Příklady

Na závěr této části si ukažme tři příklady použití výše definovaných predikátů, díky nimž můžeme nyní i v Prologu plně využívat výhod programování vyššího řádu:

mapList aplikuje na podseznamy seznamu [[5,6,7],[8,9]] predikáty zip/4filter/3 složené pomocí =->/4. Nejprve zip/4 spojí zpracovávaný podseznam s [1,2,3] pomocí operace */3 a ze získaného výsledku potom filter/3 odstraní sudá čísla:

?- :-@ [mapList(filter(isOdd) =-> zip(*,[1,2,3])),
|       [[5,6,7],[8,9]],
|       R].
R= [[5, 21], []]
Yes.

Druhý příklad je zajímavější -- využívá se v něm curryfikace. =->/4 skládá predikáty foldR/4mapList/3. Vstupní argument [[0,1],[2]] je nejdříve narovnán voláním foldR/4 s použitím append/3 a iniciální hodnoty []. Na prvky takto získaného seznamu [0,1,2] pak mapList/3 provede částečnou aplikaci operace +/3. Vyhodnocení by proběhlo pouze v případě, pokud by byly doplněny i zbývající parametry operace +/3:

?- :-@ [mapList(+) =-> foldR(append,[]),[[0,1],[2]],R].
R= [+(0), +(1), +(2)]
Yes

Poslední příklad ukazuje cíl, který by při obvyklém volání skončil chybou nebo selháním, díky curryfikaci však proběhne úspěšně:

?- foldR(append =-> mapList(+(3)),[],[[3],[5,6]],R).
R = [6, 8, 9] 
Yes
Ke každému prvku v seznamu seznamů se přičte číslo 3 a výsledné seznamy se spojí do jednoho. Bez curryfikace by došlo k chybě, protože během výpočtu je volán cíl =->/5, který není definován:
:-@ [append =-> mapList(+(3)), [5,6], [], R]
Výpočet však skončí úspěšně, neboť jsou parametry přidávány postupně a ne najednou.

Tím jsme si ukázali pro náš účel nejdůležitější predikáty vyššího řádu. Uzavřeme tuto kapitolu konstatováním, že knihovna kombinátorů obsahuje i další, jenž nejsou popsány v textu práce -- v případě zájmu můžete nahlédnout do zdrojových textů.

dvorka 2013-12-31