Prolog中的粘合剂

lam*_*y.x 6 lambda prolog

我知道Prolog没有内置的粘合剂来代表,?x (x=1)但我想知道是否有可能实现它们.在某些谓词中setof/3,行为非常接近:X查询的答案替换中的变量

?- setof(X, member(X,[a,a,c]), Xs).
Xs = [a, c].
Run Code Online (Sandbox Code Playgroud)

是没有约束的,我们可以给它一个我们喜欢的价值:

?- setof(X, member(X,[a,a,c]), Xs), X = b.
X = b,
Xs = [a, c].
Run Code Online (Sandbox Code Playgroud)

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

?- X = b, setof(X, member(X,[a,a,c]), Xs).
false.
Run Code Online (Sandbox Code Playgroud)

我想要发生的是,setof绑定X,即用于评估setof,X被视为一个新变量.为了使这个多一点具体:是否有可能得到实现binding_setof,从而

?- X = b, binding_setof(X, member(X,[a,a,c]), Xs).
X = b,
Xs = [a, c].
Run Code Online (Sandbox Code Playgroud)

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

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

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

成功,但是

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

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

Pau*_*own 3

Golog解释器包含局部范围变量的解决方案,它们使用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].
Run Code Online (Sandbox Code Playgroud)

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