再说个小伎俩。
在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中的几个语句。
它是事实库geni中的一条事实,上一节(《Visual Prolog 的 Web 专家系统 (4) 》)
中已有介绍,它出自animal.gni,FILENAME = "animal.htm"
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,上节已有介绍。
在我的机器上,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是报错的谓词调用。
把网页body的内容写入CGI。今天的任务完成。
Visual Prolog 的 Web 专家系统 (5),布布扣,bubuko.com
原文地址:http://blog.csdn.net/lawme/article/details/37612725