有没有一种方法或一种算法转换成DCG Prolog中正常明确的条款?转换成、算法、条款、明确

2023-09-11 02:28:44 作者:绝望

我在序言一个新手,我试图了解如何语法可以转化为从DCG正常的明确条款。 我明白,DCG符号只是语法糖在序言正常明确条款。我开始描绘出正常确切语法和DCG中之间有一些相似之处,但未能采用同样的模式,所以我问的是有一些规则,我丢失或转换的算法可能会奏效。

下面是我的工作的语法,这里是我为了把这种语法做的:

  expr的 - >长期,addterm。
addterm  - > []。
addterm  - > [+],EXPR。
名词 - >因素,multfactor。
multfactor  - > []。
multfactor  - > [*], 术语。
因子 - > [Ⅰ],{整数(Ⅰ)}。
因子 - > ['('],EXPR,[')'。
 

这其实语法检查算术运算的语法正确性。 第一条规则实际上是很容易转换为模式类似于正常的明确语法,所以是第四之一。不过,我不知道对其他四个。这里是如何转换的规则:

  EXPR(E0,E): - 长期(E0,E1),addterm(E1,E)。
 
真正的百万答题 七大千年数学难题之 NP问题

解决方案

您是在正确的轨道!继续下去,你会得到这样的:

  EXPR(XS0,XS): - %EXPR  - >
   长期(XS0,XS1),%来看,
   addterm(XS1,XS)。 %addterm。

addterm(XS0,XS): - %addterm  - >
   XS0 =的X. %[]。
addterm(XS0,XS): - %addterm  - >
   XS0 = [+ | XS1]%[+],
   EXPR(XS1,XS)。 %EXPR。

长期(XS0,XS): - %名词 - >
   因子(XS0,XS1),%因子,
   multfactor(XS1,XS)。 %multfactor。

multfactor(XS0,XS): - %multfactor  - >
   XS0 =的X. %[]。
multfactor(XS0,XS): - %multfactor  - >
   XS0 = [* | XS1],%[*],
   长期(XS1,XS)。 %    术语。

因子(XS0,XS): - %的因素 - >
   XS0 =〔I |两个X],%[I]
   整数(I)中。 %{整数(Ⅰ)}。
因子(XS0,XS): - %的因素 - >
   XS0 = ['('| XS1],%['('],
   EXPR(XS1,XS2),%EXPR,
   XS2 = [')'|两个X]。 `%[')'。
 

I am a newbie in Prolog, and I am trying to understand how a grammar can be translated into a normal definite clause from a DCG. I understood that DCG notation is just syntactic sugar for normal definite clauses in Prolog. I started to depict some similarities between the normal definite grammars, and the DCGs, but failed to apply the same pattern, so I am asking is there some rules that I am missing or an algorithm of conversion that might work.

Here is the grammar that I am working on, and here is what I did in order to translate that grammar:

expr --> term, addterm.
addterm --> [].
addterm --> [+], expr.
term --> factor, multfactor.
multfactor --> [].
multfactor --> [*], term.
factor --> [I], {integer(I)}.
factor --> ['('], expr, [')'].

This grammar actually checks the syntactic correctness of arithmetic operations. The first rule is actually easy to convert as its pattern is similar to normal definite grammars, and so is the 4th one. However I have no clue about the other four. Here is How I converted the rule:

expr(E0,E) :- term(E0,E1), addterm(E1,E).

解决方案

You are on the right track! Keep on going and you will get to something like this:

expr(Xs0,Xs) :-                         % expr -->
   term(Xs0,Xs1),                       %    term,
   addterm(Xs1,Xs).                     %    addterm.

addterm(Xs0,Xs) :-                      % addterm --> 
   Xs0 = Xs.                            %    [].
addterm(Xs0,Xs) :-                      % addterm -->
   Xs0 = [+|Xs1],                       %    [+], 
   expr(Xs1,Xs).                        %    expr. 

term(Xs0,Xs) :-                         % term --> 
   factor(Xs0,Xs1),                     %    factor,
   multfactor(Xs1,Xs).                  %    multfactor.

multfactor(Xs0,Xs) :-                   % multfactor -->
   Xs0 = Xs.                            %    [].
multfactor(Xs0,Xs) :-                   % multfactor -->
   Xs0 = [*|Xs1],                       %    [*],
   term(Xs1,Xs).                        %    term.  

factor(Xs0,Xs) :-                       % factor --> 
   Xs0 = [I|Xs],                        %    [I],
   integer(I).                          %    {integer(I)}.
factor(Xs0,Xs) :-                       % factor --> 
   Xs0 = ['('|Xs1],                     %    ['('], 
   expr(Xs1,Xs2),                       %    expr,
   Xs2 = [')'|Xs]. `                    %    [')'].