有几个有趣的problems与共同路由。例如,我们想要收回未达到的冻结目标。但Prolog系统存在一个不支持循环术语的问题。即冻结:
?- freeze(V, p(...V...)).
导致内部数据结构中的循环。一个简单的解决方法是解决冻结的目标。因此,我们不使用谓词freeze/2
,而是使用谓词guard/2
,它可以定义如下:
guard(V, C) :- freeze(V, call(C, V)).
但我们如何根据freeze/2
定义guard/2
?明显的定义不起作用,因为它没有引入新的变量,我们仍然遇到闭包含V的问题(假设lambda库中(\)/2
是lambda抽象):
freeze(V, G) :- guard(V, V\G).
再见