标签:style color strong os 文件 art
为了集中注意力,较好地分析GENI推理机核心程序,应该做些准备工作,弄明白一些起辅助作用的谓词功能。
is_htmlfile(FILE):- filenameext(File,_Name,Mask), Mask = ".htm",!. is_htmlfile(FILE):- filenameext(File,_Name,Mask), Mask = ".html",!.
如果FILE的扩展名是“.htm”,或者“.html”,该谓词成功。否则失败。
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(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.
介绍下其中的谓词:
VIP内建谓词。流模式(i, i), (i, o), (o, i) upper_lower (STRING UpperCase, STRING LowerCase) upper_lower (CHAR UpperCase, CHAR LowerCase) 用于大写的字符(串),与小写的字符(串)相互转换
VIP内建谓词。流模式(i, i, o) searchstring (STRING SourceStr, STRING SearchStr, UNSIGNED Position) 确定字符串中,子串的一端位置
VIP内建谓词。流模式(i, i, i, o) ubstring (STRING Source, UNSIGNED Pos, UNSIGNED Len, STRING Part) 返回字符串中指定的一部分(子串)Part
子句gethtmlbody(TEXT,BODY),从字符串TEXT中,抠出子串BODY,
算法清楚直观,不必细说。
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=\"yes\">\n",CONDITION),
write("<FONT SIZE=+6 ><I><B>"),
write("<input type=\"hidden\" name=\"answer\" value=\"Yes\">\n"), %%这一句没用,可删除
write("<p><Input type=\"SUBMIT\" value=\"Yes\">\n"),
writef("<Input type=\"BUTTON\" value=\"No\" onclick=\"form.%s.value=‘no‘;submit()\">\n",CONDITION),
writef("<Input type=\"BUTTON\" value=\"Why\" onclick=\"form.%s.value=‘why‘;submit()\">\n",CONDITION),
writef("</Form>\n"),%<Form action=\"/geni.htm\">\n"),
write("</p></form>\n"),
write("</FONT>\n"),
write("</BODY>\n"),
write("</HTML>\n").
endpage里调用了2个谓词write_kb和write_conditions。
write_kb:- kb(KB),!, writef("<input type=\"hidden\" name=\"knowledgebase\" value=\"%s\">\n",KB). write_kb:- errorexit().
kb是事实库谓词,当前的KB="animal",表示知识库的名字
在CGI方式下,程序所需变量,要在各网页接续下传。这里的writef,正在做这件事情。
write_conditions:- yes(CNO), format(CONDITION,"cond_%",CNO), writef("<input type=\"hidden\" name=\"%s\" value=\"yes\">\n",CONDITION), fail. write_conditions:- no(CNO), format(CONDITION,"cond_%",CNO), writef("<input type=\"hidden\" name=\"%s\" value=\"no\">\n",CONDITION), fail. write_conditions.
对这个谓词有点说道。
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"
VIP内建谓词,流模式(i), 进行逻辑非运算。 如果rule(_,Mygoal,_,_,_)不在事实库里,not(rule(_,Mygoal,_,_,_))为真;否则为假。
这个谓词的第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(CNO):-no(CNO),!.
notest(CNO):-not(yes(CNO)),!.
可将以上“没用的”子句,从geni.pro代码中注释掉,编译运行验证。
这一节的内容已经不少,但没说到专家系统的重要功能 -- 对 why 问题的处理。
对why问题的处理,比较复杂,增加一节,专门说说。
Visual Prolog 的 Web 专家系统 (9),布布扣,bubuko.com
标签:style color strong os 文件 art
原文地址:http://blog.csdn.net/lawme/article/details/37913725