专家系统 | 基于产生式规则的动物识别专家系统

Hi,大家好,我是半亩花海。本项目旨在开发一个基于产生式规则的动物识别专家系统。通过构建事实库规则库,系统能够利用正向推理机制,根据用户输入的动物特征识别出相应的动物种类。采用Python编程语言,我们将实现专家系统的基本结构,并提供扩展功能的可能性,以满足多样化的识别需求。

目录

一、实验目的

二、实验要求

三、实验原理

四、实验步骤

1. 构造动物实体Animal

2. 构造规则

3. 构造动物识别专家系统

4. 构造规则库

5. 设置事实库,初始化动态数据库

6. 正向推理并输出

7. 测试

五、实验结果

六、实验总结

七、完整代码


一、实验目的

(1)了解产生式规则的原理。

(2)了解产生式规则专家系统的构成及其原理。

(3)了解产生式规则专家系统的正向推理机制。


二、实验要求

(1)学会使用Python构造专家系统事实库、产生式规则库。

(2)学会使用Python进行专家系统规则的正向推理。

(3)可以修改程序以扩充相应功能。


三、实验原理

参见4.2节《从规则到系统》的内容,在表4-1的基础上建立动物识别产生式规则库,建立事实库动态数据库和控制系统,并采用正向推理控制策略完成简单的动物识别。

表1如下所示为一个动物识别产生式规则库。

表1 动物识别产生式规则库

规则编号

如果

前件

那么

后件

R1

IF

胎生

THEN

哺乳动物

R2

IF

卵生 AND 会飞

THEN

R3

IF

有毛发

THEN

哺乳动物

R4

IF

有羽毛

THEN

R5

IF

有喙

THEN

R6

IF

食肉

THEN

肉食动物

R7

IF

吃草

THEN

草食动物

R8

IF

有爪

THEN

爪类动物

R9

IF

哺乳动物 AND 有蹄

THEN

蹄类动物

R10

IF

爪类动物 AND 有犬齿

THEN

肉食动物

R11

IF

鸟 AND 肉食动物 AND 高飞 AND 爪类动物

THEN

R12

IF

哺乳动物 AND 肉食动物 AND 褐色斑纹

THEN

R13

IF

蹄类动物 AND 黑白斑纹

THEN

斑马

R14

IF

哺乳动物 AND 肉食动物 AND 王字纹

THEN

R15

IF

鸟 AND 细腿 AND 红顶

THEN

丹顶鹤

四、实验步骤

1. 构造动物实体Animal

# (1)构造动物实体Animal
class Animal(object):
    def __init__(self):
        self.name = ''
        self.phylum = ''  # 门
        self.classes = ''  # 纲
        self.order = ''  # 目
        self.family = ''  # 科
        self.surface = ''  # 表面
        self.food = ''  # 食物
        self.mouth = ''  # 嘴型
        self.foot = ''  # 足部
        self.head = ''  # 头部
        self.ornament = ''  # 纹饰
        self.tooth = ''  # 牙齿
        self.can_fly = -1  # 会飞:1;不会飞:0;未定义:-1
        self.birth = ''  # 生产方式

    def clone(self, _Animal):
        self.name = _Animal.name
        self.phylum = _Animal.phylum
        self.classes = _Animal.classes
        self.order = _Animal.order
        self.family = _Animal.family
        self.surface = _Animal.surface
        self.food = _Animal.food
        self.mouth = _Animal.mouth
        self.foot = _Animal.foot
        self.head = _Animal.head
        self.ornament = _Animal.ornament
        self.tooth = _Animal.tooth
        self.can_fly = _Animal.can_fly
        self.birth = _Animal.birth

    def output(self):
        print('\n')
        print('该动物', end='')
        if self.birth != '':
            print(self.birth, end='')
            print(',', end='')

        if self.head != '':
            print(self.head, end='')
            print(',', end='')
        if self.mouth != '':
            print(self.mouth, end='')
            print(',', end='')
        if self.tooth != '':
            print(self.tooth, end='')
            print(',', end='')
        if self.food != '':
            print(self.food, end='')
            print(',', end='')
        if self.surface != '':
            print(self.surface, end='')
            print(',', end='')
        if self.ornament != '':
            print(self.ornament, end='')
            print(',', end='')
        if self.foot != '':
            print(self.foot, end='')
            print(',', end='')
        if self.can_fly == 1:
            print('会飞,', end='')
        elif self.can_fly == 0:
            print('不会飞,', end='')
        print('应该属于', end='')
        if self.phylum != '':
            print(self.phylum, end='')
        if self.classes != '':
            print(self.classes, end='')
        if self.order != '':
            print(self.order, end='')
        if self.family != '':
            print(self.family, end='')

        if self.name != '':
            print(self.name, end='')
        print('。\n')

