有没有一种方法或一种算法转换成DCG Prolog中正常明确的条款? [英] Is there a way or an algorithm to convert DCG into normal definite clauses in Prolog?

查看:130
本文介绍了有没有一种方法或一种算法转换成DCG Prolog中正常明确的条款?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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

  EXPR(E0,E): - 长期(E0,E1),addterm(E1,E)。
 

解决方案

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

  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]. `                    %    [')'].      

这篇关于有没有一种方法或一种算法转换成DCG Prolog中正常明确的条款?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