基于Prolog的人参专家诊断系统

目 录

1. 系统简介 1

1.1 系统概述 1

1.2 目的与意义 1

1.3 功能需求 1

1.4 系统结构图 2

2. 功能介绍 2

2.1 底层逻辑介绍 2

2.2 数据库 3

2.3 知识库 5

2.4 模型库 7

2.5 用户管理 8

3. 开发平台及开发工具介绍 10

3.1 开发平台介绍 10

3.2 开发工具介绍 14

系统简介

1.1 系统概述

该系统为人参专家诊断系统,主要对象是从事人参种植工作的农民。主要功能是实现以人参病植、虫害等信息维护为主要功能的数据库,基于Prolog的规则库,以及Prolog推断病植信息和虫害信息的模型库。我们利用药用植物病虫害数据库(pets.com.cn)中提供的数据及专家知识,为从事人参种植工作的农民提供服务。该系统目前已经成功线上部署运行:https://expert.goesbest.cn(用户名和密码均为admin)

1.2 目的与意义

本系统的实现源自于实际管理问题,经过项目开展的前期调研得知,现有基于Prolog的专家系统存在的问题是:现有的数据库能够实现增删改查,但是知识库都是直接写到程序中的,无法做到动态更新,这主要是由于Prolog的语言特性决定的。作为一门逻辑推理的语言,Prolog擅长基于搜索穷举的逻辑推断,但增删改查等常见的数据库操作却稍显乏力。本项目引入热加载机制、在Prolog推断层外层引入Python逻辑交互层以实现对推理知识的增删改查,并做成友好界面,方便相关专家进行知识构建。在推理机上:本系统通过正向推理,对用户输入的病植症状进行规则匹配,使用宽度优先搜索得出病害结论。最终,本系统开发完成度较高,能够较好地为用户提供服务。对于相关知识欠缺,从事人参养殖的相关用户来说,该系统用户友好在知识获取方面具有重要的意义。

1.3 功能需求

本人参专家管理系统主要包含四个工作模块:

数据库:对病害信息、虫害信息、农药信息进行维护。

知识库:分为事实库和规则库,对专家知识进行维护。

模型库:本系统包含两个模型:病害推断模型和虫害推断模型,这两个模型利用Prolog推理机进行正向推理,对于用户输入的病植症状进行规则匹配,得出结论为用户提供决策。

用户(从事人事养殖工作的人)管理模块:对于系统的使用者提供行为审计,用户管理等功能。

系统功能概述为:

  1. 数据库:
  2. 病害信息:对人参的病害信息进行维护,主要字段为病害名称、病害部位、病害状、危害、病原、发生规律、防治方法。
  3. 虫害信息:对虫害信息进行维护,主要字段为虫害名称、科属、危害部位、发生规律、防治方法等
  4. 农药信息:对农药信息进行了维护,主要字段为农药名称、防止对象及农药描述,
  5. 知识库(专家规则):
  6. 事实库:推理机事实规则,包含Prolog语句及字段说明。
  7. 规则库:利用规则进行数据推理,包含Prolog语句及字段说明。
  8. 模型库:
    1. 病害Prolog推断:利用Prolog推理机对可能发生的病害名称进行推断。
    2. 虫害Prolog推断:利用Prolog推理机对可能发生的虫害名称进行推断。
  9. 用户管理模块:
  10. 用户行为审计:记录每一次用户登录时的IP,浏览器,操作系统等行为信息,方便用户检查自己的账户是否被盗用。
  11. 用户权限管理:包含账户信息管理,在本系统中设置了两类用户一类是超级管理员“admin”用户,一类是普通用户。不同的用户拥有不同的权限,同时超级管理员用户具有创建普通用户的权限。本模块主要针对普通用户权限进行管理。

1.4 系统结构图

图1.1 系统功能结构图

功能介绍

2.1 底层逻辑介绍

作为一个以增删改查为和推理机推断为主要核心的系统,本系统的工作量主要集中在后台部分,类之间的调用关系如下:

图2.1 类图设计

对于前端和后台之间的交互逻辑如下:

图2.2 前端后台交互逻辑

在核心层部分,我们在底层额外设计一个数据库辅助连接的wrapper以便完成数据库连接与json映射。此外,由于所有和数据库打交道的逻辑都要通过该函数发生,因而该部分还承担鉴权的职责,具体实现如下:

图2.3 数据库底层逻辑实现

2.2 数据库

对于数据库部分,结合实际调研与显示情况,我们整理为三张表:病害信息表、虫害信息表、农药信息表。其中数据库表分别如下:

表一:病害信息表

字段 类型 键类型 说明
id int(11) 唯一 数据编号
Xingming varchar(20) 姓名
Weihaibuwei varchar(20) 危害部位
Beihaizhuang varchar(20) 被害状
weihai Text 危害
Bingyuan Text 病原
fashengguily Text 发生规律
fangzhifangfa Text 防治方法

表二:虫害信息表

