有没有办法在Prolog中声明以下内容而不会陷入无休止的递归?
left([X,Y], Z) :- left([Z,X], Y); left([Y,Z], X).
语义是列表表示由两个点给出的向量,第二个参数是向量左侧的第三个点。
一个相关的问题是,如何通过以下方式声明“左”和“右”的关系:
left([X,Y], Z) :- right([Y,X], Z).
没有得到无休止的递归。
答案 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
。
值得注意的几件事情:
将三个参数分开,如图所示。最好不要引入不必要的结构。
首选明确的子句,而不是;
。它使您的代码更加明显。阅读代码时,;
很容易被遗漏;如果你使用它,把它放在行的开头,而不是在某个地方的中间或末尾
支持制表的Prolog实现没有这个问题。