【发布时间】:2026-02-15 11:15:02
【问题描述】:
我对 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)).
所以我可以通过咨询来测试我的代码是否有效:
现在没关系,但让我们尝试使用最终的异或,它会接受我需要的整个命题:
它返回true,这是错误的,因为如果implies3(true,true,true)returns true,那么xor(implies3(true,true,true),true)应该返回false,但事实并非如此。
我可以证明 xor(X,Y) 有效:
没错,它返回 false,但我不知道当我咨询 xor(implies3(true,true,true),true) 时发生了什么,它应该返回“false”但它没有,即使它与异或(真,真)。
可能是什么问题?我想我已经很接近了!
【问题讨论】:
-
问题是你没有简化。你的
xor/2确实implies3(true,true,true) = true这是错误的,不是真的。 -
我建议你这样写你的
xor/2:xor(A,B) :- or(A,B), nand(A,B).nand(A,B) :- not(and(A,B)). -
非常感谢@damianodamiano,它有效!顺便问一下 xor/2 是什么?
-
@TomasBy 暗示3(true,true,true) = true,因为 {ent1(true,true,true)} 和 {ent2(true,true,true)} 返回 {true},所以 ent3 (true,true,true) 等于 {true -> true},这是真的,不是假的。
-
我的
xor/2是这样工作的:or真值表是0111,and真值表是1000,序言中的逗号就像and所以@987654345 @ 即xor真值表。
标签: prolog