Visual Prolog 的 Web 专家系统 (8)

GENI的核心 -- 推理机(2)流程控制

1、细说fail、“!”与回溯

与其他语言相比,Prolog最大的特点,是它的回溯机制。

回溯机制,主要手段有2个,一是用谓词fail引发回溯,二是用特别谓词“!”(读作cut)取消回溯。

Prolog运用fail引发回溯,实现程序的循环,并运用“!”对回溯进行控制。

看一个典型示例:

FACTS
	f(integer)
PREDICATES
	a()
	b()
	c()
CLAUSES
	a():-
		write("------ a -------\n"),
		f(X),
		writef("%\n",X),
		fail.
	a():-
		write("a is sucsess.").
%---------------------------------------------------------
	b():-
		write("\n\n------- b -------\n"),
		f(X),
		writef("%\n",X),
		!,
		fail.
	b():-
		write("b is sucsess.").
%---------------------------------------------------------
	c():-
	        write("\n\n------- c -------\n"),
		a(),
		b(),
		!,
		write("\nc sucsess.").
	c():-
		write("\nc backtracking.\n\n").
%---------------------------------------------------------
GOAL
assert(f(1)),
assert(f(2)),
assert(f(3)),
c().

在VDE中,菜单选:File|New,新建一文件noname.pro,把上边的代码贴进去

菜单选:Project|Test Goal,

运行结果,输出显示如下:

------- c -------
------ a -------
1
2
3
a is sucsess.

------- b -------
1

c backtracking.

yes

程序很简单,GOAL先把事实f(1)、f(2)、f(3)入库,接着求证c()。

Prolog把“函数调用”称作“求证(query)子目标”。

并非Prolog矫情,别的“小语种”基本如此。

比如,函数语言Lisp、Erlang等,把“函数调用”称作“求值(evaluate)“。

还得说说”子目标“。

从理论上说,Prolog程序,由一个总目标和多个子目标构成,形成”树“逻辑关系。

GOAL是总目标,即树的根结点,子目标则是树的各层枝叶。

在本示例中,总目标的子目标是c(),而a(),b()则是c()的子目标。

在a()和b()中,子目标是f(X)。

这段示例代码的看点,主要是fail!

write(),writef()等管理输入输出的谓词,不是子目标。因为,它们不参与求证、推理。

要正确理解谓词子句体内子目标的关系,逗号”,“是关键。

逗号”,“的含意,是逻辑”与“,and。因此,子句体实际上是个复合逻辑判断:

例如,子句 

a():- b(),c(),d().

相当于:

if a() then {  if (b() and c() and d()) then a() }

这里并没写错,子句头与子句体就是这样的逻辑关系。

不仅如此,分号”;“表示逻辑”或“。例如,本例的谓词a(),2个子句可以合并写成这样:

	a():-
		write("------ a -------\n"),
		f(X),
		writef("%\n",X),
		fail
		;
		write("a is sucsess.").

只是,用分号”,“而非并列子句表示逻辑或,会造成代码难读、难懂等误会,很不实用。

所以,在实际编程中,几乎见不到使用分号”;“的。

现在再回到GENI的推理机流程控制这个话题上来。

上面提到的“典型示例”,是GENI的推理机流程控制的方法之一。

其中,谓词a()中的fail,遍历了全部f(X);

谓词b()中的 !,fail,只取得第一个f(X),并且不再回溯;

谓词c()中的 ! 也很重要。没有它,程序编译时就会出错。

2、Prolog以先深搜索的方式求证子目标

Prolog本身就是以先深搜索的方式求证目标的推理机。

仍以上面的“典型示例”说事。

a(),b(),c()等三个谓词,分别都是由2个子句构成的逻辑或,or 的关系。

它们体内的子句,构成逻辑与,and 的关系。

按照逻辑运算的优先级规矩,先and后or。于是,就形成了先深搜索的目标求证方式。

GENI的知识库中的rule,在逻辑上是“树”的关系,与Prolog推理机制完全吻合。

而GENI本身推理机,正是按其知识库结构,量身定制的先深搜索目标求证机。

