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推理机的执行。

Visual Prolog 的 Web 专家系统 (10)的更多相关文章

  1. Visual Prolog 的 Web 专家系统 (1)

    用Prolog敲代码,感觉舒坦. Prolog的编程范式,抽象程度远高于中.低级别的C语言等.敲代码的源码长度,至少比C语言的节省50%. 并且,Prolog的语法简单,符号选择自然合理,养眼度远高于 ...

  2. Visual Prolog 的 Web 专家系统 (7)

    GENI核心 -- 推理引擎(1)知识表示 GOAL最后一句是谓语infer(),它的含义是"论证". 因此,,进GENI核心,执行视图推理引擎. infer() infer(): ...

  3. Visual Prolog 的 Web 专家系统 (9)

    GENI的核心 -- 推理机(3)一些谓词 为了集中注意力.较好地分析GENI推理机核心程序,应该做些准备工作,弄明确一些起辅助作用的谓词功能. is_htmlfile(Rulexpl) is_htm ...

  4. Visual Prolog 的 Web 专家系统 (8)

    GENI核心 -- 推理引擎(2)流量控制 1.阐述fail."!"而回溯 与其他语言相比,,Prolog最大的特点.这是回溯机制. 回溯机制,还有的主要手段2个月,首先,通过使用 ...

  5. Visual Prolog 的 Web 专家系统 (6)

    保存用户响应询价.作为进一步推理的条件 或GOAL段开始.最初的一句是write_startform() write_startform():- write("<form action ...

  6. Visual Studio 2013 Web开发

    cnbeta新闻:微软正式发布Visual Studio 2013 RTM版,微软还发布了Visual Studio 2013的最终版本..NET 4.5.1以及Team Foundation Ser ...

  7. Could not find the Visual SourceSafe Internet Web Service connection information

    Visual SourceSafe Internet---------------------------Could not find the Visual SourceSafe Internet W ...

  8. 转:Visual Studio进行Web性能测试- Part I

    原文作者:Ambily.raj Visual Studio是可以用于性能测试的工具之一.Visual Studio Test版或Visual Studio 2010旗舰版为自动化测试提供了支持.本文介 ...

  9. Visual Studio进行Web性能测试- Part II

    Visual Studio进行Web性能测试- Part II 2012-08-31 14:34 by 知平软件, 7557 阅读, 5 评论, 收藏, 编辑 原文作者:Ambily.raj 对于一个 ...

随机推荐

  1. [03] html 中引入与使用css

    1. 使用style属性 <a style="color: red;"> hello ,there use style attribute</a> 2. l ...

  2. UBI 文件系统移植 sys 设备信息【转】

    转自:http://blog.chinaunix.net/uid-25304914-id-3058647.html cat /sys/class/misc/ubi_ctrl/dev --------- ...

  3. java基础练习 14

    import java.util.Scanner; public class Fourtheen { /*打印出所有的"水仙花数",所谓"水仙花数"是指一个三位 ...

  4. python--cProfile,memory_profiler,psutil

    关于测试代码用了多长时间,我们之前介绍了timeit.相较于timeit,python中还有一个更加强大的模块,cProfile模块 (提到cProfile,其实还有一个profile,但profil ...

  5. bash shell 文本文件操作

    一.打开文本文档,查看文本的内容,我们最直观的方式就是用编辑器,并且可以使用vi内部的查找命令查找[参见Vim文字编辑] vi test.txt#使用vi打开当前目录下的test.txt文本 二.总结 ...

  6. Bfs【p2385】 青铜莲花池

    题目描述--->p2385 青铜莲花池 分析 很明显了,题目告诉我们有八个方向,当然优先考虑bfs! 很简单的bfs,重点在于考虑清楚8个方向. 自己刚开始打错了 emmm 给大家上一个图.↓ ...

  7. 【bzoj1598】【 [Usaco2008 Mar]牛跑步】启发式搜索思路+spfa

    (上不了p站我要死了,侵权度娘背锅) 最近复习搜索,先从启发式搜索来吧. 感觉启发式搜索这玩意挺玄学的,先从其思想入手,做一道经典的K短路. Description BESSIE准备用从牛棚跑到池塘的 ...

  8. 【bzoj4443】【[Scoi2015]小凸玩矩阵】二分+二分图最大匹配

    (上不了p站我要死了,侵权度娘背锅) Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸 ...

  9. php的一些语法

    命名空间: 一个类为App/Http/Controllers/Controller,则该类的命名空间为App/Http/Controllers,可以通过use关键字导入该类,也可以导入命名空间,但是该 ...

  10. GIF工具 | 分享几个Gif相关工具

    文章目录 LICEcap GiFResizer LICEcap LICEcap 是一款屏幕录制工具,支持导出GIF动画图片格式,轻量级.使用简单,录制过程中可以随意改变录屏范围. 下载地址: 官方地址 ...