人工智能实验指导书_第1页
人工智能实验指导书_第2页
人工智能实验指导书_第3页
人工智能实验指导书_第4页
人工智能实验指导书_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华清学院软件工程专业人工智能实验指导书西安建筑科技大学信控学院目 录第1章 课程简介,实验项目及学时安排 .(1)第2章 实验设备简介 .(2)第3章 人工智能课程实验 .(47)实验一熟悉Visual Prolog 软件开发平台(47)实验二使用Visual Prolog求解Fibonacci序列问题(49)实验三使用Visual Prolog求解梵塔问题.(50)实验四使用Visual Prolog求解装错信封问题.(51)第1章 课程简介,实验项目及学时安排一课程简介人工智能、专家系统、决策支持系统、智能机器、神经网络等等,都是近几年来国内外计算机界十分活跃的研究领域;它们是计算机科学、

2、控制论、信息论、神经生物学、心理学、语言学等多学科相互渗透发展起来的综合性学科。把它们反映到教学活动之中,可开拓学生的视野,了解计算机的新兴发展方向,对实现“宽专业、厚基础”的培养目标十分必要。通过本课程的学习,将向学生介绍人工智能、专家系统、知识工程的发展简历、核心课题和具体应用领域;讲授知识的有关基本概念和知识的各种逻辑表示方法、常用的计算机问题求解搜索策略;学习智能系统的组成结构和开发工具、方法,掌握小型智能系统的构造原理和调试方法。因此,人工智能实验的主要目的是使学生达到3个层次的实验训练要求:1. 加深理解人工智能的基本概念和方法,掌握一种智能型系统开发软件Visual Prolog

3、的基本安装、配置及其使用方法。2. 结合课程内容,掌握使用Visual Prolog完成小规模人工智能程序设计的一般过程和方法。3.在上述实验的基础上,达到巩固并加深对人工智能基本原理和概念的理解。4.通过实验,培养学生的自主意识、动手能力、查阅文献能力、思维能力、想象能力和表达能力。二实验项目及学时安排序号项目学时实验性质验证综合设计1熟悉Visual Prolog软件开发平台22使用Visual Prolog求解Fibonacci序列问题23使用Visual Prolog求解梵塔问题24使用Visual Prolog求解装错信封问题2第2章 Visual Prolog 语言介绍Prolog

4、是英文“PROgramming in LOGic”的缩写。其主要思想就是用逻辑进行程序设计。第一个Prolog系统是由A Colmeruer及其研究小组于1972年在法国马赛研制成功的,它本身就是一个演绎推理机,具有表处理功能,通过合一、消解、回溯和匹配等机制实现问题求解。Visual Prolog是基于Prolog语言的可视化逻辑程序设计集成开发环境,是Prolog开发中心推出的基于Windows环境的智能化编程工具,其语言特点符合相应的国际标准ISO/IEC 13211-1:1995。Visual Prolog具有模式匹配、递归、回溯、对象机制、事实数据库和谓词库等强大功能。它包含图形开发

5、环境、编译器、连接器和调试器,支持模块化和面向对象程序设计,支持系统级编程、文件操作、字符串处理、位级运算、算术与逻辑运算,以及与其它编程语言的接口。它捆绑了范围广泛的API函数,包括Windows GUI函数族、ODBC/OCI数据库函数和Internet函数族(socket、ftp、http、cgi)。支持Windows/98/Me/NT/2000/XP、OS/2和文本方式下的DOS、Linux和SCO UNIX。Visual Prolog非常适合于专家系统、规划和其它AI相关问题的求解,是智能程序设计语言中有代表性且应用较多的一种程序设计语言。由于这种语言很适合表达人的思维和推理规则,在

6、自然语言理解、机器定理证明、专家系统等方面得到了广泛的应用,在智能程序设计语言中占有相当重要的地位。2.1Visual Prolog开发环境2.1.1Visual Prolog安装及其选项本书所叙述的实例程序均基于Visual Prolog V5.x版本编写,为了运行和测试正常,建议读者安装V5.2以上的Visual Prolog运行环境,在安装期间,您需要注意以下安装:在编译程序对话框Compiler中安装可视化开发环境VDE(Visual Development Environment),推荐选择Win32版本。在库对话框Libraries中,选中与所选的VDE平台相对应的库。在资料对话框

