【问题标题】:How to represent optionality and 0 or more in Prolog rules?如何在 Prolog 规则中表示可选性和 0 或更多?
【发布时间】:2015-05-03 10:36:04
【问题描述】:

我正在尝试编写规则以使用递归表示 0 或更多:EBNF 中的规则如下:

translation_unit 
        => external_declaration  { external_declaration}

我的猜测如下:

translation_unit(Xs0,Xs) :-                         
         [external_declaration|Xs]. 

我还想在另一个规则中表示可选性,如下所示:

declaration_specifiers_next
  a.    : ε
  b.    | declaration_specifiers

我的猜测是:

  declaration_specifiers_next(Xs0, Xs)
        :- ε,
           [declaration_specifiers|Xs]

我也对我们在这种情况下给规则标题的论点感到困惑:(Xs0, Xs) 它们实际上是什么意思?

【问题讨论】:

  • “我的猜测是”是什么意思?您是否尝试通过随机输入符号来创建程序?如果您甚至没有定义(Xs0, Xs) 的含义,您想如何实现translation_unit(Xs0, Xs)?这是你的程序,如果你不知道你想让它做什么,别人怎么知道?
  • ε, [declaration_specifiers|Xs] 不正确,因为 , 代表 Prolog 中的连词,而不是 BNF 建议的析取。此外,[declaration_specifiers|Xs] 本身的列表不是有效的 Prolog 查询。你熟悉 Prolog 的基础知识吗?您可能想研究一下而不是猜测。 ;) 对于这样的事情,DCG 将是理想的:declaration_specifiers_next --> [] | declaration_specifiers.declaration_specifiers -->...
  • 非常感谢您的建议 :) 我会考虑的

标签: prolog grammar rule bnf dcg


【解决方案1】:

第一个子句的主体是一个列表,Prolog 系统将其视为对预定义谓词 consult 的调用,该谓词用于打开文件并将其内容作为程序加载。这不是你想要的……

子句的开头似乎表明您希望对 EBNF 的每个非终结符(类名)都有一个谓词。如果是这种情况,您可能希望谓词为每个可能的替代项都有一个子句,您应该将您的 EBNF 规则转换为上下文无关语法规则,例如

translation_unit -> ε
translation_unit -> external_declaration translation_unit

然后在 Prolog 中为您的谓词编写适当的子句。

为了理解什么让你感到困惑,你必须首先解释你所说的规则是什么意思。它是定句语法规则吗?作为一个普通子句,这取决于你需要传递什么信息,并从对谓词的调用中返回:你必须知道这一点才能编写程序。

【讨论】:

  • 按照规则,我的意思是一个正常的确定子句。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多