首页 > 代码库 > Visual Prolog 的 Web 专家系统 (9)
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的扩展名是“.htm”,或者“.html”,该谓词成功。否则失败。
consult_htm(Rulexpl,HTMLtext)
consult_htm(FileName,HTMLTEKST):- syspath(ExeStartupPath,_ProgName), filenamepath(FullName,ExeStartupPath,FileName), trap(file_str(FullName,HTMLTEKST),_,writef("File % is not found! Correct problem!\n",FullName)),!. consult_htm(_,""):- errorexit.
按照指定路径和文件名,把html文件内容读入变量HTMLTEKST,“返回”。
若子句1出错,回溯到子句2后报错退出。
gethtmlbody(HTMLtext,Bodytext)
gethtmlbody(TEXT,BODY):- upper_lower(TEXT,LOWERTEXT), searchstring(LOWERTEXT,"<body",LEN1), frontstr(LEN1,LOWERTEXT,_,TXT1), searchchar(TXT1,‘>‘,BODY_TAG_LEN), STARTPOS = LEN1+BODY_TAG_LEN+1, searchstring(LOWERTEXT,"</body>",ENDPOS), LEN = ENDPOS-STARTPOS, substring(TEXT,STARTPOS,LEN,BODY),!. gethtmlbody(_,""):- errorexit.
介绍下其中的谓词:
upper_lower(TEXT,LOWERTEXT)
VIP内建谓词。流模式(i, i), (i, o), (o, i) upper_lower (STRING UpperCase, STRING LowerCase) upper_lower (CHAR UpperCase, CHAR LowerCase) 用于大写的字符(串),与小写的字符(串)相互转换
searchstring(LOWERTEXT,"<body",LEN1)
VIP内建谓词。流模式(i, i, o) searchstring (STRING SourceStr, STRING SearchStr, UNSIGNED Position) 确定字符串中,子串的一端位置
substring(TEXT,STARTPOS,LEN,BODY)
VIP内建谓词。流模式(i, i, i, o) ubstring (STRING Source, UNSIGNED Pos, UNSIGNED Len, STRING Part) 返回字符串中指定的一部分(子串)Part
子句gethtmlbody(TEXT,BODY),从字符串TEXT中,抠出子串BODY,
算法清楚直观,不必细说。
endpage("")
endpage("") :-!, write_kb, write_conditions, write("<Center>"), write("<FONT SIZE=+6 ><I><B>"), write("</Center>"), write("</FONT>\n"), write("</BODY>\n"), write("</HTML>\n"). endpage(CONDITION) :- write_kb, write_conditions, writef("<input type=\"hidden\" name=\"%s\" value=http://www.mamicode.com/"yes/">/n",CONDITION),"color:red">write("<input type=\"hidden\" name=\"answer\" value=http://www.mamicode.com/"Yes/">/n"),%%这一句没用,可删除 write("<p><Input type=\"SUBMIT\" value=http://www.mamicode.com/"Yes/">/n"),>
endpage里调用了2个谓词write_kb和write_conditions。
write_kb
write_kb:- kb(KB),!, writef("<input type=\"hidden\" name=\"knowledgebase\" value=http://www.mamicode.com/"%s/">/n",KB).>kb是事实库谓词,当前的KB="animal",表示知识库的名字
在CGI方式下,程序所需变量,要在各网页接续下传。这里的writef,正在做这件事情。
write_conditons
write_conditions:- yes(CNO), format(CONDITION,"cond_%",CNO), writef("<input type=\"hidden\" name=\"%s\" value=http://www.mamicode.com/"yes/">/n",CONDITION),>对这个谓词有点说道。
yes(CNO)和no(CNO)是事实库谓词,分别代表用户对第CNO号(条件)询问, 已经做出的肯定或否定的回答。 format(CONDITION,"cond_%",CNO)是VIP内建谓词。 format (STRING OutputString, STRING FormatString, Arg1, Arg2, ..., ArgN) 流模式(o, i, i, i, i....) ,将多个参数格式化为字符串 本例的结果(假设CNO=5)是:CONDITION = "cond_5"not(rule(_,Mygoal,_,_,_))
VIP内建谓词,流模式(i), 进行逻辑非运算。 如果rule(_,Mygoal,_,_,_)不在事实库里,not(rule(_,Mygoal,_,_,_))为真;否则为假。check(RNO,HISTORY, COND)
这个谓词的第3和第4子句(红色部分),目前没有实际用处,可以删除。
check( RNO, HISTORY, [CNO|REST] ):- yes(CNO),!, check(RNO, HISTORY, REST). check( _, _, [CNO|_]):- no(CNO), !,fail. check( RNO, HISTORY, [CNO|REST]):- cond(CNO,NCOND,OPTIONS), fronttoken(NCOND,"not",_COND), frontchar(_COND,_,COND), cond(CNO1,COND,OPTIONS), notest(CNO1), !, check(RNO, HISTORY, REST). check(_,_, [CNO|_] ):- cond(CNO,NCOND,OPTIONS), fronttoken(NCOND,"not",_COND), frontchar(_COND,_,COND), cond(CNO1,COND,OPTIONS), yes(CNO1), !, fail. check( RNO, HISTORY, [CNO|REST] ):- cond(CNO,TEXT,OPTIONS),!, inpq(HISTORY,RNO,CNO,TEXT,OPTIONS), check(RNO, HISTORY, REST). check( _, _, []).
check的第3第4子句,处理的对象,是知识库中的谓词cond(编号,询问的问题,提示)。
如果“询问的问题”是以“not”开头,check的第3第4子句会做出相应处理。
但是,“询问的问题”没有以“not”开头的,check的第3第4子句没有实际用处。
同样,check的第4子句求证的notest(CNO1),也没有用处,可以一并删除。
notest(CNO1)
notest(CNO):-no(CNO),!. notest(CNO):-not(yes(CNO)),!.
可将以上“没用的”子句,从geni.pro代码中注释掉,编译运行验证。
这一节的内容已经不少,但没说到专家系统的重要功能 -- 对 why 问题的处理。
对why问题的处理,比较复杂,增加一节,专门说说。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。