7、Documentation中,必须选中安装Answers和Examples。我们还推荐把Documentation对话框中所列出的所有其它安装项开关选为ON。在对话框Final中,推荐选中使32位VDE与项目文件扩展名PRJ和VPR相关联。2.1.2Visual Prolog启动及其配置完成安装后,为使用可视化开发环境VDE中的TestGoal实用程序运行书中的实例程序。建议对Visual Prolog编译程序中的某些非缺省选项进行配置,做法为:1)启动Visual Prolog的VDE。若是第一次启动VDE,因没有一个可被装入的项目,你将会看到图2.1这样的情形。同时你将被告知,缺省的Vis

8、ual Prolog初始文件已被创建。 图2.1 图2.22)开始创建一个新项目。选择Project |New Project菜单项,对话框Application Expert将被激活。3)指定基目录Base Directory和项目名Project Name。假定在安装时你已经选择了Visual Prolog的根目录C:VIP,在这种情况下,推荐指定下面的基目录:C:VIPDOCExamplesTestGoal这一选择对于将来装入示例的Prolog源文件是方便的。在项目名Project Name一栏,推荐指定“TestGoal”。还要选中多程序员方式Multiprogrammer Mode,

9、并点击Name of.PRJ File控制项里面的文件名。你将会看到项目名TestGoal.PRJ出现。4)指定目标Target设置。在对话框Application Expert的Target标签项,我们选择如图2.2那样的设置。现在按下Create按钮,创建一个缺省的项目文件。5)设置创建Test Goal项目所要求的编译程序选项。选择Options|Project|Compiler Options菜单项,编译程序选项对话框Compiler Options被激活。选择Warnings标签项。在这一标签项中:a)选中Nondeterm单选按钮。这将迫使Visual Prolog的编译程序缺省接

10、受所有用户定义的谓词是不确定性的,从而可以产生不止一个解。b)去掉复选项:非引用符号选项(Non Quoted Symbols)、强类型转换检查选项(Strong Type Conversion Check)和检查谓词类型选项(Check Type of Predicates)。这些选项将抑制一些可能产生的、而对于理解示例程序不太重要的编译警告信息。c)最后,编译程序选项Compiler Options对话框看起来如图2.3所示。按下OK按钮,保存编译程序选项Compiler Options的设置。2.1.3运行和测试Visual Prolog程序为检查系统配置是否合适,在编辑器窗口中键入下面

11、的文本:GOALwrite(“Hello World”), nl.这就是Prolog术语所说的所谓目标GOAL。为了执行GOAL,激活菜单项Project|Test Goal或按下快捷键Ctrl+G。如果系统安装合适,屏幕上将出现如图2.4所示的情形。执行的结果将出现在另一个新开窗口中。它的标题如下:Inactive C:VipDocExamplesTestGoalObjgoal000.exe 图2.3 图VDE编辑器VDE含一个标准的文本编辑器,菜单命令File|New可以创建一个新的编辑器窗口,使用鼠标和键盘即可对它进行操纵。它支持Copy、Paste、Cut、Undo、R

12、edo等操作。Visual Prolog的源程序就可在此进行编辑,并保存为后缀为.pro的源程序文件。2.1.5程序错误处理如果程序中出现了错误,在编译时,VDE将显示Errors(Warnings)窗口,其中包含所检测出来的错误的列表。可双击其中一个错误而到达错误所在源文本中的位置。从Visual Prolog V5.3开始,可单击其中一个错误并按下F1键来显示有关所选错误的扩展信息。当处于帮助Help窗口时,单击搜索Search按钮并键入一个错误号,帮助主题和关于这个错误的扩展信息将显示出来。2.2Prolog基本语法规则2.2.1Prolog语言的特点Prolog是基于Horn子句的,而

