相关疑难解决方法(0)

如何在ISO Prolog中定义(和命名)相应的安全术语比较谓词?

标准术语顺序(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.

如果XY是相同的术语,则X term_precedes Y
Y term_precedes X都是假的.

如果XY有不同的类型:Xterm_precedes Y当且仅当该
类型X先于类型Y按以下顺序:
variablefloating point先于integer
先 …

sorting prolog iso-prolog prolog-dif

32
推荐指数
4
解决办法
934
查看次数

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

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

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

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

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

更新:

这里有一些有趣的(但仍然太基础和太笼统)点:Lifeware团队的Prolog编程指南

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

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

prolog iso-prolog

13
推荐指数
1
解决办法
1817
查看次数

Prolog谓词参数中实例化模式指标的含义

查看Prolog文档,谓词签名有时写成如下:

foo(:Bar, +Baz, -Qux, ?Mop)
Run Code Online (Sandbox Code Playgroud)

什么是:,+,-?为以及如何解读?此外,这些是唯一存在的还是更多?

prolog signature iso-prolog

9
推荐指数
2
解决办法
1166
查看次数

好的Prolog代码的特点?

有什么设计启发式的人必须掌握好写Prolog?我听说需要一名经验丰富的程序员大约两年才能熟练掌握Prolog.有效地使用递归是其中的一部分,但这似乎是一个相对较小的障碍.究竟是什么给程序员带来了这么多麻烦?我应该在示例代码中寻找什么来判断其质量?

prolog failure-slice logical-purity

8
推荐指数
1
解决办法
920
查看次数

如何从SWI-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

8
推荐指数
3
解决办法
2万
查看次数

Prolog 中的 +,+ 模式是什么意思?

所以我被告知一个特定的谓词必须在 +,+ 模式下工作。这在 Prolog 中是什么意思?

prolog iso-prolog

5
推荐指数
1
解决办法
740
查看次数

列表中元素的总和

我不得不说有一个类似的问题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的初学者,任何答案都会非常感激.

prolog

1
推荐指数
1
解决办法
101
查看次数