知识工程T-PROLOG(8)

2019-03-16 15:06

有些是局部的,对程序的数据库段应给一个名字,并且在该模块中每个名字必须不同,若对数据库段不命名,编译程序将赋予它一个默认名dbasedom.

如果已知一个谓词只对应一个事实,则可以在此数据库谓词前加determ,这样使得编译程序产生更高效的代码,并且在词用此谓词时不会出现不确定性警告,这对于标记(flags)计数器以及其他全局变量来说是很有用的。

说明了一个数据库段后,编译程序在内部将使用与此数据库段相同的名说明一个与之对应的 。这便得谓词能象处理项一样处理事实。

(5)常量段

常量说明段由关键字constants指示,后跟说明本身。 语法如下: =<宏定义>

每一个定义以一个换行符结尾,因此每行只有一个常量说明,按这种方式说明的常量以后可在程序中使用,例如:

constants blue=1

language=english

Turbo PROLOG会自动用每个变量实际对应的字符串替换之。 使用符号常量有以下限制:

①一个常量的定义中不能引用其自身,例如:

list=[1,2][list] \\*不允许*\\

将产生错误信息:“常量定义中出现递归”。

②在常量说明中系统不区别字母的大小写,因此当一个常量标识符在程序中的子句段使用时,其首字母应小写以避免与变量混淆。

③在一个程序中有多个常量说明段,但每个常量必须先定义,后使用。 ④常量标识符对文件的剩余部分而言是全局性的且只须被说明一次,同一标识符的多次说明会产生错误信息。

(6)目标段

以关键字goal开头的目标段允许用户标识一个固定的目标,即对PROLOG程序的询问,如果用户想在内存中试各种不同的目标,可以省去目标段。运行时系统将在对话窗口提示(goal:)输入目标,这种方式类似于解释型的PROLOG

系统,但在编译成执行文件的程序中必须包含一个非空的目标段。

目标和规则体在本质上是相同,目标也可以是一子目标序列。 3.编译指令

Turbo PROLOG提供了一些编译指令,程序员可以通过编译指令来控制编译程序以特定的方式处理程序代码,下面列出Turbo PROLOG2.0提供的编译指令。

bgidriver config nobreak shotttrace bgifont diagnostics nowarnings trace check-dererm errorlevel printermenu trail code heap project

许多编译指令既可以从Turbo Prolog开发环境(菜单)中设置,也可以在源代码中设置。源代码中的编译指令,必须出现在程序正文的开始处,并可能置盖由菜单设置的该编译指令的值。

下面分别介绍各类编译指令的用途、用法。 (1)bgidriver

用于把某一特定的图形驱动程序直接连入用户的可执行的图形程序。后跟图形驱动程序文件的公共名。

用法:bgidriver“GGA-driver-far”

其中,GGA-driver-far是希望使用的图形驱动程序文件的公共名。 (2)bgifont

用于把BGI的笔划式字符字体连入可执行的用户图形程序。 用法:bgifont“_gothic_font_far” (3)check_determ

如果使用了check_determ,Turbo PROLOG系统就会对导致一个非确定谓词的每个程序子句给出一个警告。

(4)code

编译指令code说明了内部代码区的大小,该指令缺省则表示代码数值是16KB。code的用法是:

code=Number_of_paragraphs

其中Number_of_paragraphs为代码区所要的段数,每段16B,例如,指令:code=1024表示代码区为16KB。Code命令对EXE文件的大小无影响。

(5)config

为了使独立执行的EXE程序读入定义了默认的窗口属性,键盘设置的SYR文件可在源程序设置

config“.sys”

编译指令,生成的,EXE程序执行时读入.sys,并可获得尤如Turbo PROLOG使用PROLOG.SYS一样的效果。

(6)diagnostics

使用了diagnostics编译指令,编译系统会显示出程序的分析信息,包括: · 使用的谓词名

· 谓词是局部的,还是全局的,抑或外部定义的 · 谓词是确定的还是非确定的 · 每个谓词的代码大小 · 参数的领域类型 · 每个谓词的流模式 (7)errorlevel

errorlevel编译指令可用来控制EXE文件错误报告的详细程序。用法是: errorlevel=d

其中d为程序报告的级别,可为0,1,2之一,其中

0:产生最高效的代码,这同Turbo PROLOG的1.X版本中的策略一致。 1:产生可以缺省的。当出现错误时,会显示出一些原始信息。

2:在这一级,能报告一些在级别1中不报告的错误,例如找滋出、堆滋出、尾区滋出等。

(8)heap

heap用于指出EXE文件由DOS启动时应占据多少存贮空间,如果不使用这个heap命令,或将它的值置0,程序便可占据一切可利用空间,heap指令的用法如下:

heap=Number_of_paragraphs

(9)nobreak

如果nobreak命令缺省,Turbo PROLOG系统将生成一些代码用以在调用每个谓词之前测试键盘,以确认没有按过Ctrl-Break复合键。这样做稍降低了程

序执行速度,存贮开销也大些。使用nobrdak可以防止这种代码的自动产生。但给出了nobreak编译指令后,跳出死循环的唯一办法是重启操作系统。因此,nobreak指令只当程序彻底测试后方可使用。

(10)nowarnings

程序中使用nowarningw编译指令,当一个变量在子句中仅出现一次时,可抑制警告信息的轴出。

(11)printermenu

若这条指令出现在程序中,则用户能把屏幕输出送到打印机或将其记到LOG文件。

(12)project

project编译指令用于模块化程序设计。一个工程中的所有Turbo PROLOG模块需要共 内部符号表。例如,有一个称为MYPROJ的工程,符号表可以放在名为MYPROJ.SYM的文件中,使用时,project指令必须出现在模块的第一行以说明该模块所属的工程。

下面一行代码表明该模块属于MYPROJ project\” (13)trace(shorttrace)

Turbo PROLOG中的跟踪方式有好几种,最简单的方法就是在程序中引入编译指令,可把trace或shortrace指令放在源程序的顶部。

trace指令将报告作为程序执行逻辑组成部分的每一个调用的返回;而shorttrace只考虑Turbo prolog执行的特定优化方式,并且只报告调用和返回的一个子集。

如果在程序的首部使用了trace或shorttrace将跟踪所有的谓词,如果trace或shorttrace后跟一个谓词名表,则仅对表中所列谓词跟踪。

(14)trail

Trail指令说明内部尾数组的大小,使用格式是:

Trail=Number_of_paragraphs

尾数组用于记录副作用(主要是指针变量的约束)。默认情况下,无尾数组,若在程序中使用指针变量,则必须明确给出尾数组大小,不然将产生尾区溢出错。对大多数情况,设置trail=100就足够了。

Prolog教程

第一章 入门

如果你是一位prolog的新手,希望你首先阅读这篇文章,好对prolog的全局有个了解。在这篇文章中我会把prolog和其他的程序语言做比较,所以希望你已经具有了一定的编程水平。

什么是prolog?

prolog是Programming in LOGic的缩写,意思就是使用逻辑的语言编写程序。prolog不是很高深的语言,相反,比较起其他的一些程序语言,例如c、basic等等语言, prolog是更加容易理解的语言。如果你从来没有接触过计算机编程,那么恭喜你,你将很容易的进入prolog世界。如果你已经是其他语言的高手,你就需要完全丢弃你原来的编程思路,否则是很难掌握prolog的。

一个例子

逻辑思维在我们日常生活中比比皆是,prolog正是把这种思维用文字描述出来的计算机语言。还是首先举个例子吧。

比如一群年轻人正在恋爱,每个人都有自己心中所追求的对象: 张学友爱王菲 张学友爱周慧敏 王菲爱谢廷峰 周慧敏爱张学友 谢廷峰爱王菲 谢廷峰爱周慧敏 刘德华爱周慧敏 ......

我们说两个年轻人要互相都喜爱,他们就算是一对情侣,那么上面的谁和谁是情侣呢? 这应该算是一道最简单逻辑推理题目了,那么我们如何用prolog语言实现呢? “张学友爱王菲”是一条已知的事实,用prolog语言来表达就是: 爱(张学友,王菲).

注意1:这里是为了阅读方便才使用汉字的,真正的prolog是不允许使用除了基本字符以外字符的,也就是说,上面的句子必须写成love(zhangxueyou,wanfei).,电脑才能够真正的理解。

注意2:最末尾的“.”一定不能掉,它表示一个句子结束。

注意3:上面词汇对于电脑来说并没有真正的含义,所以我们完全可以用 ai(zxy,wf).来表达这个关系,更进一步,我们甚至可以用 xxx(a,b).来表达,只要你自己心里清楚xxx表示爱,a表示张学友,b表示王菲就可以了。

注意4:张学友和王菲的顺序也没有特别的规定,你完全可以把他们换个位置:爱(王菲,张学友). 只要你心里清楚它表达的意思就行了,而以后都遵循这种被爱的人在前面的顺序,就不会出错。

其他的事实我就不写了,你可以参照上面的例子自己把已知事实翻译成prolog的语句。 那么情侣的概念怎么定义呢?也很简单!

情侣(某人甲,某人乙):-爱(某人甲,某人乙),爱(某人乙,某人甲).

:-在prolog中表示“如果”的意思,我们使用它来定义规则。上面这句话的意思就是,


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

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

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

马上注册会员

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