字段 类型 键类型 说明
id int(11) 唯一 数据编号
Name varchar(20) 姓名
Keshu varchar(20) 科属
Weihaibuwei varchar(20) 危害部位
Beihaizhuang Text 被害状
Weihai Text 危害
Xingtaitezheng Text 形态特征
Fashengguily Text 发生规律
Fangzhifangfa Text 防治方法

表三:农药信息表

字段 类型 键类型 说明
id int(11) 唯一 数据编号
Name varchar(20) 姓名
fangzhiduixiang varchar(50) 防治对象
Xinximiaoshu Text 信息描述

三张信息表的功能都是实现增删改查,因而在此只给出病害信息表的实现逻辑:

图2.4 数据库CRUD实现

2.3 知识库

在知识库中,我们将知识库分为事实库和规则库,用来存储专家知识。我们制作了两张表格用以存储专家知识。

表四:事实库/规则库表

字段 类型 键类型 说明
id int(11) 唯一 数据编号
Prolog varchar(255) 专家规则(Prolog语句)
moxingshuoming varchar(255) 说明

在本项目中,我们利用药用植物病虫害数据库(pets.com.cn)中提供的数据及专家知识,总结出病植诊断的规则如下:

IF 病害部位是茎叶 AND 被害状是坏死或变色 THEN 该病害为灰霉病

IF 病害部位是全株 AND 被害状是萎蔫 THEN 该病害为立枯病

IF 病害部位是根 AND 被害状是变色 THEN 该病害是红皮病

IF 病害部位是叶 AND 被害状是坏死或萎蔫 THEN 该病害是日灼病

IF 病害部位是根或全株 AND 被害状是坏死或萎蔫 THEN 该病害是疫病

IF 病害部位是根或叶或茎 AND 被害状是腐烂 THEN 该病害是锈腐病

IF 病害部位是根 AND 被害状是腐烂 THEN 该病是根腐病

IF 病害部位是叶 AND 被害状是变色 THEN 该病是病毒病

IF 病害部位是叶或花或果 AND 被害状是萎蔫 THEN 该病是白粉病

IF 病害部位是叶 AND 被害状是坏死 THEN 该病是黑斑病

IF 病害部位是根 AND 被害状是腐烂或萎蔫 THEN 该病是菌核病

IF 病害部位是全株 AND 被害状态是萎蔫 THEN 该病是猝倒病

总结出虫害诊断的规则如下:

IF 危害部位是根茎叶 AND 被害状态是缺刻 THEN 该害虫为黄地老虎

IF 危害部位是根茎叶 AND 被害状态是缺刻 THEN 该害虫为大地老虎

IF 危害部位是根茎叶 AND 被害状态是缺刻 THEN 该害虫为小地老虎

IF 危害部位是叶根 AND 被害状态是缺刻 THEN 该害虫为暗黑鳃金龟

IF 危害部位是叶根 AND 被害状态是缺刻 THEN 该害虫为东北大黑鳃金龟

IF 危害部位茎是AND 被害状态是萎蔫THEN 该害虫为沟金针虫

IF 危害部位根是AND 被害状态是萎蔫THEN 该害虫为细胸金针虫

IF 危害部位是叶AND 被害状态是缺刻THEN 该害虫为油葫芦

IF 危害部位是根AND 被害状态是萎蔫THEN 该害虫为网目拟地甲

IF 危害部位是根AND 被害状态是萎蔫THEN 该害虫为蒙古拟地甲

IF 危害部位是根AND 被害状态是全株THEN 该害虫为大灰象甲

IF 危害部位是茎叶花果AND 被害状态是变色萎蔫THEN 该害虫为康氏粉蚧

IF 危害部位是叶花果AND 被害状态是缺刻THEN 该害虫为斜纹夜蛾

IF 危害部位是茎叶AND 被害状态是缺刻THEN 该害虫为草地螟

IF 危害部位是根AND 被害状态是萎蔫THEN 该害虫为华北蝼蛄

根据以上专家规则,我们设计谓词fact和truth用于把专家规则转化为53条Prolog逻辑,部分规则如下图所示:

图2.5 知识库CRUD实现

由于人参专家诊断系统推理逻辑

2.4 模型库

在本系统中,我们提供了两个模型:病植推断和虫害推断模型,在这一部分,我们在Prolog的基础上,使用PySwip作为Python和Prolog之间的交互接口,具体的逻辑是,先从Mysql数据库中抽取抽取专家知识,然后利用PySwip将专家知识输入进Prolog,Prolog返回病害结果,之后再次根据病害结果查询数据库中的病因、防治方法。交互结构图如下图所示:

图2.6 模型库推理流程图

具体的实现逻辑如下:

图2.7 模型库推理实现

但是在实际项目的部署中,使用pyswip无法在以Flask为代表的多线程框架中运行,因而我们在pyswip的基础上对线程进行额外的管理,我们将原有系统自动分配线程交由程序来处理,避免由于Flask一类的多线程Api框架在调用pyswip时引发的段错误,具体的实现代码如下:

