2

协同路由有几个有趣的问题。例如,我们想要回收未达到的冻结目标。但是不支持循环项的 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).

再见

4

0 回答 0