2. 构造规则

# (2)构造规则
class Rule(object):
    def __init__(self):
        self.antecedent = Animal()
        self.consequent = Animal()

    def setAntecedent(self, animal):
        self.antecedent.clone(animal)

    def setConsequent(self, animal):
        self.consequent.clone(animal)

    # 规则匹配
    def match(self, animal):
        result = True
        if self.antecedent.can_fly != -1:
            if self.antecedent.can_fly != animal.can_fly:
                result = False
                return result
        if self.antecedent.classes != '':
            if self.antecedent.classes != animal.classes:
                result = False
                return result
        if self.antecedent.family != '':
            if self.antecedent.family != animal.family:
                result = False
                return result
        if self.antecedent.food != '':
            if self.antecedent.food != animal.food:
                result = False
                return result
        if self.antecedent.foot != '':
            if self.antecedent.foot != animal.foot:
                result = False
                return result
        if self.antecedent.head != '':
            if self.antecedent.head != animal.head:
                result = False
                return result
        if self.antecedent.mouth != '':
            if self.antecedent.mouth != animal.mouth:
                result = False
                return result
        if self.antecedent.name != '':
            if self.antecedent.name != animal.name:
                result = False
                return result
        if self.antecedent.order != '':
            if self.antecedent.order != animal.order:
                result = False
                return result
        if self.antecedent.ornament != '':
            if self.antecedent.ornament != animal.ornament:
                result = False
                return result
        if self.antecedent.surface != '':
            if self.antecedent.surface != animal.surface:
                result = False
                return result
        if self.antecedent.tooth != '':
            if self.antecedent.tooth != animal.tooth:
                result = False
                return result
        if self.antecedent.birth != '':
            if self.antecedent.birth != animal.birth:
                result = False
                return result
        if self.antecedent.phylum != '':
            if self.antecedent.phylum != animal.phylum:
                result = False
                return result
        return result

    # 规则执行
    def execute(self, animal):
        if self.consequent.can_fly != -1:
            animal.can_fly = self.consequent.can_fly
        if self.consequent.classes != '':
            animal.classes = self.consequent.classes
        if self.consequent.family != '':
            animal.family = self.consequent.family
        if self.consequent.food != '':
            animal.food = self.consequent.food
        if self.consequent.foot != '':
            animal.foot = self.consequent.foot
        if self.consequent.head != '':
            animal.head = self.consequent.head
        if self.consequent.mouth != '':
            animal.mouth = self.consequent.mouth
        if self.consequent.name != '':
            animal.name = self.consequent.name
        if self.consequent.order != '':
            animal.order = self.consequent.order
        if self.consequent.ornament != '':
            animal.ornament = self.consequent.ornament
        if self.consequent.surface != '':
            animal.surface = self.consequent.surface
        if self.consequent.tooth != '':
            animal.tooth = self.consequent.tooth
        if self.consequent.birth != '':
            animal.birth = self.consequent.birth
        if self.consequent.phylum != '':
            animal.phylum = self.consequent.phylum

3. 构造动物识别专家系统

# (3)构造动物识别专家系统
class ExpertSystem(object):
    def __init__(self):
        self.facts = []  # 事实库
        self.Rules = []  # 规则库
        self.dataset = []  # 动态数据库
        self.setRules()

4. 构造规则库

