什么是最好的Prolog编程实践和风格指南?

好的,我知道这是一个非常普遍的问题,并且写了一些关于这个主题的文章,但是我有一种感觉,这些出版物涵盖了非常基本的材料,我正在寻找更高级的东西来提高风格和效率。 这是我在纸上写的:

  • “研究报告AI-1989-08有效的序言:实用指南”Michael A.Civington,1989
  • 1992年Timo Knuutila撰写的“Efficient Prolog Programming”
  • Covington,Bagnara,O'Keefe,Wielemaker,Price编着的“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 SortedList (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