简化复杂DCGs-Prolog

简化复杂DCGs-Prolog,prolog,dcg,lambda-calculus,Prolog,Dcg,Lambda Calculus,我如何使用apply(X^p,X,p)减少像这个dtv(P1^P2^P3^Q1)这样的DCG规则? 我试图描述不同语法成分的语义,并使用lambda演算。 这就是我对双及物动词所做的,然而,第二个apply函数不起作用,我想知道我做错了什么 dtv(P1^P2^P3^Q1)-->[gave], {apply(P1,X^Q3,Q1)}, {apply(P,Y^Q3, P2)}, {apply(P3,Z^gave(X,Y,Z),Q3)}. 以下是完整代码: % Ap

我如何使用apply(X^p,X,p)减少像这个dtv(P1^P2^P3^Q1)这样的DCG规则? 我试图描述不同语法成分的语义,并使用lambda演算。 这就是我对双及物动词所做的,然而,第二个apply函数不起作用,我想知道我做错了什么

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)}.

所以,让我从一个建议开始:至少阅读第4章。它完全涵盖了您所看到的内容—例外情况是
apply/3
被称为
reduce/3
。这个
apply/3
是一种有点形式化的解释方式,即参数传递。看起来,对于很多例子,你都有点混淆了

作为第一步,考虑你的程序的这个部分:

apply(X^P,X,P).

s(S) --> np(NP), vp(VP), {apply(VP, NP, S)}.
这对应于1:

因此,实际上,不需要使用
apply/3
——这是一个很好的设备,但最后,上面的符号更紧凑,因为它使用的变量更少

我建议你清理你的代码,我发现它很难阅读


您可以放心地忽略脚注

1实际上,通信只是一个声明性的,转换可能会改进(=更改)对
vp//1

的终止,因此,让我从一个建议开始:至少阅读。它完全涵盖了您所看到的内容—例外情况是
apply/3
被称为
reduce/3
。这个
apply/3
是一种有点形式化的解释方式,即参数传递。看起来,对于很多例子,你都有点混淆了

作为第一步,考虑你的程序的这个部分:

apply(X^P,X,P).

s(S) --> np(NP), vp(VP), {apply(VP, NP, S)}.
这对应于1:

因此,实际上,不需要使用
apply/3
——这是一个很好的设备,但最后,上面的符号更紧凑,因为它使用的变量更少

我建议你清理你的代码,我发现它很难阅读


您可以放心地忽略脚注

1实际上,通信只是一个声明性的,转换可能会改进(=更改)对
vp//1

的终止,因此,让我从一个建议开始:至少阅读。它完全涵盖了您所看到的内容—例外情况是
apply/3
被称为
reduce/3
。这个
apply/3
是一种有点形式化的解释方式,即参数传递。看起来,对于很多例子,你都有点混淆了

作为第一步,考虑你的程序的这个部分:

apply(X^P,X,P).

s(S) --> np(NP), vp(VP), {apply(VP, NP, S)}.
这对应于1:

因此,实际上,不需要使用
apply/3
——这是一个很好的设备,但最后,上面的符号更紧凑,因为它使用的变量更少

我建议你清理你的代码,我发现它很难阅读


您可以放心地忽略脚注

1实际上,通信只是一个声明性的,转换可能会改进(=更改)对
vp//1

的终止,因此,让我从一个建议开始:至少阅读。它完全涵盖了您所看到的内容—例外情况是
apply/3
被称为
reduce/3
。这个
apply/3
是一种有点形式化的解释方式,即参数传递。看起来,对于很多例子,你都有点混淆了

作为第一步,考虑你的程序的这个部分:

apply(X^P,X,P).

s(S) --> np(NP), vp(VP), {apply(VP, NP, S)}.
这对应于1:

因此,实际上,不需要使用
apply/3
——这是一个很好的设备,但最后,上面的符号更紧凑,因为它使用的变量更少

我建议你清理你的代码,我发现它很难阅读


您可以放心地忽略脚注


1实际上,通信只是一个声明性的,转换可能会改进(=更改)对
vp//1

的终止,这是什么类型的Prolog/apply?序言中有
调用/N
。您是否正在使用?它使用lambdas而不重命名,这与您所拥有的非常相似。特别要看。不,我没有用那本书。我将apply重新定义为:apply(X^P,X,P)。此外,第一个和第三个apply用于减少lambda函数。第二个有问题。谢谢你给出的例子太不完整,无法直接帮助你。但是我怀疑,如果你有三个不同的^,你也必须使用apply/3三次。这是什么样的Prolog/apply?序言中有
调用/N
。您是否正在使用?它使用lambdas而不重命名,这与您所拥有的非常相似。特别要看。不,我没有用那本书。我将apply重新定义为:apply(X^P,X,P)。此外,第一个和第三个apply用于减少lambda函数。第二个有问题。谢谢你给出的例子太不完整,无法直接帮助你。但是我怀疑,如果你有三个不同的^,你也必须使用apply/3三次。这是什么样的Prolog/apply?序言中有
调用/N
。您是否正在使用?它使用lambdas而不重命名,这与您所拥有的非常相似。特别要看。不,我没有用那本书。我将apply重新定义为:apply(X^P,X,P)。此外,第一个和第三个apply用于减少lambda函数。第二个有问题。谢谢你给出的例子太不完整,无法直接帮助你。但是我怀疑,如果你有三个不同的^,你也必须使用apply/3三次。这是什么样的Prolog/apply?序言中有
调用/N
。您是否正在使用?它使用lambdas而不重命名,这与您所拥有的非常相似。特别要看。不,我没有用那本书。我将apply重新定义为:apply(X^P,X,P)。此外,第一个和第三个apply用于减少lambda函数