GENI的核心 -- 推理机(4)求证过程分析

1、GENI知识库结构

专家系统推理机的设计执行,与其知识库结构紧密相关。

GENI知识库结构是一棵逻辑推理树。

根节点是animal,即求证的目标。

Animal有2个子节点,即求证的子目标。节点或子目标。用rule表示。比如:

rule(8,"animal","mammal",[12,13],"")

rule(9,"animal","bird",[9,14],"")

注意,rule的第2參数是求证的目标,第3參数是其子目标。

这2个參数的关系,构成推理树。

规则8和9,是逻辑或or的关系。有一条规则证明为真,目标animal为真。

规则8,子目标是mammal。哺乳动物,证明为真的条件是[12,13]。

规则9,子目标是bird,鸟类。证明为真的条件是[9,14]。

证明条件[12,13]是逻辑与。and的关系。[9,14]也是。也就是说。2个条件都为真,子目标才为真。

证明条件在知识库中表示为cond。

比如以上4个条件:

cond(12,"it has hair","animals\\animals.htm")

cond(13,"it does give milk","animals\\animals.htm")

条件12、13是说,哺乳动物要有毛发、分泌乳汁。

cond(9,"it has feathers","animals\\bird3.htm")

cond(14,"it lays eggs","<img src=\"animals/egg.jpg\">")

条件9、14是说,鸟类要有羽毛、会下蛋。

注意,cond的第3參数。是显示网页用的,与求证推理无关。

目标mammal和bird以下。还有子目标。

以mammal为例:

rule(10,"mammal","carnivore",[15],""),子目标是carnivore,食肉动物

rule(11,"mammal","ungulate",[16],"") ,子目标是ungulate,偶蹄类动物

2个或关系的目标carnivore 和ungulate 之下。还有子目标。以carnivore为例:

rule(1,"carnivore","cheetah",[1,2],"animals\\cheetah.htm")。子目标是猎豹

rule(2,"carnivore","tiger",[1,3],"<img src=\"animals/tiger02.jpg\">") ,子目标是老虎

cheetah 和tiger 是以上推理树的叶节点,最后的子目标。

假设rule 1 的证明条件[1,2],或者rule 2 的证明条件[1,3]为真,就形成完整的证明链条,得出证明结论。


2、推理求证的起点与终点:谓词go

  go( _, Mygoal, Rulexpl ):-is_htmlfile(Rulexpl),!,consult_htm(Rulexpl,HTMLtext),gethtmlbody(HTMLtext,Bodytext),not(rule(_,Mygoal,_,_,_)),!,nl, write("I think the answer is : ",Mygoal),nl,write(Bodytext),nl,endpage("").go( _, Mygoal, Rulexpl ):-not(rule(_,Mygoal,_,_,_)),!,nl,write("I think the answer is : ",Mygoal),nl,write(Rulexpl),nl,endpage("").go( HISTORY, Mygoal,_ ):-rule(RNO,Mygoal,NY,COND,Rulexpl),check(RNO,HISTORY, COND),go([RNO|HISTORY],NY,Rulexpl).go( _, Mygoal,_ ):-rule(_RNO,Mygoal,_NY,_COND,_Rulexpl),!,true,write("<H> Sorry, but I have no answer for this problem! </H>\n"),endpage("").

谓词go以递归进行循环,有下面特点:

(1)、子句1和2是全然同样的递归终止条件,not(rule(_,Mygoal,_,_,_))

它的含意是。当前处理的目标Mygoal。不是动物的“类别”,而是动物的名称。

这时,该详细动物的证明条件为真。即animal的所有子目标都为真,目标证明为真。

复习一下rule的数据格式,第2參数是动物类别。

子句1和2的不同之处,是它们处理网页显示的方法不同,与推理求证无关。

(2)、第3子句。取出当前目标Mygoal(动物类别)的rule,用check求证Mygoal是否为真。即证明条件是否所有为真;

假设求证为真,接着做3件事情:

