首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >prolog列出了fd_all_different和is_set什么更快?

prolog列出了fd_all_different和is_set什么更快?
EN

Stack Overflow用户
提问于 2011-06-03 20:58:01
回答 2查看 1.6K关注 0票数 1

我只想知道你们中是否有人知道什么更快,

代码语言:javascript
复制
L=[1,2,3,4,5], all_different(L). % needs use_module(library(clpfd)).

代码语言:javascript
复制
L=[1,2,3,4,5], is_set(L).

有人知道吗?我的数独解算器需要更快的解决方案。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2011-06-03 21:28:45

使用谓词time/1来测量推论的数量和执行计算所用的实际时间。在您的示例中,您将执行以下操作

代码语言:javascript
复制
time((L=[1,2,3,4,5], all_different(L))) vs. time((L=[1,2,3,4,5], is_set(L)))

请注意,测量的时间一直到第一次成功为止。

票数 2
EN

Stack Overflow用户

发布于 2011-06-04 15:00:38

all_different/1 is _set/1之间的区别在于前者使用“约束逻辑”,并且可以在列表的条目被完全实例化之前施加预期的限制,这样,当强制Prolog引擎统一列表参数的两个条目或将相等的值分配给列表参数的两个条目时,就会发生失败。

我们可以用以下两个查询来说明all_different的“约束逻辑”:

代码语言:javascript
复制
?- length(L,5), all_different(L), L=[1,2,3,4,5].
L = [1, 2, 3, 4, 5].

?- length(L,5), all_different(L), L=[1,2,3,4,1].
false.

有必要向all_different提供适当的列表,但不能有一个完全绑定或“地面”的条目。上面显示了all_different可以预先对列表的条目施加约束。

请将结果与is_set进行比较:

代码语言:javascript
复制
?- length(L,5), is_set(L), L=[1,2,3,4,5].
L = [1, 2, 3, 4, 5].

?- length(L,5), is_set(L), L=[1,2,3,4,1].
L = [1, 2, 3, 4, 1].

一旦is_set成功,它就不能阻止将来创建相同条目的绑定。

因此,谓词all_different依赖约束逻辑库中的额外机器来完成is_set不能做的事情,并且在大多数情况下,这种额外机器会增加开销。然而,在viktor的问题中使用的简单方式,额外的机器并没有使用太多。检查是在完全约束的条件下进行的,而不是以前瞻性的方式进行,并且效率是可比的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6227384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档