好的,我知道这是一个非常普遍的问题,并且已经写了一些关于这个主题的论文,但我觉得这些出版物涵盖了非常基本的材料,我正在寻找更先进的东西来改善风格和efficency。这就是我的论文:
这些主题包括:尾递归和差异列表,正确使用索引,正确使用剪切,避免断言和撤销,避免CONSing,代码格式化指南(缩进,if-then-elses等),命名约定,代码记录,参数顺序,测试。
根据您在Prolog的个人经历,您会在此添加什么?是否有适用于CLP编程的特殊风格指南?你知道一些常见的效率问题,知道如何处理它们吗?
更新:
这里有一些有趣的(但仍然太基本,太笼统)点:Prolog programming guidelines of Lifeware Team
为了突出整个问题,我想问一下“Prolog的编码指南”(Covington等人):
据我们所知,Prolog的一套连贯且相当完整的编码指南从未发布过。此外,当我们查看已发布的Prolog程序的语料库时,我们看不到事实上的标准出现。这一明显遗漏背后的最重要原因是,由于缺乏全面的语言标准,小型Prolog社区进一步分散为以个体Prolog系统为中心的子社区,其中没有一个具有支配地位。
答案 0 :(得分:13)
为了在Prolog中设计干净的界面,我建议您阅读Prolog标准,请参阅iso-prolog。
特别是内置谓词如何编码的具体格式,其中包括特定样式的文档,以及错误信号的发送方式。请参阅ISO / IEC 13211-1:1995的 8.1内置谓词定义的格式。您可以在Cor.2和。{}中找到该样式的定义 Prolog prologue
遵循ISO错误信令约定(但尚未标准化)的库的一个非常好的示例是SICStus和SWI中library(clpfd)
的实现。虽然两种实现方法在方法上都有根本的不同,但它们最大限度地利用了错误约定。
回到ISO。这是内置谓词的ISO格式:
一开始,可能会有一个简短的可选非正式评论。
给出了一个声明性描述,该描述通常使用描述性变量名称以最常见的目标开始,以便稍后可以引用它们。如果谓词的含义根本不是声明的,那么要么说明了#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.
如有必要,添加一个单独的程序描述,从"程序性开始,"开始。它再次没有涵盖任何错误。这是标准描述的一大优势:错误都与"做"分开,这有助于程序员(=内置用户)更系统地捕获错误。公平地说,它会略微增加想要手动优化并逐案优化的实施者的负担。无论如何,这种优化的代码通常容易出现微妙的错误。
这里,参数的全面,一或两行规范'给出了模式和类型。该符号与其他符号非常相似,后者起源于1978 DECsystem-10 mode declarations。
8.5.2.2模板和模式
arg(+integer, +compound_term, ?term)
然而,ISO的方法和Covington等人的指南之间存在很大差异,该指南仅具有非正式性质,并说明程序员应如何使用谓词。 ISO的方法描述了内置程序的行为 - 特别是应该预期哪些错误。 (上面有4个错误加上一个额外的错误,从上面的规范中看不到,见下文)。
给出了所有错误条件,每个错误条件都在其自己的子条款中按字母顺序编号。 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)
。
(可选)。
(可选)。 定义其他类似的谓词,它们可以&#34; bootstrapped&#34;。