Reprezentace n-tic

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")]
Yes
dvorka 2013-12-31