V knihovně kombinátorů parserů jsou n-tice reprezentovány
posloupností položek zřetězených pomocí operátoru >/2
--
jako vhnízděné dvojice.
Již při návrhu rozhraní parserů jsme zvolili konvenci, v níž je
výsledek v seznamu úspěšných rozkladů svázán s nezpracovanou částí
vstupu do dvojice operátorem >/2
. Výše uvedenou reprezentaci
n-tic budeme také velmi často používat uvnitř výsledků samotných
k zachycení struktury vstupního textu -- položky n-tic budou
řetězeny jak s levou, tak s pravou asociativitou.
Proto jsou připraveny predikáty umožňující manipulace s n-ticemi, které jsou navrženy s ohledem na využívání v predikátech vyššího řádu, kde také nacházejí největší uplatnění. Představíme si pouze ty nejdůležitější. Prvním z nich je konstruktor dvojice:
% *>*(+FunN, +FunR, +Input, -NewTuple) *>*(FunN,FunR,I,(N>R)):- :-@[FunN,I,N], :-@[FunR,I,R].a dalšími dvěmi jsou selektory:
% fstTuple(+Tuple, -NotParsedRest) fstTuple(N>_,N). % sndTuple(+Tuple, -Result) sndTuple(_>R,R).V případech, kdy je term s n-ticí přímo dostupný, je použití výše uvedených predikátů zpravidla zbytečné, avšak při manipulacích v predikátech vyššího řádu se bez nich neobejdeme. To platí i pro následující predikát určený ke konverzi mezi n-ticemi a prologovským seznamem:
% tuple2List(?Tuple, ?List) tuple2List((R1>R2),[R1|R2]).Další dva predikáty jsou obdobami základních operací se seznamy. Variantami pro n-tice jsou
memberTuple/2
pro určení
výskytu prvku v n-tici a appendTuple/3
pro řetězení n-tic.
Nakonec si ještě ukažme příklad použití nově zavedených predikátů:
?- mapList(fstTuple *>* (const(mod) *>* sndTuple), | ["x">"y","y">"z"], | R). R= ["x"> (mod>"y"), "y"> (mod>"z")] Yesdvorka 2013-12-31