webForumDet fria alternativet

Prologfråga

Programmering

1 svar · 362 visningar · startad av CombatAnna

Medlem sedan dec. 20061 inlägg
Frågan#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 ;)

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

262 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)