Prolog布尔方程求解

时间:2014-09-12 07:49:22

标签: prolog clpb

到目前为止,我已经在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"可以是真是假。哪种方法最好?

2 个答案:

答案 0 :(得分:3)

考虑使用带有布尔约束求解器的Prolog系统。例如,在SICStusSWI-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)

我建议您使用变量代替pq并将其包装在某个术语中,例如

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。 :)

如果您有布尔约束求解器,那当然会更有效。