【问题标题】:Is there a prolog language grammar/spec?是否有序言语言语法/规范?
【发布时间】:2014-08-27 03:22:58
【问题描述】:

是否有 prolog 语言语法,或与之相近的东西,通常用作参考?我使用的是 SWI-prolog,所以最好有一个适合这种风格的,否则一般的 prolog 语言语法/规范也可以。

【问题讨论】:

  • Prolog 语法在语言刚开始的时候很简单。但它有一个特性使它不适合通常的上下文无关语法:可以声明运算符 - 甚至可以动态声明。我有一个很简单的实现here,如果你想看看
  • @CapelliC:Prolog 从一开始就有运营商。第一个 Prologs,Prolog 0 和 Prolog I,有完全不同的语法。不确定您在这里指的是什么时间。

标签: prolog grammar iso-prolog


【解决方案1】:

自 1995 年以来,Prolog 就有了 ISO/IEC 标准:ISO/IEC 13211-1:1995。它还包含一个定义 Prolog 语法的语法,它由两个级别组成:

令牌级别:(6.4 令牌,6.5 处理器字符集

这些是由正则表达式定义的,并像那个时代的许多语言一样使用最长的输入匹配/渴望消费者规则/贪婪匹配/最大咀嚼。用标准(6.4)的话来说:

令牌后面不能有这样的字符
将令牌的字符与这些
字符连接起来形成上述
语法所指定的有效令牌。

注意事项1 这是急切的消费者规则:123.e 定义了令牌
123 . elayout text 有时需要
分隔两个令牌。

这种定义标记的方式对于起源于 1970 年代的编程语言来说是典型的。

token 级别对 Prolog 的语法特别重要,因为 termread term 首先被定义为一系列 token:

term (* 6.4 *)
   = { token (* 6.4 *) } ;

read term (* 6.4 *)
   = term (* 6.4 *) , end (* 6.4 *) ;

许多令牌在开头都包含一个可选的layout text sequence。但永远不会到最后。另请注意,要确定结束时间(即完成时间段),需要先行查看下一个字符。在用 Prolog 编写的分词器中,这将通过 peek_char/1 来实现。

只有在在这个级别上识别出一个术语之后,实际的语法才会发挥作用。请参阅read_term/3 的 8.14.1.1 说明。当然,一个实现可能会做不同的事情,只要它表现得“好像”。

语法级别:(6.2 Prolog 文本和数据,6.3 术语)

这些定义依赖于完整的上下文无关语法形式以及一些上下文相关的约束。

一致性

关于实现的一致性, see this table。 SWI 总是在许多特殊的方面有所不同:无论是在令牌级别还是在语法级别。甚至运算符语法 (for certain cases) 也与其他系统和标准不兼容。也就是说,某些术语的阅读方式不同。 Since SWI7, SWI now differs even for canonical syntax。试试writeq('.'(1,[])). 这应该会产生[1],但是SWI7 会产生一些错误。

对于符合标准的实现,请参阅(4.3 版)和

【讨论】:

    【解决方案2】:

    特别是对于 SWI-Prolog,事情有点“复杂”。它从未严格遵守 ISO,而且当前的开发版本(SWI-Prolog 7 及更高版本)与 ISO 合规性相差甚远。开发版本是目前唯一“积极”维护的版本,这意味着很快您可能会期望 SWI-Prolog 6 中不会删除错误。

    作为参考,你将不得不阅读手册并希望弄清楚什么是正确的,什么是错误的。信息都在那里,即使不是超级整齐。

    你可以从这里开始:

    http://www.swi-prolog.org/pldoc/man?section=syntax

    推荐书籍:

    http://www.swi-prolog.org/pldoc/man?section=intro

    不幸的是,实际上是您无法完全规避的事情(如果有人证明我错了,我会很高兴)。至少获得那里列出的三个中的一个。例如,Sterling & Shapiro, 1986 就是一个很好的起点。 http://www.learnprolognow.org/的在线教程也不错。

    其他内容:在 Richard O'Keefe 的“The Craft of Prolog”中,您可以找到用 Prolog (10.7, pp 337-354) 编写的 Prolog 标记器的完整实现。我不知道这是否符合您的目的。

    还有一些建议:如果您打算使用 SWI-Prolog,请努力安装当前的开发版本。在 Linux 上这相当容易(不知道在实践中它在 MacOS 上是如何进行的,但我怀疑它会更复杂)。

    【讨论】:

    • “在少数地方偏离了严格的 ISO 合规性”:SWI 从未严格遵守
    【解决方案3】:

    至少,有 ISO 标准(参见其创建者 page)。

    【讨论】: