2

到目前为止,我已经让这个程序在 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.

你可以输入 and(p,q) 得到是,也可以输入 and(p,not(q)) 得到否定。现在我想做这样的事情:

我将 p 设置为真,(通过用 p. 初始化它)和 (and(p,q)) 为真(但没有初始化 q),我想让 prolog 说:存在一种解决方案:“q”必须为真

如果我将 p 和 (or(p,q)) 设置为真,我希望 prolog 说:存在两种解决方案,“q”可以是真或假。最好的方法是什么?

4

2 回答 2

3

我建议您使用变量而不是pandq并将其包装在某个术语中,例如

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_trueresp 更好的名字。formula_false. :)

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

于 2014-09-12T09:07:37.860 回答
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 的有限域约束求解器,因为布尔值是整数的一种特殊情况。

于 2014-09-12T08:54:59.797 回答