人工智能-产生式系统实验

实验一 产生式系统实验

一、实验目的

  1. 熟悉知识的表示方法
  2. 掌握产生式系统的运行机制
  3. 产生式系统推理的基本方法。

二、实验原理:

产生式通常用于表示事实、规则以及它们的不确定性度量,适合于表示事实性知识和规则性知识。
确定性规则知识的产生式表示
不确定性规则知识的产生式表示
确定性事实性知识的产生式表示
不确定性事实性知识的产生式表示

三、实验条件:

Python版本:Python 3及以上
所需要的依赖包:无
可采用的软件:PyCharm
知识库是教材中的动物识别系统中的15条规则。

四、实验内容

if 有毛发 then 哺乳动物
if 有乳 then 哺乳动物
if 吃肉 then 食肉动物
if 有犬齿 and 有爪 and 眼向前方 then 食肉动物
if 哺乳动物 and 有蹄 then 有蹄类
if 哺乳动物 and 反刍动物 then 有蹄类
if 哺乳动物 and 食肉动物 and 黄褐色 and 暗斑点 then 豹子
if 哺乳动物 and 食肉动物 and 黄褐色 and 黑条纹 then 老虎
if 有蹄类 and 长脖子 and 长腿 and 暗斑点 then 长颈鹿
if 有蹄类 and 黑条纹 then 斑马

五、实验步骤

  1. 定义规则类(Rule):
    • 规则类包含两个属性:前提(premise)和结论(conclusion)。
    • 在初始化方法中,将传入的前提和结论分别赋值给对应的属性。
  2. 定义专家系统类(ExpertSystem):
    • 专家系统类包含一个规则列表(rules)。
    • 在初始化方法中,创建一个空的规则列表。
    • read_rules方法:从指定的文件路径读取规则,并将每个规则添加到规则列表中。规则文件中的每一行表示一个规则,规则的格式为 “前提 then 结论”,其中前提和结论之间用空格分隔。
    • apply_rule方法:根据给定的规则和事实集合,尝试应用该规则。如果规则的前提都在事实集合中,则将规则的结论添加到事实集合中,并返回更新后的事实集合;否则返回None。
    • match_rules方法:遍历规则列表,依次尝试应用每个规则。如果应用某个规则后事实集合发生了变化,则继续尝试应用下一个规则;否则跳出循环。最后返回最终的事实集合。
  3. 定义用户界面函数(ui):
    • 该函数接收用户输入的事实,并将其作为字符串返回。
  4. 定义主函数(main):
    • 首先指定规则文件的路径(file_path),然后创建一个专家系统对象(expert_system)。
    • 调用read_rules方法从文件中读取规则,并将其添加到专家系统的规则列表中。
    • 调用ui函数获取用户输入的事实,并将其传递给match_rules方法。
    • match_rules方法返回最终的事实集合,将其打印出来。
    • 根据最终的事实集合判断是否可以识别出动物,并输出相应的结论。

图1:流程图

图2:规则数据库

图3:结果举例

图4:文件树
#定义规则的前提和结论
class Rule:
def init(self, premise, conclusion):
self.premise = premise
self.conclusion = conclusion
#为每个规则设置一个专家系统对象
class ExpertSystem:
def init(self):
self.rules = []

def read_rules(self, file_path):
    try:
        with open(file_path, mode='r', encoding='utf-8') as file:
            for line in file:
                line = line.replace('if', '').strip()
                premise, conclusion = line.split(' then ')
                rule = Rule(premise, conclusion)
                self.rules.append(rule)
    except FileNotFoundError:
        print(f"文件 '{file_path}' 未找到。")

def apply_rule(self, rule, facts):
    if all(p in facts for p in rule.premise.split(' and ')):
        new_facts = facts.difference(rule.premise.split(' and '))
        new_facts.add(rule.conclusion)
        return new_facts
    return None

def match_rules(self, user_input):
    facts = set(user_input.split())
    while True:
        flag = False
        for rule in self.rules:
            new_facts = self.apply_rule(rule, facts)
            if new_facts is not None:
                facts = new_facts
                flag = True
                break
        if not flag:
            break
    return facts

def ui():
user_input = input(‘请输入事实:’)
return user_input

def main():
file_path = ‘rules.txt’
expert_system = ExpertSystem()
expert_system.read_rules(file_path)
user_input = ui()
result = expert_system.match_rules(user_input)

print('已应用的事实:')
print(result)

if any('动物' in fact for fact in result):
    print('最终结论: 无法识别出动物。')
else:
    print('最终结论: 可以识别出动物。')

if name == ‘main’:
main()

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值