Jag vill göra en shift reduce-parser (för språkteknologisk användning) som skall ge outputten:
X = [(s, (np, jag), vp, (vTr, hatade), n, motet)]
På frågan:
parse([jag,hatade,motet],X).
Men i nuläget ger programmet svaret:
X=[]
Jag trodde att jag i basfallet sa att accepterandestadiet ska vara en lista som börjar på (s. Det gör mig ganska förvirrad att svaret i nuläget kan bli tomma listan. Tracear man så ser man att programmet kommer fram till rätt lösning, just innan den börjar tömma stacken igen. Och returnerar följaktligen en tom lista.
Mitt program ser ut så här:
:-op(500,xfx,::).
:-op(500,xfx,--->).
np::jag.
vTr::hatade.
n::motet.
s --->[np,vp].
np --->[n].
vp --->[vTr, n].
parse([],[(s,_)]).
% Shift
parse([Word|Words],Stack):-
(Cat :: Word),
parse(Words,[(Cat,Word)|Stack]).
% Reduce för regel -> 1 kategori
parse(Input,[(Cat,Word)|Stack]):-
VH ---> [Cat],
parse(Input,[(VH,(Cat,Word))|Stack]).
% Reduce för regel -> 2 kategorier
parse(Input,[(Cat2,Word2),(Cat1,Word1)|Stack]):-
VH ---> [Cat1,Cat2],
parse(Input,[(VH,(Cat1,Word1),(Cat2,Word2))|Stack]).
Någon som ser vad jag har gjort fel?
Det kanske t.o.m är uppenbart för en rutinerad, till skillnad mot mig ;)