zoukankan      html  css  js  c++  java
  • 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

       

  • 相关阅读:
    今日SGU 5.27
    今日SGU 5.26
    今日SGU 5.25
    软件工程总结作业
    个人作业——软件产品案例分析
    个人技术博客(α)
    结对作业二
    软工实践 二
    软工实践 一
    《面向对象程序设计》六 GUI
  • 原文地址:https://www.cnblogs.com/iamfongbao/p/2813135.html
Copyright © 2011-2022 走看看