有没有办法在 Prolog 中声明以下内容而不会陷入无休止的递归?
left([X,Y], Z) :- left([Z,X], Y); left([Y,Z], X).
语义是列表表示由两个点给出的向量,第二个参数是位于向量左侧的第三个点。
一个相关的问题是,如何声明“左”和“右”的关系:
left([X,Y], Z) :- right([Y,X], Z).
没有得到无尽的递归。
有没有办法在 Prolog 中声明以下内容而不会陷入无休止的递归?
left([X,Y], Z) :- left([Z,X], Y); left([Y,Z], X).
语义是列表表示由两个点给出的向量,第二个参数是位于向量左侧的第三个点。
一个相关的问题是,如何声明“左”和“右”的关系:
left([X,Y], Z) :- right([Y,X], Z).
没有得到无尽的递归。
不幸的是,您不能直接在 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 实现没有这个问题。