:-@/1
je to, že můžeme s jeho
pomocí přenést z funkcionálního programování ještě jeden užitečný
jev.
V některých funkcionálních jazycích, jejichž zástupcem je například Haskell, jsou s oblibou používány takzvané curry funkce. Ty umožňují ještě stručnější zápis a větší míru obecnosti v definicích. Myšlenka stojící v pozadí curryfikace je následující: aplikace funkce na argumenty , , ..., je ekvivalentní aplikaci na , která vrátí funkci, a následnou aplikaci této funkce postupně na , ..., . Tato postupná aplikace umožňuje dosáhnout větší pružnosti jak v definici, tak při použití funkce, protože umožňuje dodávat argumenty po částech a otevírá cestu k větší míře abstrakce.
Pokud je skrze :-@/1
zavolán predikát, u kterého nejsou zatím
specifikovány všechny parametry, je výsledkem částečná aplikace
curry predikátu:
?- :-@ [append,[1,3,5],R]. R = append([1,3,5]) Yes.Jakmile jsou všechny zbylé parametry známy, je zavolán samotný predikát:
?- :-@ [append,[1,3,5],T], | :-@ [T,[7,9],R]. T = append([1,3,5]) R = [1,3,5,7,9] YesProces postupné aplikace jednotlivých parametrů je prováděn automaticky, takže není nutné explicitně implementovat chování v jednotlivých případech volání s neúplným počtem parametrů, jak tomu je například v řešení publikovaném v práci Naish [12], protože se potřebný kód generuje podle obsahu databáze sám. Určitým omezením, které plyne z toho, že modelujeme chování funkcí pomocí predikátů je to, že poslední argument predikátu je rezervován pro výslednou hodnotu.
Na druhou stranu lze pomocí prostředků logického programování vytvářet konstrukce, které ve funkcionálním programování nejsou možné. Takovou konstrukcí je například navracení nebo použití různých módů proměnných.
Vzhledem k tomu, že proces curryfikace sebou samozřejmě nese určitou režii, je jeho použití v rámci knihovny volitelné.
Výše uvedené jednoduché příklady nejsou zatím příliš přesvědčivé. Skutečná síla curryfikace se ukáže zvláště v kombinaci s predikáty vyššího řádu, jenž vytvoříme v následující části.
dvorka 2013-12-31