0

有没有办法在 Prolog 中声明以下内容而不会陷入无休止的递归?

left([X,Y], Z) :- left([Z,X], Y); left([Y,Z], X).

语义是列表表示由两个点给出的向量,第二个参数是位于向量左侧的第三个点。

一个相关的问题是,如何声明“左”和“右”的关系:

left([X,Y], Z) :- right([Y,X], Z).

没有得到无尽的递归。

4

1 回答 1

2

不幸的是,您不能直接在 Prolog 中执行此操作。您可以通过引入一个枚举事实排列的谓词来表达交换关系,例如:

left_of(A, B, C) :- left(A, B, C).
left_of(A, B, C) :- left(C, A, B).
left_of(A, B, C) :- left(B, C, A).

left(a, b, c).

现在查询应该是

?- left_of(A, B, C).

同样,您应该right_of根据 来定义left

有几点值得注意:

  1. 保持三个参数分开,如图所示。最好不要引入不必要的结构。

  2. 更喜欢显式子句,而不是;. 它使您的代码更加明显。;阅读代码时真的很容易错过;如果您使用它,请将其放在行首,而不是在中间某处或末尾

  3. 支持表格的 Prolog 实现没有这个问题。

于 2013-06-14T16:31:33.690 回答