知识工程T-PROLOG(6)

2019-03-16 15:06

现若询问?—strong(wan-lin).

则上述目标匹配第1条规则后,因为谓词fail马上失败,又因为cut使得从父目标strong(wan-lin)。到cut之间所有目标都是不可重新满足的,因此PROLOG回答no。由此可见,因为cut和fail的作用,改变了正规的回溯方式,提高了搜索速度。最后一条规则是匹配任何一个strong(X)目标,该目标已经过了上面各种情况的排除才与最后一个规则匹配,所以此人一定是健康的。这个例子中的cut用法也称作cut-fail组合法或cut的排除型选择用法。

(3)分情况选择

Cut的第三种用法称为分情况选择,这种用法更为普遍,它是针对下列情况使用。

当情况1→ 做动作1 当情况2→ 做动作2 :

当情况N→ 做动作n 否则 → 做动作n+1 样本写法将是:

sample(case l, X,?): -!,acctionl(X,?). sample(case 2,X,?): -!,action2(X,?). sample(case n,X,?): -!,actionn(X,?). sample(others,X,?):-cath-actionnl(X,?). 这里cut肯定了分情况选择的,不可能再有第二种。

例5,定义谓词sum-to,使得目标Sun-to(N,X)在N为一整数值时,X将被实例化为从1到N的和,例如:

?—sum-to(5,X).

X=15; / * 注意这里打分号* / - - - - - No

因为1+2+3+4+5=15,所以X为15。显然这是递归程序。终结情况为N=1,否则先求出1到N-1之和,再加N,于是sum-to的程序为:

Sum-to (1,1):-!

Sum-to (N,Res)):-Nl is N-l, sum-to(N1,Resl),

Res is Res1+N.

终结条件是N为1,此时答案也是1,第2个子句引入另一个sum-to目标,这个新目标的第一个变元的值比原来小1,如此递归下法,直至到达终结条件,需注意,不能写Sum-to (N-1,Resl).

代替N1 is N-1,sum-to(N1,Res1).

需说明这个例子为什么在第1个子句中用cur?从前面处理表的一些例子中,大家会看到它们的第1个子句通常处理空表,其后并不使用cut,这是因为表的处理,容易区分空表[ ]和非空表[A|B]两种情况。因此,在定义有关表运算的谓词时,只需提供上述两种不同模式的规则头分别处理就可以了。某对象匹配空表就不会匹配[A|B],反之亦然(即它们的交集为空)。但是对于数,并不容易区分。因为我们不可能指明一个模式,它只匹配不等于1的整数。于是这个例子所采用方法是:提供一个模式加cut针对整数1的情况。而用变量来匹配其它情况,从PROLOG的搜索方式知道,对任一目标首先试图匹配该目标谓语的第1个子句(这里检查N=1?),如果第1子句失败再试匹配第2个子句等。对这个例子,第2个子句应只匹配不等于1的数。但问题在于第2子句也能匹配数1,如果第1子句中不用于cut,即若写成:

sum - to(1,1).

sum - to(N,Res):-N1 is N - 1,sum-to(N1,Resl),

Res is Resi+N.

当用户询问?— sum—to(1,X)时,第一次得到正确的解X=1,但若“;”和回车换行后,PROLOG进行回溯重新选择子句匹配时,将找到第2个子句,这就产生错误。实际上将引起无限运行,直到存贮空间用完。

读者可以模仿上节递归展开的例子,分析一下打“;”后为何会发生这种情况,但若cut加在第1个子句中,则对目标sum-to(1,X)只能成功一次,PROLOG决不试第2行规则。

这个例子说明,当我们不能够通过指明规则头的不同模式来区别所有可能的情况时(交集不为空),可以利用cut让PROLOG在搜索时选取确定的规则。这是

cut是一种用法,称为确认一规则的选择。但上面sum-to谓词实际上是不完善的,因为对目标sum-to(M,S),当M≥1时程序是可行的,而当M小于1的整数时,也会出现无限运行的情况,为避免出现这种情况,为避免出现这种情况,可把sum-to改写成:

sum-to(N,1):-N=<1,!.

Sum-to(N,R):-N1 is N-1,sum-to(N1,R1),

R is R1+N.

此时,如果提供的N小于等于1,则选择第1个规则,虽然对小于1的N给出了不妥当的结果,但不会出现无限运行的情况。

此外还可以用内部谓词not来改写上述程序。内部谓词not定义为,若X作为一目标失败,则目标not(X)成功,若X成功,则not(X)失败。于是可以用not来代替cut。

