Magasabbrendű eljárások

A VIK Wikiből
(PrologElm27 szócikkből átirányítva)

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


  • fejezetek: 4.10
  • fóliák: 238-243

Olyan eljárások, melyek argumentuma egy másik eljárás.

Megoldásgyűjtő eljárások

Lista páros elemeinek felsorolása:

findall(X, (member(X,L), X mod 2 =:= 0), Pk).

Meta-eljárások megoldásgyűtő eszközökkel

Tetszőleges Prolog predikátum szerint is szűrhetjük a listát.

filter(L, X, Pred, FL) :- 
	 findall(X, (member(X, L), call(Pred)), FL). 

A funkcionális nyelvekből jól ismert map függvény Prolog verziója:

map(L, X, Pred, Y, ML) :- 
	 findall(Y, (member(X, L), Pred), ML). 

Részlegesen paraméterezett eljárások

Egy olyan map függvényt írunk, amelynek olyan kifejezéseket adunk át, amelyek önmagukban nem hívhatók meg, hanem csak úgy, hogy ezeket a kifejezéseket ellátjuk két további paraméterrel. Ezeket a kifejezéseket tehát joggal nevezhetjük részlegesen paraméterezett eljáráshívásoknak.

Konvenció: a magasabbrendű műveletekben érdekelt argumentumok mindig a predikátum utolsó argumentum-pozícióin vannak.

% Pred utolsó két argumentumként az A és B kifejezésekkel  
% kiegészítve igaz. 
call2(Pred, A, B) :- 
	 Pred =.. FArgs,
	 append(FArgs, [A,B], FArgs2), 
	 Pred2 =.. FArgs2,
	 call(Pred2). 

Részleges paraméterezést használó magasabbrendű eljárások

 
% map(Xs, Pred, Ys): Az Xs lista elemeire a Pred transzformációt  
% alkalmazva kapjuk az Ys listát. 
map([X|Xs], Pred, [Y|Ys]) :- 
	 call2(Pred, X, Y), 
	 map(Xs, Pred, Ys). 
map([], _, []). 
 
negyzet(X, Y) :- Y is X*X. 
 
| ?- map([1,2,3,4], negyzet, L). 
L = [1,4,9,16] ? ; 
no