13、Horn子句是谓词逻辑形式系统的子集,因此它能进行清晰地推理。作为一种逻辑程序语言,Prolog具有两个方面的特性:(1)它描述求解问题的方式与通常的高级程序设计语言不同。众所周知,通常的程序设计语言(如:C)求解问题时,需指明算法,即对一个给定问题指明一系列计算机要执行的计算步骤,告诉计算机“如何做”。而Prolog语言求解问题时,只描述所解问题中的对象和对象之间关系的某些已知事实、推理规则,程序一般不必告诉计算机执行的先后次序。因此,Prolog是一种描述性逻辑语言。(2)它还具有程序设计语言所具有的其它语言特点。Prolog的数据和程序结构统一,均以(关于某一问题领域的)知识数据库的形式

14、存在。知识数据库、知识库及程序这几个专业术语在Prolog语言中的意思是相同的。Prolog包括一个推理机(Inference Engine),能自动实现模式匹配和回溯,从而在逻辑推理的过程中找到给定问题的解(而且是所有解)。Prolog语言支持递归的定义和调用,因此能够使一个复杂的问题可以用小的程序来解决。2.2.2子句:事实和规则谓词逻辑是人们为了把基于逻辑的思想表达为书面形式而发展起来的。Prolog利用这种语法发展了一种基于逻辑的程序设计语言。在谓词逻辑中,首先从句子中消去所有不必要的词。然后,变换并确定句子之间的关系,依据关系对对象进行分组。接着,对象变成作用于关系的参数。(表2.1

15、)示例3句子被转换为谓词逻辑语法。表2.1自然语言转换为谓词逻辑自然语言谓词逻辑玫瑰花是红色的red(rose)玛丽穿的是套装wears(mary, dress)比尔喜欢狗,如果那些狗是漂亮的likes(bill, dogs) if pretty(dogs)在Prolog的谓词逻辑中,所有的对象及它们之间的关系均被概括成短语,短语中只有两种表现类型,一是事实,一是规则。短语在Prolog中被统称为子句(clause),它是构成Prolog程序的核心。与自然语言语句类似子句由实心句号“”结束。一、事实:已知的关系在Prolog中,知识的最简单形式就是事实,它陈述了自然语言中对象间的已知关系。例如

16、,在自然语言中表示“喜欢”的关系有:比尔喜欢狗。玛丽喜欢蓝色衬衫。汤姆喜欢自行车。而用Prolog语法写出来的同样事实为:likes(bill, dog).likes(mary, blueshirt).likes(tom, bike).因此,在Prolog中事实的一般形式及其描述规则如下:关系(对象1,对象2,对象n).(1)先描述关系名,接着在一对圆括号中描述若干对象(其标准名称为变元),每个对象之间用逗号隔开。(2)所有关系名和对象名均应小写。(3)事实子句必须用“”号结束。Prolog是根据句号来判断事实结束的。一般而言,子句括号内的变元顺序对于Prolog来说没有什么关系。但在某一特定

17、应用环境中的前后约定应该注意保持一致,来看下面两个事实:狗(dog)咬(bites)人(man)人(man)咬(bites)狗(dog)它们的意思显然不同。在翻译成Prolog语言时必须保持原来的顺序:bites(dog, man)./* 狗咬人 */bites(man, dog)./* 人咬狗 */应注意的是,在数据库中上述两个事实如果有一个存在,并不意味着另一个事实也存在。也就是说,“狗咬人”这一事实并不能代表“人咬狗”的事实! 下面还有一些简单的Prolog事实:事 实说 明count(dracula).德雷克拉是会计prince(charles).查尔斯是王子gardener(jame

18、s).詹姆斯是园林工人married(jane, david).珍妮和戴维结婚friends(tony, peter).托尼和彼德是朋友drinks(joyce, coffee).乔伊斯喝咖啡drive(john, pauline, bmw).约翰和波林驾驶bmw轿车还应注意的是,事实中的变元数可以是任意的,这取决于所期望联系在一起的对象数目。且Prolog无法知道我们给出的事实真实与否。例如:bird(pig)./*猪是一种鸟*/这样的错误却可以被Prolog完全接受。 二、规则:从已知事实进行推理在日常生活中,通过其它事实推断出某事为真往往是可能的,Prolog所构造和描述从其它信息进行推

