[英]Binders in 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].
?
PS:我知道可以解决此问题的λProlog之类的语言,但我对Prolog解决方案感兴趣。
编辑:我试图解决与library(lambda)
的问题。 我的目标是创建一个匿名变量,并通过call/N
将其应用于\\X^setof(X, member(X,[a,c,c], Xs)
。由于Xs
的绑定在其外部被撤消,因此顶层没有报告它。仍然可以通过在setof中添加format('~w',[Xs])
来查看它,但是为了清楚起见,我将其省略。
?- 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表达式之外。
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].
它“大部分时间”都有效; 使用CLP库时遇到了问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.