如果 X = f(X),Prolog 会做什么?

What does Prolog do if you X = f(X)?

在 Prolog 中比较谓词和未绑定变量是什么意思?

在 Prolog 中,(=)/2 it not a comparison, but a fundamental operation, called unification

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

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

循环项处理起来有问题,通常是由编程错误造成的:SWI-Prolog(和其他)的行为可以使用全局标志来控制,请参阅 occurs_check

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

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