Re: Higher order programming: apply/3 implemented in swi
- From: "levilista@xxxxxxxxx" <levilista@xxxxxxxxx>
- Date: Sun, 18 May 2008 02:05:33 -0700 (PDT)
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.
.
- Follow-Ups:
- Re: Higher order programming: apply/3 implemented in swi
- From: Jan Wielemaker
- Re: Higher order programming: apply/3 implemented in swi
- References:
- Higher order programming: apply/3 implemented in swi
- From: levilista@xxxxxxxxx
- Re: Higher order programming: apply/3 implemented in swi
- From: Jan Wielemaker
- Higher order programming: apply/3 implemented in swi
- Prev by Date: Re: Higher order programming: apply/3 implemented in swi
- Next by Date: Re: Higher order programming: apply/3 implemented in swi
- Previous by thread: Re: Higher order programming: apply/3 implemented in swi
- Next by thread: Re: Higher order programming: apply/3 implemented in swi
- Index(es):
Relevant Pages
|