Magasabbrendű eljárások
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