# (4)构造规则库
    # 建立规则库
    def setRules(self):
        R1 = Rule()
        # 设置前件
        R1_antecedent = Animal()
        R1_antecedent.birth = '胎生'
        R1.setAntecedent(R1_antecedent)
        # 设置后件
        R1_consequent = Animal()
        R1_consequent.classes = '哺乳纲'
        R1.setConsequent(R1_consequent)

        self.Rules.append(R1)

        R2 = Rule()
        # 设置前件
        R2_antecedent = Animal()
        R2_antecedent.birth = '卵生'
        R2_antecedent.can_fly = 1
        R2.setAntecedent(R2_antecedent)
        # 设置后件
        R2_consequent = Animal()
        R2_consequent.classes = '鸟纲'
        R2.setConsequent(R2_consequent)

        self.Rules.append(R2)

        R3 = Rule()
        # 设置前件
        R3_antecedent = Animal()
        R3_antecedent.surface = '毛发'
        R3.setAntecedent(R3_antecedent)
        # 设置后件
        R3_consequent = Animal()
        R3_consequent.classes = '哺乳纲'
        R3.setConsequent(R3_consequent)

        self.Rules.append(R3)

        R4 = Rule()
        # 设置前件
        R4_antecedent = Animal()
        R4_antecedent.birth = '羽毛'
        R4.setAntecedent(R4_antecedent)
        # 设置后件
        R4_consequent = Animal()
        R4_consequent.classes = '鸟纲'
        R4.setConsequent(R4_consequent)

        self.Rules.append(R4)

        R5 = Rule()
        # 设置前件
        R5_antecedent = Animal()
        R5_antecedent.mouth = '喙'
        R5.setAntecedent(R5_antecedent)
        # 设置后件
        R5_consequent = Animal()
        R5_consequent.classes = '鸟纲'
        R5.setConsequent(R5_consequent)

        self.Rules.append(R5)

        R6 = Rule()
        # 设置前件
        R6_antecedent = Animal()
        R6_antecedent.food = '肉'
        R6.setAntecedent(R6_antecedent)
        # 设置后件
        R6_consequent = Animal()
        R6_consequent.order = '食肉目'
        R6.setConsequent(R6_consequent)

        self.Rules.append(R6)

        R7 = Rule()
        # 设置前件
        R7_antecedent = Animal()
        R7_antecedent.food = '草'
        R7.setAntecedent(R7_antecedent)
        # 设置后件
        R7_consequent = Animal()
        R7_consequent.order = '食草目'
        R7.setConsequent(R7_consequent)

        self.Rules.append(R7)

        R8 = Rule()
        # 设置前件
        R8_antecedent = Animal()
        R8_antecedent.foot = '爪'
        R8.setAntecedent(R8_antecedent)
        # 设置后件
        R8_consequent = Animal()
        R8_consequent.phylum = '有爪门'
        R8.setConsequent(R8_consequent)

        self.Rules.append(R8)

        R9 = Rule()
        # 设置前件
        R9_antecedent = Animal()
        R9_antecedent.foot = '爪'
        R9_antecedent.classes = '哺乳纲'
        R9.setAntecedent(R9_antecedent)
        # 设置后件
        R9_consequent = Animal()
        R9_consequent.order = '有蹄目'
        R9.setConsequent(R9_consequent)

        self.Rules.append(R9)

        R10 = Rule()
        # 设置前件
        R10_antecedent = Animal()
        R10_antecedent.phylum = '有爪门'
        R10_antecedent.tooth = '有犬齿'
        R10.setAntecedent(R10_antecedent)
        # 设置后件
        R10_consequent = Animal()
        R10_consequent.order = '食肉目'
        R10.setConsequent(R10_consequent)

        self.Rules.append(R10)

        R11 = Rule()
        # 设置前件
        R11_antecedent = Animal()
        R11_antecedent.phylum = '有爪门'
        R11_antecedent.order = '食肉目'
        R11_antecedent.classes = '鸟纲'
        R11_antecedent.can_fly = 1
        R11.setAntecedent(R11_antecedent)
        # 设置后件
        R11_consequent = Animal()
        R11_consequent.family = '鹰'
        R11.setConsequent(R11_consequent)

        self.Rules.append(R11)

        R12 = Rule()
        # 设置前件
        R12_antecedent = Animal()
        R12_antecedent.order = '食肉目'
        R12_antecedent.classes = '哺乳纲'
        R12_antecedent.ornament = '褐色斑纹'
        R12.setAntecedent(R12_antecedent)
        # 设置后件
        R12_consequent = Animal()
        R12_consequent.family = '猫'
        R12.setConsequent(R12_consequent)

        self.Rules.append(R12)

        R13 = Rule()
        # 设置前件
        R13_antecedent = Animal()
        R13_antecedent.order = '有蹄目'
        R13_antecedent.ornament = '黑白斑纹'
        R13.setAntecedent(R13_antecedent)
        # 设置后件
        R13_consequent = Animal()
        R13_consequent.family = '斑马'
        R13.setConsequent(R13_consequent)

        self.Rules.append(R13)

        R14 = Rule()
        # 设置前件
        R14_antecedent = Animal()
        R14_antecedent.order = '食肉目'
        R14_antecedent.classes = '哺乳纲'
        R14_antecedent.ornament = '王字纹'
        R14.setAntecedent(R14_antecedent)
        # 设置后件
        R14_consequent = Animal()
        R14_consequent.family = '虎'
        R14.setConsequent(R14_consequent)

        self.Rules.append(R14)

        R15 = Rule()
        # 设置前件
        R15_antecedent = Animal()
        R15_antecedent.foot = '细腿'
        R15_antecedent.head = '红顶'
        R15_antecedent.classes = '鸟纲'
        R15.setAntecedent(R15_antecedent)
        # 设置后件
        R15_consequent = Animal()
        R15_consequent.family = '丹顶鹤'
        R15.setConsequent(R15_consequent)

        self.Rules.append(R15)

