jess笔记_(1)
jess不可以用\ 否则会跳过 就算是win下都要用/
关于jess的介绍,可以参考这里,介绍得比较详尽.
最好用eclipse,因为这样的话语法检错比较好用.
参考的书籍是jess in action 新手求指点
然后,由一个简单的逻辑问题,开始展开.
有4个人,Joe,Tom,Bob,Fred,他们四个站成一列,穿着不同颜色的衣服(红,蓝,橙,格子).其中:
Fred右边那个是蓝衣服的
Joe排第二
Bob就是格子男
Tom不在第一也不在第四,而且没有穿橙色(妹的,这么抠的条件...)
然后,问他们谁穿什么衣服,排第几了…
当然,用逻辑的推理的话,tom已经确定了第三,然后Fred就不得不第一,Bob就是第四.酱紫的话Joe蓝衣服,Bob格子男,Tom就变态红,当然,Fred就是橙色男``
然后,怎样让jess推理呢?
首先,新建一个clp文件,就是新建文件的时候选File
后缀加上.clp就好.然后开始对推理进行定义.
第一步,就是定义解决这个问题要用到最精简的数据结构.这里,显然一个人和他的位置,衣服相关联,只要用语句定义好他们的联系就好,如下:
屏幕剪辑的捕获时间: 2012/12/11 15:25
其中,slot of 是对象的主体,slot is 是其自身的属性.例如
屏幕剪辑的捕获时间: 2012/12/11 15:26
这样的用法就比较明显知道,Joe的位置是第二.(这句还有其他的意思,在下面会讲到.)
然后,就开始进行规则,rule的定义.jess是一个基于规则的shell,因而接着的部分比较重要.
接下来,我们要利用rule来引进一些,例如说名字(Fred,Tom...) 衣服颜色(Red.Orange...)还有位置(1,2,3..)
屏幕剪辑的捕获时间: 2012/12/11 15:33
这里用foreach的循环来创建了我们要的东西,每个name下面(name用create$ 创建了Fred Joe Bob Tom四个)都用foreach创建了color(Red,Blue,Orange,Plaid)以及position(1 2 3 4) 这样,每个name下面都有四个color和4个position ,一共32关联.
assert为我们吧他们的联系确定下来,例如,(position (of Bob) (is 4)) 就是说Bob的位置排第四(这也是其中的一个联系)
接着,就是把我们的条件输进去.
屏幕剪辑的捕获时间: 2012/12/11 15:55
这部分放在find-solution里.刚才的generate-combos只是把我们的对象创建出来并且定义好关联,当然,这些关联也是规则rule的定义.这里的条件则更重要.下面,回顾上面我们给出的条件,针对每一句来说:
Fred右边那个是蓝衣服的
这样的话,就是说存在一个叫Fred的人儿.然而,这个人儿的位置和颜色,我们不知道.jess里就用?wanted_name(就是在变量的前面加?)来描述这种存在而不确定的东西.
首先,Fred是存在的,这样的话,假设在?p1,穿着?c1的颜色.
那样,我们就有:
屏幕剪辑的捕获时间: 2012/12/11 15:48
然后,他右面是个蓝衣服的,但是我们不知道他的名字是什么,所以,我们用?n(表示一个人名)来说明这样的存在.
屏幕剪辑的捕获时间: 2012/12/11 15:49
当然,这个?n就不是Fred. &是且的意思,~是非的意思.就是说这个?n且不是Fred的觉得的位置不知道,用?p描述,但是我们知道他等于?p1 +1(我们的定义应该很显然了吧,由左到右依次是1 2 3 4)
然后,看那个人的衣服是蓝色的.显然,那个人传的不会是Fred穿的.因此:
屏幕剪辑的捕获时间: 2012/12/11 15:51
这样,也可以比较好得砍掉不属于Fred的衣服的颜色(起码不是blue``)
下一句:
Joe排第二
这样的话,很显然,Joe和Fred不可能是同个位置,而且也不是穿着Fred一样颜色的衣服.因此
屏幕剪辑的捕获时间: 2012/12/11 15:55
注意,这样的关联是有必要说清楚的,否则,推理的输出结果有可能让不同的人穿同样颜色的衣服,或者同个位置有几个人.
继续下一句:
Bob就是格子男
酱紫,只要我们说明Bob的位置不在Fred和Joe那里就好.颜色也不和其他三个一样.描述如下:
屏幕剪辑的捕获时间: 2012/12/11 15:58
最后 Tom的比较恶心,不是1也不是4,也不是橙色,然而蓝色也有人穿了(真蛋疼,这个还要指出来...)而且因为位置的原因,tom的不可能是之前我们设的那个?n 因此:
屏幕剪辑的捕获时间: 2012/12/11 16:07
然后,我们就可以有输出了``
屏幕剪辑的捕获时间: 2012/12/11 16:08
其中=>的作用就像if...完(就是上面我们的条件)之后的then (=>), then就是输出,因为假设的东西都已经有了,因此就可以printout我们要的东西.
最后,加上
屏幕剪辑的捕获时间: 2012/12/11 16:09
程序就可以完成了.
输出的结果``:
屏幕剪辑的捕获时间: 2012/12/11 16:10