什么是最好的Prolog编程实践和风格指南?
好的,我知道这是一个非常普遍的问题,并且写了一些关于这个主题的文章,但是我有一种感觉,这些出版物涵盖了非常基本的材料,我正在寻找更高级的东西来提高风格和效率。 这是我在纸上写的:
这些示例主题包括:尾递归和差异列表,正确使用索引,正确使用剪切,避免断言和撤销,避免CONS,代码格式化指导(缩进,if-else-elses等),命名约定,代码记录,参数顺序,测试。
您从Prolog的个人经历中将添加什么? 是否有任何特殊风格指南仅适用于CLP编程? 你知道一些常见的效率问题,并知道如何处理它们吗?
更新:
一些有趣的(但仍然太基本,对我来说太笼统了)点:在Lifeware团队的Prolog编程指南
为了突出整个问题,我想编辑“Prolog的编码准则”(Covington等人):
据我们所知,Prolog编码指南的连贯且合理的完整集从来没有出版过。 而且,当我们查看已出版的Prolog程序的语料库时,我们并未看到新的事实标准。 这一明显遗漏背后的最重要原因是,由于缺乏全面的语言标准,小型Prolog社区被进一步分割为以Prolog个人系统为中心的子社区,而这些社区都没有支配地位。
为了在Prolog中设计干净的界面,我建议阅读Prolog标准,参见iso-prolog。
特别是内置谓词是如何编码的特定格式,其中包括特定的文档类型,但也包含错误信号的方式。 见8.1 ISO / IEC 13211-1:1995 内置谓词定义的格式 。 您可以在Cor.2和Prolog序言中在线查找该风格的定义。
遵循ISO错误信号约定直到字母(但尚未标准化)的库的一个非常好的示例是在SICStus和SWI中实现library(clpfd)
。 虽然这两种实现方法在方法上有着根本的不同,但它们使用错误约定来发挥最大优势。
回到ISO。 这是内置谓词的ISO格式:
xyz名字/ Arity
在开始时,可能会有一个简短的可选非正式评论。
xyz1说明
给出了一种说明性描述,它通常使用描述性变量名称以最常用的目标开始,以便稍后可以引用它们。 如果谓词的含义根本不是陈述性的,那么它要么被陈述为“是真的”,要么被称为“一致”的一些其他不必要的操作性词语,则使用“集合”。 让我举个例子:
8.5.4 copy_term / 2
8.5.4.1说明
如果Term_2
与术语T
相结合, copy_term(Term_1, Term_2)
是真实的,该术语是Term_1
的重命名副本(7.1.6.2)。
所以这个统一是一个巨大的红色警告标志:永远不要认为这个谓词是一种关系,它只能在程序上被理解。 甚至更多(隐含地)指出,这个定义在第二个论证中是坚定的。
再比如: sort/2
。 这是现在的关系吗?
8.4.3排序/ 2
8.4.3.1说明
sort(List, Sorted)
为true iff Sorted
与List
(7.1.6.5)的排序列表相结合。
所以,再次,没有关系。 惊讶吗? 看看8.4.3.4例子:
8.4.3.4例子
...
sort([X, 1], [1, 1]).
Succeeds, unifying X with 1.
sort([1, 1], [1, 1]).
Fails.
如有必要,将添加一个单独的程序性说明,以“程序性”开头。 它再次不包括任何错误。 这是标准描述的一大优点:错误全部与“正在执行”分开,这有助于程序员(=内置用户)更系统地捕捉错误。 公平地说,它略微增加了想要手工优化和实例优化的实现者的负担。 无论如何,这样优化的代码通常容易产生细微的错误。
xyz2模板和模式
这里给出了一个全面的,一两行的参数模式和类型的说明。 该符号与1978年DECsystem-10模式声明中的其他符号非常相似。
8.5.2.2模板和模式
arg(+integer, +compound_term, ?term)
然而,ISO的方法和Covington等人的指南只有非正式的指导方式有很大的区别,并且指出程序员应该如何使用谓词。 ISO的方法描述了内置的行为 - 特别是应该预期哪些错误。 (从上面有4个错误加上一个额外的错误,从上面的规格看不到,见下文)。
xyz3错误
所有的错误条件都给出了,每个条款都在其子条款中按字母顺序编号。 7.12中的代码错误 :
当满足多个错误条件时,由Prolog处理器报告的错误取决于实现。
这意味着,每个错误条件都必须说明适用的所有先决条件。 他们全部。 错误条件不会像if-then-elsif那样读取,然后......
这也意味着编码员必须付出额外的努力寻找好的错误条件。 这对于实际的用户程序员来说都是有利的,但对编码器和实现者来说肯定会有点痛苦。
根据8.1.3错误中的NOTES和7.12.2错误分类 (摘要), xyz2中给出的规范直接遵循许多错误条件。 对于内置的谓词arg/3
,错误a,b,c,d遵循规范。 只有错误e不遵循。
8.5.2.3错误
a) N
是一个变量
- instantiation_error
。
b) Term
是一个变量
- instantiation_error
。
c) N
既不是一个变量也不是一个整数
- type_error(integer, N)
。
d) Term
既不是变量也不是复合术语
- type_error(compound, Term)
。
e) N
是一个小于零的整数
- domain_error(not_less_than_zero, N)
。
xyz4例子
(可选的)。
xyz5引导式内置谓词
(可选的)。 定义其他类似的谓词,它们可以被“引导”。
链接地址: http://www.djcxy.com/p/66935.html上一篇: What are the best Prolog programming practices and style guidelines?
下一篇: Some questions about declarative interpretation of not predicate in Prolog