Пролог: Приговор Парсер - PullRequest
       11

Пролог: Приговор Парсер

1 голос
/ 29 апреля 2010

Сидел здесь часами, просто уставился на этот код и понятия не имею, что я делаю не так. Я знаю, что происходит из-за трассировки кода (он идет по вечному циклу при обращении к verbPhrase). Любые советы более чем приветствуются. Спасибо.

% 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 Ответ

1 голос
/ 29 апреля 2010

Я понял это сейчас после небольшого троллинга в интернете, поэтому отвечу здесь, если кто-то еще борется с этим.

Проблема заключалась в том, что приложение создавало пустой список. Этот список был передан в качестве параметра, а затем снова разделен на два пустых списка. И это повторялось снова и снова. Чтобы остановить это, каждый раз, когда используется функция добавления, должна быть проверка, если списки пусты.

Например

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