Мне поставили задачу разбора естественного языка в Прологе.Пока у меня есть программа, работающая до некоторой степени.Он напечатает предложение, например, если я введу список [the, cat, sat, on, the, mat]
, он правильно выведет:
(noun_phrase(det(the), np2(noun(cat))), verb_phrase(verb(sat), pp(prep(on), noun_phrase(det(the), np2(noun(mat))))))
Следующее, что мне нужно сделать, это извлечь ключевые слова из предложения, т.е. извлечьсуществительное во фразе существительного, глагол во фразе глагола и существительное во фразе глагола, чтобы я мог вернуть список: [cat, sat, mat]
.Кто-нибудь может помочь мне начать, потому что я очень застрял в этом.Спасибо!
Мой текущий код:
sentence(S,sentence((NP), (VP))):-
nl,
np(S, NP, R),
vp(R, VP, []),
write('sentence('), nl, write(' '), write((NP))
,nl,write(' '), write((VP)),nl,write(' ').
np([X | S], noun_phrase(det(X), NP2), R) :- det(X), np2(S, NP2, R). np(S, NP, R) :- np2(S, NP, R). np(S, np(NP, PP), R) :- append(X, Y, S), /* Changed here - otherwise possible endless recursion */ pp(Y, PP, R), np(X, NP, []).
np2([X | R], np2(noun(X)), R) :- noun(X). np2([X | S], np2(adj(X), NP), R) :- adj(X), np2(S, NP, R).
pp([X | S], pp(prep(X), NP), R):- prep(X), np(S, NP, R).
vp([X | R], verb_phrase(verb(X)), R) :- /* Changed here - added the third argument */ verb(X). vp([X | S], verb_phrase(verb(X), PP), R) :- verb(X), pp(S, PP, R). vp([X | S], verb_phrase(verb(X), NP), R) :- verb(X), np(S, NP, R).
det(the). det(with). noun(cat). noun(mat). verb(sat). prep(on). adj(big).