是否有prolog语言语法/规范?

时间:2014-08-27 03:22:58

标签: prolog grammar iso-prolog

是否有一个prolog语言语法,或者通常用作参考的东西?我正在使用SWI-prolog,所以对于那种味道会很好,否则一般的prolog语言语法/规范也可以。

3 个答案:

答案 0 :(得分:4)

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

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

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

一个标记后面不应有字符,以便将标记的字符与这些字符连接起来形成一个有效的标记,如规定的那样通过上述
语法。

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

这种定义令牌的方式对于源自20世纪70年代的编程语言来说是典型的。

令牌级别对Prolog的语法特别重要,因为termread term首先被定义为令牌序列:

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

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

许多令牌在开头都包含一个可选的layout text sequence。但从来没有结束。另请注意,要确定结束(即完成时段),需要预测下一个字符。在用Prolog编写的tokenizer中,这将通过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)和

答案 1 :(得分:3)

特别是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

实际上是你不能完全规避的东西,不幸的是(如果有人证明我错了,我会很高兴)。至少获得那里列出的三个中的一个。英镑和Shapiro,1986就是一个很好的起点。 http://www.learnprolognow.org/的在线教程也非常好。

其他:在Richard O'Keefe的“The Prop of Prolog”中,你可以找到Prolog令牌化器的完整实现,用Prolog编写(10.7,第337-354页)。我不知道这是否符合你的目的。

并提出一些建议:如果要使用SWI-Prolog,请努力安装当前的开发版本。它在Linux上相当容易(不知道它在实践中如何用于MacOS,但我怀疑它更复杂)。

答案 2 :(得分:2)

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