【问题标题】:Infinite list of terminals – Prolog grammar rules终端的无限列表 - Prolog 语法规则
【发布时间】:2012-12-14 00:00:43
【问题描述】:

在使用语法规则时,是否可以在 Prolog 中定义无限数量的终端?

下面的例子描述了这个问题:

selection-->([if,'('],condition,[')',
then,'{'],commands,['}']);([if,'('],condition,[')',
then,'{'],commands,['}',else,'{'],commands,['}']).
condition-->[X].
commands-->[X].

这里,“条件”和“命令”块可以有不定数量的元素。如何在 Prolog 中指定?条件的产生规则和我在这里提供的命令只允许一个原子。

我希望下面的陈述是真实的,但是这条规则 condition-->[X]. 只允许括号之间有一个原子:

selection([if,'(',a,<,b,')',then,'{',a,+,+,'}',else,'{',c,'}'], []).

附录

如何让程序根据语句创建语法树?例如,如果输入以下语句:

selection( S, [ if, '(', a, &lt;, b, ')', then, '{', a, +, +, '}' ], [] ).,

结果应该是S = selection(if(condition([a,&lt;,b])),then(commands([a,+,+])))

我需要对代码进行哪些更改?

非常感谢您。

【问题讨论】:

    标签: if-statement prolog context-free-grammar dcg


    【解决方案1】:

    使用递归:

    condition --> [X], ( condition_separator, condition ; [] ).
    

    condition_separator 可以为空,然后省略它

    编辑

    要生成语法树,最简单的方法是向产品添加参数,再现“形状”(未经测试的代码):

    selection(Tree) -->
      [if,'('], condition(Condition1), [')', then,'{'], commands(Commands1), ['}'],
      {Tree = selection(Condition1, Commands1)}
      ;
      [if,'('],condition(Condition1),[')', then,'{'], commands(Commands1),
      ['}', else,'{'], commands(Commands2),['}'],
      {Tree = selection(Condition1, Commands1, Commands2)}
      .
    
    condition(X)-->[X].
    commands(X)-->[X].
    

    然后在访问树时使用不同的arity(参数计数)选择来恢复已解析的分支。

    假设我们有一个命令列表,其中每个命令都以 ';' 结尾:这可能是

    commands([C|Cs]) --> command(C), [';'], commands(Cs).
    commands([]) --> [].
    

    【讨论】:

    • 谢谢,这有帮助,但我遇到了另一个问题。请参阅“附录”下方的我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多