mapList
aplikuje na podseznamy seznamu [[5,6,7],[8,9]]
predikáty
zip/4
a filter/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/4
a mapList/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] YesKe 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