一尘不染

有没有一种方法或算法可以将DCG转换为Prolog中的普通定句?

algorithm

我是Prolog的新手,我试图了解如何将语法从DCG转换为常规的确定句。我知道DCG表示法只是Prolog中常规定语从句的语法糖。我开始描述正常定语法和DCG之间的一些相似之处,但是未能应用相同的模式,所以我问是否有一些我遗漏的规则或可能有效的转换算法。

这是我正在研究的语法,这是我为了翻译该语法所做的工作:

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

该语法实际上检查算术运算的句法正确性。第一条规则实际上很容易转换,因为它的模式类似于普通的确定语法,第四条规则也是如此。但是我对其他四个都不了解。这是我如何转换规则:

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

阅读 210

收藏
2020-07-28

共1个答案

一尘不染

您在正确的轨道上!继续前进,您将获得如下信息:

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