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