sum-to(1.1).

sum-to(N,R):-not(N=1),N1 is N-1,

sum-to(N1,R1),R is R1+N.

同样:

sum-to(N,1):-N=<1.

sum-to(N,R):-not(n=<1),N1,is N-1,

sum-to(N,R1),R is R1+N.

事实上,上面两个not可直接用N\\=1和N>1来分别代替。

用not来代替cut是一个好的程序设计风格,因为含有cut的程序通常比较难读。但如果not中条件相当复杂,则下列这种一般形式的程序将比用cut低。

A:-B,C. A:-not(B),D.

因为若匹配第2个规则,则PROLOG常试图满足B两次(一次在第1子句,一次在第2子句)。若B是一复杂的条件,显然是费时的,而若用cut,则具有同样功能的下列程序段将有效得多。

A:-B,!,C. A:-D.

因此人们有时必须在程序的易读性和效率性上作出选择。现改写例4,用not

代替(cut-fail)组合,程序需要重新组织。

srtong(X):-not(heart-disease(X)),

not(tuberculosis(X)), not(nearsight(X)),?。

Turbo PROLOG语言

一、概述

Turbo PROLOG语言是美国Borland公司于1986年推出的适用于IBM PC及其兼容机的典型的PROLOG编译程序。它不仅保持了clocksin—Mellish所描述的PROLOG语言的主要特点,而且比解释型PROLOG的运行速度快得多,从而使得微机上的PROLOG语言可以在人工智能的许多领域得到广泛地应用。

本节主要介绍1988年推出的Turbo PROLOG 2.0版,它在原来的1.0和1.1版的基础上作了较大的改进和扩充。下面概括一下Turbo PROLOG语言的主要特征。

①Turbo PROLOGR提供了既安全又方便的程序开发环境。同时能对源代码进行跟踪调试。

②运行速度快,内存需求少。

③提供了丰富的内部谓词集,可以利用窗口、图形、声响等内部谓词编写图文并茂的程序。

④既可支持多重内部数据库,又具有强有力的外部数据库系统,能对磁盘或扩充存储器上的大型数据进行快速存取。

⑤系统内部配有完整的整数,实数算术运算操作及科学计算函数。 ⑥Turbo PROLOG是一个集成式、模块化的程序开发环境。可以将多个程序模块联结成一个可执行的程序。还能够同C,PASCAL和汇编语言书写的模块联结成一个可执行的程序,并提供了和这些语言之间交互的接口。

⑦提供了支持元程序设计的Turbo PROLOG解释程序的源代码和注释。可对该源代码进行修改,以便处理新的逻辑程序语言。

由于上述特点使得Turbo PROLOG成为微型计算机上一个较为实用的PROLOG系统。它可用在IBM PC/XT,AT,286,386,486或其兼容机上,并适用于以下

广泛的应用领域:

①Turbo PROLOG可以快速地实现任一实际应用系统的原型。 ②可以完全联接PC机的I/O端口,可以进行监督生产或实时控制。 ③可以实现动态关系数据库处理。

④能进行符号处理,构造符号微积分等软件包,并可以进行语言转换,实施机器翻译,实现自然语言理解。

⑤利用Turbo PROLOG的演绎推理功能,很适合构造定理证明等各种人工智能软件包。

⑥利用和其它语言的接口,实现和现有软件的交互。可充分利用原有的软件资源。

⑦构造专家系统或专家系统开发工具。

二、程序结构

Tubo PROLOG语言的语法和clockisn-Mellish定义的PROLOG有明显的不同,Turbo PROLOG语言更加结构化并采用强制域类型检查。语法的改变主要是迎合编译技术的需要。

1.名

Turbo PROLOG中,名用来表示符号常量、域、谓词及变量。一个名由一个字母或下划线,后 零个或若干个字母、数字及下划线组成。对名有下列两点重要的限制:

①符号常量名必须以小写母开头。 ②变量名必须以大写字母或下划线开头。

除了上述两点限制以外,在程序其他地方可随意使用大小写字母。例如,为增强可读性,可混合使用大小写字母,例如:

MyLongestVariableNameSoFar

或者使用下划线:

pair_who_might_make_a_happy_coupte(henry_viii,ann_boleyn) (1)关键字

下列关键字作为系统的保留字,它们不允许用作用户自定义名。 and domains goal include


知识工程T-PROLOG(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:职务型经济犯罪疑难问题对话录

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: