Prolog中的粘合剂

时间:2017-05-05 17:02:12

标签: lambda prolog

我知道Prolog没有内置的活页夹代表例如λx (x=1)但我想知道是否有可能实施它们。在某些谓词如setof/3中,行为非常接近:查询的答案替换中的变量X

?- setof(X, member(X,[a,a,c]), Xs).
Xs = [a, c].

是未绑定的,我们可以根据自己的喜好给它一个值:

?- setof(X, member(X,[a,a,c]), Xs), X = b.
X = b,
Xs = [a, c].

但如果我们早些时候实例化X,我们会失去解决方案:

?- X = b, setof(X, member(X,[a,a,c]), Xs).
false.

我希望发生的是setof绑定X,即对于setof的评估,X被视为一个新变量。为了使这更具体一点:是否可以提供实现binding_setof以便

?- X = b, binding_setof(X, member(X,[a,a,c]), Xs).
X = b,
Xs = [a, c].

P.S。:我知道像λProlog这样的语言是为了解决这个问题而建立的,但我对Prolog解决方案很感兴趣。

编辑: 我试图用library(lambda)解决问题。我的目的是创建一个匿名变量并通过\X^setof(X, member(X,[a,c,c], Xs)将其应用于call/N。由于Xs的绑定在其外部被撤消,因此顶层不会报告它。通过将format('~w',[Xs])添加到setof中仍然可以看到它,但为了清楚起见,我将其留下。再次,电话

?- call(\X^setof(X,member(X,[a,c,c]),Xs), _), X=b.
X = b.

成功,但

?- X = b, call(\X^setof(X,member(X,[a,c,c]),Xs), _).
false.

失败。这与源中的注释一致,即lambda绑定变量不得出现在lambda表达式之外。

1 个答案:

答案 0 :(得分:2)

The Golog interpreter包含一种局部作用域变量的解决方案,它们使用pi/2复合和sub/4谓词。我们可以将pi/2修改为谓词,因为它们的许可证不允许分发其解释器,因此您需要从上面获得的sub/4(免费)链接。

pi(V, E) :- 
    sub(V, _, E, E1), 
    call(E1).

?- X = d, pi(x, setof(x, member(x, [a, a, c]), Xs)).
X = d,
Xs = [a, c].

“大部分时间”都有效;使用CLP库时遇到了问题。