Prolog 我如何在不证明某些东西是错误的情况下使规则失败?

Prolog 我如何在不证明某些东西是错误的情况下使规则失败?,prolog,Prolog,我正在尝试做一个反转/2。我想让它忽略论点的顺序,这样你就不必担心倒装句的哪一半是你知道的,这样你就不必在把倒装句当作事实陈述时重复自己的话。我现在有 invert(Left, Right) :- call_with_depth_limit(invert(Right, Left), 1, Result), Result \= depth_limit_exceeded. 作为第一个反转规则。这主要是工作的,但是如果反转(a,b).,然后 -反相(b,x).给出了 >和 false

我正在尝试做一个
反转/2
。我想让它忽略论点的顺序,这样你就不必担心倒装句的哪一半是你知道的,这样你就不必在把倒装句当作事实陈述时重复自己的话。我现在有

invert(Left, Right) :-
    call_with_depth_limit(invert(Right, Left), 1, Result),
    Result \= depth_limit_exceeded.

作为第一个
反转
规则。这主要是工作的,但是如果<代码>反转(a,b).<代码>,然后<代码> -反相(b,x).<代码>给出了<<代码> x= a < /> >和<代码> false <代码>,这不是我想要的。

有两件事我会考虑。首先,确保为在事实中建立关系对称性而创建的谓词与事实具有不同的名称。名称相同通常会导致诸如无限递归之类的问题。第二,如果事实在你的控制之下,那么要保持事实是否明确宣布了对称情况的一致性。如果有,那么就不需要额外的谓词。如果没有,那么您需要一个额外的谓词

例如,在明确声明对称性的情况下:

opposite(a, b).
opposite(b, a).
opposite(c, d).
opposite(d, c).
opposite(a, b).
opposite(c, d).

inverted(X, Y) :- opposite(X, Y).
inverted(X, Y) :- opposite(Y, X).
您不需要额外的谓词来获得
对立面的对称解

未明确声明对称性的示例:

opposite(a, b).
opposite(b, a).
opposite(c, d).
opposite(d, c).
opposite(a, b).
opposite(c, d).

inverted(X, Y) :- opposite(X, Y).
inverted(X, Y) :- opposite(Y, X).

在这种情况下,查询
inversed/2
而不是
reversit/2
将处理关系中的对称性。

不会
inverse(A,B):-inverse(B,A)工作?@Enigmativity
错误:超出本地堆栈
@Lowerer那么为什么它不显示在每个查询的结果列表的末尾?因为不是每个查询都会留下一个“选择点”。使用
invert/2
实现什么目标有点不清楚。从你的评论来看,从语义上看,
Left
Right
的反义词,
Right
Left
的反义词。我认为关键在于你如何详细定义这种关系。您还没有展示
invert/2
的真正功能,因此很难提供这方面的具体建议。但是看起来你试图强迫你真正的
invert/2
在“事后”做一些事情,但是
invert/2
可能需要重构。现在所有试图找到一个反转的人都给出了正确的答案,但是如果我按
它们无限循环。@Viko:Louger的定义总是终止。@Viko我相信我确实正确地回答了这个问题,因为它是在有限的上下文中提出的。你的不确定循环是由于你没有显示的东西。我建议用你的新代码发布一个新问题来说明发生了什么。现在更改此问题中的代码是不合适的,因为它会更改答案的上下文。