19、断的就是规则。一个规则就是指一系列其它关系已知为真,那么某个关系则为真,其语法描述为:规则头 :- 规则体.或关系(对象,对象,对象) :- 关系(对象,对象),关系(对象,对象).或规则头 :- 子目标,子目标.其中,规则头是:如果若干条件为真则其为真的事实,也称作结论或依赖关系。规则体是:一些条件,它们必须为真才能使Prolog利用它们证明规则头为真。例如,“约翰喜欢汽车,如果该汽车十分有趣”,此句用Prolog规则表示为:likes(john,Car) :- fun(Car).注意,likes谓词中的第二个变元以大写字母开始,而第一个变元john却不是,这是因为john是一个固定的常量对

20、象,而Car是一个可能取不同值的变量,在Prolog中变量总是以大写字母开始的。2.2.3变量如果将如下完整程序调入VDE环境,并用Test Goal运行它。/* Program */PREDICATESlikes(symbol, symbol)CLAUSES1ikes(ellen, tennis).likes(john, football).likes(tom, baseball).likes(eric, swimming).likes(mark, tennis).likes(bill, Actvity) :- likes(tom, Acti

21、vity).GOALlikes(bill, baseball).Test Goal在应用程序窗口中会回答:yes它已经结合了规则:likes(bill,Activity) :- likes(tom,Activity).用事实likes(tom, baseball).来判定目标likes(bill, baseball).也可以试着询问:likes(bill, tennis).Test Goal回答:noVisual Prolog对询问“Bill喜欢打网球吗?”回答no是因为:没有事实显示“Bill喜欢打网球”;bill与网球的关系不能从给出的规则和可用的事实中推断出来。当然,Bill在现实生活中

22、很喜爱网球运动是可能的,但是Visual Prolog的回答仅仅基于已经在程序中给出的事实和规则。如上所述,变量可以使你能写出更一般化的事实和规则。此外,还能让你提出更一般的问题,如:likes(Person, tennis).其中用Person表示未知的人。在Visual Prolog中,变量名必须以大写字母(或下划线)开始,其后可以是任何数量的字母(大写或小写)、数字或下划线(“_”)字符。例如,下列是有效的变量名:My_first_correct_variable_name,Sales_10_11_86而下列三个是无效的变量名:lstattempt,second_attempt,“dis

23、aster”仔细地选择变量名可以使程序更具可读性。例如,对比下述两个子句:likes(Person, tennis).和likes(x, tennis).显然前者更好,因为Person比X有更明确的含义。现在测试目标:GOAL likes(Person, tennis).Visual Prolog回答:Person = e1lenPerson = mark2 Solutions因为求解目标只有两个情形,即用变量Person匹配值ellen和mark。在变量名中,除了第一个字符必须是大写字母或下划线,Visual Prolog允许其它位置的字符任意大小写。使变量名更具可读性的办法之一是大小写字母

24、混合使用,例如:IncomeAndExpenditureAccount一、变量如何取值当程序中某个量的值是变化或不确定时,就要用到变量。你可能注意到了Prolog语言中没有赋值语句,这是它与其它程序设计语言的一个显著区别。Prolog中的变量通过与事实和规则中的常量匹配获取其值。在被赋值之前一个变量是自由的(free),一旦被赋值则变量成为被绑定的(bound)。但是绑定的时间只维持到获得一个询问的解,然后Prolog释放它,回头继续寻找其它解。这是一个非常重要的观点:不能通过给变量赋值来存储信息。变量是用来作为模式匹配过程的一部分,而不是一种信息存储方式。请看下面程序

25、示范变量如何获取它们的值的例子。/* Program */PREDICATESlikes(symbol, symbol).CLAUSESlikes(ellen, reading).likes(john, computers).likes(john, badminton).likes(leonard, badminton).likes(eric, swimming).likes(eric, reading).考察这个询问:有既喜欢阅读又喜欢游泳的人吗?likes(Person, reading), likes(Person, swimming).Prolog将通过对程序

26、子句从头到尾地搜索来求解这个询问的两个部分。询问的第一部分是:likes(Person, reading)其中,变量Person是自由的。在Prolog尝试找到答案之前,它的值未知。另一方面,第二个参数reading是已知的。Prolog寻找匹配询问第一部分的一个事实。程序中的第一个事实:likes(ellen, reading)可以于之匹配(事实中的reading和询问中的reading匹配),Prolog用事实中的ellen绑定变量Person。同时,Prolog在事实列表中设置一个指针表示已经到达的搜索过程。接着,为了完全满足询问(找到既喜欢阅读又喜欢游泳的人),第二部分询问必须被执行。

