2015-06-26 6 views
0

Как уменьшить правило 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)}. 
+1

Какой вид Пролог/применяется это? Прологи скорее имеют 'call/N'. – false

+1

Возможно, вы используете [эту книгу] (http://www.mtome.com/Publications/PNLA/PNLA-code/index.html)? Это тот, который использует лямбды без переименования - очень похоже на то, что у вас есть. См., В частности, [semint.pl] (http://www.mtome.com/Publications/PNLA/PNLA-code/semint.pl). – false

+0

Нет, я не использую эту книгу. Я переопределял применение как: apply (X^P, X, P). – fenimi

ответ

3

Итак, позвольте мне начать с рекомендацией: Почитайте хотя бы главу 4 Prolog and Natural-Language Analysis, pdf. Он охватывает именно то, что вы смотрите на —, за исключением того, что apply/3 называется reduce/3. Этот apply/3 - это немного формальный способ объяснить вещи, то есть передачу параметров. Похоже, что для многих примеров вы немного перепутали это.

В качестве первого шага рассмотреть эту часть вашей программы:

apply(X^P,X,P). 

s(S) --> np(NP), vp(VP), {apply(VP, NP, S)}. 

Это соответствует к:

s(S) --> np(NP), vp(NP^S). 

Так эффективно, нет необходимости использовать apply/3 - это хороший устройство, но, наконец, выше обозначений еще более компактно, так как он использует меньше переменных.

Я рекомендую вам очистить свой код, мне было очень трудно его прочитать.


Сноски вы можете спокойно игнорировать
На самом деле, переписка является декларативным только преобразование может улучшить (= изменение) прекращение vp//1.

+1

Спасибо за рекомендацию, я прочитаю книгу – fenimi