我不了解Prolog中的标签是什么

纽吉

我浏览了手册和文档,但仍然不明白。我正在尝试实现数独解决方案,在写下所有其他游戏规则之后,我根据老师的指示添加了label(Board)。

但是我仍然不知道它是如何工作的或正在做什么。其他约束(我检查过说数字必须为1..9,行必须全部不同,等等)是否应该自己给我答案?

错误的

如果您想快速学习Prolog和CLP(FD),请使用Prolog的顶层shell玩转,直到对它感到满意为止。实际上,您需要了解的有关CLP(FD)和Prolog的所有信息都可以在此处进行解释。或几乎。无需编写(它们的名字是什么?)文件,所有内容都可以排成一行。是的,我知道,我们的父母警告过我们:我的孩子,向我保证,永远不要单打独斗。但是您会学到很多。

那你有?-等待吗?

在传统的Prolog中(无限制),您从查询中得到的是所谓的答案替换在许多情况下,此答案替换已描述了一种解决方案。如果对于每个变量都找到一个变量自由项,就是这种情况。让我们看一个具体的示例并描述一个包含5个元素的列表,其中每个元素的值都在1到5之间。在这种情况下,可以找到针对的不同值的解决方案L

?- N = 5, length(L,N),maplist(between(1,N),L).
   N = 5, L = [1, 1, 1, 1, 1] ;
   N = 5, L = [1, 1, 1, 1, 2] ;
   N = 5, L = [1, 1, 1, 1, 3] ...

Prolog仅向您显示一种解决方案(秘密地希望您对此感到满意,这有点懒惰,或者是非严格的)。你得到所有这些打字SPACE;尝试一下只是看看有多少...

共有5^5解决方案。如果您只想从众多解决方案中选择一种,那不是很实用。大量解决方案以这种方式无效地表示。然后,考虑无限集Prolog或任何有限的存在如何枚举无限集?我们只能从有限的角度开始这样做。

为了克服这个问题,Prolog并非总是被迫显示具体的值,即解决方案,而是可以通过显示答案来稍微包含它们:

?- N = 5, length(L,N).
   N = 5, L = [_A, _B, _C, _D, _E].

该答案(替代)包含5^5上述所有答案,以及更多其他答案,例如L = [stack,over,flow,dot,com]实际上,它描述了无限的解决方案!我不是说我们有限的生物不能做到这一点吗?只要我们坚持具体的解决方案,我们就不会,但是如果我们对答案感到满意,那么我们可以做不可能的事情。

该想法可以扩展为描述更具体的集合。全部都有一个答案。对于整数集,我们有library(clpfd)像这样使用它:

?- use_module(library(clpfd)).

?- asserta(clpfd:full_answer).  % only necessary for SICStus

现在,我们可以重新声明原始查询(在SWI中,您可以Cursor up ↑获取它):

?- N = 5, length(L,N),L ins 1..N.
   N = 5, L = [_A, _B, _C, _D, _E],
   _A in 1..5, _B in 1..5, _C in 1..5, _D in 1..5,_E in 1..5.

现在,所有3125解决方案都可以用一个答案紧凑地描述。(3125?就是5^5)。我们可以继续陈述进一步的要求,例如它们都是不同的:

?- N = 5, length(L,N),L ins 1..N, all_different(L).
   N = 5, L = [_A, _B, _C, _D, _E],
   _A in 1..5,_B in 1..5,_C in 1..5,_D in 1..5,_E in 1..5,
   all_different([_A, _B, _C, _D, _E]).

(实际上)所有约束的共同点是它们不枚举解决方案,而是尝试保持一致性让我们尝试一下,说明第一个元素应该为1:

?- N = 5, length(L,N),L ins 1..N, all_different(L), L = [1|_].
   N = 5, L = [1, _A, _B, _C, _D],
   _A in 2..5,_B in 2..5,_C in 2..5,_D in 2..5,
   all_different([1, _A, _B, _C, _D]).

您看到效果了吗?他们迅速更改了域名!现在他们都在2..5

他们都应该在1..4

