我知道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表达式之外。
答案 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库时遇到了问题。