Visual Prolog 的 Web 专家系统 (8)

时间: 2024-08-25 02:35:50

Visual Prolog 的 Web 专家系统 (8)的相关文章

Visual Prolog 的 Web 专家系统 (10)

GENI的核心 -- 推理机(4)求证过程分析 1.GENI知识库结构 专家系统推理机的设计运行,与其知识库结构紧密相关. GENI知识库结构是一棵逻辑推理树.根节点是animal,即求证的目标. Animal有2个子节点,即求证的子目标.节点或子目标,用rule表示.例如: rule(8,"animal","mammal",[12,13],"") rule(9,"animal","bird",[9,14]

Visual Prolog 的 Web 专家系统 (7)

GENI的核心 -- 推理机(1)知识表示 GOAL段最后一句是子句infer(),它的含意是"推理". 由此,进入GENI的核心,察看推理机的运行. infer() infer():- topic(Maingoal,_), go([],MainGoal,""),!. infer():- errorexit. topic(Maingoal,_) topic现存于事实库geni中,取出的Maingoal = "animal", 详见<Visu

Visual Prolog 的 Web 专家系统 (5)

使用现成网页 再说个小伎俩. 在VIP开发环境中,可以随时测试代码,不必编译成exe文件. 比如,想看看VIP内建谓词filenameext的执行结果,可以在一空白.pro文件中写入: GOAL filenameext("prolog.exe",Name,Ext), filenameext(NewName,"prolog.exe",".err"). 然后点选菜单"Project | Test Goal",就会看到以下结果: N

Visual Prolog 的 Web 专家系统 (6)

保存用户对询问的回答结果,作为进一步推理的条件 还是从GOAL段开始.起始句是write_startform() write_startform():- write("<form action=\"\cgi-bin\geni.exe\"method=\"post\">\n"). 注意!上一句应为write("<form action=\"geni.exe\"method=\"post\&q

Visual Prolog 的 Web 专家系统 (3)

深入探究WEB GENI源程序 折腾WEB GENI的目的,是为了摸清它的结构设计.运行机制,为山寨出自己的专家系统外壳,积累经验,启发思路. 为此,必须深入细致地研读源程序代码. WEBGENI包括2个模块:geni.pro和cgitools.pro.前者是主程序,负责推理.生成网页等:后者负责相对底层的CGI数据处理.本文探究的对象,主要是geni.pro. Visual Prolog(以下简称VIP)程序由几种代码段构成: PREDICATES :谓词段.相当于C语言的函数声明 CLAUS

Visual Prolog 的 Web 专家系统 (4)

知识库操作 先说个小伎俩. 在VIP中打开geni.prj,菜单选Options,打开Application Expert,点击Other Options, 点击Project Directories,点击Output,在Final文本框填入d:\Apache2.2\htdocs\GENI 这个目录是GENI虚拟主机所在之处. 这样做的目的,是编译后geni.exe会自动存入上述目录,省去了人工搬运的麻烦. 开始今天的话题,进行知识库操作. 下一步是执行GOAL段的子句consult_kb(Pa

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

Visual Prolog 的 Web 专家系统 (2)

Web 专家系统 WWWGENI 在目录<VIP_root>\WWW\Programs\GENI中,有个例程,展示如何创建在WEB服务器支持下,以CGI脚本方式在因特网上工作的小型专家系统. GENI 使用极为简单的规则表示知识,当满足某些条件时,适用这些规则. rule(1,"carnivore","cheetah",[1,2],"") rule(2,"carnivore","tiger",[

Visual Prolog 的 Web 专家系统 (11)

GENI的核心 -- 推理机(5)处理why问题 1.why问题由客户从浏览器提出 专家系统工作时,需要向用户提出问题,收集推理求证用的事实根据. 用户有时想知道,系统为什么提出这样的问题,要求系统给出解释.这就是所谓的why问题. why问题的提出,是按动网页按钮"why"的结果. 2.why功能的设置 GENI的第一个页面default.htm并没有按钮"why".它的设置过程是这样的: 从上一节的谓词check第3子句说起. check( RNO, HISTO