prolog中的命题逻辑几乎可行,xor也有问题

时间:2018-04-21 07:42:52

标签: prolog

我在prolog上非常新,所以我试图制作一个命题逻辑解算器,解决这个问题:

enter image description here

这个想法是在这样咨询时传递p,q,r,s布尔参数(仅举例):

solvelogic(true,true,false,true).

所以我有这个知识库:

implies(X,Y) :- (not(X);Y).                       %that's implies formula and it works
xor(X,Y) :- not(X=Y).                             %that's xor formula and it works too
and(X,Y) :- X,Y.
or(X,Y) :- X;Y.

implies1(P,Q,R) :- implies(and(P,Q),R).
implies2(P,Q,R) :- implies(P,(or(not(Q),R))).
implies3(P,Q,R) :- implies(implies1(P,Q,R),implies2(P,Q,R)).

所以我可以通过咨询测试我的代码是否有效:

enter image description here

现在还可以,但是让我们尝试最终的xor,他会接受我需要的整个命题:

enter image description here

它返回true,这是错误的,因为如果implies3(true,true,true)返回true,那么xor(implies3(true,true,true),true) 应该返回false ,但它不会。

我可以证明xor(X,Y)有效:

enter image description here

这是正确的,它返回错误,但我不知道在我咨询xor(implies3(true,true,true),true)时发生了什么,它应该返回&#34假#34;但它并不是,即使它与xor(真,真)相同。

可能是什么问题?我想我真是太近了!

2 个答案:

答案 0 :(得分:1)

你可以尝试

eval(P,R) :- P -> R=true ; R=false.

%xor(X,Y) :- not(X=Y).                  %that's xor formula and it works too
xor(X,Y) :- eval(X,A),eval(Y,B), A\=B.

注意我确定了参数...并建议相应地修改你的代码

答案 1 :(得分:1)

因此,要解决您的问题,您可以用这种方式重写xor/2谓词:

nand(A,B):- 
    not(and(A,B)).

xor(A,B):- 
    or(A,B), 
    nand(A,B). 

查询:

?- xor(implies3(true,true,true),true) 
false

xor/2的实现遵循以下观点:or的真值表为0111and的真值表为1000,因此nand 1}}是0111。逗号,的作用类似于and,因此0110 and 01110110,这是xor的真值表。