【人工智能】鲁滨逊归结原理-Python实现

news2024/11/19 17:30:56

一、实验目的

        了解鲁滨逊归结算法原理,利用Python编写程序,实现鲁滨逊归结算法。

二、实验原理

        鲁滨逊归结原理又称为消解原理,是鲁滨逊提出的一种证明子句集不可满足性,从而实现定理证明的一种理论及方法。它是机器定理证明的基础。

        由谓词公式转化为子句集的过程可以看出,在子句集中子句之间是合取关系,其中只要有一个子句不可满足,则子句集就不可满足。由于空子句是不可满足的,所以,若一个子句集中包含空子句,则这个子句集一定是不可满足的。鲁宾逊归结原理就是基于这个思想提出来的。其基本方法是:检查子句集S中是否包含空子句,若包含,则S不可满足;若不包含,就在子句集中选择合适的子句进行归结,一旦通过归结得到空子句,就说明子句集S是不可满足的。

三、实验过程记录

        以下为归结原理中归结过程的树形表示:

        以下列题目为例,对归结原理进行应用。

        下面我们用Python实现命题逻辑归结原理的演绎推理:

S = [] # 以列表形式存储子句集S

def readClauseSet(filePath):

    global S

    for line in open(filePath, mode = 'r', encoding = 'utf-8'):

        line = line.replace(' ', '').strip()

        line = line.split('∨')

        S.append(line)



#取反

def opposite(clause):

    if '~' in clause:

        return clause.replace('~', '')

    else:

        return '~' + clause



#归结

def resolution():

    global S

    end = False

    while True:

        if end: break

        father = S.pop()

        for i in father[:]:

            if end: break

            for mother in S[:]:

                if end: break

                j = list(filter(lambda x: x == opposite(i), mother))

                if j == []:

                    continue

                else:

                    print('\n亲本子句:' + ' ∨ '.join(father) + ' 和 ' + ' ∨ '.join(mother))

                    father.remove(i)

                    mother.remove(j[0])

                    if(father == [] and mother == []):

                        print('归结式:NIL')

                        end = True

                    elif father == []:

                        print('归结式:' + ' ∨ '.join(mother))

                    elif mother == []:

                        print('归结式:' + ' ∨ '.join(mother))

                    else:

                        print('归结式:' + ' ∨ '.join(father) + ' ∨ ' + ' ∨ '.join(mother))

                  



def main():

    filePath = r'./S.txt'

    readClauseSet(filePath)

    print('--------命题逻辑归结推理--------')

    resolution()



if __name__ == '__main__':

    main()

四、实验结果

        选取以下题目进行测试:已知命题公式集S,求证R

        首先需要手动将谓词公式化为子句集,并存储到S.txt文件中。过程如下:

        在S.txt中存储的内容作为后续归结的子句集。

        运行程序,得到如下归结过程。

五、实验过程中存在的问题及解决方案

        该实验的理论部分以及手动进行归结过程并不复杂,只需要认真仔细即可完成。但利用Python进行归结的时候出现了不小的困难。通过上网查询资料和参考别人的代码,最后实现了对命题子句集进行归结的代码,后续还需要继续努力。

六、实验总结

        本次实验利用手动归结和Python编程分别对鲁宾逊归结原理进行了学习。归结原理在命题逻辑和谓词逻辑中的定义如下:

(1)命题逻辑中的归结原理

        设C1­与C2是子句集中的任意两个子句,如果C1中的文字L1与C2中的文字L2互补,那么从C1和C2中分别消去L1和L2,并将两个子句中余下的部分析取,构成一个新语句C12,这一过程称为归结。C12称为C1和C2的归结式,C1和C2称为C12的亲本子句。

(2)谓词逻辑中的归结原理

        子句C1­与C2的归结式是下列二元归结式之一:

               a)C1­与C2的二元归结式

               b)C1­的因子C1σ1与C2的二元归结式

               c)C1­与C2的因子C2σ2的二元归结式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1418916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目解决方案:市小区高清视频监控平台联网整合设计方案(上)

目 录 一、项目需求 1.1业务需求 1.2技术需求 1.3 环境要求 1.3.1 硬件要求 1.3.2 技术服务要求 二、系统设计方案 2.1 视频监控平台基础功能设计 2.2 视频资源及联网设备编码与管理设计 2.2.1 全省现有联网视频资源属性 2.2.2 视频资源编码具体格…

任务修复实例(1)

实例1 任务名:增强防御(quest_template.id 8490) 涉及的两个数据表分别为 smart_script 和 creature_summon_groups smart_script Reactstate 取值参考源码 UnitDefines.h 的 ReactStates 定义,其中:0为被动&#…

第18章_JDK8-17新特性(下)(新语法结构,API的变化,其它结构变化,小结与展望)

文章目录 第18章_JDK8-17新特性(下)6. 新语法结构6.1 Java的REPL工具: jShell命令6.2 异常处理之try-catch资源关闭6.3 局部变量类型推断6.4 instanceof的模式匹配6.5 switch表达式6.6 文本块6.7 Record6.8 密封类 7. API的变化7.1 Optional类…

[docker] Docker镜像的创建以及Dockerfile的使用

一、Dokcer镜像的创建 创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。 1.1 基于现有镜像创建 (1)首先启动一个镜像,在容器里做修改docker run -it --name web centos:7 /bin/bash …

