2010-04-29 93 views
1

在这里呆了几个小时,现在只是盯着这段代码,不知道我做错了什么。通过跟踪代码,我知道发生了什么事(当它碰到verbPhrase时,它正在进行一个永恒的循环)。任何提示都更受欢迎。谢谢。Prolog:Sentence Parser

% Knowledge-base 
det(the). 
det(a). 

adjective(quick). 
adjective(brown). 
adjective(orange). 
adjective(sweet). 

noun(cat). 
noun(mat). 
noun(fox). 
noun(cucumber). 
noun(saw). 
noun(mother). 
noun(father). 
noun(family). 
noun(depression). 

prep(on). 
prep(with). 

verb(sat). 
verb(nibbled). 
verb(ran). 
verb(looked). 
verb(is). 
verb(has). 

% Sentece Structures 
sentence(Phrase) :- 
     append(NounPhrase, VerbPhrase, Phrase), 
     nounPhrase(NounPhrase), 
     verbPhrase(VerbPhrase). 

sentence(Phrase) :- 
verbPhrase(Phrase). 

nounPhrase([]). 

nounPhrase([Head | Tail]) :- 
det(Head), 
nounPhrase2(Tail). 

nounPhrase(Phrase) :- 
nounPhrase2(Phrase). 

nounPhrase(Phrase) :- 
append(NP, PP, Phrase), 
nounPhrase(NP), 
prepPhrase(PP). 

nounPhrase2([]). 

nounPhrase2(Word) :- 
noun(Word). 

nounPhrase2([Head | Tail]) :- 
adjective(Head), 
nounPhrase2(Tail). 

prepPhrase([]). 

prepPhrase([Head | Tail]) :- 
prep(Head), 
nounPhrase(Tail). 

verbPhrase([]). 

verbPhrase(Word) :- 
verb(Word). 

verbPhrase([Head | Tail]) :- 
verb(Head), 
nounPhrase(Tail). 

verbPhrase(Phrase) :- 
append(VP, PP, Phrase), 
verbPhrase(VP), 
prepPhrase(PP). 

回答

1

现在我想通过一些曳网络来解决这个问题,所以如果有其他人与之斗争,我会在这里回答。

问题是append创建了一个空列表。该列表作为参数传递,然后再分成两个空列表。这一遍又一遍地重复着。为了防止这种情况发生,每次使用附加功能时,必须检查列表是否为空。

例如

verbPhrase(Phrase):- 
append(VP, PP, Phrase), 
VP \= [], 
PP \= [], 
verbPhrase(VP), 
prepPhrase(PP).