- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章prolog语言
例: write_string:- writer((WE ARE THE WORLD)), nl, write_string. ?__ write_string. 可以看出,此规则有三个部分,前两个内部谓词部分输出字符串 WE ARE THE WORLD,并把光标移到下一行开始,有两个内部谓词组成。第三部分是规则本身。 执行该程序会无数遍输出“WE ARE THE WORLD” 原因因为规则体有两个子句组成,执行完第一个子句,就要执行第二个子句,该子句是一个规则,产生重复执行 分析可知:在递归中一定要有结束的条件否则会一直进行下去。 一般形式(一般递归规则(General Recursive Rules ,简称GRR方法)): 递归规则名:- 谓词子句表, 出口条件谓词, 谓词子句表, 递归规则名, 谓词子句表. 这条递归规则体有五部分组成,第一个是一组谓词子句,这些谓词子句中任一个的成功或失败都不会引起递归。第二个部分是出口条件谓词子句, 此谓词子句的成功或失败将引起继续递归或停止递归。第三部分是另一组谓词子句,同样谓词子句中任一个的成功或失败都不会引起递归。第四部分是递归规则自身, 此规则导致递归。第五个是一组谓词, 这些谓词中任一个的成功或失败都不会引起递归,这里强调产生一次递归,则规则体各子句都要执行一次,其结果都要自动内部记录一次,特别是匹配子句。 例:假定需要构造一个规则来输出从1至7的整数,设规则名:write_number(Number) 依据上述规则可知;在递归规则的一般形式中, 第一个部分在此例中不适用,第二个部分是出口条件谓词, Number8,若Number的值为8时, 规则失败并且终止程序。 第三部分对数字进行处理,即显示数字然后将其加1,增量后的值名Next_number, 第四部分是递归规则自身: write_number (Next_number) 。通常情况第五个部分不出现,将write_string写出如下: write_number(8). write_number(Number) :- Number 8, write(Number),nl, Next_number= Number+1, write_number (Next_number). ?_write_number(1). 执行如下: 此程序以试图满足子目标write_number(1)开始。首先程序用第一个规则write_number(8).与子目标匹配,由于1与8不相等,匹配失败。然后,程序向下试图再次匹配子目标,这次匹配的是一条规则的首部:write_number(Number),匹配成功将Number约束成1, 执行如下(续): 然后,程序将其值与8比较,这是出口条件。由于1小于8,子规则成功。下一谓词写出Number的实例化值, Next_number变量被实例化成2,Number的值增加1。 此时,write_number规则使用Next_number实例化的新值2来调用自己。注意:不必使用出现在规则首部中的同一变量名来调规则,当数值传递时是参数表中的位置起作用。 表的匹配过程如下: 设事实库中有: P ( [ 1, 2, 3 ] ). P ( [ the, cat, sat , [ on, the, mat ] ] ). 询问:?__ P( [ x | y ] )﹒ X=1, Y=[ 2, 3 ] ; / * 打 ; 号 */ X=the, Y=[ cat , sat , [ on, the, mat ] ] ?__ P ( [ __ , __ , __ , [__ | [ X] ] )﹒ X= [ the , mat ] ?__ P([ X, Y | Z ] ) X= 1 , Y=2 , Z=[3]; /* 打 ; 号 */ X=the,Y=cat ,Z=[ sat,[ on ,the,mat ] ] 4.3. Prologe的数据结构(语法知识)(续7) 常见表的匹配形式: 表 1 表2
文档评论(0)