« Return to Thread: lambda-like continuations (was: maplist and friends)

lambda-like continuations (was: maplist and friends)

by Ulrich Neumerkel :: Rate this Message:

Reply to Author | View in Thread


In April 2008, we had some discussion ("maplist and friends") about
ways to express lambda like expressions in the place of continuations.
The following variant fits into the predefined definitions using
standard operators:

?- maplist(\X^Y^plus(X,1,Y), [1,2,3], L).
L = [2, 3, 4].

?- maplist(succ, [1,2], L).
L = [2, 3].

?- maplist(\X^succ(X), [1,2], L).
L = [2, 3].

?- maplist(\X^Y^succ(X,Y), [1,2], L).
L = [2, 3].

I.e., all variables are by default local.  Global variables like the X
in

?- Xs = [_,_], maplist(dif(X), Xs).
Xs = [_G2284, _G2287],
dif(X, _G2284),
dif(X, _G2287).

cannot be directly expressed.  The following shows that X is now a
local variable yielding an unintended answer.

?- Xs = [_,_], maplist(\Y^dif(X,Y), Xs).
Xs = [_G2329, _G2332],
dif(_G2350, _G2329),
dif(_G2356, _G2332).

To make X global:

?- Ys = [_,_], maplist(X+ \Y^X^dif(X,Y), Ys).
Ys = [_G2346, _G2349],
dif(X, _G2346),
dif(X, _G2349).

Being equivalent to:

?- Ys = [_,_], maplist(X+ \Y^X1^dif(X1,Y), Ys).
Ys = [_G2364, _G2367],
dif(X, _G2364),
dif(X, _G2367).


Implementation:

:- meta_predicate ^(?,0,?).
:- meta_predicate ^(?,1,?,?).
:- meta_predicate ^(?,2,?,?,?).
:- meta_predicate ^(?,3,?,?,?,?).

^(V1, Goal, V1) :- call(Goal).
^(V1, Goal, V1, V2) :- call(Goal, V2).
^(V1, Goal, V1, V2, V3) :- call(Goal, V2, V3).
^(V1, Goal, V1, V2, V3, V4) :- call(Goal, V2, V3, V4).
^(V1, Goal, V1, V2, V3, V4, V5) :- call(Goal, V2, V3, V4, V5).

:- meta_predicate \(1,?).
:- meta_predicate \(2,?,?).
:- meta_predicate \(3,?,?,?).
:- meta_predicate \(4,?,?,?,?).

\(FC, V1) :- copy_term_nat(FC,C), call(C, V1).
\(FC, V1, V2) :- copy_term_nat(FC,C), call(C, V1, V2).
\(FC, V1, V2, V3) :- copy_term_nat(FC,C), call(C, V1, V2, V3).
\(FC, V1, V2, V3, V4) :- copy_term_nat(FC,C), call(C, V1, V2, V3, V4).
\(FC, V1, V2, V3, V4, V5) :- copy_term_nat(FC,C), call(C, V1, V2, V3, V4, V5).

:- meta_predicate +(?,1).
:- meta_predicate +(?,2,?).
:- meta_predicate +(?,3,?,?).
:- meta_predicate +(?,4,?,?,?).
:- meta_predicate +(?,5,?,?,?,?).

+(V1, Goal) :- call(Goal, V1).
+(V1, Goal, V2) :- call(Goal, V2, V1).
+(V1, Goal, V2, V3) :- call(Goal, V2, V3, V1).
+(V1, Goal, V2, V3, V4) :- call(Goal, V2, V3, V4, V1).
+(V1, Goal, V2, V3, V4, V5) :- call(Goal, V2, V3, V4, V5, V1).
_______________________________________________
SWI-Prolog mailing list
SWI-Prolog@...
https://mailbox.iai.uni-bonn.de/mailman/listinfo.cgi/swi-prolog

 « Return to Thread: lambda-like continuations (was: maplist and friends)