mozart-oz自带文档:

《Finite Domain Constraint Programming in Oz. A Tutorial.》读书笔记

http://www.mozart-oz.org/documentation/fdt/index.html

watercloud @ xfocus.org 2004-4

先考虑据说是爱因斯坦在20世纪初出的这个谜语。他说世界上有98%的
人答不出来。

1、在一条街上,有5座房子,喷了5种颜色。
2、每个房里住着不同国籍的人
3、每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物。

问题是:谁养鱼?

提示: 1、英国人住红色房子
2、瑞典人养狗
3、丹麦人喝茶
4、绿色房子在白色房子左面
5、绿色房子主人喝咖啡
6、抽Pall Mall 香烟的人养鸟
7、黄色房子主人抽Dunhill 香烟
8、住在中间房子的人喝牛奶
9、 挪威人住第一间房
10、抽Blends香烟的人住在养猫的人隔壁
11、养马的人住抽Dunhill 香烟的人隔壁
12、抽Blue Master的人喝啤酒
13、德国人抽Prince香烟
14、挪威人住蓝色房子隔壁
15、抽Blends香烟的人有一个喝水的邻居

这个题在oz中非常容易就能获得答案!!!!!

约束编程中存在两个基本问题:约束传播和约束分配。
有限域中处理的通常为非负数,并且此类问题中oz中能处理的最大
数字为:134 217 726。

