2010-04-29 3 views
1

Был здесь часами, просто смотрел на этот код и понятия не имею, что я делаю неправильно. Я знаю, что происходит от отслеживания кода (он проходит вечный цикл, когда он набирает verbPhrase). Любые советы приветствуются. Спасибо.Пролог: 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 создавал пустой список. Этот список был передан как параметр, а затем снова разбит на два пустых списка. И это повторялось снова и снова. Чтобы остановить это, каждый раз, когда используется функция append, должна быть проверка, являются ли списки пустыми.

Например

verbPhrase(Phrase):- 
append(VP, PP, Phrase), 
VP \= [], 
PP \= [], 
verbPhrase(VP), 
prepPhrase(PP). 
Смежные вопросы