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=\"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
write_kb:-
kb(KB),!,
writef("<input type=\"hidden\" name=\"knowledgebase\" value=\"%s\">\n",KB).
write_kb:-
errorexit().
kb是事实库谓词,当前的KB="animal",表示知识库的名字
在CGI方式下。程序所需变量。要在各网页接续下传。
这里的writef,正在做这件事情。
write_conditons
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"
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问题的处理,比較复杂,添加一节。专门说说。
Visual Prolog 的 Web 专家系统 (9)的更多相关文章
- Visual Prolog 的 Web 专家系统 (1)
用Prolog敲代码,感觉舒坦. Prolog的编程范式,抽象程度远高于中.低级别的C语言等.敲代码的源码长度,至少比C语言的节省50%. 并且,Prolog的语法简单,符号选择自然合理,养眼度远高于 ...
- Visual Prolog 的 Web 专家系统 (7)
GENI核心 -- 推理引擎(1)知识表示 GOAL最后一句是谓语infer(),它的含义是"论证". 因此,,进GENI核心,执行视图推理引擎. infer() infer(): ...
- Visual Prolog 的 Web 专家系统 (8)
GENI核心 -- 推理引擎(2)流量控制 1.阐述fail."!"而回溯 与其他语言相比,,Prolog最大的特点.这是回溯机制. 回溯机制,还有的主要手段2个月,首先,通过使用 ...
- Visual Prolog 的 Web 专家系统 (6)
保存用户响应询价.作为进一步推理的条件 或GOAL段开始.最初的一句是write_startform() write_startform():- write("<form action ...
- Visual Prolog 的 Web 专家系统 (10)
GENI的核心 -- 推理机(4)求证过程分析 1.GENI知识库结构 专家系统推理机的设计执行,与其知识库结构紧密相关. GENI知识库结构是一棵逻辑推理树. 根节点是animal,即求证的目标. ...
- Visual Studio 2013 Web开发
cnbeta新闻:微软正式发布Visual Studio 2013 RTM版,微软还发布了Visual Studio 2013的最终版本..NET 4.5.1以及Team Foundation Ser ...
- VSS提示"Could not find the Visual SourceSafe Internet Web Service connection information for the specified database
转自:http://www.cnblogs.com/qqflying/archive/2007/12/18/1004051.html VSS连接错误提示: ====================== ...
- Visual Studio的Web Performance Test提取规则详解(3)
总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...
- Visual Studio的Web Performance Test提取规则详解(2)
总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...
随机推荐
- C# 委托总结
总结 委托的本质: 委托是一种特殊的数据类型,它表示某种特定类型的函数,并且可以表示多个函数,将这些函数串联起来.使用委托就好像函数调用一样. 委托实质上是一个类,编译器会根据关键字delegate自 ...
- 回调函数、Java接口回调 总结
谈到回调,我们得先从回调函数说起,什么叫回调函数呢? 回调函数是什么? 百度百科的解释:回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用 ...
- 数组乘积--满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出
数组乘积(15分) 输入:一个长度为n的整数数组input 输出:一个长度为n的整数数组result,满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出). ...
- .net获取当前网址url(各种参数值)
.net获取当前网址url(各种参数值) 假设当前页完整地址是:http://www.test.com/aaa/bbb.aspx?id=1&name=category" 先来看一下整 ...
- MongoDB@入门一
安装MongoDB自行搜索, 我这里提供GUI版本类似navicat. 1. 数据库层面 show dbs #查看服务器上的数据库 [local 0.000GB] use test #切换到指定 ...
- PHP:6种GET和POST请求发送方法
在i94web博客中,我试过了畅言和多说两种社会化评论框,后来还是抛弃了畅言,不安全. 无论是畅言还是多说,我都需要从远程抓取文章的评论数,然后存入本地数据库.对于多说,请求的格式如下: // 获取评 ...
- 精妙SQL语句 基础
精妙SQL语句SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我留一些更好的佳句, ...
- [HIve - LanguageManual] Hive Operators and User-Defined Functions (UDFs)
Hive Operators and User-Defined Functions (UDFs) Hive Operators and User-Defined Functions (UDFs) Bu ...
- 中断——中断处理程序的进入与退出 (基于3.16-rc4)
上一篇博文我们分析了中断描述符表的中断门初始化过程,并且在interrupt数组中初始化过程中,可以看到每个中断处理程序都会跳入common_interrupt中.下面我们分析下common_inte ...
- 【bz2594】水管局长数据加强版
题意: 给出一张n节点.m条代权无向边的无向联通图 和q个任务 1:询问一条x到y的路径 并使路径上最大权值最小 要求输出路径上最大权值 2:宣布x到y的路径报废题目保证该图永远联通 题解: 这是道凶 ...