基于回溯推理的小型专家系统
- 格式:doc
- 大小:503.00 KB
- 文档页数:22
人工智能的专家系统与规则推理专家系统与规则推理是人工智能领域中的两个重要概念,它们在解决复杂问题、进行推理和决策过程中发挥着重要作用。
本文将深入探讨专家系统和规则推理的定义、原理、应用以及未来发展方向。
一、专家系统的概念和原理专家系统是通过模拟人类专家的知识和经验,以解决特定问题为目标的计算机程序。
它由知识库、推理机和用户界面三个主要组成部分构成。
知识库包含了专家知识的各种表达形式,这些知识可以是规则、事实、概念、关系等。
推理机是专家系统的核心,其作用在于根据知识库中的规则和事实,进行推理和判断,并提供解决问题的答案。
用户界面则是用户与专家系统进行交互的桥梁,使用户能够输入问题并接收系统的回答。
专家系统的原理基于规则推理,即依据一系列前提条件推导出结论的思维过程。
规则推理是基于规则库中的规则进行的,规则库是知识库的一个重要组成部分。
规则库中的规则通常采用条件-结论形式来表示,它由一个前提和一个结论组成。
前提是一个或多个条件,表示问题的特征或状态;结论是根据前提条件推导出来的结论或行动。
推理机会根据用户提供的前提条件,在规则库中寻找匹配的规则,并根据规则中的结论向用户提供答案或行动建议。
二、专家系统的应用领域专家系统的应用领域非常广泛,涵盖了医疗、金融、工业、农业等多个领域。
以下是几个典型的应用案例。
1. 医疗诊断:专家系统可以根据患者提供的症状和疾病数据库,通过规则推理的方式诊断患者疾病,给出相应的治疗建议。
2. 金融风险评估:专家系统可以根据海量的金融数据和分析模型,通过规则推理的方式评估客户的信用风险,为银行提供贷款决策的建议。
3. 工业故障诊断:专家系统可以根据设备传感器数据和故障数据库,通过规则推理的方式判断设备是否存在故障,并提供相应的维修建议。
4. 农业植物识别:专家系统可以根据植物图像和植物数据库,通过规则推理的方式识别出植物的种类以及相应的养护方法。
三、规则推理的概念和原理规则推理是基于规则库中的规则进行的推理过程,它是专家系统中的核心方法之一。
全国青少年人工智能创新挑战赛考试题库(含答案)一、单选题1.能根据过去和现在的信息推断可能发生和出现的情况的专家系统是()。
A、诊断型专家系统B、控制型专家系统C、预测型专家系统D、监督型专家系统参考答案:C2.三段论推理包括()、小前题和结论。
A、假设B、经验C、知识D、大前提参考答案:D3.()是把句法成分与应用领域中的目标表示相关联。
A、词法分析B、句法分析C、语用分析D、语义分析参考答案:D4.人工神经网络中各个神经元同时改变状态,称为()。
A、异步工作方式B、半工工作方式C、同步工作方式D、全工工作方式参考答案:C5.()是语音信号处理的前提。
A、语音信号识别B、语音信号采集C、语音信号分析D、语音信号过滤参考答案:B6.()是利用与问题有关的启发信息进行搜索。
A、深度优先策略B、宽度优先策略C、最好优先策略D、启发式策略参考答案:D7.()是获取知识的过程。
A、学习B、环境C、评价D、知识库参考答案:A8.深度优先搜索和()是状态空间最基本的搜索策略。
A、正向搜索B、逆向搜索C、宽度优先搜索D、目的搜索参考答案:C9.通常用语言或表情、眼神及肢体动作对外界的刺激做出反应,传达某个信息,这些称为()。
A、学习能力B、行为能力C、感知能力D、顿悟能力参考答案:B10.图的节点表示问题的()。
A、状态B、操作C、目的D、结果参考答案:A11.()描述两个模糊集合中的元素之间的关联程度。
A、概率关系B、模糊关系C、线性关系D、包含关系参考答案:B12.在经济领域,利用粒子群优化算法求解博弈论中的()。
A、均衡解B、策略解C、方法解D、结果解参考答案:A13.赫布学习规则是()规则。
A、自学习B、半监督学习C、监督学习D、无监督学习参考答案:D14.()是把句法成分与应用领域中的目标表示相关联。
A、词法分析B、句法分析C、语用分析D、语义分析参考答案:D15.()开启了机器学习的先河。
A、遗传算法B、赫布学习规则C、粒子群算法D、产生式方法参考答案:B16.在遗传算法中,必须为遗传操作准备一个由若干初始解组成的()。
人工智能中的专家系统与推理机制在人工智能领域,专家系统和推理机制是两个重要的概念。
专家系统是一种模拟人类专家知识与推理能力的计算机系统,而推理机制则是专家系统实现知识推理和问题求解的核心机制。
本文将深入探讨人工智能中的专家系统与推理机制,并分析其在现实生活中的应用。
一、专家系统的概念与特点专家系统是一种基于人工智能技术构建的软件系统,旨在模拟人类专家的知识和推理能力,用于解决特定领域的问题。
其特点主要包括以下几点:1. 知识库:专家系统通过建立一个包含大量领域知识的专家知识库,其中包括实际专家的决策过程、经验和实践等。
这些知识以规则、事实、案例等形式存储。
2. 推理机制:专家系统利用专门的推理机制对知识库中的知识进行推理和解决问题。
推理机制是根据领域知识和逻辑规则,通过一系列的推理过程来实现对问题的求解。
3. 解释能力:专家系统不仅能够给出问题的答案,还可以解释其推理过程和结果。
这种解释功能使其在实际应用中更加可信和可靠。
4. 学习能力:专家系统可以通过学习和训练不断提升自身的解决问题能力。
例如,通过与领域专家的交互学习新的知识和经验。
二、推理机制的分类与应用推理机制是专家系统实现问题求解的核心机制,根据其实现方式和思想,可以分为经典推理机制和概率推理机制。
1. 经典推理机制:经典推理机制是基于逻辑推理和规则匹配的方法,主要包括前向推理、后向推理和混合推理。
前向推理从已知事实出发,根据规则逐步推导出结论;后向推理从目标结论出发,反向推导出需要的事实;混合推理结合前向和后向推理的特点,在求解过程中进行动态调整。
2. 概率推理机制:概率推理机制基于概率和统计理论,将不确定性引入问题求解过程中。
主要包括贝叶斯推理、马尔可夫链推理和模糊推理等。
概率推理机制更适用于处理信息不完备或存在不确定性的问题。
这些推理机制在各个领域中都有广泛应用。
例如,在医疗领域,专家系统可以根据患者的症状和病历数据,利用推理机制给出疾病的诊断和治疗建议;在金融领域,专家系统可以分析市场数据和投资策略,帮助投资者做出决策;在工业生产中,专家系统可以根据生产数据和经验知识,优化生产过程并提高效率。
专家系统发展综述专家系统是领域的一个重要分支,自20世纪60年代初以来,已经经历了数十年的发展。
本文将对专家系统的发展历程、基本概念、应用领域以及未来趋势进行综述。
一、专家系统的发展历程专家系统的发展可以追溯到1965年,当时美国科学家Feigenbaum提出了基于规则的专家系统概念。
随后,在1970年,Feigenbaum和Stuart Russell合著的《专家系统》一书出版,标志着专家系统的正式诞生。
在此之后,专家系统经历了快速发展和广泛应用,逐渐成为了人工智能领域的重要支柱。
二、专家系统的基本概念专家系统是一种智能计算机程序,它利用计算机技术和人工智能理论,模拟人类专家解决问题的思维过程,为用户提供专业领域的咨询和服务。
通常情况下,专家系统包括知识库和推理机两个核心组成部分,其中知识库用于存储领域专业知识,推理机则用于根据已有知识进行推理和解决问题。
三、专家系统的应用领域1、医疗领域:医生专家系统可以帮助医生进行疾病诊断和治疗方案制定。
例如,基于医学知识的智能问诊系统,可以根据患者症状和病史,进行初步诊断和用药建议。
2、金融领域:金融专家系统可以帮助银行、证券公司等金融机构进行投资决策、风险管理等方面的工作。
例如,基于金融市场数据的智能投顾系统,可以根据市场行情和投资者风险偏好,制定个性化的投资策略。
3、交通领域:交通管理专家系统可以帮助交通管理部门进行交通流量规划和调度指挥。
例如,基于路网信息的智能交通管理系统,可以根据实时交通信息进行路况预测和交通调度。
4、教育领域:教育专家系统可以帮助教师进行教学辅助和学生学习辅导。
例如,基于学科知识的智能教育辅导系统,可以根据学生的学习需求和学科水平,提供个性化的学习资源和教学方案。
四、专家系统的未来趋势1、知识库的构建与更新:随着知识爆炸的时代到来,专家系统的知识库需要不断更新和优化,以适应领域发展的需要。
因此,如何高效地进行知识获取、整理、表达和更新将成为未来研究的重要方向。
专家系统专家系统是基于人工智能技术开发的一种智能计算机系统,它能够模拟和复制人类专家在特定领域内的知识和经验,从而能够进行问题的分析、推理和解决。
本文将介绍一些关于专家系统的基本概念、分类以及其在不同领域中的应用。
首先,我们来了解一下专家系统的基本概念。
专家系统是一种模仿专家解决问题的计算机程序,它通过获取专家的知识和经验,建立相关的知识库和推理机制,从而能够自主地进行问题的分析和解决。
专家系统通常由三部分组成:知识库(knowledge base)、推理机(inference engine)和用户接口(user interface)。
知识库保存了专家的知识和经验,推理机利用这些知识和经验进行问题的推理和解决,而用户接口则提供了与用户交互的方式。
根据专家系统的分类方法,可以将其分为基于规则的专家系统(rule-based expert systems)和基于案例的专家系统(case-based expert systems)。
基于规则的专家系统通过使用一系列的规则来描述专家的知识和经验,然后使用这些规则进行问题的推理和解决。
而基于案例的专家系统则是根据专家的经验案例来进行问题的处理和解决。
这些案例包含了问题的描述和解决方法,系统可以通过比较新问题和已有案例的相似度,来找到最佳的解决方案。
在不同领域中,专家系统都有着广泛的应用。
在医学领域中,专家系统可以帮助医生诊断各种疾病和制定治疗方案。
通过分析患者的症状和病历,专家系统可以根据专家的知识和经验给出准确的诊断结果和治疗建议。
在工程领域中,专家系统可以用于辅助设计和优化工程方案。
通过分析工程问题的各种参数和限制条件,专家系统可以提供最佳的设计解决方案,从而提高工程效率和质量。
除了医学和工程领域,专家系统在金融、法律、环境保护等多个领域都有应用。
在金融领域中,专家系统可以用于股票交易和投资决策。
通过分析市场数据和专家的投资经验,专家系统可以帮助投资者进行投资决策,提高投资的成功率和收益率。
经典人工智能技术—推理与搜索简介推理与搜索是经典人工智能领域中的重要技术之一。
推理是指根据已知事实和逻辑规则来推导出新的结论,而搜索则是在一个问题空间中寻找解决方案的过程。
在人工智能的发展历程中,推理与搜索技术在解决复杂问题、优化决策和提供智能服务方面发挥了关键作用。
本文将从推理和搜索方面介绍经典的人工智能技术,包括规则推理、专家系统、搜索算法和智能代理等。
规则推理规则推理是一种基于逻辑规则推导的推理方法。
它通过事先定义一系列的规则,然后根据已知的事实和规则来推断出新的结论。
规则推理在计算机科学和人工智能中被广泛应用,特别是在专家系统中。
在规则推理中,推理引擎是核心组件。
它负责解释和应用规则,以达到推导出新的结论的目的。
推理引擎主要包括三个步骤:匹配、执行和回溯。
首先,推理引擎会将已知的事实与规则进行匹配,找出与当前状态匹配的规则。
然后,它会执行匹配到的规则,将结论添加到已知事实中。
最后,如果所有规则都已应用,但没有找到解决方案,则需要进行回溯,重新选择规则。
规则推理的优势在于它能够将专业知识形式化,使得可以通过推理引擎自动推导出结论。
然而,规则推理也存在一些挑战,比如规则的冲突解决、规则的不完备性和推理效率等问题。
专家系统专家系统是一种基于知识表示和推理机制的人工智能技术。
它模拟了人类专家的知识和经验,用于解决特定领域的问题。
专家系统通常由知识库、推理引擎和用户接口三个部分组成。
知识库是专家系统的核心组件,其中包含了领域专家提供的知识和规则。
推理引擎则负责解析和应用知识库中的规则,以进行推断。
用户接口则是专家系统与用户交互的界面,允许用户提出问题并得到解决方案。
专家系统在一些特定领域的问题求解中取得了较好的成效。
它可以将专业知识形式化,并通过推理引擎进行快速的推理和决策。
虽然专家系统存在知识获取困难和知识更新滞后等问题,但它在一些特定领域的应用仍然具有较大的潜力。
搜索算法搜索算法是解决问题空间中寻找解决方案的经典技术。
人工智能的专家系统技术导言:人工智能(Artificial Intelligence,AI)是一门研究如何使计算机可以像人一样智能地执行任务的学科。
专家系统是其中一种应用广泛的人工智能技术,它模仿人类专家的知识和推理能力,通过计算机实现对复杂问题的解决和决策。
一、专家系统的概述专家系统是一种基于知识的计算机系统,能够模拟人类专家的决策过程,对特定领域的问题进行分析和解决。
它主要由知识库、推理机和用户界面组成。
专家系统的知识库是存储各种领域专家知识的地方,包括事实、规则、经验、案例等。
知识库使用特定的语言表示和存储知识,使得专家系统能够在特定领域中模拟专家的决策过程。
推理机是专家系统的核心,它通过使用专家系统的知识库和推理规则对问题进行推理和决策。
推理机根据用户输入的问题和已有的知识,进行搜索和匹配,产生一系列推理结果。
推理机还可以根据问题的特点,使用不同的推理方式,如正向推理、反向推理、混合推理等。
用户界面是专家系统与用户之间的桥梁,用户通过界面与专家系统交互,输入问题和获取答案。
用户界面可以是命令行界面、图形界面或自然语言界面等,使得用户能够方便地使用专家系统。
二、专家系统的组成1. 知识获取知识获取是专家系统开发的第一步,它通过采访领域专家、查阅文献、观察现场等方式,收集专家知识并转化为计算机可识别的形式。
知识获取的关键是提取和表示知识,需要选择适当的表示方法和知识表示语言。
2. 知识表示知识表示是将采集到的知识以适当的形式表示和存储,使得计算机可以理解和使用这些知识。
常用的知识表示方法有规则表示、语义网络表示、框架表示等。
规则表示是最常用的方法,将知识表示为一系列条件-动作规则,通过匹配规则,实现对问题的推理和决策。
3. 知识推理知识推理是专家系统的核心功能,它利用知识库和推理规则对问题进行推理和决策。
专家系统的推理机通常采用基于规则的推理方法,通过匹配规则和问题,产生推理结果。
推理过程可以是正向推理、反向推理或混合推理,根据问题的特点,选择合适的推理方式。
专家系统的概述及其应用什么是专家系统?专家系统是一种基于人工智能技术的计算机系统,旨在模拟人类专家在某个特定领域中的知识和推理能力。
它通过收集和组织领域专家的知识,并利用推理规则来解决特定问题,从而为用户提供专业的建议、解决方案和决策支持。
专家系统的构成和工作原理专家系统主要由三个部分组成:知识库、推理机和用户界面。
知识库存储了领域专家的知识和经验,可以分为规则库和事实库。
规则库中包含了一系列由领域专家提供的规则,规定了问题和解决方案之间的关系。
事实库则存储了用户输入的问题相关信息。
推理机是专家系统的核心,它通过运用专家提供的规则和事实库中的信息,利用推理机制对问题进行推理和决策。
用户界面则是用户与专家系统进行交互的界面,通常采用图形用户界面或自然语言界面。
专家系统的应用领域专家系统广泛应用于各个领域,以下列举几个常见的应用领域:1. 医疗领域:专家系统可以帮助医生进行疾病的诊断和治疗方案的选择。
它可以根据病人的症状和检查结果,利用医学专家提供的规则进行推理,给出专业的建议和治疗方案。
2. 金融领域:专家系统可以用于风险评估和投资决策。
它可以基于历史数据和金融专家的知识,分析市场趋势和风险因素,为投资者提供决策建议。
3. 工程领域:专家系统可以用于设计优化和故障诊断。
它可以根据工程专家的知识和经验,分析和优化设计参数,或者通过故障检测和推理,帮助工程师快速找到故障原因并提供解决方案。
4. 决策支持系统:专家系统可以作为一个决策支持工具,帮助管理者进行决策。
它可以根据专家的经验和问题的约束条件,通过推理和分析,给出最佳的决策方案。
专家系统的优势和局限专家系统具有以下几个优势:1. 提供专业的建议和解决方案:专家系统可以利用专家的知识和推理能力,为用户提供专业的建议和解决方案。
2. 可以处理复杂的问题:专家系统可以处理大量的知识和复杂的推理过程,帮助用户解决复杂的问题。
3. 可以提高工作效率:专家系统可以提供快速的问题解决方案,帮助用户提高工作效率。
用Prolog编写的人工智能专家系统设计与实现人工智能(Artificial Intelligence,AI)作为一门前沿的科学技术,正在逐渐渗透到各个领域,并在其中发挥着重要作用。
专家系统(Expert System)作为人工智能的一个重要分支,在知识表示和推理方面具有独特优势,被广泛应用于医疗、金融、工业控制等领域。
而Prolog作为一种逻辑编程语言,其规则引擎和模式匹配特性使其成为构建专家系统的理想选择。
本文将介绍如何使用Prolog编写人工智能专家系统,包括设计思路、实现步骤和案例分析。
1. 专家系统概述专家系统是一种模拟人类专家决策过程的计算机程序,通过将专家的知识和经验转化为计算机可处理的形式,来解决复杂的问题。
专家系统通常由知识库、推理机制和用户接口三部分组成,其中知识库存储了领域知识,推理机制根据用户输入的问题和知识库中的规则进行推理,最终给出结论或建议。
2. Prolog简介Prolog是一种基于逻辑的编程语言,其核心思想是利用逻辑规则进行推理。
Prolog程序由事实(Facts)和规则(Rules)组成,通过匹配规则中的条件来实现推理过程。
Prolog具有强大的模式匹配能力和自动回溯机制,非常适合用于构建专家系统。
3. 人工智能专家系统设计3.1 知识表示在设计人工智能专家系统时,首先需要将领域知识表示为Prolog 中的事实和规则。
事实通常包括对象之间的关系或属性,而规则描述了根据某些条件得出结论的推理过程。
例如,在医疗领域的专家系统中,可以表示疾病与症状之间的关系,以及根据症状推断可能患有的疾病。
3.2 推理机制推理是专家系统的核心功能,Prolog通过自动搜索匹配规则来实现推理过程。
当用户提出问题时,系统会根据用户输入的信息和知识库中的规则进行匹配,并逐步推导出结论。
如果存在多个可能的结论,Prolog会尝试不同路径直到找到所有可能解。
3.3 用户接口为了方便用户与专家系统交互,需要设计友好的用户接口。
《基于回溯推理的小型专家系统》实验报告2011年5月1日目录一、实验题目............................................ 错误!未定义书签。
二、实验目的 (3)三、实验要求 (6)四、实验步骤 (6)基本设计思路 (8)流程框图 (10)数据测试 (12)五、实验方案设计实现 (16)六、实验程序使用说明 (8)八、实验心得体会 (15)九、源程序清单 (22)一、实验要求利用产生式规则构建一个简单的专家系统a)题目自拟(手机选择、电脑选择、玉石选择……)b)要求:1、确定推理方法(正向还是反向),并根据问题设计实现一个简单的不通用推理机(匹配、冲突消解)2、规则库要求至少包含15条规则3、初始事实可以任意给定,输入初始事实后能够得到推理结果4、设计人机界面,解释模块提供查询规则的功能5、可以不考虑知识库管理模块6、提交实验报告,实验名称为:基于回溯推理的小型专家系统7、报告中要有推理树二、实验目的通过编写设计专家推理系统,加深对产生式表示的理解。
三、实验步骤基本设计思路步1 将初始事实置入动态数据库;步2 用动态数据库中的事实,匹配目标条件,若目标条件满足,则推理成功,结束。
步3 用待测试规则集中各规则的前件匹配动态数据库中的事实,将匹配成功的规则组成冲突集;步4 若冲突集为空,则运行失败,退出。
步5 对冲突集做冲突消解,对选择执行的各规则,将其结论加入动态数据库,或执行其动作,转步2。
流程框图数据测试//Unicode编码_测试数据_规则集.txt它种子的胚有两个子叶∨它的叶脉为网状=它是双子叶植物它种子的胚有一个子叶=它是单子叶植物它的叶脉平行=它是单子叶植物(它是双子叶植物∧它的花托呈杯形)∨(它是双子叶植物∧它的花为两性∧它的花瓣有5枚)=它是蔷薇科植物它是蔷薇科植物∧它的果实为核果=它是李亚科植物它是蔷薇科植物∧它的果实为梨果=它是苹果亚科植物它是李亚科植物∧它的果皮有毛=它是桃它是李亚科植物∧它的果皮光滑=它是李它的果实为扁圆形∧它的果实外有纵沟=它是桃它是苹果亚科植物∧它的果实里无石细胞=它是苹果它是苹果亚科植物∧它的果实里有石细胞=它是梨它的果肉为乳黄色∧它的果肉质脆=它是苹果// Unicode编码_测试数据_初始事实.txt它种子的胚有两个子叶它的果肉为乳黄色它的果实里无石细胞它的果实为梨果它的果实无毛它的花托呈杯形四、实验方案设计实现由于规则集和初始事实集可能非常大,所以这里采用读入文件的方法。
为了支持中文,这里采用了Unicode编码,文本文件保存时,必须选择以Unicode的形式保存,否则会出现乱码。
对文本进行解剖的过程比较麻烦,主要是因为Unicode文本中含有很多不可视的控制字符,两个字符串,看上去一模一样,但进行比对操作后并不相等,就是因为这些不可视的控制字符导致的。
所以对文本进行解剖的过程中,必须多加注意对不可视控制字符的过滤。
为了让用户能看清整个推理过程,设了一个“推理下一步”的按钮,让用户一步步执行。
比较棘手的是前提是否成立的验证过程,运算符有∧)∨(,还要考虑运算符优先级问题。
这里模仿了利用栈进行四则运算的过程。
使用两个栈,一个保存运算符,一个保存操作数。
在表达式最后面加一个”#”作为结束符,不断提取前提中的下一个元素,当为操作数时,进操作数栈。
当为运算符时,对比它和运算符栈里最后一个运算符的优先级,如果栈中的那个优先级低,直接进栈。
否则要以栈中那个运算符为运算符,操作数栈最后两个为操作数,进行一次运算。
结果为真时,用字符串”@true”表示,结果为假时,用”@false”表示。
当匹配成功,把结论增加到事实集中,把该规则从“待测试规则”转移到“匹配规则集”列表中。
为了画面简洁,这里用规则号表示规则,用户如果要查看详细规则的说明,点击“查看规则”,就会弹出一个新的对话框。
在MFC中,我们用一个类对表示这个对话框,当用户点击按钮时,我们将其实例化,并调用ShowWindows。
为了从父对话框更新子对话框的控件,子对话框的类中,设计了专门的接口。
enum MATCH_RESULT{MATCH_RESULT_SUCCESSED,MATCH_RESULT_FAILED,};enum OPERATOR_CMP_RESULT{OPERATOR_CMP_LESS,OPERATOR_CMP_EQUAL,OPERATOR_CMP_GREATER,};CString OpenAndReadFile(CString &str);void PrintStr(vector<CString> &vec,HWND wnd,INT itemId);void PrintInt(vector<int> &vec,HWND wnd,INT itemId);void SeperateRule(const CString &rule,CString &left,CString &right);MATCH_RESULT Match(CString pre,vector<CString> &truths);OPERATOR_CMP_RESULT OperatorCmp(CString a,CString b);CString Calcute(CString a,CString oper,CString b,vector<CString> &truths);void NextElement(CString &res,CString &str);bool IsOperator(WCHAR oper);bool Find(vector<CString> &vec,CString v);void NextLine(CString &res,CString &str);bool IsEmptyWChar(WCHAR ch);void init();void UpdateAllLists();afx_msg void OnBnClickedChooseRule();afx_msg void OnBnClickedCheckRule();afx_msg void OnBnClickedChooseTruth();afx_msg void OnBnClickedStart();void UpdateTotalRules(vector<CString> vec);五、实验程序使用说明启动程序选择规则集规则集载入成功选择初始事实集初始事实集载入成功查看规则集详细描述不断按“推理下一步”,得到最后结果六、实验心得体会通过这次实验,加深了对正向推理的理解。
正向推理又称为正向链接推理,其推理基础是逻辑演绎的推理链,它从一组表示事实的谓词或命题出发,使用一组推理规则,来证明目标谓词公式或命题是否成立。
实现正向推理的一般策略是:先提供一批数据(事实)到总数据库中,系统利用这些事实与规则的前提匹配,触发匹配成功的规则(即启用规则),把其结论作为新的事实添加到总数据库中。
继续上述过程,用更新过的总数据库中的所有事实再与规则库中另一条规则匹配,用其结论再修改总数据库的内容,直到没有可匹配的新规则,不再有新的事实加到总数据库为止。
同时加强了对MFC和Unicode的实践。
七、源程序清单enum MATCH_RESULT{MATCH_RESULT_SUCCESSED,MATCH_RESULT_FAILED,};enum OPERATOR_CMP_RESULT{OPERATOR_CMP_LESS,OPERATOR_CMP_EQUAL,OPERATOR_CMP_GREATER,};//打开文件,并返回其内容CString OpenAndReadFile(CString &str){CFileDialog fd(TRUE,NULL,NULL,NULL,L"所有文件(*.*)|*.*");;if(fd.DoModal()==IDOK){CFile f;f.Open(fd.GetPathName(),CFile::modeRead |CFile::modeNoTruncate);int len=f.GetLength()/sizeof(TCHAR);TCHAR *buf=new TCHAR[len+5];f.Read(buf,f.GetLength());buf[len]=L'\0';str=CString(buf);delete []buf;}return fd.GetPathName();}//把CString列表打印到对应的控件上void PrintStr(vector<CString> &vec,HWND wnd,INT itemId){CString str;for(int i=0;i<vec.size();i++)str=str+vec[i]+L"\r\n";SetDlgItemText(wnd,itemId,str);}//把Int列表打印到对应的控件上void PrintInt(vector<int> &vec,HWND wnd,INT itemId){CString str;for(int i=0;i<vec.size();i++){CString tmp;tmp.Format(L"%d\r\n",vec[i]);str=str+tmp;}SetDlgItemText(wnd,itemId,str);}//把规则根据等号分成左右两部分void SeperateRule(const CString &rule,CString &left,CString &right) {int p=rule.Find(L'=');left=rule.Mid(0,p);right=rule.Mid(p+1,rule.GetLength());}//通过两个栈来实验运算,看规则前提是否成立MATCH_RESULT Match(CString pre,vector<CString> &truths){pre=pre+L"#";stack<CString> operatorStack;stack<CString> operandStack;operatorStack.push(L"#");CString next;NextElement(next,pre);while(next!=L"#" || operatorStack.top()!=L"#"){if(!IsOperator(next[0])){operandStack.push(next);NextElement(next,pre);}elseswitch(OperatorCmp(operatorStack.top(),next)) {case OPERATOR_CMP_LESS:operatorStack.push(next);NextElement(next,pre);break;case OPERATOR_CMP_EQUAL:operatorStack.pop();NextElement(next,pre);break;case OPERATOR_CMP_GREATER:{CString b=operandStack.top();operandStack.pop();CString a=operandStack.top();operandStack.pop();CString oper=operatorStack.top();operatorStack.pop();operandStack.push(Calcute(a,oper,b,truths));break;}default:break;}}if(operandStack.top()==L"@true")return MATCH_RESULT_SUCCESSED;elsereturn MATCH_RESULT_FAILED;}//对比运算符的优先级别OPERATOR_CMP_RESULT OperatorCmp(CString a,CString b){if( (a==L"∨"||a==L"∧")&&(b==L"∨"||b==L"∧"||b==L"#"||b==L")")) return OPERATOR_CMP_GREATER;else if(a==L"("&&b==L")" || a==L"#"&&b==L"#" )return OPERATOR_CMP_EQUAL;elsereturn OPERATOR_CMP_LESS;}//进行逻辑运算CString Calcute(CString a,CString oper,CString b,vector<CString> &truths) {if(oper==L"∧")return ((a==L"@true" || Find(truths,a)) &&(b==L"@true" || Find(truths,b)))?L"@true":L"@false";else if(oper==L"∨")return ((a==L"@true" || Find(truths,a)) ||(b==L"@true" || Find(truths,b)))?L"@true":L"@false";}//在前提中提取下一个元素void NextElement(CString &res,CString &str){int i=0;while(!IsOperator(str[i]))i++;if(i==0){res=str.Mid(0,1);str=str.Mid(1);}else{res=str.Mid(0,i);str=str.Mid(i);}}//检测这字符是否为运算符bool IsOperator(WCHAR oper){return oper==L'('||oper==L')'||oper==L'∧'||oper==L'∨'||oper==L'='||oper==L'#';}//在vector<CString>中查找v是否存在bool Find(vector<CString> &vec,CString v){for(int i=0;i<vec.size();i++){int t1=vec[i].GetLength();int t2=v.GetLength();if(vec[i].Compare(v)==0)return true;}return false;}//检测字符是否为不可见字符bool IsEmptyWChar(WCHAR ch){return ch==L'\r' || ch==L'\n' || ch==L'\0' || ch==0xEF || ch==0xBB || ch==0xBF ||ch==65279;}//在res中提取下一行void NextLine(CString &res,CString &str){int t=str.GetLength();int a=0;while(IsEmptyWChar(str[a]))a++;int b=a+1;while(!IsEmptyWChar(str[b]))b++;res=str.Mid(a,b-a);str=str.Mid(b+1);//初始化void CReasoningDlg::init(){mTotalRules.clear();mCurRules.clear();mTruths.clear();mConficts.clear();}//选择规则集void CReasoningDlg::OnBnClickedChooseRule(){init();CString str,path,line;path=OpenAndReadFile(str);SetDlgItemText(IDC_RULE_PATH,path);while(true){if(str.GetLength()<3)break;NextLine(line,str);mTotalRules.push_back(line);mCurRules.push_back(mTotalRules.size()-1);}PrintInt(mCurRules,m_hWnd,IDC_RULE_LIST);}//查看规则集void CReasoningDlg::OnBnClickedCheckRule(){CCheckDialog *dlg=new CCheckDialog();dlg->Create(MAKEINTRESOURCE(IDD_CHECK_DIALOG));dlg->UpdateTotalRules(mTotalRules);dlg->ShowWindow(SW_NORMAL);}//选择事实集void CReasoningDlg::OnBnClickedChooseTruth(){mTruths.clear();CString str,path,line;path=OpenAndReadFile(str);SetDlgItemText(IDC_TRUTH_PATH,path);while(true){if(str.GetLength()<3)break;NextLine(line,str);mTruths.push_back(line);}PrintStr(mTruths,m_hWnd,IDC_TRUTH_LIST);}//下一步推理void CReasoningDlg::OnBnClickedStart(){for(vector<int>::iteratoriter=mCurRules.begin();iter!=mCurRules.end();iter++) {CString left,right;SeperateRule(mTotalRules[*iter],left,right);int result=Match(left,mTruths);switch(result){case MATCH_RESULT_SUCCESSED:mConficts.push_back(*iter);mTruths.push_back(right);mCurRules.erase(iter);break;case MATCH_RESULT_FAILED:break;default:break;}if(result==MATCH_RESULT_SUCCESSED)break;}UpdateAllLists();}//更新所有列表void CReasoningDlg::UpdateAllLists(){PrintInt(mCurRules,m_hWnd,IDC_RULE_LIST);PrintStr(mTruths,m_hWnd,IDC_TRUTH_LIST);PrintInt(mConficts,m_hWnd,IDC_CONFICT_LIST);}//子对话框更新接口void CCheckDialog::UpdateTotalRules(vector<CString> vec) {CString num;for(int i=0;i<vec.size();i++){num.Format(L"R%d:",i);vec[i]=num+vec[i];}PrintStr(vec,m_hWnd,IDC_TOTAL_RULE);}。