oz中用过程描述域限定,然后使用oz提供的搜索工具即可找到解。
过程规范如下:
proc {Script Root}
%% declare variables
in
%% post constraints
%% specify distribution strategy
end
其中Root代表问题的解存放变量,如果问题的解由多个变量构成,则
Root为record。
约束描述语法包括: ::: 指定记录中所有元素的取值范围; :: 指定
变量范围(用n#m表示);
=: 指定等式约束 ; =: 指定不等约束; >: <: >=: =<: ,
这些表达式都是FD模块中的部分功能的快捷方式。

过程中发布约束到问题解上用如下方法:
{FD.distribute ff Root} ff为最常用的发布策略,发布策略可参
考手册。 Root为问题解。

问题求解有下面两个oz标准过程实现:
{SearchAll Script ?Solutions}
{SearchOne Script ?Solutions}

查看搜索过程可用
{ExploreOne Script }
{ExploreAll Script }
来查看。
(Explor图中的图标可双击以查看搜索情况,三角形图标可展开)

3.2 问题:
变量D E M N O R S Y都是0-9的数字, 求其值使得如下等式成立:
SEND+MORE=MONEY

解:
declare Script Root in
proc {Script Root}
S E N D M O R Y in
sol(s:S e:E n:N d:D m:M o:O r:R y:Y)=Root
Root ::: 0#9
S =: 0
M =: 0
S*1000 + E*100 + N*10 + D + M*1000 + O*100 + R*10 + E
=: M*10000 + O*1000 + N*100 + E*10 +Y
{FD.distribute ff Root}
end
/* {ExploreAll Script} */
{Browse {SearchAll Script}}
这将获得一系列的答案,如:[sol(d:7 e:5 m:1 n:6 o:0 r:8 s:9 y:2)]

通过完整的FD模块约束传播定义上面的脚本等价于;
proc {Money Root}
S E N D M O R Y
in
Root = sol(s:S e:E n:N d:D m:M o:O r:R y:Y)
{FD.dom 0#9 Root}
{FD.distinct Root}
{FD.sum [S] '=:' 0}
{FD.sum [M] '=:' 0}
{FD.sumC
[1000 100 10 1 1000 100 10 1 ~10000 ~1000 ~100 ~10 ~1]
[ S E N D M O R E M O N E Y]
'=:'
0}
{FD.distribute ff Root}
end

first-class space是有限域计算的顶层空间,有点类似oz语

言执行中的top-level space,唯一不同的是top.. space在约

束条件不一致时时产成违例,而first-class space中则仅仅

产成一个普通的没有解的事件;另外first-classspace不能

写其父空间中的变量。

FD.distinct (creates a propagator)
FD.distribute (creates a distributor)

oz中支持 %注释一行 和 /* */构成的大段注释

最开始的问题和下面这个是等同的,4.3节:
Five men with different nationalities live in the first five
houses of a street. There are only houses on one side of the
street. The men practice distinct professions, and each of
them has a favorite drink and a favorite animal, all of them
different. The five houses are painted with different colors.
The following facts are known:
The Englishman lives in a red house.
The Spaniard owns a dog.
The chinese is a painter.
The Italian drinks tea.
The Norwegian lives in the first house.
The owner of the green house drinks coffee.
The green house comes after the white one.
The sculptor breeds snails.
The diplomat lives in the yellow house.
Milk is drunk in the third house.
The Norwegian's house is next to the blue one.
The violinist drinks juice.
The fox is in the house next to that of the doctor.
The horse is in the house next to that of the diplomat.
The zebra is in the white house.
One of the men drinks water.
Who lives where?

求解:
proc {Zebra Nb}
Groups = [ [english spanish chinese italian norwegian]
[green red yellow blue white]
[painter diplomat violinist doctor sculptor]
[dog zebra fox snails horse]
[juice water tea coffee milk] ]
Properties = {FoldR Groups Append nil}
proc {Partition Group}
{FD.distinct {Map Group fun {$ P} Nb.P end}}
end
proc {Adjacent X Y}
{FD.distance X Y '=:' 1}
end
in
%% Nb maps all properties to house numbers
{FD.record number Properties 1#5 Nb}
{ForAll Groups Partition}
Nb.english = Nb.red
Nb.spanish = Nb.dog
Nb.chinese = Nb.painter
Nb.italian = Nb.tea
Nb.norwegian = 1
Nb.green = Nb.coffee
Nb.green >: Nb.white
Nb.sculptor = Nb.snails
Nb.diplomat = Nb.yellow
Nb.milk = 3
{Adjacent Nb.norwegian Nb.blue}
Nb.violinist = Nb.juice
{Adjacent Nb.fox Nb.doctor}
{Adjacent Nb.horse Nb.diplomat}
Nb.zebra = Nb.white
{FD.distribute ff Nb}
end
求解结果为:
number(
blue:2 coffee:5 diplomat:3 doctor:4
dog:3 english:4 fox:5 green:5
horse:4 italian:2 chinese:5 juice:1
milk:3 norwegian:1 painter:5 red:4
sculptor:2 snails:2 spanish:3 tea:2
violinist:1 water:4 white:1 yellow:3
zebra:1
)

约束问题中得脚本也可以是由过程或函数返回的过程。

增加冗余的约束很多时候都能提高搜索性能。

X*X =: Y约束要求X和Y都必须在约束域中才能工作,

作为替代可以用FD.times

=====================================

翻译部分《参考手册》中系统模块部分的有限域模块

内容如下:

5.4 Telling domains
X :: 1#10 相当于 {FD.int 1#10 X}
sol(X Y Z) ::: 1#10 相当于: {FD.dom 1#10 sol(X Y Z)}
{FD.list I spec Ds} I: 列表中要约束的元素长度 spec为范围,
如1#10,Ds为列表变量
{FD.tuple L I spec Dt} L为tuple的label
{FD.record L Ls spec Dr} LS为feature list
{FD.decl D} 相当于: {FD.int 0$FD.sup D}

FD.inf 为约束域的最低值:0
FD.sup ... 大值:目前为:134 217 726

5.7 Generic Propagators
{FD.sum *Dv +A *D}
调用格式如:{FD.sum [ X Y Z ] '>:' 8} Dv为操作数,A为约束

,D为目标值
sum操作为求列表的累加值。
{FD.sumC +Iv *Dv +A *D} :约束累加 Ii * Di 后的值
{FD.sumCN +Iv *Dvv +A *D} Dvv为多维列表,约束 累加 Ii*(Dij j=1..Max)
{FD.sumAC +Iv *Dv +A *D} sumAC中A指绝对值 C值称值
{FD.sumACN +Iv *Dvv +A *D} sumACN中 N指多维列表
FD.sumD和FD.sumCD指支持 '=:'和 '=:'操作。

{FD.distinct *Dv} 所有Dv中的元素都互为不同
distinctB和distinctD效果和distinct相同,但内部使用了不同的算法。
{FD.distinctOffset *Dv +Iv} 所有的Di+Ii结果都不能相同
{FD.distinct2 *Dv1 +Iv1 *Dv2 +Iv2}等价于:
or Dv1.i + IV1.i =<: Dv1.j
[] Dv1.j + IV1.j =<: Dv1.i
[] Dv2.i + IV2.i =<: Dv2.j
[] Dv2.j + IV2.j =<: Dv2.i
end
主要用来表示两个四边形不要相互覆盖,此时Dv1存储

X坐标,Dv2存Y坐标Iv1和 IV2分别存放宽度和高度
{FD.atMost *D *Dv +I} 相当于Dv中最多有D个元素值为I
{FD.atLeast *D *Dv +I} 至少
{FD.exactly *D *Dv +I} 刚好
{FD.element *D1 +Iv *D2} Iv中第D1个元素等于D2中对应元素,如:
{FD.int [1 3] X} {FD.element X [5 6 7 8] Y}
will constrain Y to [5 7] .

5.9 0/1 Propagators
{FD.conj $D1 $D2 $D3} $D3为$D1和$D2的与
{FD.disj $D1 $D2 $D3} 或
{FD.exor $D1 $D2 $D3} 异或
{FD.nega $D1 $D2} 非
{FD.impl $D1 $D2 $D3} 推导,D3 is the implication of D2 by D1 (``'').
{FD.equi $D1 $D2 $D3} D3 is the equivalence of D1 by D2 (``'').

mozart-oz中有限域编程读书笔记相关推荐

  1. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  2. C专家编程-读书笔记(书本顺序)

    C语言设计哲学:   一切工作程序员自己负责.   语言中的所有特性都不需要隐式的运行时支持.   程序员所做的都是对的.   程序员应该知道自己在干什么,并保证自己的所作所为是正确的. ====== ...

  3. C++Windows核心编程读书笔记(转)

    http://www.makaidong.com/(马开东博客) 这篇笔记是我在读<windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的 ...

  4. Unix 网络编程 读书笔记1

    第一章: C/C++语言提供两种不同的编程模式:IPL32和PL64. ► IPL32 ● 表示integer/pointer/long三种数据类型是32位(4个字节),在这种模式下,提供32 位的地 ...

  5. 函数式编程 读书笔记

    函数式编程 函数式编程思想:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值. 已经掌握的使用场景: 1.      获取集合中的最大或最小值,当集合类型为自定义类型时的使用比较 ...

  6. UNIX网络编程读书笔记:套接口选项

    概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...

  7. 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

  8. 文件io(一)--unix环境高级编程读书笔记

    unix-like(后面以linux为例)系统中的文件操作只需要五个函数就足够了,open.close.read.write以及lseek.这些操作被称为不带缓存的io,这里有必要说一下带缓存和不带缓 ...

  9. C专家编程 读书笔记

    在ANSI C中,如果要声明空参数表,则必须使用关键字void进行显式声明: CPU,16位地址总线,能够访问2^16也就是64KB的内存:20位地址总线,可以访问2^20也就是1MB的内存:32位地 ...

最新文章

  1. 第13章代码《跟老男孩学习Linux运维:Shell编程实战》
  2. 04.内置analyzer和analyze-API使用
  3. Android Bitmap OutOfMemory 解决的方法
  4. chrome扩展程序_如何创建Chrome扩展程序
  5. 荐 Intellij IDEA创建Maven Web项目(带有webapp文件夹目录的项目)
  6. 【软件工程】用户在软件项目中承担的工作
  7. 通过修改word文件,来屏蔽宏代码
  8. Vue学习笔记(六)
  9. python应聘要求_python爬取招聘要求等信息实例
  10. python头像转卡通_用python将你的头像“卡通化”
  11. centos添加互信
  12. ssm南工二手书交易平台毕业设计源码172334
  13. 外贸企业邮箱是什么?大连邮箱,邮件归档系统
  14. 租车汽车租赁系统开发
  15. 随机数函数rand()和srand()的区别
  16. 网上店铺怎样给宝贝定价
  17. Linux下磁盘常见错误分析与检测工具使用
  18. 微信小程序毕业设计 基于微信图书馆借阅小程序系统开题报告功能参考
  19. STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)
  20. 云+小游戏,会成为5G时代的抖音吗?​

热门文章

  1. pyhton爬虫实战-爬取新浪国内新闻
  2. show-cloud(十一)添加删除帐套的mq队列
  3. Visual Studio社区2015:添加电子邮件和联系页面
  4. 简单介绍app软件开发的方法
  5. CTeX下的WinEdt和GSview相关的破解和自动补足
  6. SQL学习,Mysql数据库常用表及数据备份。
  7. wasm和javascript
  8. 3DMAX和MAYA软件上功能上有什么不同
  9. 有没有国内或者香港的服务器带宽在1gbps以上的?为什么看过的服务器基本带宽都是5M以下的?
  10. zabbix3.2 报错 Database error