Hej och välkommen till Webforum :)
Det kanske är ont om Prolog experter här på webforum.
Här finns ett annat forum: http://www.tek-tips.com/threadminder.cfm?pid=345
Vi får se om någon klarar att svara på detta här :)
1 svar · 362 visningar · startad av CombatAnna
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 ;)
Hej och välkommen till Webforum :)
Det kanske är ont om Prolog experter här på webforum.
Här finns ett annat forum: http://www.tek-tips.com/threadminder.cfm?pid=345
Vi får se om någon klarar att svara på detta här :)