0

使用语法规则时,是否可以在 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, <, b, ')', then, '{', a, +, +, '}' ], [] ).,

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

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

非常感谢您提前。

4

1 回答 1

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([]) --> [].
于 2012-12-14T06:26:41.987 回答