Detekce $\varepsilon$-přechodů

V tomto odstavci vytvoříme mód, v němž spuštěný parser určí, zda je či není schopen přijímat prázdný řetězec. Pro tento účel zavedeme nový selektor empty/0. V módu empty/0 je provedena abstraktní interpretace za účelem analýzy parseru. Pokud je schopen přijmout prázdný řetězec, vydá atom true, v opačném případě vydá false.

Nejdříve si ukážeme některá ze základních primitiv:

epsilon(empty+true).
return(_,empty+true).
terminate(empty+false).

item(empty+false).

fulfil(_,empty+false).
symbol(_,empty+false).
Rozšíření definic konstruktorů je velmi přirozené. Sekvenční kompozice parserů $P1$$P2$ přijímá prázdný řetězec právě tehdy, když jej přijímá jak $P1$ tak $P2$:
<&>(P1,P2,empty+Empty):-
        empty+Empty1 :-> P1,
        empty+Empty2 :-> P2,
        pcAND(Empty1,Empty2,Empty).
Alternativní kompozice parserů $P1$$P2$ přijímá prázdný řetězec právě tehdy, když jej přijímá buď parser $P1$ nebo $P2$:
<:>(P1,P2,empty+Empty):-
        empty+Empty1 :-> P1,
        empty+Empty2 :-> P2,
        pcOR(Empty1,Empty2,Empty).
Doplnění klauzulí módu je nutné pouze u základních kombinátorů a mutátorů. Složitější parsery nemusejí být doplňovány ani modifikovány, protože jsou z nich složeny. Můžeme si proto hned ukázat parser double v módu empty/0. Bez zásahů do zdrojového kódu nám vydá požadovaný výsledek:
?- empty+Empty :-> double.
Empty = false 
Yes
Výpočet v empty/0 se od doposud představených módů liší tím, že má charakter abstraktní interpretace parseru. Při výpočtu se neprovádí rozklad, ale získávají se informace o jeho vlastnostech. Stejný charakter bude mít i mód, který vytvoříme v následující části.

dvorka 2013-12-31