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>\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).

(4)、子句4处理知识库谓词cond的错误,措施不当。

只有当知识库的cond谓词发生严重错误时,才可能求证子句4。

这时,正确的做法,子句4应该立即报错报警,不能知情不报,留下隐患。

我修改了check子句3,用注释屏蔽了子句4.程序重新编译运行,结果正常。


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

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

我推荐一个办法。主要讲具体操作,道理不多啰嗦。

(1)、启动Apache服务器;

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

(3)、下拉框选中 animal

(4)、按钮:Select Problem

(5)、在之后出现的网页中,一律按钮: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.peo,开始观察分析GENI推理机的运行。

Visual Prolog 的 Web 专家系统 (10),布布扣,bubuko.com

时间: 2024-10-05 06:44:13

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

Visual Prolog 的 Web 专家系统 (7)

GENI的核心 -- 推理机(1)知识表示 GOAL段最后一句是子句infer(),它的含意是"推理". 由此,进入GENI的核心,察看推理机的运行. infer() infer():- topic(Maingoal,_), go([],MainGoal,""),!. infer():- errorexit. topic(Maingoal,_) topic现存于事实库geni中,取出的Maingoal = "animal", 详见<Visu

Visual Prolog 的 Web 专家系统 (11)

GENI的核心 -- 推理机(5)处理why问题 1.why问题由客户从浏览器提出 专家系统工作时,需要向用户提出问题,收集推理求证用的事实根据. 用户有时想知道,系统为什么提出这样的问题,要求系统给出解释.这就是所谓的why问题. why问题的提出,是按动网页按钮"why"的结果. 2.why功能的设置 GENI的第一个页面default.htm并没有按钮"why".它的设置过程是这样的: 从上一节的谓词check第3子句说起. check( RNO, HISTO

Visual Prolog 的 Web 专家系统 (5)

使用现成网页 再说个小伎俩. 在VIP开发环境中,可以随时测试代码,不必编译成exe文件. 比如,想看看VIP内建谓词filenameext的执行结果,可以在一空白.pro文件中写入: GOAL filenameext("prolog.exe",Name,Ext), filenameext(NewName,"prolog.exe",".err"). 然后点选菜单"Project | Test Goal",就会看到以下结果: N

Visual Prolog 的 Web 专家系统 (6)

保存用户对询问的回答结果,作为进一步推理的条件 还是从GOAL段开始.起始句是write_startform() write_startform():- write("<form action=\"\cgi-bin\geni.exe\"method=\"post\">\n"). 注意!上一句应为write("<form action=\"geni.exe\"method=\"post\&q

Visual Prolog 的 Web 专家系统 (3)

深入探究WEB GENI源程序 折腾WEB GENI的目的,是为了摸清它的结构设计.运行机制,为山寨出自己的专家系统外壳,积累经验,启发思路. 为此,必须深入细致地研读源程序代码. WEBGENI包括2个模块:geni.pro和cgitools.pro.前者是主程序,负责推理.生成网页等:后者负责相对底层的CGI数据处理.本文探究的对象,主要是geni.pro. Visual Prolog(以下简称VIP)程序由几种代码段构成: PREDICATES :谓词段.相当于C语言的函数声明 CLAUS

Visual Prolog 的 Web 专家系统 (4)

知识库操作 先说个小伎俩. 在VIP中打开geni.prj,菜单选Options,打开Application Expert,点击Other Options, 点击Project Directories,点击Output,在Final文本框填入d:\Apache2.2\htdocs\GENI 这个目录是GENI虚拟主机所在之处. 这样做的目的,是编译后geni.exe会自动存入上述目录,省去了人工搬运的麻烦. 开始今天的话题,进行知识库操作. 下一步是执行GOAL段的子句consult_kb(Pa

Visual Prolog 的 Web 专家系统 (8)

GENI的核心 -- 推理机(2)流程控制 1.细说fail."!"与回溯 与其他语言相比,Prolog最大的特点,是它的回溯机制. 回溯机制,主要手段有2个,一是用谓词fail引发回溯,二是用特别谓词"!"(读作cut)取消回溯. Prolog运用fail引发回溯,实现程序的循环,并运用"!"对回溯进行控制. 看一个典型示例: FACTS f(integer) PREDICATES a() b() c() CLAUSES a():- write

Visual Prolog 的 Web 专家系统 (9)

GENI的核心 -- 推理机(3)一些谓词 为了集中注意力,较好地分析GENI推理机核心程序,应该做些准备工作,弄明白一些起辅助作用的谓词功能. is_htmlfile(Rulexpl) is_htmlfile(FILE):- filenameext(File,_Name,Mask), Mask = ".htm",!. is_htmlfile(FILE):- filenameext(File,_Name,Mask), Mask = ".html",!. 如果FILE

Visual Prolog 的 Web 专家系统 (2)

Web 专家系统 WWWGENI 在目录<VIP_root>\WWW\Programs\GENI中,有个例程,展示如何创建在WEB服务器支持下,以CGI脚本方式在因特网上工作的小型专家系统. GENI 使用极为简单的规则表示知识,当满足某些条件时,适用这些规则. rule(1,"carnivore","cheetah",[1,2],"") rule(2,"carnivore","tiger",[