博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Visual Prolog 的 Web 专家系统 (9)
阅读量:7040 次
发布时间:2019-06-28

本文共 3730 字,大约阅读时间需要 12 分钟。

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_TAG_LEN), STARTPOS = LEN1+BODY_TAG_LEN+1, searchstring(LOWERTEXT,"",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("
"), write("
"), write("
"), write("\n"), write("\n"), write("\n"). endpage(CONDITION) :- write_kb, write_conditions, writef("\n",CONDITION), write(""), write("\n"), %%这一句没用。可删除 write("

\n"), writef("\n",CONDITION), writef("\n",CONDITION), writef("\n"),%

\n"), write("

\n"), write("
\n"), write("\n"), write("\n").

endpage里调用了2个谓词write_kb和write_conditions。

write_kb

write_kb:-	kb(KB),!,	writef("\n",KB).  write_kb:-	errorexit().

kb是事实库谓词,当前的KB="animal",表示知识库的名字

在CGI方式下。程序所需变量。要在各网页接续下传。

这里的writef,正在做这件事情。

write_conditons

write_conditions:-	yes(CNO),	format(CONDITION,"cond_%",CNO),	writef("\n",CONDITION),	fail.  write_conditions:-	no(CNO),	format(CONDITION,"cond_%",CNO),	writef("\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"

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问题的处理,比較复杂,添加一节。专门说说。

转载地址:http://eixal.baihongyu.com/

你可能感兴趣的文章
使用位操作
查看>>
Babelfish(二分)
查看>>
JS 中如何判断 undefined 和 null
查看>>
ftk学习记录(一个进度条文章)
查看>>
log4j直接输出日志到flume
查看>>
非正确使用浮点数据由项目产生BUG讨论的问题
查看>>
PHP5中的stdClass
查看>>
IntelliJ IDEA Community Edition 14.1.4下使用 Apache-Subversion搭建代码管理环境
查看>>
四种可变交流swap方法
查看>>
Lucene中的 Query对象
查看>>
二分基础
查看>>
物流英语
查看>>
[iOS]iOS8可用的识别用户方式(idfa、UUID、idfv)
查看>>
hdu1507--二分图最大匹配
查看>>
【数据结构与算法】二叉树深度遍历(递归)
查看>>
iOS开发--基于AFNetWorking3.0的图片缓存分析
查看>>
使用jqMobi开发app基础:弹出内容的设计
查看>>
3.Java集合总结系列:Set接口及其实现
查看>>
ExtJs之Element.select函数
查看>>
驱动程序调试方法之printk——自制proc文件(一)
查看>>