7

在 Prolog 中将谓词与未绑定变量进行比较是什么意思?

4

2 回答 2

7

在 Prolog 中,(=)/2不是比较,而是基本操作,称为统一

您在问题标题中显示的表达式,如果在 X 是自由变量时调用,将创建一个循环项。在 SWI-Prolog 中

?- X=f(X),write(X).
@(S_1,[S_1=f(S_1)])
X = f(X).

循环术语难以处理,通常是由编程错误造成的:SWI-Prolog(和其他)的行为可以使用全局标志来控制,请参阅发生检查

于 2015-04-17T21:47:55.100 回答
5

目标的结果X = f(X)取决于 Prolog 的实现。在某些系统中,正如 Carlo 在他的回答中指出的那样,结果可以由用户可设置的标志控制。统一谓词 ,(=)/2可以在有或没有所谓的发生检查的情况下实现。此检查验证一个操作数中的变量是否出现在另一个操作数的子项中。当统一谓词执行此检查时,目标X = f(X)失败。但是,出于性能原因,统一谓词通常在没有此检查的情况下实现。ISO Prolog 标准指定了另一种统一谓词,恰当地命名为unify_with_occurs_check/2,当诸如此类的目标可能导致麻烦时,可以使用该谓词。

如今,一些实现支持循环项,也称为有理项,由目标创建,例如X = f(X). 其中包括 CxProlog、ECLiPSe、SICStus Prolog、SWI-Prolog 和 YAP。但是请注意,对有理项的支持程度因系统而异。最小的支持将是(1)能够创建有理项(没有堆栈溢出!),(2)能够统一两个有理项,以及(3)能够打印包含有理项的查询绑定以一种明确的方式。使用这三个功能,您可以例如实现协推逻辑编程,这对几类问题很有用。

于 2015-04-17T22:03:30.710 回答