Я знаю, что раньше меня об этом спрашивали, но я до сих пор не могу понять, что не так.Я пытаюсь создать DCG, которая может обрабатывать различие между субъектом / объектом, различие в единственном / множественном числе, способно создавать деревья разбора и использовать отдельный словарь.
У меня есть этот код:
lex(the,det,_).
lex(a,det,singular).
lex(man,n,singular).
lex(men,n,plural).
lex(apple,n,singular).
lex(apples,n,plural).
lex(eat,v,plural).
lex(eats,v,singular).
lex(i,pronoun,singular,subject).
lex(we,pronoun,plural,subject).
lex(me,pronoun,singular,object).
lex(us,pronoun,plural,object).
lex(you,pronoun,_,_).
lex(he,pronoun,singular,subject).
lex(she,pronoun,singular,subject).
lex(him,pronoun,singular,object).
lex(her,pronoun,singular,object).
lex(they,pronoun,plural,subject).
lex(them,pronoun,plural,object).
lex(it,pronoun,singular,_).
s(s(NP, VP), Q, P) --> np(NP, Q, P), vp(VP, Q).
np(np(DET, N), Q, _) --> det(DET, Q), n(N, Q).
np(np(PRONOUN), Q, P) --> pronoun(PRONOUN, Q, P).
vp(vp(V, NP), Q) --> v(V, Q), np(NP, _, object).
vp(vp(V), Q) --> v(V, Q).
det(det(W), Q) --> [W], {lex(W, det, Q)}.
pronoun(pronoun(W), Q, P) --> [W], {lex(W, pronoun, Q, P)}.
n(n(W), Q) --> [W], {lex(W, n, Q)}.
v(v(W), Q) --> [W], {lex(W, v, Q)}.
когда я проверяю его с помощью s (X, [он ест, яблоко], []).Я хочу получить вывод X = s (np (местоимение (он, единственное число, субъект)), vp (v (ест, единственное число), np (det (то, единственное число), n (яблоко, единственное число, объект)))).
Но я получаю ошибку, неперехваченное исключение: ошибка (наличие_сервера (процедура, с / 3), верхний_уровень / 0).и ОШИБКА: неопределенная процедура: s / 3 Однако существуют определения для: s / 5
ОШИБКА: поток user_input: 6: 1 Синтаксическая ошибка: неожиданный конец файла
Я попытался изменить егона
s(s(NP, VP)) --> np(NP, Q, P), vp(VP, Q).
но тогда я получаю вывод: X = s (np (местоимение (он)), vp (v (ест)), np (det (the), n (apple))))Я не могу понять, где я иду не так.Любой совет приветствуется.