webForumDet fria alternativet

Prologfråga

1 svar · 360 visningar · startad av CombatAnna

CombatAnnaMedlem sedan dec. 20061 inlägg
#1

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 ;)

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#2

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 :)

134 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)