27、因为变量Person已被ellen绑定,Prolog必须寻找事实:likes(ellen, swiming)Prolog从程序的开始搜索,但没有可以匹配的事实(因为程序中没有这样的事实)。此时,询问的第二部分为假。Prolog现在释放Person的值,并且试图在Person重新成为一个自由变量的情况下,寻找询问第一部分的另一个解答。寻找另一个解答的搜索从事实列表指针的位置开始。Prolog寻找下一个喜欢阅读的人,从而发现事实likes(eric, reading)。变量Person现在被eric绑定,Prolog再次试图满足询问的第二部分,这次是通过查看事实:likes(eric, swimm

28、ing)这次Prolog发现一个匹配的事实(程序最后一个子句),从而询问全部满足。Prolog(Test Goal)回答:Person = eric1 Solution二、复合目标来看看下面这个包含有某大学学生信息的程序。/* Program */male(tim).male(marc). /* 如果X为male,则male(X)成功 */male(simon).female(louise).female(hazel). /* 如果X为female,则female(X)成功 */female(marie).year(tim, 4).year(m

29、arc, 1).year(simon, 2). /* 如果学生X为Y级学生,则year(X,Y)成功 */year(louise, 3).year(hazel, 1).year(marie, 4).studies(tim, history).studies(marc, philosophy). /* 如果学生X学习的课程为Y,*/studies(simon, mathematics). /* 则studies(X,Y)成功 */studies(louise, computer_science).studies(hazel, chemistry).studies(marie, art).age(

30、tim, 24).age(marc, 18). /* 如果学生X的年龄为Y,则age(X,Y)成功 */age(simon, 25).age(louise, 21).age(hazel, 22).age(marie, 32).用户也许会向Prolog提出这样一个问题:有学历史的男生吗?为了用Prolog语言来表达上述问题,就必须采取一种更为复杂的询问方式。因为这一问题涉及到知识库中两种形式的事实:说明学生性别的事实;说明学生所学课程的事实。因此,我们必须把两个简单的询问用“与”操作符,也就是用逗号“,”连在一起。对这一问题的正确询问形式应为:male(X), studies(X, histor

31、y).这就是所谓的目标合取。为了满足整个目标,Prolog必须满足这两个子目标。如果它找不到能够满足两个子目标的X值,那么整个目标也将无法满足。当然,对这个问题,Prolog的答复应该是: X = tim此外,还可以提出更为复杂的问题:在一年级中,有没有20多岁,且学习化学的学生?这个问题也可以表示为子目标合取的形式为:year(X, 1), age(X, Y), Y20, studies(X, chemistry).答复为:X = hazel注意,在子目标Y20中,引入了大于号“”,如果Y20,则这个子目标成功。三、空变量在对问题中某一变量的值不关心时,可以使用空变量(又称匿名变量),空变量

32、记作(_)。例如,利用程序来回答下述问题:有学哲学的男学生吗?这里并不想知道学生的名字是什么,所以可利用空变量来构成问句:male(_), studies(_, philosophy).对此,Prolog会回答“yes”.2.2.4注释在程序中使用注释来解释一些别人不易看懂的程序是一种非常好的程序设计风格。而给变量、谓词、论域选择了合适的名字,程序就是自我说明的,就不需要更多的注释。多行注释以字符/*(斜线、星号)开始并以字符*/结束。单行注释,可能使用相同的字符,也可以在行前使用字符百分号(%)。例如:/* This is an example of a commen

33、t */% This is also a comment and so are these three lines/* * */Prolog在论域声明的每个论域后也可以使用注释:DOMAINSarticles = book(STRING title, STRING author); horse(STRING name)在谓词声明中使用注释:PREDICATESconv(STRING uppercase, STRING lowercase)单词title、author、name、uppercase和lowercase虽然将会被编译器忽略,却会增强程序的可读性。2.2.5语法规则语法是与标点、拼写

