标准术语顺序(ISO/IEC 13211-1 7.2术语顺序)是在所有术语(包括变量)上定义的.虽然有很好的用途 - 想想实现setof/3,但这使得许多其他清洁和逻辑用途的内置插件在8.4 Term比较中声明性的噩梦与imps(命令式构造的简短形式)四处都有.8.4术语比较功能:
8.4术语比较
8.4.1(@ = <)/ 2,(==)/ 2,(\ ==)/ 2,(@ <)/ 2,(@>)/ 2,(@> =)/ 2.
8.4.2比较/ 3.
8.4.3 sort/2.
8.4.4 keysort/2.
举个例子,考虑一下:
?- X @< a.
true.
Run Code Online (Sandbox Code Playgroud)
这成功了,因为
7.2期限订单
命令term_precedes(3.181)定义
术语X术语是否在术语之前Y.如果
X且Y是相同的术语,则Xterm_precedesY
和Yterm_precedesX都是假的.如果
X和Y有不同的类型:Xterm_precedesY当且仅当该
类型X先于类型Y按以下顺序:
variable先floating point先于integer
先 …
好的,我知道这是一个非常普遍的问题,并且已经写了一些关于这个主题的论文,但我觉得这些出版物涵盖了非常基本的材料,我正在寻找更先进的东西来改善风格和效率.这就是我的论文:
这些主题涵盖的示例主题包括:尾递归和差异列表,正确使用索引,正确使用剪切,避免断言和缩回,避免CONSing,代码格式化指南(缩进,if-then-elses等),命名约定,代码记录,参数顺序,测试.
您将从Prolog的个人经历中添加什么?是否有适用于CLP编程的特殊风格指南?你知道一些常见的效率问题,知道如何处理它们吗?
更新:
这里有一些有趣的(但仍然太基础和太笼统)点:Lifeware团队的Prolog编程指南
为了突出整个问题,我想问一下"Prolog的编码指南"(Covington等人):
据我们所知,Prolog的一套连贯且相当完整的编码指南从未发布过.此外,当我们查看已发布的Prolog程序的语料库时,我们看不到事实上的标准出现.这一明显遗漏背后的最重要原因是,由于缺乏全面的语言标准,小型Prolog社区进一步分散为以个体Prolog系统为中心的子社区,其中没有一个具有支配地位.
查看Prolog文档,谓词签名有时写成如下:
foo(:Bar, +Baz, -Qux, ?Mop)
Run Code Online (Sandbox Code Playgroud)
什么是:,+,-和?为以及如何解读?此外,这些是唯一存在的还是更多?
有什么设计启发式的人必须掌握好写Prolog?我听说需要一名经验丰富的程序员大约两年才能熟练掌握Prolog.有效地使用递归是其中的一部分,但这似乎是一个相对较小的障碍.究竟是什么给程序员带来了这么多麻烦?我应该在示例代码中寻找什么来判断其质量?
所以我需要编写一个谓词remove_duplicates/2来删除给定列表中的重复元素.例如:
?- remove_duplicates([a,a,b,c,c], List).
List = [a,b,c]
Yes
请记住,我只学习SWI-Prolog两天,只了解Prolog的基础知识.这就是我现在所拥有的:
remove_duplicates([H | T], List) :-
member(H, T),
append(T, [], List1).
这适用于列表,[a,a,b,c]但不适用于尾部中两个元素相同的列表.我想我不得不将Head删除到临时列表,创建一个新的Head并重复谓词.我不知道该怎么做.此外,当Head不在尾部时,例如列表之类的[a,b,b,c,],终端只是说False,因为member(H, T)不是真的.
有任何想法吗?
所以我被告知一个特定的谓词必须在 +,+ 模式下工作。这在 Prolog 中是什么意思?
我不得不说有一个类似的问题Prolog列表中的元素总和需要很少的解释,但仍然让我感到困惑.
以下是需要解释的以下解决方案.
sum([H],H).
sum([H|T],R):-sum(T,P),R is H + P.
Run Code Online (Sandbox Code Playgroud)
让我们说我们总和([1,2,3],R).
sum([1,2,3],R)
sum([2,3],<unknown-1>)
sum([3],<unknown-2>)
Run Code Online (Sandbox Code Playgroud)
那么它将实现事实总和([H],H)?我把这个变量写成sum([H],H),这个案例的唯一输出是3,这意味着在unknown-2中这里是3,为什么?
只是prolog的初学者,任何答案都会非常感激.