①、把Mygoal的rule编号放在列表HISTORY的表头,记录下试过的rule,以供处理why问题时使用;

②、把Mygoal的子目标NY作为下一个求证的目标,以保障逐步向终于目标求证下去。

③、曾经2个设置为參数。进行递归推理求证。

(3)、第4个子句。本次求证失败,告知用户。

能求证本子句。说明前3个子句都求证失败。

也就是说,即未证明是何种动物,又无法继续递归,仅仅能以证明失败告终。

注意,谓词go的第3子句,颇有“技术含量”,值得多看几眼。


3、求证规则成立的条件的真假:谓词check

这是去掉“无用子句”的版本号:

 check( RNO, HISTORY, [CNO|REST] ):-yes(CNO),!,check(RNO, HISTORY, REST).check( _, _, [CNO|_]):-no(CNO),!,fail.check( RNO, HISTORY, [CNO|REST] ):-cond(CNO,TEXT,OPTIONS),!,inpq(HISTORY,RNO,CNO,TEXT,OPTIONS),check(RNO, HISTORY, REST). check( _, _, []).

Check有下面特点:

(1)、子句1用递归方式,对第3參数[CNO|REST],所有证明条件逐一求证。

假设各个条件所有yes。返回go第3子句交差。Go则又一次设置參数,对本规则做下一步求证。

(2)、子句2专门处理证明条件为假,从而否定规则的情况。

当发现有no(CNO)后。用“!,fail”强制失败并取消回溯。不再求证其它no(X)条件,而且,不回溯再试第3和第4子句。

子句2的这一失败,返回给go子句3之后,造成后者的失败。引发其对rule回溯求证,寻找新的rule重试。

go子句3若找到合法的新rule,就開始新的递归;否则,求证失败。

(3)、子句3处理证明条件CNO未定真假的情况。

若没有事实yes(CNO)和no(CNO) 存在,子句1和2都失败。则回溯到子句3。

子句3有逻辑错误。

求证的inpq若成功,会调用内建谓词exit,geni.exe关闭;

若inpq失败。则check子句3也失败。

而且,因已有”!”,不会回溯到check子句4.

不管哪种情况。check子句3的末尾一句,check(RNO, HISTORY, REST)不会求证。

正确的逻辑应该例如以下。

check( RNO, HISTORY, [CNO|REST] ):-cond(CNO,TEXT,OPTIONS),!,inpq(HISTORY,RNO,CNO,TEXT,OPTIONS).

改动了check子句3。程序又一次编译执行,结果正常。


4、分析GENI推理机的其它办法

第一种办法。是借助VIP自有的debugger。使用的难度不大。仅仅是过程琐碎,视界较小,效果有限。

我推荐一个办法。

主要讲详细操作,道理不多啰嗦。

(1)、启动Apacheserver。

(2)、在浏览器中,打开http://localhost/default.htm

(3)、下拉框选中 animal

(4)、button:Select Problem

(5)、在之后出现的网页中。一律button:yes

(6)、直至出现网页:“I think the answer is : cheetah”,和猎豹的图像

(7)、右击鼠标,点击:“查看页面源码”,可见下面“变量”:

<input type="hidden" name="knowledgebase"  value="animal">
<input type="hidden" name="cond_12"  value="yes">
<input type="hidden" name="cond_13"  value="yes">
<input type="hidden" name="cond_15"  value="yes">
<input type="hidden" name="cond_1"  value="yes">
<input type="hidden" name="cond_2"  value="yes">

依据前面几节的介绍。已知这些变量值,在推理机执行之前,进行了初始化处理,进入了事实库:

kb(animal),yse(12)。yse(13),yse(15),yse(1),yse(2)

有了这些前提条件和事实依据,就能够打开geni.pro,開始观察分析GENI推理机的执行。

转载于:https://www.cnblogs.com/clnchanpin/p/6805327.html

