我在prolog上非常新,所以我试图制作一个命题逻辑解算器,解决这个问题:
这个想法是在这样咨询时传递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)).
所以我可以通过咨询测试我的代码是否有效:
现在还可以,但是让我们尝试最终的xor,他会接受我需要的整个命题:
它返回true,这是错误的,因为如果implies3(true,true,true)
返回true,那么xor(implies3(true,true,true),true)
应该返回false ,但它不会。
我可以证明xor(X,Y)有效:
这是正确的,它返回错误,但我不知道在我咨询xor(implies3(true,true,true),true)
时发生了什么,它应该返回&#34假#34;但它并不是,即使它与xor(真,真)相同。
可能是什么问题?我想我真是太近了!
答案 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
的真值表为0111
,and
的真值表为1000
,因此nand
1}}是0111
。逗号,
的作用类似于and
,因此0110 and 0111
为0110
,这是xor
的真值表。