5. 设置事实库,初始化动态数据库

# (5)设置事实库,初始化动态数据库
    def setFacts(self, _facts):
        for ani in _facts:
            f = Animal()
            f.clone(ani)
            self.facts.append(f)
            d = Animal()
            d.clone(ani)
            self.dataset.append(d)

6. 正向推理并输出

# (6)正向推理并输出
    def forwardReasoning(self):
        for d in self.dataset:
            for r in self.Rules:
                # 如果规则匹配,则执行规则
                if r.match(d):
                    r.execute(d)
                    d.output()

7. 测试

# (7)测试
if __name__ == '__main__':
    ani_expert = ExpertSystem()

    ani1 = Animal()
    ani1.birth = '卵生'
    ani1.can_fly = 1
    ani1.head = '红顶'
    ani1.foot = '细腿'

    ani2 = Animal()
    ani2.birth = '胎生'
    ani2.food = '肉'
    ani2.ornament = '褐色斑纹'

    ani3 = Animal()
    ani3.order = '食肉目'
    ani3.classes = '哺乳纲'
    ani3.ornament = '王字纹'

    ani_expert.setFacts([ani1, ani2, ani3])
    ani_expert.forwardReasoning()

五、实验结果

由上图结果可知,在输出的六行中,二、五、六行为最终测试的结果。第一行为第二行的推理结果,第三、四行为第五行的推理结果,最终得出“该动物卵生,红顶,细腿,会飞,应该属于鸟纲丹顶鹤。”和“该动物胎生,肉,褐色斑纹,应该属于哺乳纲食肉目猫。”以及“该动物胎生,肉,褐色斑纹,应该属于哺乳纲食肉目猫。”这三个测试结果。


六、实验总结

该实验项目是一个基于产生式规则的动物识别专家系统,通过定义动物类、规则类和专家系统类,实现了对动物的分类和识别。核心思想是利用一系列规则来匹配动物的属性,从而推断出动物的分类信息。

通过此实验项目,我可以学到以下几个方面的知识和技能:

1. 产生式规则引擎:了解了产生式规则在人工智能领域的应用,通过编写规则来描述问题的解决方案,实现了一种基于规则的推理引擎。

2. 面向对象编程:实验采用了面向对象的编程方法,通过定义动物类和规则类,将系统的功能模块化,使得代码更加清晰和易于扩展。

3. 规则匹配和推理:学会了如何根据规则库中定义的前件条件,对动物的属性进行匹配,从而推断出动物的分类信息。

4. 动态数据库管理:掌握了如何管理动态数据库,即根据用户提供的事实,动态地生成待推理的动物数据集。

5. 系统测试与调试:通过测试部分的编写,学会了如何验证系统的功能是否符合预期,以及如何调试和改进程序。

通过完成这个实验项目,我不仅增加了对人工智能和规则引擎的理解,还提升了面向对象编程的能力和系统设计的能力。同时,也为进一步学习和开发复杂的专家系统奠定了基础。