34、等有关的一些规则,在编制正确的Prolog程序过程中必须遵守这些规则。程序中如果出现语法错误,将会导致错误的信息,以致程序无法运行,必须进行修改。下面几个问题要特别强调一下,因为它们很容易引起Prolog程序中最常见的错误。句号 “.”用来表示一个子句的结束。Prolog把两个句号之间的内容作为一个子句。因此,如果在一个子句后面忘写了一个句号,那么Prolog就将把这个子句同后面的子句合到一起,直至遇到一个句号为止。这样,子句的意义就完全改变了。小写字母对象和谓词名的每一个字符必须小写。例如:apple, pear, likes, male, female大写字母变量名的第一个字符必须大写。例

35、如:Mother, Father变元一个谓词的变元必须放在圆括号内,并且用逗号分开。例如:parents(john, Mother, Father)逗号含义为“与”,是用来连接两个或多个目标,以形成目标的合取。分号含义为“或”。也可用来形成一个目标的析取。例如下面的询问 drives(mick, car); rides(mick, bicycle).意思是说:麦克是开车还是骑自行车?如果这两个子目标中有一个成功,则整个目标成功。不过一般来说,在Prolog程序中并不频繁使用分号,因为这样做会使程序的逻辑性不清楚以至难于跟踪。下划线用在目标、变量或谓词的名字中,将两个或都多个词连在一起,例如:r

36、ed_car, ginger_beer, Mother_in_law。另外,这一符号也可以用来表示空变量。2.3Prolog程序结构与早期的解释型Prolog版本不同,Visual Prolog有一个强类型编译器,它要求声明每一个谓词所应用对象的类型,这些类型声明使得Visual Prolog程序可以直接被编译成本地机器代码,其执行速度类似于编译后的C或Pascal的代码。一般来说,Visual Prolog程序具有下列基本结构:论域段(DOMAINS)用来声明正在使用的任何论域,而这些论域不是Visual Prolog的标准论域。谓词段(PREDICATES)用来声明谓词及其参数的论域(类型

37、)。(不必声明Visual Prolog的内部谓词)。子句段(CLAUSES)是Visual Prolog程序的核心。其中放置事实和规则,Visual Prolog程序对其进行操作作以试图满足程序的目标。目标段(GOAL)设置Visual Prolog程序应求解的目标。由于子句段是Visual Prolog程序的核心部分,而它们的抽象格式及论域又分别由谓词段、论域段声明,所以我们将采用“倒叙”的方法详细地讨论上述几个部分。2.3.1子句段本段的起始以关键字clauses为标识。子句段中放置组成程序的所有事实和规则,构成Visual Prolog程序的知识库。要了解事实和规则,并知道如何在Pro

38、log中写出它们,就必须知道子句如何起作用。给定谓词的子句必须统一被放在子句段。定义谓词的一个子句序列被称为过程。当试图满足一个目标时,Visual Prolog从子句段的顶部开始寻找匹配目标的每一个事实和规则。Visual Prolog经由子句段继续往下进行,并将为每一个匹配当前子目标的子句设置内部指针。如果该子句不是进行求解的逻辑通路的一部分,Visual Prolog将返回到前面设置的指针处并继续寻找其它匹配子句。关于Prolog匹配和回溯的工作机制将在下节详细讨论。2.3.2谓词段本段的起始以关键字predicates为标识。是用户说明自定义谓词部分的,它指定谓词的名称、参数以及参数的

39、类型(论域)。Visual Prolog还带有大量的内部谓词,在程序中使用它们时不需要进行声明,Visual Prolog的在线帮助给出了内部谓词的完整解释。一、自定义谓词格式谓词声明以谓词名开始,紧跟一个左圆括号,接着是零个或多个谓词参数。predicateName(argument_type1, argument_type2, , argument_typeN)参数之间以逗号分隔,最后跟随一个右圆括号。注意,与子句段不同,谓词声明不需要加句号。参数类型可以是标准论域或是已经在论域段声明过的论域。二、谓词命名规则谓词名必须以小写字母开始,接着是一系列的字母、数字和下划线。谓词名中间字母的大小

