附录 术语表
附录 术语表
? 本附录是术语表 ( Glossary), 提供 Visual Prolog的关
键术语, 这些术语以其英文字母顺序给出 。
A B C D E F G H I J
K L M N O P Q R S T
U V W X Y Z
alignment of memory
(内存对齐)
? 通过对一个混合论域或一个列表论域声明添加对齐说明 ( alignment
specification) 的前缀, 可以覆盖缺省的内存对齐方式 。 其语法为:
DOM = align 1 | 2 | 4 DOMDECL。 这里 DOMDECL是一个普通
的论域声明 。 覆盖对齐方式的主要目的是使复合对象与使用不同于
Visual Prolog缺省值对齐方式的外部代码保持兼容 。
ambiguity of names
(名字的歧义性)
? 名字的用途在其作用域内必须清楚。如果名字表示的是谓词,该则谓
词参数的数目和类型必须清楚。与调用谓词有关的歧义性可通过使用
限定名字避免。为了消除歧义性,类应提供该谓词的实现程序,该谓
词来自于我们所使用的一个归结段( resolve section)的多重继承。
一个归结限定符用于解决来自指定源的实现。
And(与)
? 逻辑与和逻辑或 。
? 由两个或多个部分组成的目标被认为是复合目标, 而复合目标的每一
部分叫子目标 。 用逗号,,, 分隔子目标, 可使用一复合目标以找出
一种解, 该解中子目标 A和子目标 B均正确 ( 一个逻辑与 ) 。 用分号
,;, 分隔子目标, 也可找出一种解, 该解中至少一个子目标 A或子
目标 B正确 ( 一个逻辑和 ) 。
anonymous variable
(匿名变量)
? 当变量绑定的值不重要时,在一个普通变量位置使用变量‘ _'。一个
以下划线开头的变量如,_AnyName‖如果在子句中只使用一次,同
样被 Visual Prolog编译器认为是匿名变量。
arguments(参数)
? 在一个谓词或谓词值调用中传递的值和变量的集体名字。
arithmetic expressions
(算术表达式)
? 算术表达式由操作数 ( 数字和变量 ), 运算符 ( +,-,*,/), 内部
数学函数 div和 mod,括号, PFC,用户定义的数学函数, 常数和十
进制数值的事实变量组成 。 表达式的值只有当所有的变量在计算期间
被绑定时才能得到 。 计算按一定的顺序进行, 由算术运算符的优先级
决定;优先级高的运算符先行运算 。
arithmetic operators
(算术运算符)
? 算术运算符可用于任何算术运算, 如:加 ( + ), 减 ( - ), 乘
( * ), 除 ( / ), 整数除 (div//2),和求模 (mod//2 –整数除法的
余 )。 当表达式中有多种算术运算符时, 乘, 除和求模首先运算, 其
次是加, 减 。 当一个表达式中所有的运算符的优先级相同时, 按从左
至右的顺序进行 。 括号内的表达式在所有其他运算符之前优先计算 。
arity of predicates
(谓词的变元)
? 一个有 N个参数的谓词称之为 N-元谓词,或者说该谓词有 N个变元 。
不同变元的谓词即使它们名字相同也永远是不同的谓词 。 以下符号要
用到,
– Name/N 表示一个 N元的普通谓词 ( 即不是函数 ) Name。
– Name//N 表示一个 N元的函数 Name。
– Name/N..,表示一个普通谓词 Name,其 N个参数后跟着省略参
数 (即可变数目的参数 )。
– Name//N..,表示一个函数 Name,有 N个参数, 后跟着省略参数
(即可变数目的参数 )。
atoms(原子)
? 原子是符号项或者字符串项。
backtracking(回溯)
? Visual Prolog内部有一个求解搜索机制。当一给定的子目标计算未
能成功完成,Visual Prolog返回上一子目标并试着用不同的方法来
满足。这就是 Visual Prolog的回退且重试方法,称之为回溯,以找
到给定问题的解。
backtracking points
(回溯点)
? Visual Prolog使用回退且重试的方法, 称之为回溯方法, 以对一给
定问题找出解 。 当 Visual Prolog开始寻找一问题 ( 或目标 ) 的解时,
它要在两种可能的方法之间进行选择 。 它在一个分枝点设置一个标志
( 称之为回溯点 ) 并选择第一个子目标进行追踪 。 如果该子目标失败,
Visual Prolog将回退到回溯点并尝试备选的子目标 。
binary domain
(二进制论域)
? Visual Prolog有一种特殊的二进制内部论域以保存二进制数据, 还
有用于创建二进制项和访问二进制项单个元素的谓词, 二进制项的
主要作用是保存数据, 这些数据再没有其他合理的表示方法, 如屏幕
位图数据 。 二进制项可以以文本格式读写 。 二进制项可象其他项一样
比较, 合一 。
bound variable(绑定变量)
? 绑定或实例化的变量, 是一个引用了已知值 ( 项 ) 的变量 。 谓词
bound/1可用于检查一个指定变量是否绑定到某一值 。
? 参见:合一 ( unification) 。
built-in domains,predicates,and constants
(内部论域,谓词和常量)
? Visual Prolog包含嵌入的隐含类, 它对内部常量, 论域和谓词提供
声明和实现程序 。 这些内部常量, 论域和谓词既可用在编译中 ( 例如,
在 #if,..结构中 ) 也可用于运行中 。 每一编译单元隐含着这一嵌入隐
含类的声明, 但实际上, 这一类有着在你的代码中不能明确引用的特
殊的内部惟一名字 。 你可在内部项的名字前使用,:。
calling a sub-goal
(调用子目标)
? 表示 Visual Prolog正在试着满足某子目标 ( 属于给定谓
词 ) 的表达式 。
calling conventions(调用约定)
? 调用约定确定了参数等如何传递给谓词 。 它也确定了如何从谓词名得
到连接名 。 作为 prolog缺省调用约定的选择, 可使用语言关键词
language来规定调用约定为 c,stdcall,或 apicall。
char(字符)
? char内部论域 。 该论域的值为 UNICODE字符, 由两个无
符号字节组成 。 在语句构成上, 它可写作用单引号引用的
字符 'a'或一转义顺序字符如 '\t'。
child class(子类)
? 从父类或超类继承而来的类 。 子类 ( child class) 和支类 (sub-class)
对父类而言是一样的, 我们也称子类由父类继承而来 。 一个子类只能
通过它的公共接口访问它的父类, 即在使用父类上它并没有比其他类
更多的特权 。
class(类)
? 每个类都有一个声明部分和实现部分 。 一个类可以创建与接口相应的
对象, 该接口在类声明的结构类型中指定 。 任何对象都是由类创建的 。
如果一个对象是由一个类创建的, 而该类使用接口 C来建立对象, 则
我们称之为, C对象, 。 从编程的观点来看, 类是主要项:代码包含
在类中 。 接口仅存在于程序的文本表示中;不存在 ( 直接的 ) 接口的
运行时间表示 。
class members and state
(类成员和声明)
? 由某一类建立的所有对象都具有相同的对象成员谓词集合, 但每一对
象有自己的声明 。 因而, 对象成员谓词实际是类的一部分, 而对象声
明是对象本身的一部分 。 一个类也可以包含用关键 class声明的其他
命名谓词和封装声明, 分别称之为类成员和类声明 。 类成员和类声明
存在于每一个基类之上 。 而对象成员和对象声明存在于每一个对象基
础之上 。 类声明可以通过类成员和对象成员访问 。
clause(子句)
? 某一特定谓词的事实或规则,后面跟一句点 ‘,'。
comments(注释)
? 一句注释是一系列字符, 编译器视其为单个空格字符, 或者就被忽视 。
注释用来为你的代码提供资料 。 注释可出现于任何空格可出现的地方 。
既然编译器视其为单个空格, 因此不能将注释放在一个记号内 。 在
Visual Prolog中有两种注释可供使用:多行注释和单行注释 。
? 多行注释以符号 /*( 斜杠, 星号 ) 开头, 其后是任意顺序的字符 ( 包
括新行 ), 最后以 */( 星号, 斜杠 ) 结尾 。 这些注释可以有多行 。 可
以嵌套 。
? 单行注释以符号 % (百分号 )开头, 后面可跟任意顺序的字符 。 单行
注释到行尾结束 。
comparison(比较)
? 两项可用关系操作符比较,>,<,>=,<=,<>,><,
和 =。 关系操作符是公式, 以表达式作为参数 。 首先, 计
算左边的项, 然后计算右边的项, 最后比较结果 。
compilation unit(编译单元)
? 编译单元是一段代码, 可由编译器单独编译生成目标文件 。 这样的目
标文件连接到一起生成程序目标文件 。 一个程序只能包含一个目标段,
这是程序的入口 。 一个编译单元是一系列编译项 。 一个编译项可以是
一个接口, 一个类声明, 一个类实现, 一个目标段或一个条件编译项 。
compiler directive
(编译器指令)
? 编译器预处理程序指令 。 这些指令不是 Visual Prolog语言的一部分 。
每一个编译器指令以#字符开头 。
? 有三种编译器指令,
– 条件编译指令, #if,#then,#else,#elseif,#endif;
– 源文件包含指令, #include;
– 编译时间信息指令, #message,#error,#requires,
#orrequires。
compound goal(复合目标)
? 一个至少包含两个子目标的目标 。 一个目标由两个或更多的部分组合
而成为复合目标, 复合目标的每一部分称为子目标 。 你可以通过用逗
号,,, 将子目标隔开, 在子目标 A和子目标 B都为真 ( 逻辑与 ) 的
情况下, 找到复合目标的解 。 你也可以通过用分号, ;, 将子目标隔
开, 在子目标 A或子目标 B为真 ( 逻辑或 ) 的情况下, 找到复合目标
的解 。
compound item(复合项)
? 一个由算符和子项列表(表中子项用逗号隔开,并用圆括
号括起)组成的项。
conjunction(连接词)
? 指逻辑与 (and)和逻辑或 (or)。
? 一个目标由两个或更多部分组成称为复合目标, 复合目标的每一部分
称为子目标 。 你可以通过用逗号,,, 将子目标隔开, 在子目标 A和
子目标 B都为真 ( 逻辑与 ) 的情况下, 找到复合目标的解 。 你也可以
通过用分号, ;, 将子目标隔开, 在子目标 A或子目标 B为真 ( 逻辑
或 ) 的情况下, 找到复合目标的解 。
constants(常量)
? 有名的符号常量可在常量段定义,可在现有作用域内使用。每一常量
定义包括定义一个命名的常量、它的论域和它的值。若论域是标准论
域之一,可省略。符号常量可用于任何地方,在这些地方也可以使用
同一论域的文字。
constructors(构造器)
? 构造器用于构造对象。构造器可以缺省,也可以在类声明和类实现的
构造器段明确声明。若一个类不声明任何构造器,那么一个缺省构造
器 new//0被隐含声明。每一构造器有两种用途,
? 一个类函数,返回一个新构造的对象。
? 一个对象谓词,在初始化继承对象时用到。
conversions of object types
(对象类型转换)
? 因为一个对象有其支持的任何接口的对象类型,因此它可以被用作任
何这些类型的对象。也就是说,一个对象的类型可以转换为任何其支
持的对象类型。在很多情况下,这样的转换是自动进行的。所以在不
同的上下文中,同样的对象可以被看成具有不同的类型。可以看到对
象的类型叫做可视类型,而构造该对象的类的类型叫做构造类型或定
义类型。
? (参见:类型转换,显式转换和隐式转换 )
cut(截断)
? 截断 ( cut) 在程序中用惊叹号, !‖来表示,
? 截断迫使 Visual Prolog在评估包含该截断的谓词时提交截至目前所
作出的所有选择 。 一旦截断作为一子目标被评估, Visual Prolog就
不能越过它进行回溯 。
database(数据库)
? Visual Prolog内部事实数据库是由事实组成的, 这些事实可以在运
行时从你的程序中直接加入或除去 。 可在事实段声明描述内部数据库
事实和事实变量的谓词, 象调用普通谓词一样调用这些数据库事实 。
但和普通谓词不同的是, 可以使用谓词 assert和 retract在运行时加
入数据库事实和除去已有的事实 。 可命名一个事实数据库, 这同时就
隐含定义了一个额外的复合论域 。 该论域与事实段名字相同 。
database predicates
(数据库谓词)
? 数据库谓词能在程序执行时从 Visual Prolog系统中添加
或删除事实。
declarations(声明)
? 一个声明引入一个名字并陈述该名字的一些性质 。 例如, X是一个整
型数, 就是一个声明; 它引入名字 X 并说明 X 是整型数的性质 。 声
明的目的是引入一些名字和该名字的性质, 以便能够从上下文关系中
引用 ( 即使用 ) 该名字, 并不需要知道该名字的定义 。
default constructor
(缺省构造器)
? 若一个类不声明任何构造器, 那么一个缺省构造器已经隐
含地声明了 。 一个缺省构造器是名为 new的空变元构造器 。
definitions(定义)
? 一个定义也引入一个名字 。 但说明该名字的确切意义 。 例如,, X 等
于 7‖ 就是一个定义, 它引入名字 X 并说明该名字的确切意义, 也就
是 7。 声明的目的是为了定义一个名字的确切意义, 所以它确实有意
义 ( 在运行时 ) 。 但既然一个定义也是一个声明, 所以声明的用途也
可用于定义 。
determinism(确定性)
? 大多数语言都是确定性的 。 也就是说, 任何一套输入值将导致一套用
于产生输出值的指令, 并且被调用的函数仅能产生一套输出值 。 另一
方面, Visual Prolog自然也支持基于非确定性谓词的非确定性推理 。
Visual Prolog有一套强制类型的确定性系统 。 确定性检查推理主要
处理程序优化 。 Visual Prolog 确定性检查系统强制声明谓词的下列
行为:谓词调用是否可以失败和谓词可以产生的解的数目 。 在更多
Prolog程序执行期间, 确定性模式定义,
– 谓词可以失败吗?
– 谓词可以成功吗?
– 对谓词调用是否要设置回溯点 。
disjunction(析取)
? 一个目标由两个或更多部分组成成为复合目标, 复合目标的每一部分
称为子目标 。 当子目标 A与子目标 B都为真, 可使用一复合目标来寻
找解, 只要用逗号,,, 将子目标隔开 。 当子目标 A或子目标 B至少
有一个为真, 也可使用一复合目标来寻找解, 只要用分号, ;, 将子
目标隔开 。
? 析取命题, 即命题中所呈现出两个或两个以上的可选项, 其中只有一
项成立便可以使命题为真 。
domain(论域)
? 在传统 Prolog中只有一种类型 ——项 。 Visual Prolog也有项, 但必
须声明谓词参数的论域是什么 。 论域使你能够给看起来相像然而种类
不同的数据有不同的名字 。 在 Visual Prolog程序中, 关系中的项
( 即谓词的参数 ) 属于论域 。 这些论域可以是预先确定的论域或用户
特殊声明的论域 。 论域声明有两个非常有用的目的 。 首先, 可以给论
域冠以有意义的名字, 即使它们与内部已存在的论域相同 。 其二, 特
殊的论域声明可用来声明标准论域没有定义的数据结构 。
ellipsis(省略号)
? 省略号, …‖可在谓词和谓词论域声明中作为最后一项形
式参数 。 在这种情况下, 它意味着声明的谓词 ( 谓词论域 )
可以有一可变数目的参数 。 省略号流必须与一个省略参数
匹配因此只能是流模式中的最后一个流 。
encapsulation(封装)
? 封装是一个对象隐藏其内部数据的能力和仅使其可以访问的部分能经
编程访问的方法 。 封装和模块的重要性广为人知 。 封装因象黑盒一样
处理对象而使程序结构化更好, 可读性更强 。 考虑一复杂问题, 找到
一个可以声明和描述的部分 。 将其封装进一个对象, 建立一个接口,
一直这样下去, 直到可以声明所有的子问题 。 当一个问题的对象得到
封装, 并确保能正确运行, 就可以从它们之中进行提炼 。
evaluation(评估)
? 一个 Prolog程序的评估就是寻找“解”。寻找解的每一步
都可能成功或失败。
exception handling
(异常处理)
? 异常处理系统的基础部分基于两个内置谓词 errorExit/1
(产生一个例外 ) 和 trap/3 (对某一计算设置异常处理程
序 )。 当 errorExit/1被调用时, 当前活动的异常处理程序
也将得到调用 。 该异常处理程序在其原始文本中执行, 也
就是说在它被设置的地方而不是异常发生的地方执行 。
expressions(表达式)
? 一个表达式是一系列表明一次计算的操作符和操作数 。 通
常一个表达式在运行时间计算得到一个值 。
? (参见:算术表达式 )
external resolution
(外部分解)
? 一个谓词外部分解说明该谓词并不是完全在类内部实现,
但是在一个外部库中实现 。 外部分解只能用于类谓词, 即
对象谓词不能被外部分解 。
fact variables(事实变量)
? 一个事实变量与带有一个参数的单事实相似。然而,在语
法构成上它用作可变变量(即赋值)。一个赋给事实变量
的值应是一个能在编译时计算得来的项。
facts(事实)
? 事实是对象之间的联系 。 在一个事实 likes("John",
"Mary")中, likes是关系的名字, "John"和 "Mary"是元
素 。 (参见:数据库谓词 。 )
facts database
(事实数据库)
? Visual Prolog内部事实数据库由能在运行时从程序中直接加入和除
去的事实构成 。 可以在事实段声明描述内部事实数据库的谓词, 并可
以象普通谓词一样调用这些数据库 。 但和普通谓词不同的是, 可以使
用谓词 assert和 retract在运行时加入数据库事实和除去已有的事实 。
可命名一个事实数据库, 这就同时隐含定义了一个额外的复合论域 。
该论域与事实段名字相同 。
fail(失败)
? Visual Prolog不能满足的一个子目标 。 fail/0和 succeed/0是两个内
部的空变元谓词 ( built-in nullary predicates) 。 fail/0总是失败,
而 succeed/0总是成功, 除此之外这两个谓词没有任何作用 。 谓词
fail/0强使一个谓词失败, 因而总是引起回溯 。
flow pattern(流模式)
? 根据谓词调用中的参数是用作输入 ‘ i' (即已知)或用
作输出 ‘ o '(即未知)形成的模式。
flow variant(流变体)
? 若一个谓词与几个不同的流模式相联系, 相应于该谓词的
程序的一个单独的内部实现程序将为每个流模式而存在 。
这些不同的实现叫作该谓词的流变体 。
formulas(公式)
? 公式代表逻辑声明,如, 数字 7大于数字 3‖。
free variable(自由变量)
? 尚未引用任何值的变量 。 若一个变量的值是自由的, 它可通过合一绑
定到论域的任何值 。 一旦一个变量被绑定, 可通过回溯到绑定以前的
点, 重新使它自由 。 可用谓词 free/1测试该变量是自由的还是被绑定
的 。 (参见:绑定部分 )
function(函数)
? 返回一个值的谓词称为函数。有时,为了强调不是函数,
称不返回值的谓词为普通谓词。
functor(算符)
? 一个复合论域选项的名字。
global(全局的)
? 一个用来允许一个以上的程序模块访问的那些常量, 论域和谓词的限
定词 。 Visual Prolog中惟一的全局实体包括类, 接口, 内部论域,
谓词和常量 。 全局名在任何作用域内都可以访问 。 然而可能存在全局
名被局部名遮蔽的情况 。 全局实体可通过加上一双冒号,:获得 (没有
前置的类/接口名 )。
goal(目标)
? 目标段是程序的入口 。 目标段由一个子句体构成 。 当程序开始时, 它
执行程序目标 。 它是在程序执行 中 Visual Prolog 试图 满足的子目标
的集合 。 当程序目标得到执行时, 程序退出 。
goal tree(目标树)
? 一种可选择的图形表示,可在对程序目标的子目标进行评
估时作出。
head of a list(表头)
? 表的第一个元素。
heap(堆)
? 堆保持比较永久或不太永久的对象。它用来存储插入内部
数据库的事实、符号表、文件缓冲区、图形对象等等。这
些区域在事实撤销、窗口关闭等事件发生后自动释放。
identifiers(标识符)
? ―标识符, 是提供给程序中变量, 论域, 谓词, 常量, 事实和事实变
量的名字 。 标识符名字在拼写和使用时必须和任何关键字区分开来 。
不能使用关键字作为标识符;关键字保留用作特殊用途 。 标识符可通
过在一个变量, 论域, 谓词, 常量, 事实或事实库的声明中指明进行
创建 。 一旦声明, 可在后面的程序代码中引用相关的值 。
identity of objects
(对象的同一性)
? 每一个对象都是唯一的:对象有可变的状态,并且因为该对象的状态
可借助于它们的成员谓词来观测,所以一个对象只与自己是同一的。
也就是说即使两个对象的状态是同样的,对象也不相同,这是因为可
以改变一个对象的状态而不改变另一个对象。我们没有直接的途径访
问一个对象的状态,总是靠引用一个对象来访问对象的状态。
immutable elements
(不可变元素)
? Visual Prolog的类型分为对象类型和值类型 。 我们可用术语值论域
来指定不可改变的元素的论域 。 这里, 我们可以说属于相应接口名论
域的对象具有可变的状态, 而任何其它论域的项都是不可变的 。 所以
实际上, 值类型不是对象类型 。 Prolog中的变量是不可变的;一旦它
们被绑定到一个值, 它们将保留该值, 除非在恢复程序以前状态的过
程中, 经由回溯而释放该变量 。 否则, 一个绑定的变量是不可变的 。
若变量包含一个对象, 那么该对象仍有可变的状态 。 然而, 对变量绑
定的对象而言, 它是不可变的 。
implementations(实现)
? 一个类实现用于提供在类声明中声明的谓词和构造器的定
义,也提供被他的构造对象所支持的任何谓词定义。
infix notation(中缀符)
? 在要执行运算的两个值或表达式之间具有运算符的算术表
达式。
inheritance(继承)
? Visual Prolog代码继承仅发生在类的实现中 。 Visual Prolog有多重
继承 。 可以通过在一个实现的特定继承段提到一个类而实现该类的继
承 。 从中继承的类称为父类或超类 。 子类 ( Child class) 和支类
( sub-class) 对父类而言是一样的, 我们也称子类由父类继承而来 。
一个子类只能通过它的公共接口访问它的父类 。
integral domains(整数论域)
? 整数论域用来表示自然数 。 它们分为有符号数和无符号数两类 。 预定
义的论域整数和无符号数以处理器结构的自然长度表示符号整数和无
符号整数 (即 32位机上为 32位 )。 整数论域也可有不同的表示长度 。
interface name domains
(接口名论域)
? 每个接口的声明都声明了一个与接口名对应的论域。该论
域可在谓词和其它论域的声明中当作任意其他论域使用。
internal fact database
(内部事实数据库)
? Visual Prolog内部事实数据库是由事实组成的, 这些事实可以在运
行时从你的程序中直接加入或除去 。 可在事实段声明描述内部数据库
事实和事实变量的谓词, 象调用普通谓词一样调用这些数据库事实 。
但和普通谓词不同的是, 可以使用谓词 assert和 retract在运行时加
入数据库事实和除去已有的事实 。 你可命名一个事实数据库, 这时就
隐含定义了一个额外的复合论域 。 该论域与事实段的名字相同 。
internal goal(内部目标)
? 在程序的目标段硬性编码的目标 。 这样的目标称之为内部目标 。 因为
它们是程序源文本的一部分且以程序代码进行编译 。 作为对应部分,
一些 Prolog环境支持所谓的外部目标 。 当这些 Prolog环境运行不含内
部目标的程序时, 环境会显示特殊的对话框, 在运行时间可以在这个
对话框中输入一个外部目标 。
keywords(关键字)
? 关键字是保留字 。 不能将其在程序中用作用户定义名 。 Visual
Prolog的关键字有,align,and,anyflow,as,bitsize,class,
clauses,constants,constructors,determ,digits,div,
domains,delegate,end,erroneous,externally,facts,failure,
from,implement,interface,inherits,goal,guards,language,
mod,monitor,multi,nondeterm,open,or,predicates,
procedure,reference,resolve,single,supports,to。
language(语言)
? 关键字 language规范用来告诉编译器使用哪一个调用协议, 而且它
只在向其它语言所编写的例程声明论域的时候才出现 。 调用协议决定
参数等如何传给谓词 。 它也决定连接名如何从谓词名中得到 。 如果省
略调用协议, 则它缺省为 prolog。
last call optimization
(尾部调用优化)
? 是 Visual Prolog 系统内部采取的行动, 以减少规则中尾部递归所占
用的空间和时间资源 。 也称为, 尾部递归优化, 。
link name(连接名)
? 一个连接谓词名是该谓词在定义编译单元之外可引用的名字 。 通常连
接名用于从其他语言调用一个谓词或从其他语言的外部模块调用函数
以声明一个谓词 。 只有类谓词可以有连接名 。 如果连接名没有声明,
那么连接名就从谓词名得到, 而得到名字的方法取决于调用协议 。
? ( 参见调用约定 )
lists(列表)
? 由包含在方括号 [ ]中零个或多个元素的集合组成的项, 集合的元素之
间用逗号隔开 。
? (参见:列表论域 )
literal(文字)
? 不变的程序元素叫做, 文字, 。 文字可分为以下几类:整数, 字符,
浮点数, 字符串, 二进制值和表 。
logical operators(逻辑运算符)
? 由两个或多个部分组成的目标被认为是复合目标, 而复合目标的每一
部分叫子目标 。 用逗号,,, 分隔子目标, 可使用一复合目标以找出
一种解, 要求该解中子目标 A和子目标 B均正确 ( 逻辑与 ) 。 用分号
,;, 分隔子目标, 也可找出一种解, 该解中至少有一个子目标正确
( 逻辑或 ) 。 也就是说, 在 Visual Prolog程序中, 有两个逻辑操作
符,‘,’(与 )和 ‘ ; ’ (或 )在逻辑表达式中组合子目标 。
mode of predicates & facts
(谓词与事实的模式)
? 大多数语言都是确定性的 。 相反, Visual Prolog自然地支持基于不确定性谓
词的不确定性推理 。 确定性监控主要处理程序优化 。 Visual Prolog确定性检
查系统强制声明谓词的下列行为:对于谓词或事实调用
– 谓词可以失败吗?
– 谓词可以成功吗?
– 谓词调用是否设置回溯点 。
? 这些方面的哪一组应用于事实的谓词由谓词或事实的模式决定 。 当声明一个
谓词时, 模式可以省略 。 在执行程序内部 ( 即对于局部谓词 ), 所需的流
( flows) 和模式源自谓词的使用 。 在一个接口或一个类声明 ( 即对于公共谓
词 ) 内部省略谓词模式意味着它是一个过程 。
module(模块)
? 一个 Visual Prolog编译单元, 它具有全局声明, 从而构成项目的一
部分 。
? (参见:编译单元 )
multiple predicate declarations
(多重谓词声明)
? 任何谓词可以有几个声明 ( 对于相同的变元 ), 每一个都对参数有不
同的论域声明 。
mutable elements(可变元素)
? Visual Prolog的类型分为对象类型和值类型 。 我们可用术语值论域
来指定不可改变的元素的论域 。 这里, 我们可以说属于相应接口名论
域的对象具有可变的状态, 而任何其它论域的项都是不可变的 。 所以
实际上, 值类型不是对象类型 。 Prolog中的变量是不可变的;一旦它
们被绑定到一个值, 它们将保留该值, 除非在恢复程序以前状态的过
程中, 经由回溯而释放该变量 。 否则, 一个绑定的变量是不可变的 。
若变量包含一个对象, 那么该对象仍有可变的状态 。 然而, 对变量绑
定的对象而言, 它是不可变的 。
name restrictions(名字限制)
? 以下是加给名字的重要限制,
– 子句段中的符号常量名必须以小写字母开头 。
– 变量名字必须以大写字母或下划线字符 ‘ _’开头 。
– 符号文件名必须以小写字母开头 。
? Visual Prolog编译器不区分大小写, 除非是第一个字符 。
? (参见, 名字, 小写标识符名字 )
names(名字)
? 名字用来表示接口, 类, 符号常量, 论域, 论域算符, 谓词, 事实段,
事实, 事实变量及变量 。 一个名字是一连续的字母, 数字和下划线字
符的序列 。 一名字以一个字母或下划线开头, 后面接零个或多个字母,
数字和下划线符的任意组合, 可长达 250个字符 。 不能在名字中使用
空格, 减号, 星号或斜线 。 Visual Prolog 的关键字是保留字, 不能
用作用户定义的名字 。 Visual Prolog编译器不区分大小写, 除非是
第一个字符 。 (参见, 名字限制,小写标识符名字 )
names belonging to lower-case identifiers
(小写标识符名字)
? 接口, 类, 符号常量, 论域, 论域算符, 谓词, 事实段, 事实, 事实
变量和变量的名字必须是小写标识符 。 小写标识符以一个小写字母开
头, 跟着一系列字母, 数字和下划线 。 不能在这些名字中使用空格,
减号, 星号或斜线 。 名字可长达 250个字符 。 ( 参见, 名字, 名字限
制 )
nondeterm(不确定性模式)
? 缺省状态下,事实的确定性模式为 nondeterm(不确定性)。按照
它们真正的性质,在事实段中的谓词通常是不确定的。因为事实可在
运行期间的任意时刻加入,所以编译器通常必须假设通过回溯找到备
选解是可能的。如果在事实段有一个谓词,其事实不会多于一个,那
么你可以在事实声明中用关键字 determ 开头 (或者在该谓词有且仅
有一个事实的情况下用关键字 single)。
object(对象)
? 一个对象是一套命名的对象成员谓词和一套支持的接口 。 对象通常也
有状态, 但这状态只能通过成员谓词而观测和改变 。 我们说状态封装
在对象内 。
object members and state
(对象成员和状态)
? 所有对象都是由某种具有相同对象成员谓词的类建立的, 但每一对象
都有自己的状态 。 因而, 对象成员谓词实际上是类的一部分, 而对象
状态是对象本身的一部分 。 一个类也包含另一组命名的谓词和一个封
装的状态, 用关键词 ‘ class’对其进行声明, 分别称为类成员和类状
态 。 类成员和类状态存在于每一类基础上, 而对象成员和对象状态存
在于每一对象基础上 。 类成员和对象成员均可访问类的状态 。
object state(对象状态)
? 一个对象的状态作为事实存储在对象中 。 这些事实在类实现的事实段
中进行声明 。 对每一对象而言事实是局部的 (与其他对象实体一样 ),
而在类的所有对象中, 类事实 ( class facts) 是共享的 。
open qualification(开放限定符)
opened scopes(开放作用域)
? 开放限定符可使引用类级的实体更加方便 。 开放段把一作用域的名字
带入另一作用域, 这样无需限定符即可进行引用 。 开放限定符对对象
成员的名字不起作用, 因为它们在任何情况下只能借助于一个对象进
行访问 。 开放段只在它们所在的作用域内起作用 。 举例来说, 在类声
明中的开放段对类的实现就不起作用 。
operator priority
(运算符优先级)
? 在算术表达式中决定运算符运算顺序的层次 。
operators(运算符)
? 在 Visual Prolog中, 我们可使用算术运算符, 关系运算符和逻辑运
算符 。 算术运算符是,+,-,*,/,div,mod。 关系运算符是,>,<,
>=,<=,<>,><,和 =。 逻辑运算符是公式, 它以公式作为参数 。
它们都是左结合的 。 运算符 ‘,’和 ‘ and’是同义的, 运算符 ‘ ; ’ 和
‘ or’也是同义的 。
or(或)
? 逻辑与 ( 即合取 Conjunction) 和逻辑或 ( 即析取 Disjunction)
? 由两个或多个部分组成的目标被认为是复合目标, 而复合目标的每一
部分叫做子目标 。 用逗号,,, 分隔子目标, 可使用复合目标以找出
一种解, 其中子目标 A和子目标 B均正确 ( 逻辑与 ) 。 用分号分隔子
目标, 也可找出一种解,其中至少有一个子目标正确 ( 逻辑或 ) 。
origin interface of a predicate
(谓词原始接口)
? 一个谓词的原始接口是文字声明谓词的接口, 与通过一个支持限定符
间接声明的接口相反 。 (参见, 接口的支持限定符 )
parameters(参数)
? 关系中项和变量名的集合 。
parent class(父类)
? 从中继承的类叫做父类或超类 。 子类和支类 ( sub-class) 对父类而
言是一样的, 我们也称子类由父类继承而来 。 一个子类只能通过它的
公共接口访问它的父类, 即在使用父类上它并没有比其他类更多的特
权 。
predicate domains(谓词论域)
? 在 Visual Prolog中, 可声明和使用谓词论域 。 谓词论域的值是有着
相同, 签名, 的谓词, 即相同的参数和返回类型, 相同的流模式和相
同 ( 或更强 ) 的谓词模式 。
predicate values(谓词值)
? 谓词值是在以下意义上可视为值的谓词,
? 它们可作为参数传递并可从谓词和函数返回 。
? 可存储在事实中 。
? 可保留在变量里 。
? 可作相等性比较 。
? 当然, 与, 无格式, 谓词一样, 谓词值可通过合适的参量调用 。 谓词
值是作为谓词论域的实例声明的 。
predicates(谓词)
? 每一个 Visual Prolog事实或规则都属于某一谓词, 它指定相关的关
系名和关系中相关元素的类型 。 一个关系的符号名叫做谓词名 。 与之
相关的对象叫做参数 。 在事实 likes("Bill","Cindy") 中, 关系 likes
是谓词而对象 "Bill"和 "Cindy"是参数 。
program sections(程序段)
? 可以使用程序段来声明和定义接口, 类和类实现中的程序实体 。 通常
可使用:常量, 论域, 谓词, 构造器, 事实, 子句和条件段 。 并非所
有的段都可出现在各种作用域中, 详情可参考接口, 类定义, 类实现
和条件编译的描述 。
punctuation marks(标点符号)
? Visual Prolog中的标点符号对编译器而言有着语法和语义上的意义,
但它们本身并不规定产生值的运算 。 一些标点符号, 无论单独还是组
合, 都 可 以 是 Visual Prolog 的 运 算 符 。 标 点 符 号
有,; !,,# [ ] ( ),-,,,。
real(实数)
? 实数论域用于表示浮点数 。 内部实数论域精度由处理器体系结构决定 。
所有的算术, 比较和赋值运算都可用于实数论域的值 。 允许的数值范
围是 1*10-307 至 1*10+308,即 (1e-307至 1e+308)。 必要时
整数论域中的值自动转换为实数论域 。
reference items and domains
(引用项和论域)
? 如果一个未被绑定的变量被从一个子目标传至另一个子目标, 包含变
量最终可能绑定值的论域必须声明为引用论域 。 这样一个论域的元素
是引用项 。
relation(关系)
? 一个名字描述的方式, 以这种方式将对象集合 ( 或多个对象和引用对
象的变量 ) 联系到一起 。 关系的符号名字作谓词名 。 与之相关的对象
叫做参量;在事实 likes("Bill","Cindy") 中, 关系 likes是谓词而对
象 "Bill"和 "Cindy"是参数 。
repeat,.,fail combination
(重复,..失败组合)
? 一种可通过使用 Visual Prolog回溯机制以避免尾部递归
的技术 。
resolve qualification(归结限定)
? 名字的使用在其作用域内必须清楚 。 若一名字表示谓词, 则该谓词参
数的数目和类型必须清楚 。 与调用谓词有关的歧义性可通过使用限定
名避免 。 为了消除类的歧义, 类应提供谓词的实现, 该谓词来自我们
所使用的一个归结段的多重继承 。 一个归结限定用于归结来自指定源
程序的实现 。
return values(返回值)
? 有返回值的谓词叫做函数 。 为了定义谓词返回一个值, 应该在谓词声
明时的参数列表括号后加上, ->‖标记和返回值的论域 。 在子句定义
中, 返回值名字 ( 用=号为前缀 ) 应在子句头之后和,,- ‖标记前直
接指明 。
root and universal types
(根类型和通用类型)
? Visual Prolog使用一些内部类型,称之为根类型和通用类型。有通
用类型就意味着有包含着值的任何类型。举例来说,一个数字文字,
如 1并没有任何特定类型,它可用作含有 1的任何类型的值,包括实数。
算术运算对其操作数要求非常宽松。可以说算术操作数以根类型作为
参数。整数根类型是任何整数类型的超类型。因此,任何整数类型可
转换为整数根类型,而且,既然算术操作为根类型存在,这意味着它
们中任何一种都能作用于整数论域。
rule(规则)
? 在事实和子目标列表之间的关系, 它必须满足事实为真 。
satisfying a sub-goal
(满意子目标)
? Visual Prolog为任何未绑定变量选值 ( 如果可以 ) 的过程 。 在这一
过程中, 根据相应谓词给定的子句, 子目标为真 。
scope of constructors
(构造器的作用域)
? 构造器属于这样一个作用域, 在该作用域中可产生构造器段 ( 见类声
明和类实现 ) 。
scope shadowing
(作用域遮蔽)
? 在当前作用域内的声明遮蔽来自其他作用域的名字 (除非使用显式限
定符 )。
scoping & visibility
(作用域与可见性)
? Visual Prolog的名字只能在程序的某些作用域内使用 。 这一区域叫做名字的作用域 。 一个接口定
义, 一个类声明和一个类实现都是作用域 。 当类的构造器被调用和当该作用域的局部变量被初始化
时, 作用域决定了名字的可见性 。 作用域也决定了一个不表示全局作用域元素名字的, 寿命, 。
(参见:构造器和终结 。 ) 共有 4种作用域,
– 局部 Local(私有 )作用域 。 一个在类实现中声明的名字只能在该类的实现中访问 。 这些名字有
在实现中声明的论域, 事实, 谓词, 常量和子句变量 。
– 类 Class作 用域 。 类 成员名 有类 作用 域, 类 成员 可通 过类 名限定 进行 访问, 例如
className::ClassScopeName。
– 对象 Object作用域 。 对象成员名有对象作用域 。 它们仅能在对象存在时被访问 。 对象成员可
仅 通 过 引用 ( 在类 实 现内 它 被隐 含 ) 一 个 经限 定 的对 象 标识 符 进行 访 问, 例如
objectID:ObjectScopeName。
– 全局 Global作用域 。 接口名和类名有全局作用域 。 全局作用域限定符,:可用在这些名字前 。 预
定义的论域 ( 字符, 字符串, 符号, 整数, 无符号数, 实数, 二进制数, 指针, 布尔数, 事实
数据库 ), 常数和谓词也可以是全局的, 它们也可以用,,:‖进行限制 。
sections(段)
? 可以使用程序段来声明和定义接口, 类和类实现中的程序实体 。 通常
可使用:常量, 论域, 谓词, 构造器, 事实, 子句和条件段 。 并非所
有的段都可出现在各种作用域中, 详情可参考接口, 类声明, 类实现
和条件编译的描述 。
single alternate compound domains
(单选复合论域)
? 若一复合论域由可选算符组成, 则在底部表示层它被视为结构 ( 不同
与表示可选数字的第一个元素的联合 ) 并有表达式, 该表达式是与 C
语言中的适当结构二进制兼容的 。
stack(堆栈)
? Visual Prolog将参数传递至被调用的谓词使用的内存部
分。
stand-alone programs
(独立程序)
? 能脱离 Prolog系统运行于某一操作系统的程序 。 Visual Prolog可以
创建独立运行的程序 。
standard ( or built-in) domains
(标准论域或内部论域)
? Visual Prolog包含嵌入式隐藏类, 它对内部常量, 论域和谓词提供
声明和实现 。 每一编译单元隐含着这一嵌入式隐藏类的声明, 但实际
上, 这样一个类有着特殊的内部惟一的名字 。 可在内部项的名字前使
用,,:‖。 内部论域有:字符, 字符串, 符号, 整型, 无符号整型,
实型, 二进制, 指针, 布尔, 事实库 。
state of an object(对象声明)
? 一个对象的声明作为事实存在对象中 。 这些事实在类实现的事实段中
声明 。 对每一对象而言事实是局部的 (像其他对象实体一样 ),而在所
有类的对象中类事实是共享的 。
stronger predicate mode
(强谓词模式)
? 谓词模式可用如下的集描述,
? erroneous = ;
? failure = Fail;
? procedure = Succeed;
? determ = Fail,Succeed;
? multi = Succeed,BacktrakPoint;
? nondeterm = Fail,Succeed,BacktrackPoint,
? 若 Fail 在集中, 表示该谓词可以失败 。 若 Succeed在集中, 表示该谓词可以
成功 。 若 BacktrackPoint 在集中, 表示谓词可返回一个活动的回溯点 。 如
果一个集, 比方说 failure,是另外一个集的子集, 如 nondeterm,则我们说
这个模式比另一个强, 即 failure比 nondeterm强 。
sub-class(支类)
? 从称之为父类或超类的类继承而来的类 。 子类和支类 ( sub-class)
对父类而言是一样的, 我们也称子类由父类继承而来 。 一个子类只能
通过它的公共接口访问它的父类, 即在使用父类上它并没有比其他类
更多的特权 。
sub-component(子成分)
? 复合元素中的子元素之一 。 一个复合元素是一由其他子元素 ( 称作子
成分 ) 和描述名 ( 算符 ) 集合组成的单一元素 。 子成分用圆括号括起
来, 用逗号隔开 。 算符写在左括号前 。 例如以下复合项由算符 author
和三个子成分组成,author("Emily","Bronte",1818)。
sub-element(子元素)
? 复合元素中的子元素之一 ( 复合论域的 ) 。
sub-goal(子目标)
? 一个关系 ( relation), 可能涉及元素或变量, Visual Prolog必须试
着满足 。
succeed(成功)
? Visual Prolog不能满足的一个子目标 。 fail/0 和 succeed/0是两个
内部空变元谓词 。 fail/0总是失败而 succeed/0总是成功, 除此之
外这两个谓词没有任何作用 。 谓词 fail/0强使谓词失败, 因而总是引
起回溯 。
super-class(超类)
? 从中继承的类叫做父类或超类 。 子类和支类 ( sub-class) 对父类而
言是一样的, 我们也称子类由父类继承而来 。 一个子类只能通过它的
公共接口访问它的父类, 即在使用父类上它并没有比其他类更多的特
权 。
supports qualification for interfaces
(接口的支持限定)
? 接口被构造在支持层次上, 该结构是以接口对象为根的半格 ( semi-
lattice)。 如果一个对象有接口表示的类型, 那么它也有任何支持接
口的类型 。 因此, 支持层次也是一种类型层次 。 也可以说对象支持接
口 。 如果接口被命名为 X,那么我们说对象是一个 X,或 X对象 。 支持
限定只能用于接口定义和类实现 。 支持限定用于两个目的,
? 指明接口 A扩展为接口 B,因而类型 A是类型 B的子类型 。
? 声明 ( 在实现中 ) 某一类的对象比指定为构造类型的对象, 私下,
有更多的对象类型 。
? 支持是一种传递关系:若接口 A支持接口 B,而 B支持 C,则 A也支
持 C。
tail of a list(表尾)
? 当给定表的第一个元素 ( 和分隔逗号 ) 被删除时, 剩下的
表 。
tail recursion optimization
(尾部递归优化)
? Visual Prolog系统内部采取的行动, 以减少规则中尾部递归所占用
的空间和时间资源 。 也称为, 尾部递归优化, 。
terms(项)
? 严格的讲, 项是 Visual Prolog的实体 。 标准类型论域的一个元素,
一个表, 一个变量或一个复合项, 即一个跟着一系列项 ( 选择性参数 )
的算符 。 项用圆括号括起, 逗号隔开 。
This variable( This变量)
? 一个对象谓词总是调用一个对象 。 该对象带有对象事实并包含在对象
谓词的实现之中 。 对象谓词可访问该隐含对象 。 称该对象为, This‖。
在每个对象谓词的每一子句中, 变量 This隐含地定义并绑定到, This‖
对象 。 在一个对象成员谓词的一个子句中, 其他对象成员谓词可以直
接调用, 因为对该操作而言,, This‖是隐含包含的 。 超类的成员也
可以直接调用, 只要调用哪一种方法 (参见, 作用域与可见性 )是明确
的 。 同样, 对象事实 ( 存储在, This‖中 ) 也可被访问 。
trail(跟踪)
? Visual Prolog用来记录引用变量的绑定和未绑定情况的
内存部分 。
type system(类型系统)
? 使关系中所有对象或在关系中用作参数的所有变量被强制属于一个论
域的方法, 这个论域与那些用在相关谓词声明中的论域相对应 。
Unicode(统一的字符编码)
? Visual Prolog使用 Unicode编码的, 宽 ( 2字节 ) 字符, 。 Unicode
是一种将所有字符视为固定的 2字节的软件编码方法 。 这一方法用作
ANSI字符编码方法的可选方法, 由于 ANSI编码方法仅用一个字节表
示字符, 因此只能表示 256个字符 。 因为 Unicode可以表示 65,000
多个字符, 所以它给许多字符不能被 ANSI编码法表示的语言提供了
表示方法 。 Unicode不需要使用代码页, 而 ANSI使用代码页为有限
的语言提供编码, Unicode是一种在双字节字符集 (DBCS)基础上做
出的改进方法, DBCS方法混合使用 8位和 16位字符, 并仍需要代码
页 。, 宽字符, 是使用多种语言的两字节的代码 。 当今计算世界使用
的大部分字符, 包括技术符号和特殊印刷符号, 可根据 Unicode规范
被表示为宽字符 。 使用宽字符简化了带有国际字符集的编程 。
unification(合一)
? Visual Prolog为了满足一个子目标而将该子目标与事实和规则左部
相匹配, 或者确定需要评估原始子目标的一个或多个子目标的过程 。
当一个谓词被调用时, 调用参数与每一子句的头部的项合一 。 合一是
绑定变量的过程, 在这种情况下两个项变得相等, 进行尽可能少的绑
定 (即为进一步绑定留下尽可能多的自由项 )。
universal and root types
(通用类型和根类型)
? Visual Prolog使用一些内部类型, 称之为根类型和通用类型 。 有通
用类型就意味着有包含着值的任何类型 。 举例来说, 一个文字如 1并
没有任何特定类型, 它可用作含有 1的任何类型的值, 包括实数 。 算
术操作对其操作数要求非常宽松 。 可以说算术操作数以根类型作为参
数 。 整数根类型是任何整数类型的超类型 。 因此, 任何整数类型可转
换为整数根类型, 而且, 既然算术操作对任何根类型都存在, 这意味
着它们中任何一种都能作用于整数论域 。
variable binding(变量绑定)
? 变量的状态 ——自由或绑定 。
variables(变量)
? 变量是以大写字母或下划线( _)开头的名字,后面有任意个字母
(大写或小写)、数字或下划线符。
? 单个下划线字符表示匿名变量。当变量绑定的值不重要时可使用匿名
变量。一个以下划线开头的变量如果只在子句中使用一次,也被
Visual Prolog编译器认为是匿名变量。
? Prolog中的变量是局部的,不是全局的。这就是说,如果两条子句各
含有名为 X的变量,则这两个 X就是不同的变量。若在合一中它们恰
好被放到一起,就可以相互绑定,但通常它们并不相互影响。
? Prolog中的变量是不变的,一旦它们被绑定到一个值,它们就保持
该值,除非通过回溯使它们重新自由。
附录 术语表
? 解释完毕。