Tôi đang cố gắng xây dựng một giải pháp Prolog SAT đơn giản. Ý tưởng của tôi là người dùng nên nhập công thức boolean để được giải quyết trong CNF (Conjuctive Normal Form) sử dụng danh sách Prolog, ví dụ (A hoặc B) và (B hoặc C) nên được trình bày như sat ([[A, B] , [B, C]]) và quy trình Prolog để tìm các giá trị cho A, B, C.Prolog SAT Solver
Mã sau của tôi không hoạt động và tôi không hiểu tại sao. Trên dòng này của dấu vết Gọi: (7) sat ([[true, true]])? Tôi đã mong đợi start_solve_clause ([_ G609, _G612]]).
Tuyên bố từ chối trách nhiệm: Xin lỗi vì mã crappy mà tôi thậm chí không biết về Prolog hoặc bài toán SAT cách đây vài ngày.
P.S .: Lời khuyên về cách giải quyết SAT được hoan nghênh.
vết
sat([[X, Y, Z], [X, Y]]).
Call: (6) sat([[_G609, _G612, _G615], [_G609, _G612]]) ? creep
Call: (7) start_solve_clause([_G609, _G612, _G615]) ? creep
Call: (8) solve_clause([_G615], _G726) ? creep
Call: (9) or(_G725, _G615, true) ? creep
Exit: (9) or(true, true, true) ? creep
Exit: (8) solve_clause([true], true) ? creep
Call: (8) or(_G609, _G612, true) ? creep
Exit: (8) or(true, true, true) ? creep
Exit: (7) start_solve_clause([true, true, true]) ? creep
Call: (7) sat([[true, true]]) ?
Prolog Nguồn
% Knowledge base
or(true, true, true).
or(false, false, false).
or(true, false, true).
or(false, true, true).
or(not(true), true, true).
or(not(false), false, true).
or(not(true), false, false).
or(not(false), true, true).
or(true, not(true), true).
or(false, not(false), true).
or(true, not(false), true).
or(false, not(true), false).
% SAT solver
sat([]).
sat([Clause | Tail]) :- start_solve_clause(Clause), sat(Tail).
% Clause solver
start_solve_clause([Var1, Var2 | Tail]) :- solve_clause(Tail, Result), or(Var1, Var2, Result).
solve_clause([X | []], Result) :- or(Result, X, true).
solve_clause([X | Tail], Result) :- solve_clause(Tail, Result2), or(Result, X, Result2).
Thay vì 'sat (Stmt): - gọi (Stmt) .' bạn chỉ có thể thực hiện' sat (Stmt): - Stmt'. Sử dụng một biến làm mục tiêu tương đương với 'call/1' với biến làm đối số. – arnsholt
@arnsholt - ahhh, tôi không biết tại sao tôi không nghĩ vậy. rằng toàn bộ quy tắc 'sat/1' là không cần thiết, tôi nghĩ nó chỉ là một cái tên đẹp. – DaveEdelstein
Đề xuất rất tốt! Bạn cũng có thể ánh xạ trực tiếp các cá thể SAT để hạn chế các vấn đề trên các số nguyên và sử dụng thư viện ví dụ (clpfd) trong SICStus, SWI và YAP (và các ràng buộc tích hợp trong các hệ thống khác như GNU Prolog và B-Prolog). Các trình giải quyết ràng buộc nói chung sẽ có thể suy ra nhiều giá trị hơn và thực hiện nhanh hơn so với tìm kiếm đơn giản (tôi không có nghĩa là tiêu cực!). SICStus cũng có một bộ giải nén, thư viện ràng buộc SAT chuyên dụng (clpb). – mat