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

时间:2014-04-25 20:47:23

标签: prolog iso-prolog

好的,我知道这是一个非常普遍的问题,并且已经写了一些关于这个主题的论文,但我觉得这些出版物涵盖了非常基本的材料,我正在寻找更先进的东西来改善风格和efficency。这就是我的论文:

  • “研究报告AI-1989-08 Efficient Prolog:A Practical Guide”作者:Michael A. Covington,1989
  • Timo Knuutila撰写的“高效的Prolog编程”,1992年
  • “Prolog的编码指南”,Covington,Bagnara,O'Keefe,Wielemaker,Price,2011

这些主题包括:尾递归和差异列表,正确使用索引,正确使用剪切,避免断言和撤销,避免CONSing,代码格式化指南(缩进,if-then-elses等),命名约定,代码记录,参数顺序,测试。

根据您在Prolog的个人经历,您会在此添加什么?是否有适用于CLP编程的特殊风格指南?你知道一些常见的效率问题,知道如何处理它们吗?

更新:

这里有一些有趣的(但仍然太基本,太笼统)点:Prolog programming guidelines of Lifeware Team

为了突出整个问题,我想问一下“Prolog的编码指南”(Covington等人):

  

据我们所知,Prolog的一套连贯且相当完整的编码指南从未发布过。此外,当我们查看已发布的Prolog程序的语料库时,我们看不到事实上的标准出现。这一明显遗漏背后的最重要原因是,由于缺乏全面的语言标准,小型Prolog社区进一步分散为以个体Prolog系统为中心的子社区,其中没有一个具有支配地位。

1 个答案:

答案 0 :(得分:13)

为了在Prolog中设计干净的界面,我建议您阅读Prolog标准,请参阅

特别是内置谓词如何编码的具体格式,其中包括特定样式的文档,以及错误信号的发送方式。请参阅ISO / IEC 13211-1:1995的 8.1内置谓词定义的格式。您可以在Cor.2和。{}中找到该样式的定义 Prolog prologue

遵循ISO错误信令约定(但尚未标准化)的库的一个非常好的示例是SICStus和SWI中library(clpfd)的实现。虽然两种实现方法在方法上都有根本的不同,但它们最大限度地利用了错误约定。

回到ISO。这是内置谓词的ISO格式:

x.y.z姓名/精神

一开始,可能会有一个简短的可选非正式评论。

x.y.z.1说明

给出了一个声明性描述,该描述通常使用描述性变量名称以最常见的目标开始,以便稍后可以引用它们。如果谓词的含义根本不是声明的,那么要么说明了#34;是真的"或者其他一些不必要的操作词,例如"统一","汇编"用来。让我举个例子:

  

8.5.4 copy_term / 2

     

8.5.4.1说明

     

copy_term(Term_1, Term_2)如果Term_2与术语T统一,则为Term_1的重命名副本(7.1.6.2)。

所以这个统一是一个很大的红色警告标志:不要认为这个谓词是一种关系,它只能在程序上理解。甚至更多(隐含地)它表明第二个参数中的定义是坚定的

另一个例子:sort/2。这现在是一种关系吗?

  

8.4.3 sort / 2

     

8.4.3.1说明

     如果sort(List, Sorted)Sorted的排序列表(7.1.6.5)统一,则

List为真。

所以,再一次,没有关系。惊讶吗?看看8.4.3.4 Examples

  

8.4.3.4示例

     

...

sort([X, 1], [1, 1]).
   Succeeds, unifying X with 1.

sort([1, 1], [1, 1]).
   Fails.

如有必要,添加一个单独的程序描述,从"程序性开始,"开始。它再次没有涵盖任何错误。这是标准描述的一大优势:错误都与"做"分开,这有助于程序员(=内置用户)更系统地捕获错误。公平地说,它会略微增加想要手动优化并逐案优化的实施者的负担。无论如何,这种优化的代码通常容易出现微妙的错误。

x.y.z.2模板和模式

这里,参数的全面,一或两行规范'给出了模式和类型。该符号与其他符号非常相似,后者起源于1978 DECsystem-10 mode declarations

  

8.5.2.2模板和模式

     

arg(+integer, +compound_term, ?term)

然而,ISO的方法和Covington等人的指南之间存在很大差异,该指南仅具有非正式性质,并说明程序员应如何使用谓词。 ISO的方法描述了内置程序的行为 - 特别是应该预期哪些错误。 (上面有4个错误加上一个额外的错误,从上面的规范中看不到,见下文)。

x.y.z.3错误

给出了所有错误条件,每个错误条件都在其自己的子条款中按字母顺序编号。 7.12错误中的代码

  

当满足多个错误条件时,Prolog处理器报告的错误取决于实现。

这意味着,每个错误条件必须说明它适用的所有前提条件。他们都是。错误条件不像if-then-elsif那样读取......然后......

这也意味着编码器必须付出额外的努力才能找到好的错误条件。这对于实际的用户程序员来说都是有利的,但对于编码器和实现者来说肯定有点痛苦。

根据 8.1.3错误中的NOTES并根据 7.12.2错误分类< xyz2 中的规范,直接遵循许多错误条件< / strong>(summary)。对于内置谓词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)

x.y.z.4示例

(可选)。

x.y.z.5 Bootstrapped内置谓词

(可选)。 定义其他类似的谓词,它们可以&#34; bootstrapped&#34;。