zoukankan      html  css  js  c++  java
  • 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!
    ",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>
    "),
            write("</BODY>
    "), 
            write("</HTML>
    "). 
    
      endpage(CONDITION) :-
    	write_kb,
    	write_conditions,
    	writef("<input type="hidden" name="%s"  value="yes">
    ",CONDITION),
            write("<FONT SIZE=+6 ><I><B>"), 
            write("<input type="hidden" name="answer" value="Yes">
    "), %%这一句没用。可删除
    	write("<p><Input type="SUBMIT" value="Yes">
    "),
    	writef("<Input type="BUTTON" value="No" onclick="form.%s.value='no';submit()">
    ",CONDITION),
    	writef("<Input type="BUTTON" value="Why" onclick="form.%s.value='why';submit()">
    ",CONDITION),
            writef("</Form>
    "),%<Form action="/geni.htm">
    "),
            write("</p></form>
    "),
            write("</FONT>
    "),
            write("</BODY>
    "), 
            write("</HTML>
    "). 
    

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

    write_kb

      write_kb:-
    	kb(KB),!,
    	writef("<input type="hidden" name="knowledgebase"  value="%s">
    ",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">
    ",CONDITION),
    	fail.
      write_conditions:-
    	no(CNO),
    	format(CONDITION,"cond_%",CNO),
    	writef("<input type="hidden" name="%s"  value="no">
    ",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问题的处理,比較复杂,添加一节。专门说说。

  • 相关阅读:
    Android 动画
    Eclipse设置软tab(用4个空格字符代替)及默认utf-8文件编码(unix)
    android ANR
    Android 服务端开发之开发环境配置
    安装Android sdk 4.4(19)出现问题的解决方案
    adb uninstall/pull/push 命令的使用总结
    Android学习笔记1 android adb启动失败问题 adb server is out of date. killing...
    Android.mk文件语法规范 原文
    Android MediaProvider数据库模式
    Android MVC模式
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5360491.html
Copyright © 2011-2022 走看看