zoukankan      html  css  js  c++  java
  • Visual Prolog 的 Web 专家系统 (10)

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

  • 相关阅读:
    关于组件(包括控件)设计的一些建议
    请教:不能运行asp程序了??
    (ASP.NET)几个概念与区别
    突然想起99年的那次离别
    什么是计划
    服务器控件开发基础应用设计期Attribute
    收藏些API资料
    今天的感觉呐喊
    重新启用本blog
    关于Clone
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6805327.html
Copyright © 2011-2022 走看看