Как уменьшить правило DCG, подобное этому dtv (P1^P2^P3^Q1), используя apply (X^P, X, P)? Я пытаюсь описать семантику различных грамматических компонентов, и я использую лямбда-исчисление. Это то, что у меня есть для ditransitive глаголов, однако вторая функция приложения не работает, и мне интересно, что я делаю неправильно.Reducing Complex DCGs Prolog
dtv(P1^P2^P3^Q1)-->[gave],
{apply(P1,X^Q3,Q1)},
{apply(P,Y^Q3, P2)},
{apply(P3,Z^gave(X,Y,Z),Q3)}.
Это полный код ниже:
% Apply function takes a lambda expression in the form X^P. It unifies X
% in the first argument with the second argument to get a result P
apply(X^P, X,P).
%%%%%%%%
%SYNTAX
%%%%%%%%
% I converted the lambda symbol to^in order to make it consistent with
% the prolog convention and also the library module on lambda.
s(S) --> np(NP), vp(VP),
{apply(VP, NP, S)}.%This applies NP and VP to get S
adjp(Adjp)-->adj(Adj),noun(X^P),
{apply(Adj,X^P,Adjp)}.%This applies Adjective to noun to get an
% adjective Phrase
np(NP) --> det(Det), noun(X^P), {apply(Det, X^P, NP)}.%Applies Determiner and Noun to get NounPhrase
np(NP) --> pn(NP).
np(NP)-->det(Det), adjp(Adjp),
{apply(Det,Adjp,NP)}.%This applies determiner to adjective phrase to get a Noun Phrase
pp(PP)-->prep(Prep),np(NP),%prepositional phrase
{apply(Prep,NP,PP)}.
mp(MP)--> dtv(DTV),np(NP),
{apply(DTV,NP,MP)}.%This applies ditransitive verb
%noun phrase to get a modal phrase.
vp(VP)--> tv(TV), np(NP),
{apply(TV, NP, VP)}.%This applies transitive verb, noun phrase
% to get a verb phrase.
vp(VP)--> modal(M),np(NP),
{apply(M, NP, VP)}.%This applies modal (to be) to an adjective to get a verb phrase.
vp(VP)--> mp(MP),pp(PP),
{apply(MP,PP,VP)}.%This applies ditransitive verb,
%noun phrase to get a verb phrase.
vp(VP) --> iv(VP).
%%%%%%%%
% LEXICON
%%%%%%%%
prep(X^to(X))-->[to].
modal(R^S^M)-->[is],
{apply(R,X,M)},
{apply(S,X,M)}.
noun(X^food(X))-->[food].
noun(X^girl(X))-->[girl].
adj((X^P)^(Y^and(P,beautiful(Y))))-->[beautiful].
pn(P^Q)-->[jane],
{apply(P,jane,Q)}.
iv(P^Q)-->[runs],
{apply(P,X^runs(X),Q)}.
iv(P^Q)-->[sings],
{apply(P,X^sings(X),Q)}.
tv(P1^P2^Q2)-->[loves],
{apply(P2,X^Q1,Q2)},
{apply(P1,Y^loves(X,Y),Q1)}.
%Problem spot
dtv(P1^P2^P3^Q1)-->[gave],
{apply(P1,X^Q3,P2)},
{apply(P2^P3,Y^Q3, P)},
{apply(Q1,Z^gave(X,Y,Z),Q3)}.
det(P1^P2^the(X,Q1,Q2))-->[the],
{apply(P1,X,Q1)},
{apply(P2,X,Q2)}.
det(P1^P2^a(X,Q1,Q2))-->[a],
{apply(P1,X,Q1)},
{apply(P2,X,Q2)}.
Какой вид Пролог/применяется это? Прологи скорее имеют 'call/N'. – false
Возможно, вы используете [эту книгу] (http://www.mtome.com/Publications/PNLA/PNLA-code/index.html)? Это тот, который использует лямбды без переименования - очень похоже на то, что у вас есть. См., В частности, [semint.pl] (http://www.mtome.com/Publications/PNLA/PNLA-code/semint.pl). – false
Нет, я не использую эту книгу. Я переопределял применение как: apply (X^P, X, P). – fenimi