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

   

posted @ 2012-12-11 16:21  方包  阅读(564)  评论(0编辑  收藏  举报