如何在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