Docker 基础篇

目录 一、Docker 简介 1. Docker 2. Linux 容器 3. 传统虚拟机和容器的对比 4. Docker 的作用 5. Docker 的基本组成(Docker 三要素) 6. Docker 工作原理 7. Docker 架构 8. Docker 下载 二、Docker 安装 1. CentOS Docker 安装 2. CentOS8 …

03 Verilog HDL 语法

Verilog HDL(Hardware Description Language)是在 C 语言的基础上发展起来的一种硬件描述语言(用它可以表示逻辑电路图、逻辑表达式、数字逻辑系统所完成的逻辑功能等)具有灵活性高、易学易用等特点。Verilog HDL 可以在较短的时间…

Edius 9.0 下载安装教程,附安装包和工具,轻松解决软件安装

前言 Edius是一款非线性视频编辑软件,它可以帮助用户快速编辑一切,支持更多格式、更多分辨率而无需等待,无论是纪录片还是4K影视制作,软件都能很好的驾驭,是用户最喜欢的后期制作专业工具。 准备工作 1、Win7及以上…

如何做一个合格的产品经理

如何做一个合格的产品经理 如何做一个合格的产品经理 一、了解市场需求 产品经理的核心工作之一是了解市场需求。为了确保产品的成功,你需要密切关注市场动态,了解用户需求,分析竞争对手,并预测未来趋势。通过市场调查、用户访…

第十八回 林冲水寨大并火 晁盖梁山小夺泊-FreeBSD/Ubunut使用ssh的scp传输文件

何涛在得到知府命令后,带领官兵出发前往石碣村捉拿强盗。在接近石碣村时,他们遇到了一些打渔的人,得知阮小五、阮小七两兄弟在湖中居住,非乘船不能到达。何涛决定所有人都下马,一起乘船前往湖中寻找阮家兄弟。 在行船…

C++中的指针空值nullptr

一、nullptr的引入 在C98中,通常是用NULL或者0对指针变量进行初始化 int* p1 NULL; int* p2 0; NULL其实一个宏,本质是0,在传统C头文件stddef.h中给可以看到如下代码 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define …

Unity 解释器模式(实例详解)

文章目录 示例1:基础解释器结构示例2:小于表达式(LessThanExpression)示例3:逻辑或表达式(OrExpression)示例4:逻辑非表达式(NotExpression)示例5&#xff1a…

SpringBoot整合Xxl-Job实现异步任务调度中心

目录 一、下载 1、源码 2、项目结构 3、模块说明 二、部署任务调度中心 1、创建数据库xxl-job 2、配置数据库 3、启动admin模块 4、打开任务调度中心 三、SpringBoot整合xxl-job 1、导入依赖 2、配置yml文件 3、配置类 4、启动项目 5、任务配置 6、测试 一、下…

【VS Code+Verilog+Vivado使用】(2)基本设置

文章目录 2 基本设置2.1 字体大小2.2 Tab大小2.3 选中高亮2.4 文件编码 2 基本设置 2.1 字体大小 方法1:VS Code左下角 > 管理 > 设置,搜索"font size",点击左侧"字体",根据需要设置"editor.fon…

vivado 配置内存IP

配置内存IP UltraScale体系结构内存IP支持DDR3和DDR4 SDRAM的配置,QDRIIPLUS SRAM和RLDRAM3型接口。截至2015.3,内存IP已被拆分基于内存接口标准和工具流,将其划分为不同的IP。“自定义IP”对话框框包含基本和高级配置选项,其中包…

Pyecharts魔法笔:探索多彩K线图的绘制与定制

标题:Pyecharts绘制多种炫酷K线图参数说明代码实战 在数据可视化领域,K线图是股票市场中常用的一种图表类型,用于展示一段时间内的开盘价、收盘价、最高价和最低价。Pyecharts是一个强大的Python可视化库,支持绘制各种图表&#…

贪吃蛇项目

引言: 本文章使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇。 实现基本功能: 1.贪吃蛇地图绘制。 2.蛇吃食物的功能(上、下、左、右方向键控制蛇的动作) 3.蛇撞墙死亡 4.蛇咬到自己死亡 5.计算得分 6.蛇加速…

2024年数学建模美赛C题(预测 Wordle)——思路、程序总结分享

1: 问题描述与要求 《纽约时报》要求您对本文件中的结果进行分析,以回答几个问题。 问题1:报告结果的数量每天都在变化。开发一个模型来解释这种变化,并使用您的模型为2023年3月1日报告的结果数量创建一个预测区间。这个词的任何属性是否会…

肌肉骨骼模拟

前言 对于角色动画,目前的技术主要包括这两种方式:基于运动学模拟的动画,和基于动力学模拟、即基于物理模拟的动画。第一种方式的应用相当广泛,我们接触的游戏大部分都采用了基于运动学的方式去实现动画,这种方式性能…

Python算法题集_和为K的子数组

本文为Python算法题集之一的代码示例 题目560:和为K的子数组 说明:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nu…

【idea插件开发】idea插件访问浏览器web地址

背景 以往在eclipse上面开发插件,有兴致想尝试Idea上玩一下插件开发。想要在idea上面访问web地址 概要 记录在idea上面访问web地址 正文 1、点击File->New->Project… 选择IntelliJ Platform Plugin 2、点击下一步后,输入Project Name&#…