协同路由有几个有趣的问题。例如,我们想要回收未达到的冻结目标。但是不支持循环项的 Prolog 系统存在问题。即冻结:
?- freeze(V, p(...V...)).
导致内部数据结构出现循环。一个简单的解决方法是对冻结的目标进行柯里化。因此freeze/2
,我们不使用 predicate ,而是使用 predicate 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).
再见