40、写没有要求。谓词名不能超过250字符。谓词名中不能使用空格、减号、星号、斜线或其它非字母和数字的字符。Visual Prolog中有效的字符如下:大写字母:A,B,Z。小写字母:a,b,z。数字:0,1,9。下划线 :_。只要遵循谓词名和参数名的命名规则,所有谓词和参数都可由这些字符组合而成。表2.2是一些合法谓词名和非法谓词名的例子。表2.2 合法谓词名和非法谓词名举例合法谓词名非法谓词名factfactis_a*is_a*has_aHas/apatternCheckListPattern-Check-Listchoose_Menu_ItemChoose Menu Itempredicate

41、NamePredicatefirst_in_10first_in_10三、谓词参数命名规则谓词参数必须属于已知的Visual Prolog论域。可以是标准论域,或者是在论域段中声明的自定义论域。四、谓词段声明举例例1:对2.2.3节中的程序ch02ex03就有如下的谓词段声明:PREDICATESmale(symbol)female(symbol)year(symbol, integer)studies(symbol, symbol)age(symbol, integer)例2:下面的程序片段显示了更多的谓词和论域的声明:DOMAINSperson, activity = symbolcar,

42、 make, color = symbolmileage, years_on_road, cost = integerPREDICATESlikes(person, activity)parent(person, person)can_buy(person, car)car(make, mileage, years_on_road, color, cost)green(symbol)ranking(symbol, integer)这段摘录详细指定了下列关于谓词及其参数的信息:谓词likes带有两个参数(person和activity),它们都属于symbol标准论域(这意味着它们的值只能是名字

43、而不能是数字),所以不必声明参数类型。谓词parent带有两个person参数,它们都属于symbol论域。谓词can_buy带有两个参数,也都属于symbol论域。谓词car带有5个参数:make和color是symbol论域,mileage、year_on_road和cost是整数integer论域。谓词green带有一个symbol参数。谓词ranking带有两个参数,分别属于标准论域(symbol和integer)。2.3.3论域段本段的起始以关键字domains为标识。该段用来指定程序中谓词参数的论域(即类型),这些论域可以是事先定义的标准内部论域,也可以是自定义的特殊论域。例如,对

44、2.2.3节程序中论域段和谓词段的另一种非标准内部论域声明如下:DOMAINS person, subject = symbolage_year, college_year = integerPREDICATESmale(person)female(person)year(person, college_year)studies(person, subject)age(person, age_year)表2.3基本标准论域论 域描述和实现char一个字符,作为无符号字节实现。在语法上,它的书写形式是用单引号括起来的字符,如 :areal一个浮点数,按照IEEE协议用8个

45、字节实现,等价于C语言中的double型。在语法上,real书写形式是(+或-)后边跟着一些数字DDDDD,后接小数点,接着又是一些数字DDDD,然后是指数部分e(+或-)DDD:DDDDDDDDDeDDD实数的例子: 42705 9999 86.729111.e238 79.83e+21正如其它语言一样,这里79.83e+21表示79.83*1021。允许的数字范围是1*10-307到1*10308(1e-307到1e+308)。需要的时候,整数论域的值可以自动转换为实数论域srting一个字符序列,正如C语言中的一样,作为一个指向零结束的字节数组的指针实现。字符串允许有两种形式:1)一串字

46、母、数字和下划线字符序列,只要第一个字母是小写字母,或2)用一对双引号括起来的字符序列。字符串的例子: telephone_number “railway ticket” “Dorid Inc”程序中字符串的长度可达255个字符。Visual Prolog系统从文件中读取或内部创建的字符串在16位平台上可达64k字节,在32位平台上可达4G(理论上)symbol一个字符序列,作为一个指向散列符号表入口的指针来实现,包括字符串,语法上与字符串相同。显然这种声明方式有助于理解谓词中参数所代表的含义。表2.3和表2.4给出了常用的标准论域和整数标准论域供大家参考。表2.4整数标准论域论 域描述和实现

