第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 1
第 10章 Visual Prolog语言元素
本章介绍 Visual Prolog 6程序设计语言的语法和语义。 Visual
Prolog是基于逻辑程序设计语言 Prolog的一种强类型的面向对象的程序
设计语言。一个 Visual Prolog程序包括一个目标、大量的接口声明和类
的实现程序。
接口、类声明和类实现包括 Prolog实体的定义和声明,即
? 论域
? 常量
? 谓词
? 事实数据库
Visual Prolog程序的实际代码中的谓词定义由谓词声明和子句定义
来声明。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 2
第 10章 Visual Prolog语言元素
10.1 类型
10.2 对象系统
10.3 作用域和可视性
10.4 词法结构
本章小结
本章习题
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 3
10.1 类型
Visual Prolog的类型( Type)分为对象类型和数值类型。对象类型是可
变的,而数值类型是不可变的。
对象类型由接口( interface)进行定义。
数值类型包括:数值型、字符串型、字符型以及复合论域。复合论域也可
以看作代数类型数据。复合论域的简化形式是结构和枚举类型,而更多的复杂
形式是树型结构。
此外,Visual Prolog还有一种特殊类型,叫做引用论域,它可以由任意其
它类型派生而来。引用类型与 Prolog执行模型或语义密切相关 。 在下面将详细
进行介绍。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 4
10.1 类型
类型以子类型层次结构进行组织 。 子类型用来引入包容多态性:希望某种类
型的一个值能够同样接受任意的一个子类型值的任何上下文 。 或者我们倒过来说,
在需要时把一定类型的值自动地转化为任意超类型, 这样可以不需要显式的类型
转换而访问该超级类型 。
子类型可源于除代数数据类型外的其它任意数值类型 。 源于代数数据类型的
类型是同义类型而不是子类型, 也就是说它们是同一类型而不是一子类型 。
子类型的概念与子集概念密切相关 。 但是特别值得注意的是, 尽管一个类型
是另一类型子集的精确描述, 但它并不需要成为一个子类型 。 一个类型只在特别
声明时才是另一类型的子类型 。 例如
domains
t1 = [1..17],
t2 = [5..13],
t3 = t1 [5..13],
t1是一个整型变量, 取值从 1到 17( 包括端点在内 ) 。
同样, t2取值从 5到 13,但是 t2不是 t1的子类型 。 另
外, t3 (包含与 t2一样的取值 )则是 t1的子类型, 因
为这是声明了的 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 5
10.1 类型
语言中包含了少数隐含的子类关系, 但其它情况下子类
关系都是在类型定义中具体规定的 。
对象类型采用子类型层次结构组织, 该结构是源于预定
义对象类型的对象的, 也就是说, 任意对象类型是一个对
象的子类型 。 对象类型用接口相互支持的方式来规定 。 如
果一个对象是支持某一其它接口的接口或对象类型, 那么
该对象也具有那个类型并且能够不受限制地作为这样的对
象应用 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 6
10.2 对象系统
Visual Prolog的对象系统( object system),
包括外部视图( External View)和内部视图
( Internal View)。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 7
10.2.1 外部视图
Visual Prolog的类的概念基于以下 3项语义实体,
? 对象( object):一个对象是指若干命名对象成员谓词和一组支持
接口的集合。实际上对象也有一个状态,这个状态只能通过成员谓
词来改变或观察。我们称对象中的这种状态为封装。
? 接口( interface):一个接口是一种对象类型。它有一个名字且定
义了一组命名对象谓词。
? 类( Class):一个类是一个命名的对象工厂。它可以创建与某一接
口相对应的对象。任何对象都由类创建。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 8
10.2.1 外部视图
由一特定类创建的所有对象共享统一的对象成员谓词定义,但是每
一个对象又有其自身的状态。这样,对象成员谓词实际上是类的一部分,
然而对象的状态却是对象自身的一部分。
一个类也包括另外一系列命名的谓词及一个封装的状态, 分别作为
类的成员和类的状态 。 类的成员和类的状态存在于每一个基类中, 然而
对象成员和对象状态存在于每一个基对象中 。 类的状态既可以通过类的
成员访问, 也可以通过对象成员访问 。
注意, 由一个类定义的一系列对象成员谓词是该类的接口中声明的
谓词的联合 。 这特别意味着, 如果不同的两个接口中声明了同一谓词,
那么该类就只能为该谓词提供惟一的定义 。 因此, 该类只有在含义清楚
的时候才有效, 也就是说, 在这两个继承性的谓词的预定语义相同的情
况下, 该类才合理 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 9
10.2.1 外部视图
同一性 ( Identity), 每个对象都是惟一的:对象有可变的状态,
并且由于对象的状态可以通过它们的成员谓词进行观测,因此一个对象
只与自身完全相同。也就是说,即使两个对象的状态完全相同,对象也
是不同的,因为改变一个对象的状态并不能改变另一个对象的状态。
不能直接访问对象的状态, 我们通常通过该对象的引用访问对象状
态, 同时一个对象是与自身同一的 。 同一对象可以有许多的引用 。 这样,
就可以通过许多不同的引用访问同一对象 。
类和引用也是惟一的:它们通过自身的名字进行识别 。 两个引用或
类在同一程序中不能有相同的名字 。
实质上, 对象, 类或接口的结构相同并不意味着它们就一样 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 10
10.2.2 内部视图
前面一节从外部行为的角度介绍了对象、类和接口,本节将从内部问题的角
度展开这些描述。
类的程序语义,这些内部问题更具有程序语义上的自然属性。可以考虑将类
分为声明部分和实现部分。
从程序语义上的角度看, 类是核心项, 类中包含了代码 。
接口主要具有静态价值 。 事实上, 接口只存在于程序的正文描述中, 并没有
直接的运行描述 。 另一方面, 对象则主要具有动态价值 。 在程序中对象并不能
直接可见, 它只有在程序真正运行时才存在 。
一个类由声明和实现两部分组成。声明部分声明了类的公共存取部分以及产
生的对象。实现部分则定义了类声明中声明的实体。谓词的基本实现自然是子
句,但是谓词也可以借助于继承进行定义,或由外部程序库解决。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 11
10.2.2 内部视图
代码继承( Code Inheritance):在 Visual Prolog中,代码继
承只能在类的实现中发生。 Visual Prolog支持多继承。可以通过在实
现的一个特殊的继承部分中提及某一类以继承该类。继承类称为父类
或超类。子类( Child class)和支类( sub-class)与对父类而言是
一样的,我们称该子类继承了父类。一个子类只能通过公用接口访问
其父类,即在使用父类上它并没有比其他类更多的特权。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 12
10.3 作用域和可视性
本节介绍作用域和可视性( Scoping &
Visibility),包括名字分类 (Name Categories)、
可视性、隐蔽及限定( Visibility,Shadowing &
Qualification)等。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 13
10.3.1 名字分类
Visual Prolog所有的名称(识别)主要可以人为地分为两组,
?常量名(以小写字母开头)
?变量名 (以大写字母或下划线开头 )
常量名(标识符)分为以下几类,
?类型名(即论域和接口)
?论域载体(即类和接口)
?不带圆括号的名称(即常量、事实变量和空变元算符)
?变元 N的有返回值的名字(即函数、算子和事实变量)
?变元 N的无返回值的名字(即谓词和事实 )
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 14
10.3.1 名字分类
注意,
1) 一个接口和一个论域决不能在定义的地方产生冲突 。论域和接口之
间的歧义可以用限定来解决(一个接口能够用‘,:’限定,‘,:’之前没
有标识符)。
2) 类和接口不能同名,即两个类、两个接口或一个类和一个接口不能
同名。除非当一个接口的命名以与该接口同名的类的构造类型使用时才
允许同名。也就是可以使用下述语法,
interface interfaceAndClassName
,.,
end interface interfaceAndClassName
class interfaceAndClassName, interfaceAndClassName
,.,
end class interfaceAndClassName
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 15
10.3.1 名字分类
类系统对谓词、函数、常量和算符名称的使用有以下限制,
定义域 主要由限定和元数 ( arity) 来决定, 或与定义在当前作用域
范围内的规则一起决定 ( 除非使用了显式限定 ) 。
这就是说:如果以一个作用域名限定了名字, 那么所定义的作用域当
然由限定决定 。 如果在当前作用域内定义了名字或元数, 那么这就是定
义域 。 否则, 作用域必须由名字和元数清楚地惟一决定 ( 即名字或元数
在两个或两个以上开放的或继承的作用域内被定义是错误的 ) 。
定义规则 仅仅取决于名字, 元数和类型;必须有可能惟一地决定所定
义的名字空间 。 当前作用域覆盖所有其它作用域 。 必须使用限定 ( 用
‘,:’限定 ) 来解决名字空间冲突 。 在单独的一个类型中, 名字只能代表
一个含义 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 16
10.3.1 名字分类
如果一个作用域声明一个不带括号的名字,那么它可以声明为,
一个常量
一个事实变量
一个空变元算符
这就是说不可能有一个与事实变量名或空变元算符同名的常量 。
如果一个作用域声明一个有返回值的名称, 那么它可以声明为,
一个函数
一个算符
一个事实变量
也就是说, 让一个函数, 算符或事实变量同名, 同变元是不可能的 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 17
10.3.1 名字分类
如果一个作用域声明一个无返回值的变量名字, 那么可以声明如下,
一个谓词, 或者
一个事实
最后, 关于重载 。 下列实体能够重载,
算符
函数
谓词
一个算符在同一论域内不可以使用两次 ( 即使变元不同 ) 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 18
10.3.2 可视性、隐蔽性及限定性
一个接口定义、类声明和类实现都有作用域(作用域不允许嵌套)。
一个实现(私有的)扩展了相应于类声明的作用域。在一个作用域内的可视
性都是相同的。这一点特别是指在一个作用域内,不论在哪里声明的类型都在整
个作用域内是可视的。
使用来源含糊的名字是非法的。在谓词调用中的所有歧义都会通过用类名对
谓词名进行限定 (比如,cc::p)来消除。
Visual Prolog有以下的隐蔽层次,
? 局部作用域
? 超类和开放作用域
以超类为例,该层次是指一个局部声明会使一个超类声明隐蔽。但是在超类
之间并不隐蔽。所有的超类具有相同的优先权。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 19
举例
假设有接口 aa 和类 aa_class为,
interface aa
predicates
p1, () procedure (),
p2, () procedure (),
p3, () procedure (),
end interface
class aa_class, aa
end class
假设类 bb_class为,
class bb_class
predicates
p3, () procedure (),
p4, () procedure (),
end class bb_class
在这些类的上下文中考虑类 cc_class的实现,
implement cc_class inherits aa_class
open bb_class
predicates
p2, () procedure (),
p5, () procedure (),
clauses
new(),-
p1(),% aa_class::p1
p2(),% cc::p2 (shadows aa_class::p2)
aa_class::p2(),% aa_class::p2
p3(),% Illegal ambigious call,
aa_class::p3 or bb_class::p3
aa_class::p3(),% aa_class::p3
bb_class::p3(),% bb_class::p3
p4(),% bb_class::p4
p5(),% cc::p5
end implement cc_class
10.3.2 可视性、隐蔽性及限定性
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 20
10.4 词法结构
本节介绍 Visual Prolog的词法结构 (Lexical
Structure),包括程序单元( Program Elements)、标记
( Tokens)及文字( Literals)。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 21
10.4.1 程序单元
Visual Prolog编译器应用于源文件。该文件可以包括其它源文件,
这些源文件插入最初的源文件构成一个编译单位。一个编译单位的编译
依照两个步骤进行:首先,输入被转换为标记序列; 然后,这些标记
按语义分析并转化为可执行代码。
程序的词法分析将编译单元 compilationUnit分割为一个输入元素
的列表 inputElement。只有标记对于后续的语法分析才是重要的。
compilationUnit,
inputElement-list
inputElement,
comment
whiteSpace
token
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 22
10.4.1 程序单元
注释( Comments)
Visual Prolog的注释以下列任意方式书写,
1) /* (斜线, 星号 ) 字符, 后跟任意序列的字符 ( 包括新行 ), 以 */ (星
号, 斜杠 )字符结束 。 这些注释可以是多行的, 也可以是嵌套的 。
2) % (百分号 ) 字符, 后跟任意序列的字符 。 以 %字符开始的注释延续到
行尾 。 因此, 它通常被称为, 单行注释, 。
注意下面的注释示例,
/* Begin of Comment1
% Nested Comment2 */ This mark does not close a multi-line
comment because it is inside a single-line comment
This is the real termination of Comment1 */
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 23
10.4.1 程序单元
空白 ( Whitespace)
whiteSpace,
blank
tab
newLine
这里的 blank是一个空白字符, tab是一个制表符, newLine是一
个新行 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 24
10.4.2 标记
token,
identifier
keyword
punctuator
operator
literal
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 25
10.4.2 标记
标识符( Identifiers)
identifier,
lowercaseIdentifier
uppercaseIdentifier
anonymousIdentifier
ellipsis
一个小写标识符 lowercaseIdentifier是一个以小写字母开头的字母, 数字
和下划线的序列 。 一个大写标识符 uppercaseIdentifier是一个以大写字母或
下划线开头的字母, 数字和下划线的序列 。
anonymousIdentifier, _
ellipsis,
,.,
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 26
10.4.2 标记
关键字( Keywords)
关键字分为主关键字和次关键字, 这样的分类只是表面上的 。 主次关键字
之间并没有真正的区别 。 在后文中以不同的颜色区分二者 。
keyword,
majorKeyword
minorKeyword
majorKeyword, one of
class clauses constants constructors
div domains delegate
end
facts from
implement interface inherits
goal guards
mod monitor
open
predicates
resolve
supports
minorKeyword, one of
align and as anyflow
bitsize
determ digits
erroneous externally
failure
language
multi
nondeterm
or
procedure
reference
single
to
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 27
10.4.2 标记
标点符号( Punctuation Marks)
在 Visual Prolog中, 标点符号对于编译器而言具有语法上的和语义
上的 ( syntactic and semantic) 含义, 但其本身并不指定可以产生
值的运算符 。 某些标点符号或是单独的或是合成的, 都可以成为
Visual Prolog的运算符 。
标点符号有,
punctuationMarks,one of; !,,# [ ] ( ),-,,,
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 28
10.4.2 标记
运算符( Operators)
运算符指定作用于操作数的一种运算 。
operators,one of
+ - / * = div mod
< > <> >< <= >=,=
所有的运算符都是二进制的, 运算符, -, 和, +”是单目操作符 。
div和 mod 是保留字 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 29
10.4.3 文字
literal,
integerLiteral
realLiteral
characterLiteral
stringLiteral
binaryLiteral
listLiteral
? 整数型文字
? 实数型文字
? 字符型文字
? 字符串型文字
? 二进制型文字
? 列表型文字
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 30
10.4.3 文字
整数型文字
integerLiteral,
octalPrefix octalDigit-list
unaryMinus-opt decimalDigit-list
hexadecimalPrefix hexadecimalDigit-list
unaryMinus,
-
octalPrefix,
0o
octalDigit,one of
0 1 2 3 4 5 6 7
decimalDigit,one of
0 1 2 3 4 5 6 7 8 9
hexadecimalPrefix,
0x
hexadecimalDigit,one of
0 1 2 3 4 5 6 7 8 9 A a B b C c D d E e F f
整型数不能超过最大、最小整数的范围。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 31
10.4.3 文字
实数型文字
realLiteral,
unaryMinus-opt decimalDigit-list fractionOfFloat-opt exponent-
opt
fractionOfFloat,
, decimalDigit-list
exponent,
exponentSymbol exponentSign-opt decimalDigit-list
exponentSymbol,one of
e E
exponentSign,one of
- +
浮点数不能超过最大最小实数界限 。
实数型文字需要小数部分和指数部分, 否则被解释为整数 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 32
10.4.3 文字
字符型文字
characterLiteral,
' characterValue '
字符的值可以是任意可打印字符或一个转义序列,
\\ 代表 \
\t 代表制表符
\n 代表换行符
\r 代表回车
\' 代表单引号
\" 代表双引号
一个 "u"后面跟四位十六进制数代表相应数的双字节字符 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 33
10.4.3 文字
字符串型文字
stringLiteral,
stringLiteralPart-list
stringLiteralPart,
@" anyCharacter-list-opt "
" characterValue-list-opt,
一个字符串由一个或多个 stringLiteralPart串连接组成。如果
StringLiteralPart以 @开始,则不使用转义序列。因此,不使用 @的字符串
类型可以使用下述转义序列,
\\ 代表 \
\t 代表制表符
\n 代表换行符
\r 代表回车
\' 代表单引号 ( 可直接表示为单引号字符 )
\" 代表双引号
一个 "u"后面跟四位十六进制数代表相应数的双字节字符 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 34
10.4.3 文字
二进制型文字
binaryLiteral,
$[ elementValue-comma-sep-list-opt ]
elementValue,
integerLiteral
elementValue在 [0..255]之间 。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 35
10.4.3 文字
列表型文字
列表型的元素可以是整型, 字符型, 浮点型, 字符串型或二进制型 。
listLiteral,
[ simpleLiteral-comma-sep-list-opt ]
[ simpleLiteral-comma-sep-list | listLiteral ]
在这里, simpleLiteral可以是,
simpleLiteral,
integerLiteral
realLiteral
characterLiteral
stringLiteral
binaryLiteral
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 36
第十章小结
本章介绍 Visual Prolog 6程序设计语言的语法和语义,内容包
括类型、对象系统、作用域和可视性,以及词法结构等。
Visual Prolog是基于逻辑程序设计语言 Prolog的一种强类型的
面向对象的程序设计语言。一个 Visual Prolog程序包括一个目标、大
量的接口声明和类的实现程序。
第三部分:第 10章 Visual Prolog语言元素
2004.11.3 AI程序设计 37
第十章习题
1、认定一个系统是面向对象的,其准则有哪几点?什么叫对象的封装?
2、接口与类有何关系?
3、作用域指的是什么?
4、可视性、隐蔽性及限定性的含义是什么?
5,Visual Prolog的词法结构,包括那些内容?它们在实质上有何作用?