如何在prolog中执行此操作而不引起无限循环?

如何在prolog中执行此操作而不引起无限循环?,prolog,infinite-loop,Prolog,Infinite Loop,我想在序言中这样做: some_commutative_property(X,Y) :- some_commutative_property(Y,X). some_commutative_property(1,2). some_commutative_property(3,4). 这样查询某些可交换属性(1,2)。和某些可交换属性(2,1)。返回true 问题显然是第一行创建了一个无限循环。我如何解决这个问题?可能有多种解决方案: 将谓词一分为二: 一些交换性质(X,Y):-一些交换性质(X

我想在序言中这样做:

some_commutative_property(X,Y) :- some_commutative_property(Y,X).
some_commutative_property(1,2).
some_commutative_property(3,4).
这样查询
某些可交换属性(1,2)。
某些可交换属性(2,1)。
返回true


问题显然是第一行创建了一个无限循环。我如何解决这个问题?

可能有多种解决方案:

  • 将谓词一分为二:

    一些交换性质(X,Y):-一些交换性质(X,Y)。
    一些交换性质(X,Y):-一些交换性质(Y,X)。

使用
一些可交换的属性\u aux(1,2)。
一些可交换的属性\u aux(3,4)。

  • 执行命令:

    一些可交换性质(X,Y):-X>Y,一些可交换性质(Y,X)。

对于
一些可交换的属性\u aux(1,2)。
一些可交换的属性\u aux(3,4)。
这仅在假设基本事实的形式为
一些可交换的属性(A,B)
A=
的情况下有效

  • 如果您不喜欢这些解决方案,您可以使用一种称为tabling的记忆机制。到目前为止,并不是所有的Prolog方言都支持列表,例如XSB。正如David S.Warren所解释的那样,“在原始代码中添加
    :-table一些可交换属性/2
    ,也可以解决问题

可能有多种解决方案:

  • 将谓词一分为二:

    一些交换性质(X,Y):-一些交换性质(X,Y)。
    一些交换性质(X,Y):-一些交换性质(Y,X)。

使用
一些可交换的属性\u aux(1,2)。
一些可交换的属性\u aux(3,4)。

  • 执行命令:

    一些可交换性质(X,Y):-X>Y,一些可交换性质(Y,X)。

对于
一些可交换的属性\u aux(1,2)。
一些可交换的属性\u aux(3,4)。
这仅在假设基本事实的形式为
一些可交换的属性(A,B)
A=
的情况下有效

  • 如果您不喜欢这些解决方案,您可能会使用一种称为tabling的记忆机制。到目前为止,并非所有Prolog方言都支持tabling,例如XSB。正如David S.Warren所解释的那样”。在原始代码中添加
    :-table一些可交换属性/2
    ,也可以解决问题

我考虑过这一点,但我宁愿不这样做,除非这是最后一个选项。我已使用表格更新了我的答案,使用了替代解决方案。我考虑过这一点,但我宁愿不这样做,除非这是最后一个选项。我已使用表格更新了我的答案,使用了替代解决方案。