图2.8 推理机单例模式实现

2.5 用户管理

用户审计指的是对用户登录行为进行记录,记录的行为包含用户的IP、操作系统、浏览器、登陆时间等信息. 方便用户检视自己账户的登录信息.在本项目中,我们设计了用户审计表以对用户登陆行为做记录:

字段 类型 键类型 说明
Id int(11) 主键 数据编号
Username varchar(30) 用户名
Ip varchar(30) 登录IP地址
Date Datetime 登录日期
Platform varchar(50) 登录操作系统
Browser Varchar(50) 登录浏览器

在后台逻辑中,主要业务逻辑如下,从下图我们可以看到数据的源自于用户请求的Request Header, 后台系统把用户登录请求的Request Header相关信息写入到数据库中以实现用户审计功能.

图2.9 用户审计代码实现

最终在系统前端返回的示意图如图所示:

图2.10 用户审计前端演示

在前端界面中, 我们还提供了用户名检索同时支持时间段检索,提高了用户的办公效率.

在用户记录模块中,维护每一名用户的登录信息,涉及到的数据字典如下:

字段 类型 键类型 说明
Id int(11) 主键 数据编号
Username varchar(30) 用户名
password varchar(32) 非空 密码(md5加密)

在后台逻辑中的实现代码如下:

图2.11 用户登录密码处理

由于密码是敏感信息,因而系统需要实现对密码进行哈希处理.无论用户密码是多少位, 在进行md5处理后均为32位.我们将编码后的32位密码写入到数据库中.

图2.12 用户登录逻辑实现

在登录验证部分,系统也同样是把密码先进行哈希处理然后与数据库中的密码记录进行对比,然后返回密码验证结果.

开发平台及开发工具介绍

3.1 开发平台介绍

  1. 主页:当用户进入界面时,会进入系统主页:

图3.1 人参专家系统界面

  1. 数据库分为三部分:病害信息、虫害信息、农药信息。

在数据库中,均可实现增删改查。

图3.2 数据库示例页面

图3.3 数据库增加数据

图3.4 数据库修改数据

当用户删除数据时,系统会根据数据库操作的结果返回数据插入情况。

图3.5 数据库数据删除

(3)知识库

知识库分为事实库和规则库,其中Prolog字段存储的是将要被Prolog加载的逻辑推理,专家可以在系统中增加插入推理规则。

图3.6 事实库

图3.7 规则库

(4)模型库

当设置好专家规则后,我们可以模型库完成专家推断:

对于从事人参种植的相关用户,只需要选择病害部位及被害状,即可查询到通过Prolog返回的推理结果,值得一提的是:尽管界面都是相似的,但是这一步是通过Prolog专家推理实现的。

图3.8 病害推断

图3.9 虫害推断

可以看到,用户输入病发部位和病发状后,系统会返根据Prolog推理规则返回人参可能遭遇到的虫害。

      1. 用户管理

图3.10 用户审计

在用户管理中,我们可以对用户登录行为进行必要的审计,在这里我们可以看到用户登录的IP,用户使用的浏览器以及操作系统等信息。同时也能够看到用户登录的信息情况。

图3.11 用户信息管理

在这里可以查看系统中所有的用户,包含用户名和密码,能够进行用户信息管理。

3.2 开发工具介绍

本项目设计涉及到的开发工具主要有:

  1. Git:

Git是目前世界上先进的分布式版本控制系统,在本项目中,我们使用Git进行代码控制管理,将项目托管于Github(github.com/Woooosz/StudentSystem)

图4.1 Github信息

  1. WebPack:

WebPack可以看成模块打包机:能够分析项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。在本项目中,我们使用WebPack对React编写的代码进行编辑和转换.

图4.2 WebPack打包

  1. Npm:

NPM是node包管理器,主要功能是管理node包.在本项目中,我们使用npm来对前端框架进行了管理和版本控制.

图4.3 本项目包结构

  1. Ant-Design:

Ant-Design:是由阿里前端团队开发的企业级前端开源框架.在本项目中,我们沿用了Ant-Design来作为项目的前端开发框架.

图4.4 本项目使用的前端框架

  1. Flask:

Flask是一个使用Python编写的轻量级Web应用框架。在本项目中,我们使用Flask来作为后台API的框架,为用户提供可靠高质API服务.

图4.5 Flask返回的后台数据

图4.6 Flask返回的控制台数据

  1. PySwip

图4.7 PySwip

Pyswip是一个python和Prolog交互的接口,基于该接口能够使用PySwip作为Python和Prolog之间的交互接口,具体的逻辑是,先从Mysql数据库中抽取抽取专家知识,然后利用PySwip将专家知识输入进Prolog,Prolog返回病害结果,之后再次根据病害结果查询数据库中的病因、防治方法。

发表回复

您的电子邮箱地址不会被公开。