?- N = 5, length(L,N),L ins 1..N, all_different(L), L = [1|_], L ins 1..4.
   N = 5, L = [1, _A, _B, _C, _D],
   _A in 2..4,_B in 2..4,_C in 2..4,_D in 2..4,
   all_different([1, _A, _B, _C, _D]).

再次,它们被更新。但是...想一想:还剩下4个变量,它们应该都不同,但是它们只有3个不同的值。

因此,我们发现Prolog有点太懒了。实际上存在一个更好的约束all_distinct/1,该约束现在会失效,但是,无论系统有多少个聪明的约束,总会有这样的矛盾。哥德尔教授纾困的唯一方法是错误或无限循环。

因此,我们需要另一种方法来确保答案能够描述真实的解决方案。输入标签!使用label/1labeling/2我们可以消除所有这些奇怪的约束和胸围不一致:

?- N = 5, length(L,N),L ins 1..N, all_different(L), L = [1|_], L ins 1..4, labeling([], L).
   false.

?- N = 5, length(L,N),L ins 1..N, all_different(L), L = [1|_], labeling([], L).
   N = 5, L = [1, 2, 3, 4, 5] ;
   N = 5, L = [1, 2, 3, 5, 4] ;
   N = 5, L = [1, 2, 4, 3, 5] ...

我们如何确定这些是真正的解决方案?简单:除了答案替代1之外,它们不包含任何其他目标因为如果我们忘记了一些:

?- N = 5, length(L,N),L ins 1..N, all_different(L), L = [1,B,C|_], labeling([],[B,C]).
   N = 5, L = [1, 2, 3, _A, _B], B = 2, C = 3,
   _A in 4..5, _B in 4..5,
   all_different([1, 2, 3, _A, _B]),

他们会显示。

SWIlabeling/2有一个非常有用的保证:

标签总是完整的,总是终止的,不会产生多余的解决方案。


1由于SWI顶层未显示所有约束,因此您需要对其进行包装call_residue_vars(Goal, Vs)但是对于简单的顶级查询,上面的就足够了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Prolog中(+,?,?)或(-,-,+)的含义是什么?

来自分类Dev

不了解Prolog结果

来自分类Dev

我的 VBA 代码中的“标签未定义”是什么?

来自分类Dev

rsync不了解--files-from = FILE中的相对部分是什么

来自分类Dev

golang中的//!+ //!-标签是什么?

来自分类Dev

我不了解JavaScript中的递归

来自分类Dev

我需要帮助来了解CDK中的AwsCustomResource.policy是什么?

来自分类Dev

Prolog:谓词/变量中的-前缀是什么?

来自分类Dev

#=在Prolog中是什么意思?

来自分类Dev

我如何了解我的库是什么标准以及计算机中的gcc编译成什么标准?

来自分类Dev

了解Prolog中的参数

来自分类Dev

我对Microsoft Fakes的了解应该是什么?

来自分类Dev

Spring如何与Callable工作异步,我不了解什么?

来自分类Dev

我对React-native的导入/导出不了解什么?

来自分类Dev

我不了解API?

来自分类Dev

如果我在web.config中未提及sessionstate标签,那么sessionstate模式是什么?

来自分类Dev

布局中的<view /> XML标签是什么

来自分类Dev

Mandrill中的默认合并标签是什么?

来自分类Dev

引导表单标签中的“ for”是什么?

来自分类Dev

输入标签中cmdValue的意义是什么?

来自分类Dev

ABMultiValueCopyLabelAtIndex()中的标签顺序是什么

来自分类Dev

SwiftUI中tabItem的“标签”是什么?

来自分类Dev

脚本标签中的圆括号是什么?

来自分类Dev

html中<%-%>标签的含义是什么?

来自分类Dev

标签中的“ ^ {}”是什么意思?

来自分类Dev

menuitem 标签中的序列属性是什么?

来自分类Dev

GIT-git 中的标签是什么?

来自分类Dev

了解Matlab中的Fourier Descriptor程序的前提是什么?

来自分类Dev

了解Prolog中的递归规则

Related 相关文章

热门标签

归档