Jak známo, v Prologu mají data i kód stejnou syntaxi a při interpretaci
programů mají také podobnou reprezentaci. Aby bylo vůbec možné programování
vyššího řádu realizovat, musejí být k dispozici predikáty pro vytváření
kódu z dat. Do jazyka Prolog je k tomuto účelu zařazen standardní predikát
call/1
, který svůj jediný parametr v podobě datového termu
interpretuje jako kód a vykoná jej.
Typický způsob použití call/1
je spojen s operátorem univ:
?- G =.. [mod, 23, 7, X], call(G). G = mod(23, 7, 2) X = 2 YesZáklad podpory programování vyššího řádu tvořený
call/1
je někdy
ještě doplněn variantami predikátů apply/2
a call/n
:
call/1
:?- call(mod(23), 7, X). % ?- call(mod(23,7,X)). X = 2 Yes
V efektivnější variantě je predikát realizován vestavěním do
prologovského interpretu. Tím se však call/n
stává ve své podstatě predikátem s proměnným počtem argumentů.
Pokud call/n
vestavěn není, je zpravidla implementován pro
jednotlivé arity zvlášť, což je v jistém smyslu čistší řešení.
Umožňuje klasickou interpretaci takového predikátu, jeho arita
je ovšem omezena.
?- apply(mod(23), [7, X]). % ?- call(mod(23,7,X)). X = 2 YesPredikát
apply/2
je tedy sémanticky ekvivalentní a mnohem
přijatelnější variantou predikátu call/n
. Jeho implementace
také bývá označována jako efektivnější -- není totiž nutné analyzovat
dopředu neznámý počet argumentů.
apply/2
je z hlediska logického programování
čistší. Ani on však není běžnou součástí prologovských interpretů.
dvorka 2013-12-31