到目前为止,我已经在GNU prolog
中使用了这个程序not(X) :- \+ X.
and(X, Y):- X , Y.
or(X, Y):- X ; Y.
implies(X, Y):- \+ X ; Y.
p.
q.
:- initialization(main).
main :-
write('Program start'), nl.
你可以输入和(p,q),得到是,以及和(p,not(q))得到否。现在我想做这样的事情:
我将p设置为true,(通过将其初始化为p。),并将(和(p,q))设置为true(但不初始化q),并且我希望prolog说: 存在一种解决方案:" q"必须是真的
如果我将p和(或(p,q))设置为true,我想要prolog说: 存在两种解决方案," q"可以是真是假。哪种方法最好?
答案 0 :(得分:3)
考虑使用带有布尔约束求解器的Prolog系统。例如,在SICStus和SWI-Prolog中:
?- use_module(library(clpb)).
true.
?- P = 1, sat(P * Q).
P = Q, Q = 1.
?- P = 1, sat_count(P + Q, Count).
Count = 2,
P = 1.
?- P = 1, sat(P + Q), labeling([P,Q]).
P = 1,
Q = 0 ;
P = Q, Q = 1.
你也可以使用GNU Prolog的有限域约束求解器,因为布尔值是整数的特例。
答案 1 :(得分:3)
我建议您使用变量代替p
和q
并将其包装在某个术语中,例如
and(prop(P),prop(Q))
此外,我将实现两个谓词,一个用于解决真实语句,一个用于解决错误语句。使用\+
不是正确的方法,因为它不允许您绑定变量。这是一些示例代码:
formula_true(prop(true)).
formula_true(and(A,B)) :- formula_true(A),formula_true(B).
formula_true(not(A)) :- formula_false(A).
...
formula_false(prop(false)).
formula_false(and(A,B)) :- formula_false(A);formula_false(B).
...
您的示例查询将是:
P=true,formula_true(and(prop(P),prop(Q))).
也许你的名字比formula_true
更好。 formula_false
。 :)
如果您有布尔约束求解器,那当然会更有效。