实现猴子摘香蕉的问题-哈工大软件构造知识应用

问题描述:初始情况为,猴子在A处,香蕉悬挂在B处,箱子在C处。猴子需要爬上箱子才能够到香蕉。利用产生式知识表示来分析这个问题,从而得到最终猴子摘到香蕉所使用的规则序列。

将综合数据库中的元素定义为五元组(x,y,z,u,v)其中x,y,z∈{A,B,C},u,v∈{yes,no},x表示猴子所在位置,y表示香蕉所在位置,z表示箱子所在位置。

故初始状态(也就是综合数据库的初始元素)为(A,B,C,no,no),目标状态为(B,B,B,yes,yes)

经过分析,规则库如下:

1:(x,y,z,no,no)->(w,y,z,no,no):代表猴子移动,潜在要求为猴子没在箱上(u=no)。

2:(x,y,x,no,no)->(z,y,z,no,no):代表猴子推箱,条件为猴子与箱在同一位置(x=z),并且猴子没在箱上(u=no)。

3:(x,y,x,no,no)->(x,y,x,yes,no):代表猴子上箱,条件为猴子与箱在同一位置,(x=z),并且猴子没在箱上(u=no)。

4:(x,y,x,yes,no)->(x,y,x,no,no):代表猴子下箱,条件为猴子与箱在同一位置,(x=z),并且猴子在箱上(u=yes)。

5:(x,y,x,yes,no)->(x,y,x,yes,yes):代表猴子摘香蕉,条件为猴子与箱在同一位置,(x=z),并且猴子在箱上(u=yes)。

以上所有规则的条件都有猴子没摘到香蕉,因为猴子摘到了香蕉也就是达到目的,算法就结束了。

实现猴子摘香蕉的问题-哈工大软件构造知识应用_第1张图片

上图为定义的五元组中元素的取值。

 为了实现综合数据库的扩展,将综合数据库设计为有向图的形式,图中每一个节点代表一个状态(也就是一个五元组),当一条规则作用于这个数据库时,如果一个状态与该规则的前件匹配,那么以该结点为源,添加一条指向后件的有向边(自然,后件也就添加到图中了)。当综合数据库中包含目标状态时,目的达到,算法结束。

实现猴子摘香蕉的问题-哈工大软件构造知识应用_第2张图片

 综合数据库包含节点的序列,其中,结点的表示如下:

实现猴子摘香蕉的问题-哈工大软件构造知识应用_第3张图片

 实现猴子摘香蕉的问题-哈工大软件构造知识应用_第4张图片

除了一些辅助方法外,结点数据结构为一个映射(大小为5),表示着每一个状态。

例如:目标状态也就表示为:

 其余状态都由以上形式的映射定义。

以规则5为例,简要介绍通过规则想数据库中增加数据的过程:

实现猴子摘香蕉的问题-哈工大软件构造知识应用_第5张图片

 因为新生成的状态与原状态没有大的变化,因此用for循环来生成新的状态,并将新的状态添加到综合数据库节点序列,并修改相应节点的目标节点。其中节点的设计是参照软件构造lab2的。如此遍历每个结点,判断是否满足规则前提条件,进行相应添加修改即可。

其中判断是否满足条件的操作是委托给另外一个类来实现的:所有判相等的操作实现相似,都是根据给定输入的map映射中各个键相应的值的相等关系来给出true或false值。其中判断是否满足规则5的操作如下:

实现猴子摘香蕉的问题-哈工大软件构造知识应用_第6张图片

 (规则库的类)

实现猴子摘香蕉的问题-哈工大软件构造知识应用_第7张图片

 判断规则5满足与否的类。

实现猴子摘香蕉的问题-哈工大软件构造知识应用_第8张图片

 实现猴子摘香蕉的问题-哈工大软件构造知识应用_第9张图片

 可知,经过r1,r2,r3,r5猴子就摘到了香蕉,与实际相符。

你可能感兴趣的:(java)