在处理语法规则时,是否可以在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,+,+])))
。
我需要对代码进行哪些更改?
非常感谢你。
答案 0 :(得分: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([]) --> [].