七、完整代码

# 实验:基于产生式规则的动物识别专家系统
# (1)构造动物实体Animal
class Animal(object):
    def __init__(self):
        self.name = ''
        self.phylum = ''  # 门
        self.classes = ''  # 纲
        self.order = ''  # 目
        self.family = ''  # 科
        self.surface = ''  # 表面
        self.food = ''  # 食物
        self.mouth = ''  # 嘴型
        self.foot = ''  # 足部
        self.head = ''  # 头部
        self.ornament = ''  # 纹饰
        self.tooth = ''  # 牙齿
        self.can_fly = -1  # 会飞:1;不会飞:0;未定义:-1
        self.birth = ''  # 生产方式

    def clone(self, _Animal):
        self.name = _Animal.name
        self.phylum = _Animal.phylum
        self.classes = _Animal.classes
        self.order = _Animal.order
        self.family = _Animal.family
        self.surface = _Animal.surface
        self.food = _Animal.food
        self.mouth = _Animal.mouth
        self.foot = _Animal.foot
        self.head = _Animal.head
        self.ornament = _Animal.ornament
        self.tooth = _Animal.tooth
        self.can_fly = _Animal.can_fly
        self.birth = _Animal.birth

    def output(self):
        print('\n')
        print('该动物', end='')
        if self.birth != '':
            print(self.birth, end='')
            print(',', end='')

        if self.head != '':
            print(self.head, end='')
            print(',', end='')
        if self.mouth != '':
            print(self.mouth, end='')
            print(',', end='')
        if self.tooth != '':
            print(self.tooth, end='')
            print(',', end='')
        if self.food != '':
            print(self.food, end='')
            print(',', end='')
        if self.surface != '':
            print(self.surface, end='')
            print(',', end='')
        if self.ornament != '':
            print(self.ornament, end='')
            print(',', end='')
        if self.foot != '':
            print(self.foot, end='')
            print(',', end='')
        if self.can_fly == 1:
            print('会飞,', end='')
        elif self.can_fly == 0:
            print('不会飞,', end='')
        print('应该属于', end='')
        if self.phylum != '':
            print(self.phylum, end='')
        if self.classes != '':
            print(self.classes, end='')
        if self.order != '':
            print(self.order, end='')
        if self.family != '':
            print(self.family, end='')

        if self.name != '':
            print(self.name, end='')
        print('。\n')


# (2)构造规则
class Rule(object):
    def __init__(self):
        self.antecedent = Animal()
        self.consequent = Animal()

    def setAntecedent(self, animal):
        self.antecedent.clone(animal)

    def setConsequent(self, animal):
        self.consequent.clone(animal)

    # 规则匹配
    def match(self, animal):
        result = True
        if self.antecedent.can_fly != -1:
            if self.antecedent.can_fly != animal.can_fly:
                result = False
                return result
        if self.antecedent.classes != '':
            if self.antecedent.classes != animal.classes:
                result = False
                return result
        if self.antecedent.family != '':
            if self.antecedent.family != animal.family:
                result = False
                return result
        if self.antecedent.food != '':
            if self.antecedent.food != animal.food:
                result = False
                return result
        if self.antecedent.foot != '':
            if self.antecedent.foot != animal.foot:
                result = False
                return result
        if self.antecedent.head != '':
            if self.antecedent.head != animal.head:
                result = False
                return result
        if self.antecedent.mouth != '':
            if self.antecedent.mouth != animal.mouth:
                result = False
                return result
        if self.antecedent.name != '':
            if self.antecedent.name != animal.name:
                result = False
                return result
        if self.antecedent.order != '':
            if self.antecedent.order != animal.order:
                result = False
                return result
        if self.antecedent.ornament != '':
            if self.antecedent.ornament != animal.ornament:
                result = False
                return result
        if self.antecedent.surface != '':
            if self.antecedent.surface != animal.surface:
                result = False
                return result
        if self.antecedent.tooth != '':
            if self.antecedent.tooth != animal.tooth:
                result = False
                return result
        if self.antecedent.birth != '':
            if self.antecedent.birth != animal.birth:
                result = False
                return result
        if self.antecedent.phylum != '':
            if self.antecedent.phylum != animal.phylum:
                result = False
                return result
        return result

    # 规则执行
    def execute(self, animal):
        if self.consequent.can_fly != -1:
            animal.can_fly = self.consequent.can_fly
        if self.consequent.classes != '':
            animal.classes = self.consequent.classes
        if self.consequent.family != '':
            animal.family = self.consequent.family
        if self.consequent.food != '':
            animal.food = self.consequent.food
        if self.consequent.foot != '':
            animal.foot = self.consequent.foot
        if self.consequent.head != '':
            animal.head = self.consequent.head
        if self.consequent.mouth != '':
            animal.mouth = self.consequent.mouth
        if self.consequent.name != '':
            animal.name = self.consequent.name
        if self.consequent.order != '':
            animal.order = self.consequent.order
        if self.consequent.ornament != '':
            animal.ornament = self.consequent.ornament
        if self.consequent.surface != '':
            animal.surface = self.consequent.surface
        if self.consequent.tooth != '':
            animal.tooth = self.consequent.tooth
        if self.consequent.birth != '':
            animal.birth = self.consequent.birth
        if self.consequent.phylum != '':
            animal.phylum = self.consequent.phylum