47、short有符号量,短整型所有平台16位-3276832767ushort无符号量,短整型所有平台16位065535long有符号量,长整型所有平台32位-ulong无符号量,长整型所有平台32位0integer有符号量,在询问中具有机器平台体系结构的自然长度16位平台16位-327683276732位平台32位-unsigned无符号量,在询问中具有机器平台体系结构的自然长度16位平台16位06553532位平台32位0byte所有平台8位0255word所有平台16位065535dword所有平台32位02.3.4目标段本段的起始以关键字goal为标识,用来指定程序执行时要满足的目标。本质

48、上讲,目标段与规则体是相同的:它只简单地列出子目标。但目标段和规则间有两点不同:1)目标goal的关键词后不跟符号“:-”。2)当程序运行时,Visual Prolog自动执行目标,而非规则。这就像Visual Prolog调用一个目标,程序运行,试图满足目标规则体。如果目标段的子目标全部成功,那么程序成功终止。反之,程序运行时,如果目标段中有一个子目标失败,则我们说程序失败。至此,我们可给出2.2.3节中的某大学学生信息的完整程序。/* Program */DOMAINSperson, subject = symbolage_year, co

49、llege_year = integerPREDICATESnondeterm male(person)nondeterm female(person)year(person, college_year)studies(person, subject)age(person, age_year)CLAUSESmale(tim).male(marc).male(simon).female(louise).female(hazel).female(marie).year(tim, 4).year(marc, 1).year(simon, 2).year(louise, 3).year(hazel,

50、1).year(marie, 4).studies(tim, history).studies(marc, philosophy).studies(simon, mathematics).studies(louise, computer_science).studies(hazel, chemistry).studies(marie, art).age(tim, 24).age(marc, 18).age(simon, 25).age(louise, 21).age(hazel, 22).age(marie, 32).GOALmale(X), studies(X, history).在Text

51、 Goal中执行此程序,结果为:X = tim1 Solutions2.3.5多元谓词谓词的元(arity)是指谓词中参数的个数。两个谓词可能具有相同的名字但是却有不同的参数个数。程序的谓词段和子句段中给出谓词名而参数个数不同的谓词版本必须聚合在一起。除了这个限制之外,参数个数不同的谓词完全被当作是不同的谓词。/* Program */DOMAINSperson = symbolPREDICATESnondeterm father(person) % This person is a fathernondeterm father(person, person) % O

52、ne person is the father of the other personCLAUSESfather(Man) :- father(Man, _).father(adam, seth).father(abraham, isaac).2.3.6其它程序段除前述四个Visual Prolog程序基本段外,还有事实段(facts)、常量段(constants)以及各种全局段(global)、编译命令等,了解它们有助于理解和掌握Prolog程序的设计思路和技巧。一、事实段Visual Prolog程序是事实和规则的一个聚集。有时候,当程序运行时,可能想要更新部分程序中的事实。在这种情况下,

53、某些事实组成了动态或内部的事实数据库,当程序运行时,可以改变它们。这就是事实段。关键字facts声明事实段。在这里所声明的事实被包括在动态事实段。Visual Prolog提供内部谓词,可方便地使用它们。二、常量段Visual Prolog程序中在常量段可以声明符号常量。此段用关键字constants指示,后边跟着声明本身,采用下列语法: = 是符号常量的名字,是赋给常量的值。每一个以一个换行符结束,所以每行只能有一个常量声明。考察下面这段程序:CONSTANTSzero = 0one = 1two = 2hundred = (10*(10-1)+10)pi = 3.ega = 3slash_

54、fill = 4red = 4在程序编译前,Visual Prolog将用与每一个常量相对应的实际串值替代它们。例如:A = hundred*34, delay(A),setfillstyle(slash_fill, red),Circumf = pi*Diam将被编译器以完全相同的方式处理为:A = (10*(10-1)+10)*34, delay(A),setfillstyle(4, 4),Circumf = 3.*Diam,使用符号常量有下面一些限制:常量定义不能引用自身进行递归说明。例如:my_number = 2*my_number/2 /* Is not allowed */在常量声明中,系统不区分大小写字母。因此,程序的子句段中使用常量标识符时,第一个字母必须小写,以避免混淆变量与常量。所以,下面的例子是有效的构造:CONSTANTSTwo = 2GOALA = two, write(A).程序中可以有几个常量声明段,但是常量必须在使用前被声

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论