Prolog:具有置换参数的相关谓词

时间:2013-06-14 13:50:11

标签: prolog

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

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

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

一个相关的问题是,如何通过以下方式声明“左”和“右”的关系:

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

没有得到无休止的递归。

1 个答案:

答案 0 :(得分: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实现没有这个问题。