【问题标题】:Propositional logic in prolog almost works, trouble with xorprolog中的命题逻辑几乎可以工作,xor有问题
【发布时间】: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/2xor(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 真值表是0111and 真值表是1000,序言中的逗号就像and 所以@987654345 @ 即xor 真值表。

标签: prolog


【解决方案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所以nand0111。逗号,and 一样工作,所以0110 and 01110110,这是xor 的真值表。

【讨论】:

    【解决方案2】:

    你可以试试

    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.
    

    请注意,我具体化了论点...并建议相应地修改您的代码

    【讨论】:

    • 我已经对此进行了测试并且工作正常,但 Damianodamiano 首先解决了我的问题,他的解决方案比这更简单。无论如何,我应该将此问题标记为已接受吗?
    • 不,因为我的回答的核心是建议物化。需要重新考虑您的代码。感谢您提出有趣的问题,并感谢您的代码。非常好:)