# (3)构造动物识别专家系统
class ExpertSystem(object):
    def __init__(self):
        self.facts = []  # 事实库
        self.Rules = []  # 规则库
        self.dataset = []  # 动态数据库
        self.setRules()

# (4)构造规则库
    # 建立规则库
    def setRules(self):
        R1 = Rule()
        # 设置前件
        R1_antecedent = Animal()
        R1_antecedent.birth = '胎生'
        R1.setAntecedent(R1_antecedent)
        # 设置后件
        R1_consequent = Animal()
        R1_consequent.classes = '哺乳纲'
        R1.setConsequent(R1_consequent)

        self.Rules.append(R1)

        R2 = Rule()
        # 设置前件
        R2_antecedent = Animal()
        R2_antecedent.birth = '卵生'
        R2_antecedent.can_fly = 1
        R2.setAntecedent(R2_antecedent)
        # 设置后件
        R2_consequent = Animal()
        R2_consequent.classes = '鸟纲'
        R2.setConsequent(R2_consequent)

        self.Rules.append(R2)

        R3 = Rule()
        # 设置前件
        R3_antecedent = Animal()
        R3_antecedent.surface = '毛发'
        R3.setAntecedent(R3_antecedent)
        # 设置后件
        R3_consequent = Animal()
        R3_consequent.classes = '哺乳纲'
        R3.setConsequent(R3_consequent)

        self.Rules.append(R3)

        R4 = Rule()
        # 设置前件
        R4_antecedent = Animal()
        R4_antecedent.birth = '羽毛'
        R4.setAntecedent(R4_antecedent)
        # 设置后件
        R4_consequent = Animal()
        R4_consequent.classes = '鸟纲'
        R4.setConsequent(R4_consequent)

        self.Rules.append(R4)

        R5 = Rule()
        # 设置前件
        R5_antecedent = Animal()
        R5_antecedent.mouth = '喙'
        R5.setAntecedent(R5_antecedent)
        # 设置后件
        R5_consequent = Animal()
        R5_consequent.classes = '鸟纲'
        R5.setConsequent(R5_consequent)

        self.Rules.append(R5)

        R6 = Rule()
        # 设置前件
        R6_antecedent = Animal()
        R6_antecedent.food = '肉'
        R6.setAntecedent(R6_antecedent)
        # 设置后件
        R6_consequent = Animal()
        R6_consequent.order = '食肉目'
        R6.setConsequent(R6_consequent)

        self.Rules.append(R6)

        R7 = Rule()
        # 设置前件
        R7_antecedent = Animal()
        R7_antecedent.food = '草'
        R7.setAntecedent(R7_antecedent)
        # 设置后件
        R7_consequent = Animal()
        R7_consequent.order = '食草目'
        R7.setConsequent(R7_consequent)

        self.Rules.append(R7)

        R8 = Rule()
        # 设置前件
        R8_antecedent = Animal()
        R8_antecedent.foot = '爪'
        R8.setAntecedent(R8_antecedent)
        # 设置后件
        R8_consequent = Animal()
        R8_consequent.phylum = '有爪门'
        R8.setConsequent(R8_consequent)

        self.Rules.append(R8)

        R9 = Rule()
        # 设置前件
        R9_antecedent = Animal()
        R9_antecedent.foot = '爪'
        R9_antecedent.classes = '哺乳纲'
        R9.setAntecedent(R9_antecedent)
        # 设置后件
        R9_consequent = Animal()
        R9_consequent.order = '有蹄目'
        R9.setConsequent(R9_consequent)

        self.Rules.append(R9)

        R10 = Rule()
        # 设置前件
        R10_antecedent = Animal()
        R10_antecedent.phylum = '有爪门'
        R10_antecedent.tooth = '有犬齿'
        R10.setAntecedent(R10_antecedent)
        # 设置后件
        R10_consequent = Animal()
        R10_consequent.order = '食肉目'
        R10.setConsequent(R10_consequent)

        self.Rules.append(R10)

        R11 = Rule()
        # 设置前件
        R11_antecedent = Animal()
        R11_antecedent.phylum = '有爪门'
        R11_antecedent.order = '食肉目'
        R11_antecedent.classes = '鸟纲'
        R11_antecedent.can_fly = 1
        R11.setAntecedent(R11_antecedent)
        # 设置后件
        R11_consequent = Animal()
        R11_consequent.family = '鹰'
        R11.setConsequent(R11_consequent)

        self.Rules.append(R11)

        R12 = Rule()
        # 设置前件
        R12_antecedent = Animal()
        R12_antecedent.order = '食肉目'
        R12_antecedent.classes = '哺乳纲'
        R12_antecedent.ornament = '褐色斑纹'
        R12.setAntecedent(R12_antecedent)
        # 设置后件
        R12_consequent = Animal()
        R12_consequent.family = '猫'
        R12.setConsequent(R12_consequent)

        self.Rules.append(R12)

        R13 = Rule()
        # 设置前件
        R13_antecedent = Animal()
        R13_antecedent.order = '有蹄目'
        R13_antecedent.ornament = '黑白斑纹'
        R13.setAntecedent(R13_antecedent)
        # 设置后件
        R13_consequent = Animal()
        R13_consequent.family = '斑马'
        R13.setConsequent(R13_consequent)

        self.Rules.append(R13)

        R14 = Rule()
        # 设置前件
        R14_antecedent = Animal()
        R14_antecedent.order = '食肉目'
        R14_antecedent.classes = '哺乳纲'
        R14_antecedent.ornament = '王字纹'
        R14.setAntecedent(R14_antecedent)
        # 设置后件
        R14_consequent = Animal()
        R14_consequent.family = '虎'
        R14.setConsequent(R14_consequent)

        self.Rules.append(R14)

        R15 = Rule()
        # 设置前件
        R15_antecedent = Animal()
        R15_antecedent.foot = '细腿'
        R15_antecedent.head = '红顶'
        R15_antecedent.classes = '鸟纲'
        R15.setAntecedent(R15_antecedent)
        # 设置后件
        R15_consequent = Animal()
        R15_consequent.family = '丹顶鹤'
        R15.setConsequent(R15_consequent)

        self.Rules.append(R15)

# (5)设置事实库,初始化动态数据库
    def setFacts(self, _facts):
        for ani in _facts:
            f = Animal()
            f.clone(ani)
            self.facts.append(f)
            d = Animal()
            d.clone(ani)
            self.dataset.append(d)

# (6)正向推理并输出
    def forwardReasoning(self):
        for d in self.dataset:
            for r in self.Rules:
                # 如果规则匹配,则执行规则
                if r.match(d):
                    r.execute(d)
                    d.output()


# (7)测试
if __name__ == '__main__':
    ani_expert = ExpertSystem()

    ani1 = Animal()
    ani1.birth = '卵生'
    ani1.can_fly = 1
    ani1.head = '红顶'
    ani1.foot = '细腿'

    ani2 = Animal()
    ani2.birth = '胎生'
    ani2.food = '肉'
    ani2.ornament = '褐色斑纹'

    ani3 = Animal()
    ani3.order = '食肉目'
    ani3.classes = '哺乳纲'
    ani3.ornament = '王字纹'

    ani_expert.setFacts([ani1, ani2, ani3])
    ani_expert.forwardReasoning()
  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半亩花海

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值