Visual Prolog 的 Web 专家系统 (10)相关推荐

  1. ASP.NET 4 和 Visual Studio 2010 Web 开发概述

    声明:本文是ASP.NET 白皮书 ASP.NET 4 and Visual Studio 2010 Web Development Overview 的阅读摘要,只是本人的学习记录,并非完整翻译,仅 ...

  2. [导入]Visual Studio 2005 Web Deployment Projects版本不同引发的问题

    Visual Studio 2005 Web Deployment Projects版本不同引发的问题 文章来源:http://blog.csdn.net/net_lover/archive/2006 ...

  3. NEIL: Extracting Visual Knowledge from Web Data

    知识图谱总结 常识知识图谱: Cyc:An introduction to the syntax and content of cyc ConceptNet:"Conceptnet-a pr ...

  4. NEIL: Extracting Visual Knowledge from Web Data 论文笔记

    论文结构 Neil:Never ending image learner Motivation NEIL Related Work Technical Approach Seeding Classif ...

  5. 第五篇:Visual Studio 2008 Web开发使用的新特性

    第五篇:Visual Studio 2008 Web开发使用的新特性 本篇翻译自MSDN. .NET Framwork 3.5与Visual Studio 2008 包含很多新特性.AJAX的Web开 ...

  6. Visual Studio 2005 Web Deployment Projects版本不同引发的问题

    为了方便Visual Studio 2005发布为单一dll,微软发布了一个Visual Studio 2005 插件,Visual Studio 2005 Web Deployment Projec ...

  7. Visual Studio® 2010 Web Deployment Projects站点编译生成bin同时发表插件

    VS2010环境下: 1.Visual Studio® 2010 Web Deployment Projects下载地址:         http://www.microsoft.com/downl ...

  8. Visual Studio 2005 Web Application Projects 正式推出

    Visual Studio 2005 Web Application Projects 正式推出拉,下载地址在 http://msdn.microsoft.com/asp.net/reference/ ...

  9. Visual Studio 使用 Web Deploy 发布远程站点

    Ø  简介 本文介绍 Visual Studio 如何使用 Web Deploy发布远程站点,有时候我们开发完某个功能时,需要快速将更改发布至服务器.通常 Visual Studio 可以采用两种方式 ...

最新文章

  1. 每日一题(开开森森学前端之变量与函数)
  2. 231. Power of Two
  3. hdu 5248(二分+贪心)
  4. hdu 4983(欧拉函数)
  5. territory pop up window是否显示的逻辑,和transaction type差不多
  6. 简化软件操作,提升用户体验
  7. Spring整合RabbitMQ
  8. 可拖动的进度条_视频号全新升级!进度条可拖动、支持@、支持转发......
  9. excel几个数相加等于某个数_Excel如何在一列数字中找出几个之和等于某个特定值...
  10. Cocos2dx-lua组件tableView的简单用法
  11. python数据拟合方法_Python-最小二乘法曲线拟合【转载】
  12. java将阿拉伯数字转换为中文数字
  13. java paypal 支付集成_java对接PayPal标准支付操作流程
  14. yy自动语音接待机器人_YY自动欢迎老板,全自动欢迎,来人自动欢迎广播(文字欢迎)...
  15. jquery json string conver to object
  16. Python爬取的微信好友信息里我看到了自律 | CSDN博文精选
  17. MySQL通过分组计算百分比
  18. 上交计算机考研专业课,2018上交考研经验贴
  19. 2020年数据标注行业回顾及2021年展望
  20. android 四大组件Broadcast Receiver

热门文章

  1. 如何获取Agile PLM Business Object 对应Agile对象的属性?
  2. 北大青鸟广州天河中心C#学习笔记一--C#中的参数传递
  3. Hibernate(十三)迫切内连接fetch
  4. 项目: NFS服务的搭建
  5. 源代码安装httpd服务器
  6. KafkaConsumer源码解析
  7. 使用SharePoint 2010 母版页
  8. WPF中的图表设计器 – 2
  9. 网 络 欺 骗 技 术
  10. centos怎么查看用户和用户组