Estoy tratando de construir un simple solucionador de Prolog SAT. Mi idea es que el usuario debe ingresar la fórmula booleana a resolver en CNF (Forma Normal Conjugativa) usando listas de Prolog, por ejemplo (A o B) y (B o C) deben presentarse como sat ([[A, B] , [B, C]]) y Prolog procede a encontrar los valores para A, B, C.Prolog SAT Solver
Mi siguiente código no funciona y no entiendo por qué. En esta línea de la traza Llamada: (7) sat ([[true, true]])? Esperaba start_solve_clause ([_ G609, _G612]]).
Descargo de responsabilidad: Disculpa por el código de mierda que ni siquiera sabía sobre Prolog o el problema de SAT hace unos días.
P.S .: Asesoramiento para resolver el SAT es bienvenido.
traza
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 Fuente
% 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).
En lugar de 'sat (Stmt): - call (Stmt) .' puedes hacer' sat (Stmt): - Stmt'. Usar una variable como objetivo es equivalente a 'call/1' con la variable como argumento. – arnsholt
@arnsholt - ahhh, no sé por qué no pensé en hacer eso. toda esa regla 'sat/1' era superflua de todos modos, creo que era solo para que tuviera un buen nombre. – DaveEdelstein
¡Muy buena sugerencia! También puede mapear directamente las instancias de SAT para restringir problemas sobre enteros y usar, por ejemplo, la biblioteca (clpfd) en SICStus, SWI y YAP (y las restricciones incorporadas en otros sistemas como GNU Prolog y B-Prolog) para resolverlos. Los solucionadores de restricciones generalmente podrán deducir más valores y realizar más rápido que una búsqueda simple (¡no me refiero a eso negativamente!). SICStus también tiene un solucionador de restricciones SAT dedicado, biblioteca (clpb). – mat