在Prolog中,(=)/ 2它不是比较,而是一种称为统一的基本操作.
您在问题标题中显示的表达式,如果在X是自由变量时调用,将创建一个循环术语.在SWI-Prolog中
?- X=f(X),write(X).
@(S_1,[S_1=f(S_1)])
X = f(X).
Run Code Online (Sandbox Code Playgroud)
循环项有问题需要处理,通常是由编程错误创建的:SWI-Prolog(和其他)的行为可以使用全局标志来控制,请参见happen_check.
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)能够打印包含理性术语的查询绑定以一种非模棱两可的方式.通过这三个功能,您可以实现共同逻辑编程,这对于几类问题非常有用.