Re: Higher order programming: apply/3 implemented in swi



On May 18, 10:55 am, Jan Wielemaker <j...@xxxxxxxxxxxxxxxxxxx> wrote:
On 2008-05-18, levili...@xxxxxxxxx <levili...@xxxxxxxxx> wrote:

Theapply/3predicate is crucial for higher order programming in
prolog.

Is it? In many cases it can be replaced by call/2... That is
what is used in maplist/2.., etc.

Maybe I'm just reinventing the wheel, but I haven't foundapply/3in
the manual, or on other prolog sites. And as I saw on this group's
archives, there were some unresolved thread relating to it.

It has apply/2 which, I think, is the same as

apply(F, Args) :-
apply(F, Args, Goal),
call(Goal).

In practice however, the length of Args is almost always known at
compiletime, and thus we can use call/2... and avoid the need to
build a list, count its elements, etc.



I wrote it, as it was specified here:

http://www.cs.mu.oz.au/~lee/papers/ho/

I copy my code here:

%apply(f(a,b),[c,d,e],f(a,b,c,d,e))
apply(F,A,FA):-
functor(F,Atom,Argc),
countlist(Argc,Argindexes),reverse(Argindexes,Argindexes1),
findall(X,(member(Y,Argindexes1),arg(Y,F,X)),Y),
append(Y,A,YA),
length(YA,Argc1),
functor(FA,Atom,Argc1),
dressup(Argc1,FA,YA).

dressup(0,_,_):-!.
dressup(Index,Expr,ParamList):-
elementat(Index,ParamList,Param),arg(Index,Expr,Param),
I1 is Index-1,dressup(I1,Expr,ParamList).

% countlist(?C,?L)
%L contains numbers from C to 1
countlist(0,[]):-!.
countlist(C,[C|T]):-
C1 is C-1, countlist(C1,T).

elementat(1,[H|_],H):-!.
elementat(C,[_|T],R):- C1 is C-1, elementat(C1,T,R).

What about this?

apply(F,Args,Term) :-
F =.. List,
append(List, Args, All),
Term =.. All.

Cheers --- Jan

When using the lambda notation in functional languages, we can create
semi substituted functions. In prolog its equivalent is a predicate
with incorrect arity. Calling it will give us errors. apply/2 calls it
prematurely, that's the problem.
.



Relevant Pages

  • Re: Higher order programming: apply/3 implemented in swi
    ... In many cases it can be replaced by call/2... ... what is used in maplist/2.., ... or on other prolog sites. ... apply(F, Args):- ...
    (comp.lang.prolog)
  • Re: Prolog summer quiz!
    ... But entering queries doesn't work as expected. ... call/2 - that was the only thing I thought when I wrote this. ... encodings in Prolog. ...
    (comp.lang.prolog)
  • Re: Calling C code in prolog
    ... predicat from C in prolog, my prolog is not that strong as i've only ... with the right signature (taking as many term_t args as it has Prolog ... Start Prolog (The example writes to standard out, ...
    (comp.lang.prolog)