Visual Prolog 的 Web 专家系统 (5)

使用现成网页

再说个小伎俩。

在VIP开发环境中,可以随时测试代码,不必编译成exe文件。

比如,想看看VIP内建谓词filenameext的执行结果,可以在一空白.pro文件中写入:

GOAL
        filenameext("prolog.exe",Name,Ext),
        filenameext(NewName,"prolog.exe",".err").

然后点选菜单"Project | Test Goal",就会看到以下结果:

Name=PROLOG, Ext=.EXE, NewName=PROLOG.ERR

另外,Prolog的基本特点和用法,大致包括匹配(合一)、回溯、截断、
流模式等,在《Visual Prolog 的 Web 专家系统 (4) 》
中已有介绍,以后不再展开细说。

现在进入今天的话题,生成网页。

起点是GOAL段的语句:userdefined_startpage()

  userdefined_startpage():-
	default_startpage(FILENAME),
  	consult_htm(FILENAME,HtmlText),!,
        gethtmlbody(HtmlText,BodyText),
        write(BodyText).
  userdefined_startpage():-
	kb(KB),!,
	write("<h1>Geni Expert system</h1>\n"),
	writef("<h2>Knowledgebase: %</h2><hr />",KB).
  userdefined_startpage():-
	errorexit.

先看一下它的流程控制。
把这3个子句,分别叫做子句1、子句2、子句3吧。

1、子句1执行default_startpage(FILENAME)若失败,
回溯到子句2,若事实库中有kb(KB),
运行完子句2,子句3没有机会再执行;

2、若子句2,事实库中没有kb(KB),
回溯到子句3,程序报错退出。

3、子句1执行consult_htm(FILENAME,HtmlText)成功后,
接着执行完全部语句,写出网页body部分,
并发生截断,子句2、子句3没有机会再回溯执行;

下面看子句1中的几个语句。

default_startpage(FILENAME)

它是事实库geni中的一条事实,上一节(《Visual Prolog 的 Web 专家系统 (4) 》)
中已有介绍,它出自animal.gni,FILENAME = "animal.htm"

consult_htm(FILENAME,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.

2个谓词syspath和filenamepath,上节已有介绍。

trap(file_str(FullName,HTMLTEKST),_,writef("File % is not found! Correct problem!\n",FullName))

在我的机器上,FullName = "d:\\apache2.2\\htdocs\\geni\\animal.htm"
执行file_str的结果,是把该文件的内容,存入变量HTMLTEKST
VIP内建谓词writef是格式化输出。内容是:
File d:\apache2.2\htdocs\geni\animal.htm is not found! Correct problem!

以下是对trap的介绍。

内建谓词trap( PredicateCall, INTEGER ExitCode, ErrorPredicate)

流模式是(i, o,i)

用于捕获程序的退出、中断和运行时错误。

调用的子句PredicateCall的成败,导致trap的成败。

ErrorPredicate是报错的谓词调用。

write(BodyText)

把网页body的内容写入CGI。今天的任务完成。

Visual Prolog 的 Web 专家系统 (5),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。