Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 58 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
58
Dung lượng
2,09 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ BÀI TIỂU LUẬN MÔN HỌC KHAI PHÁ DỮ LIỆU HỒI QUY TỰ ĐỘNG CHỨNG MINH ĐỊNH LÝ VÀ LOGIC BẬC NHẤT Danh sách sinh viên thực hiện: Cao Mai Hương Nguyễn Đức Huy Học Nguyễn Thị Thu Trang Lê Tuấn Đạt Vũ Thị Tân HÀ NỘI – 2018 MỤC LỤC DANH MỤC HÌNH ẢNH BẢNG CHÚ GIẢI VIẾT TẮT Viết tắt Tiếng Anh Tiếng Việt MAE Mean Absolute Error Sai số trung bình tuyệt đối MSE Mean Square Error Sai số trung bình bình phương RMSE Root Mean Square Error Căn sai số trung bình bình phương RelMSE Relative Mean Square Error Sai số trung bình tương đối CV Coefficient of Variation Hệ số biến thiên LR Linear Regression Hồi quy tuyến tính MLR Multipe Linear Model Hồi quy tuyến tính đa biến PCR Principal components Hồi quy thành phần regression PLS Partial Least Squares Hồi quy vng góc phần AI Artificial Intelligence Trí tuệ nhân tạo CNF Conjunctive Normal Form Chuẩn tắc hội SAT Satisfiability Thỏa mãn UnSatisfiability Không thỏa mãn UNSAT DPLL Davis-Putnam-LogemannLoveland ATP Automated Theorem Prover Chương trình tự động chứng minh định lý NP Non-Polynomial Độ phức tạp đa thức PHẦN PHÂN CƠNG CƠNG VIỆC CỦA NHĨM SINH VIÊN ST T Họ tên sinh viên Công việc thực Phần – Từ mục 2.1 đến 2.1.2 Cao Mai Hương Có tham gia biên soạn tài liệu chung Phần – Từ mục 2.1.3 đến 2.2.2 Nguyễn Đức Huy Học Có tham gia biên soạn tài liệu chung Phần – Từ mục 2.2.3 đến 2.2.4 Nguyễn Thị Thu Trang Có tham gia biên soạn tài liệu chung Phần – Mục 3.1 3.2 demo Lê Tuấn Đạt code – phần phụ lục Có tham gia biên soạn tài liệu chung Phần – Mục 3.3 demo code- Vũ Thị Tân phần phụ lục Có tham gia biên soạn tài liệu chung PHẦN HỒI QUY [1] Mọi người (hoặc hầu hết người) muốn dự đoán điều xảy tương lai Những số chọn cho xổ số? Khóa học chọn cho kết đại học có mang lại hài lịng chun nghiệp khơng? Là bạn hẹn hò với người? Chúng ta biết tương lai khó dự đốn Tuy nhiên, có số vấn đề thực tế mà việc dự đoán khả thi Một nhiệm vụ phân tích gọi nhiệm vụ dự đoán, quy nạp mơ hình dự đốn Nhiệm vụ dự đốn Quy nạp mơ hình gán nhãn cho đối tượng chưa gán nhãn với kì vọng xác, với tập giá trị thuộc tính dự đốn cho trước Nhiệm vụ dự đốn khơng dự đốn điều xảy tương lai, dự đốn khả xảy kết kiện cụ thể Một ví dụ dự đốn chẩn đốn y tế Ví dụ, cho dù bệnh nhân có nhóm triệu chứng kết khám lâm sàng có bệnh cụ thể Những dự đốn thường khơng xác 100%, chúng hữu ích, đặc biệt việc cung cấp hỗ trợ cho việc định, ví dụ: • giảm chi phí • tăng lợi nhuận • cải thiện chất lượng sản phẩm dịch vụ • cải thiện hài lịng khách hàng • giảm thiệt hại mơi trường Nhiệm vụ dự đốn sử dụng liệu gán nhãn trước đó, liệu mà kết biết, để dự đoán kết (hoặc nhãn) cho liệu không gán nhãn Các kỹ thuật dự đoán thường xây dựng tạo gọi mơ hình dự đốn từ liệu gán nhãn, trình gọi học quy nạp Do mục tiêu việc học quy nạp tìm mơ hình tốt - hàm giả thuyết - để ánh xạ vectơ giá trị thuộc tính dự đốn thể khơng gán nhãn liệu tới nhãn xác chúng Nhưng trước giải thích mơ hình tạo nào, hay nói cách khác, học nào, thảo luận liệu Trong chương trước, liệu không chứa nhãn Nhãn đại diện cho kết có kiện thuộc số loại Ví dụ, người gắn nhãn “trẻ con” “người lớn” (ghi nhãn nhị phân), xe thuộc loại “gia đình”, “thể thao”, “địa hình” “xe tải” (nhãn danh nghĩa), phim xếp hạng "tồi tệ nhất", "kém", "trung bình", "tốt" "xuất sắc" (nhãn thứ tự), nhà có nhãn giá (nhãn định lượng) Thứ hai, có liệu gán nhãn không gán nhãn Trong học máy, liệu sử dụng để tạo mơ hình gọi liệu training, chúng sử dụng thuật toán training để định mơ hình liên kết xác thuộc tính thể với nhãn thực Q trình gọi đào tạo Dữ liệu sử dụng để kiểm tra hiệu suất/đánh giá mơ hình tạo gọi liệu kiểm thử Một ví dụ ứng dụng mà mơ hình tạo từ liệu training chẩn đoán y tế Một bệnh viện có hồ sơ số bệnh nhân, hồ sơ kết tập hợp lần khám lâm sàng chẩn đoán cho bệnh nhân Mỗi lần khám lâm sàng đại diện cho thuộc tính (dự đốn) bệnh nhân chẩn đốn thuộc tính đích Mơ hình tạo từ liệu training sau sử dụng để dự đốn chẩn đốn có khả bệnh nhân thuộc thử nghiệm, mà biết thuộc tính dự đoán (kết khám lâm sàng), chưa biết thuộc tính đích (chẩn đốn) Hãy tưởng tượng làm hữu ích mơ hình tạo cho bác sĩ khơng thể định hai chẩn đốn có khả giống Có “ý kiến” khác từ mơ hình dự đốn có nghĩa hỗ trợ định bác sĩ tốt Một mơ hình dự đốn tạo tập huấn luyện, sử dụng để dự đốn nhãn xác cho liệu bước tiếp theo, gọi khấu trừ (deduction) Những liệu liệu thử nghiệm có nhãn khơng xác định Nhiệm vụ dự đoán phân chia nhiệm vụ phân loại nhiệm vụ hồi quy Trong nhiệm vụ phân loại, mục tiêu tạo mơ hình gán nhãn định tính xác, cịn gọi lớp, cho thể có nhãn không xác định Phân loại thảo luận Chương Chương hồi quy Năm 1877, Francis Galton quan sát đảo chiều phía trung bình thí nghiệm kích thước hạt giống hệ đậu Ông đổi tên tượng “hồi quy” vào năm 1880 Kể từ đó, hồi quy q trình tạo hàm tốn học để giải thích thuộc tính đầu định lượng từ tập hợp thuộc tính tiên đốn Nhiệm vụ hồi quy Nhiệm vụ dự đốn có mục đích gán giá trị định lượng cho đối tượng chưa gán nhãn cho giá trị thuộc tính dự đốn Ví dụ 2.1 Chúng ta sử dụng ví dụ tập liệu mạng xã hội cách sử dụng “cân nặng” “chiều cao” thuộc tính dự đốn thuộc tính đích tương ứng Thuộc tính đích tên khác cho nhãn Dữ liệu training - friends có chiều cao (nhãn) mà biết - nằm Bảng 2.1 Bảng 2.1 Tập liệu danh sách liên lạc, với liệu trọng lượng chiều cao Hình 2.1 Hồi quy tuyến tính đơn giản cho liệu mạng xã hội Từ đây, mơ hình hồi quy tuyến tính đơn giản height = 128.017 + 0,611 × weight Trên thực tế, mơ hình phương trình đường có độ dốc 0.611 (tham số ) hệ số chặn 128.017 (tham số ), biểu diễn biểu đồ Hình 2.1 Bây giờ, dự đoán chiều cao người bạn Omar Patricia, có trọng lượng tương ứng 91 58 kg Những phải làm đưa thuộc tính chúng vào mơ hình tạo Chiều cao dự đoán Omar height = 128.017 + 0.611 × 91 = 183.618 cm chiều cao dự đoán Patricia height = 128.017 + 0.611 × 58 = 163.455 cm Lưu ý Omar Patricia thể thuộc tập kiểm thử Các phương thức hồi quy sử dụng nhiều miền khác nhau: • thị trường chứng khoán: để dự đoán giá trị cổ phiếu thời gian tuần • giao thơng: dự báo thời gian lại cho đường cụ thể • giáo dục đại học: để dự đốn có sinh viên khóa học năm tới • phân tích tỷ lệ sống: để dự đốn người sống sau lần điều trị • kinh tế học vĩ mơ: để dự đốn mức thất nghiệp dự kiến đưa tập hợp sách đề xuất Nhưng trước mơ tả phương thức hồi quy, bắt đầu cách mơ tả khái niệm có ý nghĩa cho hồi quy phân loại, cụ thể tính phổ qt đánh giá mơ hình Các chủ đề bao gồm phần ước tính hiệu 2.1 Ước tính hiệu dự đốn Trước nói đánh giá hiệu dự đoán, điều quan trọng phải phân biệt đánh giá kỹ thuật học dự đoán đánh giá mơ hình kết Tuy nhiên, loại mơ hình có ranh giới hạn chế Ví dụ: mơ hình tuyến tính khơng thể nắm bắt xu hướng mối quan hệ phức tạp phi tuyến tính khác liệu, chúng dễ hiểu Mặt khác, thân liệu nhiễu loại lỗi khác (các giá trị ngoại lệ thiếu giá trị) ảnh hưởng đến chất lượng mơ hình kết 2.1.1 Tính phổ quát Khi giao dịch với tác vụ dự đoán đại diện tập liệu, mục đích để tạo từ tập liệu mơ hình dự đốn cách xác đối tượng tác vụ tương tự Chúng ta muốn giảm thiểu số lượng mức độ dự đoán sai lệch tương lai Vì khơng thể dự đốn tương lai, làm để ước tính hiệu dự đốn mơ hình cho liệu Chúng ta làm cách tách liệu thiết lập thành hai phần loại trừ lẫn nhau, cho huấn luyện – điều chỉnh tham số mơ hình - cho kiểm thử: đánh giá mơ hình liệu Chúng ta sử dụng tập liệu training để tạo nhiều mơ hình dự đốn cho kỹ thuật Chúng ta thử cấu hình khác siêu tham số kỹ thuật Đối với giá trị siêu tham số , tạo nhiều mơ hình Các giá trị siêu tham số tạo mơ hình có hiệu dự đốn tốt tập huấn luyện sử dụng để thể hiệu dự đoán kỹ thuật Nếu tạo nhiều mơ hình cho giá trị siêu tham số, sử dụng hiệu dự đốn trung bình cho mơ hình khác để xác định hiệu suất dự đốn kết hợp với kỹ thuật Nếu chạy thử nghiệm với nhiều kỹ thuật cho tập liệu, sử dụng hiệu suất dự đoán kết hợp với kỹ thuật để chọn kỹ thuật phù hợp cho tập liệu Quan sát không sử dụng liệu thử nghiệm để lựa chọn kỹ thuật Giả định liệu thử nghiệm không xem kỹ thuật trước lựa chọn Nó sử dụng để xác nhận lựa chọn kỹ thuật tốt Nếu sử dụng tập huấn luyện cho tạo mơ hình lựa chọn kỹ thuật, kết thúc với ước tính lạc quan hiệu suất kỹ thuật Điều xảy xem liệu kiểm thử trước sử dụng thơng tin để chọn kỹ thuật Trong trường hợp này, mơ hình overfit (hiện tượng mô tả trên) khơng đủ tổng qt để dự đốn liệu tương lai với độ xác hợp lý Trong phương pháp này, chọn giá trị siêu tham số tốt cho kỹ thuật chọn nhiều kỹ thuật để sử dụng Thơng thường, số lượng ví dụ tập huấn luyện lớn hiệu suất dự đốn kỹ thuật cao Hai vấn đề với ước tính hiệu suất làm để ước tính hiệu mơ hình cho liệu độ đo sử dụng ước tính Hai khía cạnh đề cập phần 2.1.2 Đánh giá mơ hình Mục tiêu mơ hình dự đốn dự đốn nhãn xác cho đối tượng Như đề cập trước đây, làm ước tính hiệu suất dự đốn cách sử dụng hiệu suất dự đốn mơ hình liệu thử nghiệm Trong trình này, sử dụng phương pháp ước tính hiệu suất dự đốn Có phương thức đánh giá mơ hình khác nhau, thường dựa liệu lấy mẫu Phương pháp đơn giản nhất, holdout, chia liệu thành hai tập khơng giao nhau: • tập training sử dụng để huấn luyện (xây dựng mơ hình) • tập test sử dụng để kiểm thử (đánh giá hiệu mô hình) 10 { return this; } public override Formula ToCnf() { return this; } public override IEnumerable Literals() { return new List() { this }; } } } Clause using System; using System.Collections.Generic; namespace demo { public class Clause { public List Literals { get; set; } public Clause() { Literals = new List(); } public bool Contains(Formula literal) //xác định xem chữ có thuộc mệnh đề khơng { if (!IsLiteral(literal)) 44 throw new ArgumentException("Specified formula is not a literal"); foreach (var formula in Literals) { if (LiteralEquals(formula, literal)) return true; } return false; } public Clause RemoveLiteral(Formula literal) //trả mệnh đề không chứa { //literal đối số if (!IsLiteral(literal)) throw new ArgumentException("Specified formula is not a literal"); var result = new Clause(); for (var i = 0; i < Literals.Count; i++) { if (!LiteralEquals(literal, Literals[i])) result.Literals.Add(Literals[i]); } return result; } public bool LiteralEquals(Formula p, Formula q) //xác định xem p, q có không { if (p is Variable && q is Variable) return (p as Variable).Name == (q as Variable).Name; if (p is Not && q is Not) return LiteralEquals((p as Not).P, (q as Not).P); return false; } 45 public bool IsLiteral(Formula p) //xác định xem cơng thức P có phải literal { return p is Variable || (p is Not && (p as Not).P is Variable); } } } Heuristics using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace demo { class Heuristics { public static Formula ChooseLiteral(Cnf cnf) { if(cnf.Clauses.Count == 0) { return null; } return cnf.Clauses.First().Literals.First(); } } } Cnf 46 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace demo { public class Cnf { public List Clauses { get; set; } public Cnf() { Clauses = new List(); } public Cnf(And and) { Clauses = new List(); RemoveParenthesis(and); } public void SimplifyCnf() //đơn giản hoá cơng thức cách bỏ p ∨ ¬p { Clauses.RemoveAll(TautologyClauses); } private bool TautologyClauses(Clause clause) //xác định xem mệnh đề có chứa p ¬p khơng { for (var i = 0; i < clause.Literals.Count; i++) { for (var j = i + 1; j < clause.Literals.Count - 1; j++) { // Checking that literal i and literal 47 //j are not of the same type; i.e., both //variables or negated literals if (!(clause.Literals[i] is Variable && clause.Literals[j] is Variable) && !(clause.Literals[i] is Not && clause Literals[j] is Not)) { var not = clause.Literals[i] is Not ? clause.Literals[i] as Not : clause.Literals[j] as Not; var @var = clause.Literals[i] is Variable ? clause.Literals[i] as Variable : clause.Literals[j] as Variable; if (IsNegation(not, @var)) return true; } } } return false; } private bool IsNegation(Not f1, Variable f2) //xác định f1 có phải phủ định f2 không { return (f1.P as Variable).Name == f2.Name; } private void Join(IEnumerable others) //ghép nối orthers đầu vào { //thành mệnh đề cnf Clauses.AddRange(others); } private void RemoveParenthesis(And and) //thay đổi Cnf thành danh sách mệnh đề { var currentAnd = and; while (true) 48 { // If P is OR or literal and Q is OR or literal if ((currentAnd.P is Or || currentAnd.P is Variable || currentAnd.P is Not) && (currentAnd.Q is Or || currentAnd.Q is Variable || currentAnd.Q is Not)) { Clauses.Add(new Clause { Literals = new List(currentAnd P.Literals()) }); Clauses.Add(new Clause { Literals = new List(currentAnd Q.Literals()) }); break; } // If P is AND and Q is OR or literal if (currentAnd.P is And && (currentAnd.Q is Or || currentAnd.Q is Variable || currentAnd.Q is Not)) { Clauses.Add(new Clause { Literals = new List(currentAnd Q.Literals()) }); currentAnd = currentAnd.P as And; } // If P is OR or literal and Q is AND if ((currentAnd.P is Or || currentAnd.P is Variable || currentAnd.P is Not) && currentAnd 49 Q is And) { Clauses.Add(new Clause { Literals = new List(currentAnd P.Literals()) }); currentAnd = currentAnd.Q as And; } // If both P and Q are ANDs if (currentAnd.P is And && currentAnd.Q is And) { RemoveParenthesis(currentAnd.P as And); RemoveParenthesis(currentAnd.Q as And); break; } } } public bool Dpll() { return Dpll(new Cnf { Clauses = new List(Clauses) }); } private bool Dpll(Cnf cnf) { // The CNF with no clauses is assumed to be True if (cnf.Clauses.Count == 0) return true; // Rule One Literal: if there exists a clause with a single literal // we assign it True and remove every clause containing it var cnfAfterOneLit = OneLiteral(cnf); 50 if (cnfAfterOneLit.Item2 == 0) return true; if (cnfAfterOneLit.Item2 < 0) return false; cnf = cnfAfterOneLit.Item1; // Rule Pure Literal: if there exists a literal and its negation does not exist in any clause of Cnf var cnfPureLit = PureLiteralRule(cnf); // Rule Split: splitting occurs over a literal and creates branches of the tree var split = Split(cnfPureLit); return Dpll(split.Item1) || Dpll(split.Item2); } private Tuple OneLiteral(Cnf cnf) { var unitLiteral = UnitClause(cnf); if (unitLiteral == null) return new Tuple(cnf, 1); var newCnf = new Cnf(); while (unitLiteral != null) { var clausesToRemove = new List(); var i = 0; // 1st Loop - Finding clauses where the //unit literal is, these clauses will not be //considered in the new Cnf foreach (var clause in cnf.Clauses) { if (clause.Literals.Any(literal => clause LiteralEquals(literal, unitLiteral))) clausesToRemove.Add(i); i++; } // New Cnf after removing every clause where 51 //unit literal is newCnf = new Cnf(); // 2nd Loop - Leave clause that not include //the unit literal for (var j = 0; j < cnf.Clauses.Count; j++) { if (!clausesToRemove.Contains(j)) newCnf.Clauses.Add(cnf.Clauses[j]); } // No clauses, which implies SAT if (newCnf.Clauses.Count == 0) return new Tuple(newCnf, 0);// Remove negation of unit literal from remaining clauses var unitNegated = NegateLiteral(unitLiteral); var clausesNoLitNeg = new List(); foreach (var clause in newCnf.Clauses) { var newClause = new Clause(); // Leaving every literal except the unit //literal negated foreach (var literal in clause.Literals) if (!clause.LiteralEquals(literal, unitNegated)) newClause.Literals.Add(literal); clausesNoLitNeg.Add(newClause); } newCnf.Clauses = new List(clausesNoLitNeg); // Resetting variables for next stage cnf = newCnf; unitLiteral = UnitClause(cnf); // Empty clause found if (cnf.Clauses.Any(c => c.Literals.Count == 0)) return new Tuple(newCnf, -1); 52 } return new Tuple(newCnf, 1); } public Formula NegateLiteral(Formula literal) { if (literal is Variable) return new Not(literal); if (literal is Not) return (literal as Not).P; return null; } private Formula UnitClause(Cnf cnf) { foreach (var clause in cnf.Clauses) if (clause.Literals.Count == 1) return clause.Literals.First(); return null; } private Cnf PureLiteralRule(Cnf cnf) { var pureLiterals = PureLiterals(cnf); if (pureLiterals.Count() == 0) return cnf; var newCnf = new Cnf(); var clausesRemoved = new SortedSet(); // Checking what clauses contain pure literals foreach (var pureLiteral in pureLiterals) { for (var i = 0; i < cnf.Clauses.Count; i++) { 53 if (cnf.Clauses[i].Contains(pureLiteral)) clausesRemoved.Add(i); } } // Creating the new set of clauses for (var i = 0; i < cnf.Clauses.Count; i++) { if (!clausesRemoved.Contains(i)) newCnf.Clauses.Add(cnf.Clauses[i]); } return new Cnf(); } private IEnumerable PureLiterals(Cnf cnf) { var result = new List(); foreach (var clause in cnf.Clauses) foreach (var literal in clause.Literals) { if (PureLiteral(cnf, literal)) result.Add(literal); } return result; } private bool PureLiteral(Cnf cnf, Formula literal) { var negation = NegateLiteral(literal); foreach (var clause in cnf.Clauses) { foreach (var l in clause.Literals) if (clause.LiteralEquals(l, negation)) return false; } return true; 54 } private Tuple Split(Cnf cnf) { var literal = Heuristics.ChooseLiteral(cnf); var tuple = SplittingOnLiteral(cnf, literal); return new Tuple(RemoveLiteral(tuple.Item1, literal), RemoveLiteral(tuple.Item2, NegateLiteral(literal))); } private Cnf RemoveLiteral(Cnf cnf, Formula literal) { var result = new Cnf(); foreach (var clause in cnf.Clauses) result.Clauses.Add(clause.RemoveLiteral(literal)); return result; } private Tuple SplittingOnLiteral(Cnf cnf, Formula literal) { // List of clauses containing literal var @in = new List(); // List of clauses containing Not(literal) var inNegated = new List();// List of clauses not containing literal nor //Not(literal) var @out = new List(); var negated = NegateLiteral(literal); foreach (var clause in cnf.Clauses) { if (clause.Contains(literal)) @in.Add(clause); else if (clause.Contains(negated)) 55 inNegated.Add(clause); else @out.Add(clause); } var inCnf = new Cnf { Clauses = @in }; var outCnf = new Cnf { Clauses = @inNegated }; inCnf.Join(@out); outCnf.Join(@out); return new Tuple(inCnf, outCnf); } public override string ToString() { if (Clauses.Count > 0) { var result = ""; foreach (var clausule in Clauses) { var c = ""; foreach (var literal in clausule.Literals) c += literal + ","; result += "(" + c + ")"; } return result; } return "Empty CNF"; } } } Program 56 using System; using System.Collections.Generic; using System.Text; namespace demo { public class Program { static void Main() { //var p = new Variable(false); //var q = new Variable(false); //var formula = new Or(new Not(p), q); //Console.WriteLine(formula.Evaluate()); //p.Value = true; //Console.WriteLine(formula.Evaluate()); //Console.Read(); var p = new Variable(true) { Name = "p" }; var q = new Variable(true) { Name = "q" }; var r = new Variable(true) { Name = "r" }; ////Test //var f1 = new And(new Or(p, q), new Or(p, new Not(q))); //var f2 = new And(new Or(new Not(p), q), new Or(new Not(p), //new Not(r))); //var formula = new And(f1, f2); //Test var f1 = new Or(p, new Or(q, new Not(r))); var f2 = new Or(p, new Or(q, r)); var f3 = new Or(p, new Not(q)); var formula = new And(f1, new And(f2, new And(f3, new Not(p)))); 57 //Test //var f1 = new Or(p, new Or(q, r)); //var f2 = new Or(p, new Or(q, new Not(r))); //var f3 = new Or(p, new Or(new Not(q), r)); //var f4 = new Or(p, new Or(new Not(q), new Not(r))); //var f5 = new Or(new Not(p), new Or(q, r)); //var f6 = new Or(new Not(p), new Or(q, new Not(r))); //var f7 = new Or(new Not(p), new Or(new Not(q), r)); //var formula = new And(f1, new And(f2, new And(f3, new And(f4, //new And(f5, new And(f6, f7)))))); var nnf = formula.ToNnf(); Console.WriteLine("NNF: " + nnf); nnf = nnf.ToCnf(); var cnf = new Cnf(nnf as And); cnf.SimplifyCnf(); Console.WriteLine("CNF: " + cnf); Console.WriteLine("SAT: " + cnf.Dpll()); Console.Read(); } } } 58 ... 3.1 Việc tự động chứng minh định lý Việc tự động chứng minh định lý (ATP) chương trình máy tính tạo kiểm tra định lý tốn học tìm kiếm chứng tính xác thực định lý; tức là, tun bố ln Định lý biểu... nhà toán học Note Một số lý luận logic mạnh mẽ biểu diễn chứng minh nhiều định lý lý luận khác Logic mệnh đề thường yếu đơn giản số Định lý phương pháp lý luận khác tùy thuộc vào số lượng chứng. .. kiếm chứng sâu sắc logic ngôn ngữ sử dụng để diễn tả định lý chứng minh Một cân mức độ tự động hóa phương pháp lý luận logic phải tính đến Muốn có mức độ cao cho tự động hóa phương thức lý luận logic