我知道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
绑定(bind)了X
,即,对于setof
的求值,X
被视为一个新变量。为了使它更具体一点:是否可以给出一个实现binding_setof
,使得?- X = b, binding_setof(X, member(X,[a,a,c]), Xs).
X = b,
Xs = [a, c].
?
附注:我知道可以解决此问题的λProlog等语言,但我对Prolog解决方案感兴趣。
编辑:
我试图用
library(lambda)
解决问题。我的目标是创建一个匿名变量,并通过\X^setof(X, member(X,[a,c,c], Xs)
将其应用于call/N
。由于Xs
的绑定(bind)是在其外部撤消的,因此顶层不会报告它。通过将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绑定(bind)变量一定不能出现在lambda表达式之外。
最佳答案
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库时遇到了问题。
关于lambda - 粘合剂中的序言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43810314/