版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2004.11.3AI程序设计1第11章VisualProlog数据元素
本章介绍VisualProlog的数据元素,内容包括论域段(DomainsSections)、通用类型和根类型(UniversalandRootTypes)等。2004.11.3AI程序设计2第11章VisualProlog数据元素
11.1论域段
11.2通用类型和根类型
本章小结
本章习题2004.11.3AI程序设计311.1
论域段
一个论域段在当前作用域内定义一组论域(参见接口、类声明和类实现)。
domainsSection:
domains
domainDefinition-dot-term-list-opt论域定义一个论域定义,声明了一个当前作用域内已命名的论域。
domainDefinition:
domainName
=
typeExpression
如果在右边的论域表示一个接口或一个复合论域,那么所定义的论域就是类型表达式的同义词(即完全相同)。否则,所定义的论域称为类型表达式所指示的论域的子类。在这里,论域名domainName应当是小写标识符。有些地方必须使用论域名而不是类型表达式:
1)
作为形式变元类型的声明;
2)
作为一个常量或一个事实变量的类型;
3)
作为列表论域中的类型。2004.11.3AI程序设计411.1
论域段类型表达式一个类型表达式指示一种类型。
typeExpression:
typeName
compoundDomain
listDomain
referenceDomain
predicateDomain
integralDomain
realDomain2004.11.3AI程序设计511.1.1类型名
一个类型名或者是一个接口名,或者是一个值论域的名字。值论域这一术语用来指定元素不可变的论域。这里可以说,属于与接口名相一致的论域的对象具有可变的声明,任意其它论域的项都是不可变的。因此,实际上数值类型是除了对象类型以外的其它类型。一个类型名指示与现有论域的名称相应的类型。2004.11.3AI程序设计611.1.1类型名typeName:
interfaceName
domainName
classQualifiedDomainName
interfaceName:
lowercaseIdentifier
domainName:
lowercaseIdentifier
classQualifiedDomainName:
className::domainName
className:
lowercaseIdentifier这里,interfaceName是一个接口名,domainName是一个值域名,className是一个类名。2004.11.3AI程序设计711.1.1类型名举例domains
newDomain1=existingDomain.
newDomain2=myInterface.
在本例中,论域名是existingDomain,接口名myInterface用来定义新的论域。2004.11.3AI程序设计811.1.2复合论域
复合论域(CompoundDomains),也称作代数数据类型,用于表示列表、树和其它树形结构的数值。在其简单形式中,复合论域用于代表结构和枚举数值。复合论域可以递归定义,也可以相互或间接递归。compoundDomain:
alignment-optfunctorAlternative-semicolon-sep-list
alignment:
alignintegralConstantExpression
这里,integralConstantExpression是一个表达式,它必须是在编译时间赋为整数。2004.11.3AI程序设计911.1.2复合论域
如果一个复合论域包含一个算符选项,那么它被视为结构,并且具有与C语言中的适当结构二进制兼容的表示法。functorAlternative:
functorName
functorName
(
formalArgument-comma-sep-list-opt
)
这里,functorName是一个算符选项的名称,它应当是小写标识符。FormalArgument为:formalArgument:
typeName
argumentName-optargumentName可以是任意标识符,编译器忽略它。复合论域是从它们派生出来的引用论域的子类,否则复合论域与任何其它论域都不具有这样的子类关系。如果一个论域作为一个等价的复合论域进行定义,那么这两个论域是同义类型而不是子类型。意思就是说它们是同一类型的两个不同名字。2004.11.3AI程序设计1011.1.2复合论域举例
domains
t1=ff();gg(integer,t1).
t1是一个带有两个选项的复合论域。第一个选项是空变元算符ff。第二个选项是两个变元的算符gg,采用一个整型数论域和论域t1自身作为参数。因此,论域t1是递归定义的。以下表达式是论域t1的项:ff()gg(77,ff())gg(33,gg(44,gg(55,ff())))
2004.11.3AI程序设计1111.1.2复合论域举例domains
t1=ff();gg(t2).
t2=hh(t1,t1).t1是一个带有两个选项的复合论域。第一个选项是空变元算符ff。第二个选项是一元算符gg,采用论域t2的项作为参数。t2是一个带有一个选项算符hh的复合论域,算符hh采用两个t1项作为参数。因此,论域t1和t2是相互递归的。以下表达式是论域t1的项:ff()gg(hh(ff(),ff()))gg(hh(gg(hh(ff(),ff())),ff()))gg(hh(ff(),gg(hh(ff(),ff()))))gg(hh(gg(hh(ff(),ff())),gg(hh(ff(),ff()))))
2004.11.3AI程序设计1211.1.3列表论域
列表论域(ListDomains)代表一个特定论域的值序列。这样,列表T中的所有元素必须是T类型。
listDomain:
typeName*T*是T元素列表的类型。下列语法用于列表:
listExpression:
[term-comma-sep-list-opt]
[term-comma-sep-list|constantName]
[term-comma-sep-list|factVariableName]
[term-comma-sep-list|functionCall]
[term-comma-sep-list|variableName]
[term-comma-sep-list|anonymousIdentifier]
[term-comma-sep-list|listExpression]
这里,functionCall是一个函数调用,返回一个listDomain类型的值。ConstantName,factVariableName和ariableName应当是listDomain类型。每一项都应当是typeName类型。2004.11.3AI程序设计1311.1.3列表论域
实际上,列表仅仅是带有两个算符的复合论域:[]指示空列表;算符[HD|TL]指示该列表具有表头HD和表尾TL。表头必须是基本元素类型,而表尾必须是一个相关类型的列表。因此列表从语法上可以被修饰为:
[E1,E2,E3,...,En|L]是[E1|[E2|[...[En|L]...]]]的简记。
[E1,E2,E3,...,En]是[E1,E2,E3,...,En|[]]的简记,继而是[E1|[E2|[...[En|[]]...]]]的简记。
2004.11.3AI程序设计1411.1.4引用论域
一个引用论域(ReferenceDomains)与构造它的原始论域类似,除此之外,引用论域变量的值也可以是自由变量(即"unknown")。referenceDomain:
referencereferenceDomainDescriptionreferenceDomainDescription:
typeName
compoundDomain
listDomain
如果一个引用论域由一个复合论域构造,在算符中嵌套的所有论域也必须是引用论域。一个引用论域是一个基本的非引用论域的超论域。引用论域不是任何其它论域的子类型。2004.11.3AI程序设计1511.1.5谓词论域
一个谓词论域(PredicateDomains)的值是具有相同“签名(signature)”的谓词。就是说,具有相同的参数和返回类型,相同的流模式以及相同的(或加强的)谓词模式。一个具有返回值的谓词称为函数,而没有返回值的谓词被称为普通谓词,以强调它并不是一个函数。2004.11.3AI程序设计1611.1.5谓词论域predicateDomain:
(
formalArgument-comma-sep-list-opt
)
returnArgument-opt
predicateModeAndFlow-list-opt
callingConvention-opt
formalArgument:
predicateArgumentType
variableName-opt
ellipsis
returnArgument:
->formalArgument
predicateArgumentType:
typeName
anonymousIdentifier
variableName:
upperCaseIdentifier
2004.11.3AI程序设计1711.1.5.1谓词模式
当声明一个谓词时其模式可以省略。在一个实现内部(即对于一个局部谓词而言),所需的流和模式源自谓词的用法。在一个接口或一个类声明内部(即对于一个公有谓词而言),省略谓词模式意味着该谓词是一个过程procedure,省略流模式意味着所有的参数都是输入参数。为构造器声明一个谓词模式是非法的,这种谓词总是有procedure模式。2004.11.3AI程序设计1811.1.5.1谓词模式
指定的谓词模式可应用于下列流模式的每个成员。predicateMode:oneof
erroneous
failure
procedure
determ
multi
nondeterm
谓词模式可用下列集合来描述:
erroneous={}failure={Fail}procedure={Succeed}determ={Fail,Succeed}multi={Succeed,BacktrackPoint}nondeterm={Fail,Succeed,BacktrackPoint}Fail在集合中是指谓词失败。Succeed在集合中是指谓词成功。
BacktrackPoint在集合中是指该谓词返回时会带一个活动的回溯点。2004.11.3AI程序设计1911.1.5.2流模式
流模式(FlowPattern)定义了参数的输入/输出方向,这些参数与算符论域相结合,会成为带有单个输入参数的一些部分以及相同输出参数的某些部分的结构。一个流模式由一个流的序列组成,每个流对应一个参数(比如第一个流对应第一个参数)。flowPattern:
(flow-comma-sep-list-opt)
anyFlowflow:
i
o
functorFlow
listFlow
ellipsis2004.11.3AI程序设计2011.1.5.2流模式省略流(Ellipsisflow)模式省略流(Ellipsisflow)模式必须与一个省略参数匹配,并且因此只能作为流模式中的最后一个流。
ellipsis:
...算符流functorFlow
一个算符流functorFlow声明了一个算符和构成该流的所有的流。当然,算符必须在相应参数的论域内。functorFlow:
functorName
(
flow-comma-sep-list-opt
)
一个算符流的声明不能包含省略流。2004.11.3AI程序设计2111.1.5.2流模式列表流列表流恰恰与算符流类似,但却与列表论域具有相同的语法修饰。listFlow:
[flow-comma-sep-list-optlistFlowTail-opt
]listFlowTail:
|
flow
一个列表流不能包含省略流。当声明一个谓词时,流模式可以被省略。在一个实现内部(即对于一个局部谓词而言),所需流模式源自该谓词的用法。在一个接口或一个类声明内部(即对于一个公有谓词而言),省略流是指所有参数均为输入参数。特殊的流模式anyflow只能在局部谓词中进行声明(即在一个类的实现内部的谓词声明)。这意味着确切的流模式将在编译过程中估计出来。如果可选的先前谓词模式在这个流模式中被省略,那么就假定它是一个过程(procedure)。2004.11.3AI程序设计2211.1.5.2流模式举例
domains
pp1=(integerArgument1).pp1是一个谓词论域。具有类型pp1的谓词带有一个整型变量作为参数。由于没有声明流模式,所以该参数被认为是输入参数;而且,没有提到谓词模式,所以该谓词是过程(procedure)。举例
domains
pp2=(integerArgument1)->integerReturnType.
类型pp2的谓词带有一个整型变量作为参数,并返回一个整型类型的值。因此,pp2实际上是一个函数论域,具有类型pp2的谓词实际上是函数。由于没有声明流模式,所以该参数被认为是输入参数。而且,没有提到谓词模式,因此该谓词是过程。2004.11.3AI程序设计2311.1.5.3调用约定
调用约定(CallingConvention)决定了参数等如何传递给谓词,也决定了从一个谓词名怎样获得一个连接名。callingConvention:
languagecallingConventionKindcallingConventionKind:oneof
c
stdcall
apicall
prolog
如果没有声明一个调用约定,那么就假定用Prolog约定。Prolog调用约定是一个用于Prolog谓词的标准约定。调用约定C继承了C/C++的标准调用约定。一个谓词的连接名用一个加前导下划线(_)的谓词名创建。调用约定stdcall采用C连接名策略,但是它用了不同的变量和堆栈处理规则。表11-1显示了stdcall调用约定的实现情况。2004.11.3AI程序设计2411.1.5.3调用约定表11-1stdcall调用约定的实现特性实现参数传递顺序从右至左参数传递约定按值传递,除非传递的是一个复合论域项或引用类型。因此不能用于参数数目变化的谓词。堆栈维护职责被调用的谓词从堆栈中弹出自身参数名称修饰约定一个下划线(_)作为谓词名的前缀大小写转换约定不执行谓词名的大小写转换2004.11.3AI程序设计2511.1.5.3调用约定
调用约定apicall使用与stdcall相同的参数和堆栈处理规则,但是为了方便地调用MSWindowsAPI函数,apicall采用了大多数MSWindowsAPI函数所用的名称约定。根据apicall的名称约定,一个谓词的连接名结构如下:
*下划线符作为谓词名的前缀;
*谓词名首写字母用大写;
*如果参数和返回类型指示ANSI、双字节字符集和不确定性谓词,则分别用'A'、'W'做为后缀字符或无后缀;
*以‘@’为后缀;*以压入调用堆栈的字节数为后缀。2004.11.3AI程序设计2611.1.5.3调用约定举例
predicates
predicateName:(integer,string)languageapicall
该谓词的参数类型表明这是一个双字节字符集(正如string是双字节字符串论域一样)。在调用堆栈中,一个整型和一个字符串每一类型占4个字节,因此,连接名变成:
_PredicateNameW@8
如果apicall与"as"结构一起使用,则"as"结构中声明的名字以相同的方式被修饰。
apicall只能在谓词声明中直接使用,而不能在谓词论域定义中直接使用。在谓词论域定义中取而代之的是stdcall。2004.11.3AI程序设计2711.1.5.3调用约定
表11-2对比了c、apicall及stdcall调用约定的实现,而prolog调用约定实现比较特殊,这里不予以讨论。表11-2c、apicall及stdcall调用约定的实现对比关键字堆栈清理谓词名大小写转换连接谓词名修饰惯例c调用谓词从堆栈中弹出参数无下划线(_)作谓词名前缀stdcall被调用的谓词从堆栈中弹出自身参数无下划线(_)作谓词名前缀apicall被调用的谓词从堆栈中弹出自身参数谓词首字母大写下划线(_)作名字前缀。首字母变为大写。'A','W'做后缀或无后缀。@符号做后缀。参数列表中的字节数(十进制)做后缀。2004.11.3AI程序设计2811.1.5.3调用约定举例假定有下列声明:interfaceactionEventSource
domains
actionListener=(actionEventSourceSource)procedure(i).
predicates
addActionListener:(actionListenerListener)procedure(i).
...endinterface
同样假定类button_class支持actionEventSource。当按钮按下时事件被发送。在myDialog_class类中,实现一个对话框。为了能够响应按钮按下操作而创建了一个按钮,以便监听活动事件。2004.11.3AI程序设计2911.1.5.3调用约定implementmyDialog_class
clauses
new():-
OkButton=button_class::new(...),
OkButton:addActionListener(onOk),
...
facts
okPressed:()determ.
predicates
onOk:actionListener.
clauses
onOk(Source):-
assert(okPressed()).endimplement对于这个例子而言重要的一点是,onOk是一个对象成员。当按钮被按下时,已注册的onOk的调用将在拥有onOk的对象中返回。也就是说,可以断言,我们有权访问对象事实okPressed。
2004.11.3AI程序设计3011.1.6整型论域
整型论域用于表示整型数,主要分为符号整数和无符号整数两类。整型论域也可以有不同的表示范围。预定义论域integer和unsigned代表有符号和无符号整数,表示的长度与处理器体系结构的自然长度相同(即32位机器就是32位)。integralDomain:
domainName-optintegralDomainProperties
如果在integralDomainProperties之前声明domainName,那么这个论域本身必须是整型论域,其派生的论域也必须是这一论域的子类型(child-type或sub-type)。这种情况下,integralDomainProperties不可以违背作为子类型的可能性,也就是说,其范围不可扩展,大小不可改变。2004.11.3AI程序设计3111.1.6整型论域integralDomainProperties:
integralSizeDescriptionintegralRangeDescription-opt
integralRangeDescriptionintegralSizeDescription-opt
integralSizeDescription:
bitsize
domainSizedomainSize:
integralConstantExpression
整型大小描述声明了整型论域以位计算的大小domainSize。编译器实现整型论域的这种表示,它不少于所指定的位数。domainSize的值应当是确定的,并且不超过编译器所支持的最大值(在版本6.x中是32位)。2004.11.3AI程序设计3211.1.6整型论域
如果整型范围描述被省略,那么就与父论域相同。如果没有父论域,那就记为处理器的自然长度。integralRangeDescription:
[
minimalBoundary-opt
..
maximalBoundary-opt
]minimalBoundary:
integralConstantExpressionmaximalBoundary:
integralConstantExpression
整型范围描述声明了限定整型论域的最小界minimalBoundary和最大界maximalBoundary。如果该限定被省略,那么就用父论域的限定范围。如果没有父论域,那么用domainSize分别决定这个最大值和最小值。2004.11.3AI程序设计3311.1.6整型论域注意:指定的最小值不能超过指定的最大值,即:minimalBoundary<=maximalBoundary
最小界minimalBoundary和最大界maximalBoundary必须满足bitsize所隐含规定的位长度。论域位长度domainSize的值,以及最小界minimalBoundary和最大界maximalBoundary的值必须在编译期间进行计算。2004.11.3AI程序设计3411.1.7实型论域
实型论域用于表示带有小数部分的数(即浮点数)。实型论域可用于表示非常大和非常小的数。内部论域real具有处理器体系结构的自然精度(也是编译器所赋予的精度)。realDomain:
domainName-opt
realDomainProperties
如果在realDomainProperties之前声明domainName,那么这个论域本身就必须是一个实数论域,并且结果论域是这个论域的子类型。在此情况下,realDomainProperties不能违背作为一个子类型的可能性,就是说,范围不能被扩展,精度不能被增加。2004.11.3AI程序设计3511.1.7实型论域realDomainProperties:
realPrecisionDescriptionrealRangeDescription-opt
realRangeDescriptionrealPrecisionDescription
realPrecisionDescription:
digits
integralConstantExpression
实型精度描述声明了实型论域的精度,精度由小数位数决定。如果精度省略,则与父论域相同。若没有父论域,那么就取处理器的自然精度或是编译器所指定的精度(在VisualProlog6中编译器限制为19位数)。编译器会给精度一个上限和一个下限,如果精度超过了所用限度,就只获得处理器(编译器)所指定的精度。2004.11.3AI程序设计3611.1.7实型论域realRangeDescr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026四川成都高新未来科技城发展集团有限公司招聘20人笔试历年备考题库附带答案详解
- 2026内蒙古准格尔旗盛翔文化旅游开发集团有限公司招聘55人笔试历年常考点试题专练附带答案详解
- 2026中国林业集团有限公司夏季校园招聘33人笔试历年难易错考点试卷带答案解析
- 2026年河北省安国市高二化学下册期末考试模拟考试卷附完整答案【典优】
- 2026及未来5年中国球形刚玉轴承市场数据分析及竞争策略研究报告
- 2026及未来5年中国环氧防污漆市场数据分析及竞争策略研究报告
- 2026及未来5年中国特效退浆酶市场数据分析及竞争策略研究报告
- 2026年湖南省沅江市高二化学下册期末考试模拟试卷附参考答案(考试直接用)
- 2026及未来5年中国热环市场数据分析及竞争策略研究报告
- 2026年江西省德兴市高二化学下册期末考试模拟考试卷及参考答案【A卷】
- 插花花艺师国家职业技能标准
- 天燃气管道动火连头方案
- GB/T 6365-2006表面活性剂游离碱度或游离酸度的测定滴定法
- GB/T 19466.6-2009塑料差示扫描量热法(DSC)第6部分:氧化诱导时间(等温OIT)和氧化诱导温度(动态OIT)的测定
- GA 1800.1-2021电力系统治安反恐防范要求第1部分:电网企业
- 六年级下册道德与法治知识点-填空题100道及参考答案
- 教师招聘报名登记表
- 一年级下册生字复习二课件
- 压床机构机械原理优质课程设计
- 汽车发动机电控系统检修:第一章汽油发动机电控燃油喷射系统认知
- 隧道逃生管道安全技术交底(标准版)
评论
0/150
提交评论