知识交换标准
(Knowledge Interchange Format,KIF)
美国国家标准草案 NCITS.T2/98-004
1.范围
本草案描述知识交换格式(KIF)的语法和语义,以及KIF用“中缀”形式造成的语义变化。
知识交换标准是用于在不同的计算机系统间(不同的程序员,不同的时间,不同的语言等)进行知识交换的语言。
KIF并不试图成为直接为程序员使用的基本语言(虽然它可以作为这样的语言)。不论应用程序采用什么形式(如Prolog,概念图,自然语言等),都可以采用它在不同的计算机系统间交互。
KIF同时也不试图成为计算机系统内部或者相近的一组计算机系统内的知识表达方式(虽然它的语言可以被用于此目的)。典型的情况是,当计算机从KIF知识库读入知识后,这些知识被转换为其内部格式(特殊的指针结构,数组等),所有的计算都在这种内部格式的基础上进行。当一个计算机系统试图与另一个计算机系统交互时,它们被转换为KIF格式。
KIF的基本目的可以近似地看为脚本。脚本通常被格式化的文本和图形系统是用来完成队要打印稳当的信息交换。虽然它并不如特定的文档表达方式有效,也不如特定的所见即所得显示直观,但脚本是程序员可以理解的,独立于特定的设备和格式的有力的表达工具。KIF同样没有特定的知识表达方式有效,也不如特定的现实方式直观(当进行清单打印时),但它同样是程序员可以理解的,独立于特定的知识开发平台的有力工具。
KIF具有以下几个基本特性:
1. 其语言是符合公开的语义规范的。因此,并不需要特定的解释器来解释其表达式,就可以理解其基本含义。在这方面,KIF与那些基于特定解释器的语言(如Prolog和Emycin)是根本不同的。
2. 其语言是逻辑兼容的。它提供了基本的逻辑语句的表达式。在这方面,它与关系数据库(如SQL)和逻辑编程语言(如Prolog)是不同的。
3. 语言提供了对知识的知识的表达。这使使用者可以直接对知识表达进行决策,也可以不必改变语言就可以引入新的知识表达结构。
除了上述基本特性外,KIF还尽量满足以下几个附加特性:
1. 可应用性。虽然KIF并不试图成为程序内部的表达与交流语言,但它完全可用于此目的。
2. 可阅读性。虽然KIF并不试图成为与人交互的基本语言,其可阅读性使它能够方便地用来作为语义上的表达语言,作为公开的样例知识库,进行知识库的转换等。
2.语法
2.1.介绍
象其他的计算机语言一样,KIF的语法可以描述为三个层次。首先,有基本的语言字符集,字符可以组合成词汇,最后,词汇可以组合称为合法的表达式。
本章中,我们采用改进BNF符号来表达KIF语法。所有的非端点和BNF标点都采用黑体,而一般的KIF字符则不加黑。符号{x1,…,xn}表示一组端点x1,…,xn;[nonterminal]意味着nonterminal的零个或一个实例;nonterminal*意味着零个以上;nonterminal+意味着一个以上;nonterminal^n意味着n个实例;nonterminal1-nonterminal2意味着除了nonterminal2以外的所有nonterminal1的成员;int(n)表示整数n;space,tab,return,linefeed和page则表示ascii码的32,9,13,10和12;非端点字符character表示所有的128个ascii字符;empty表示空字符串。
2.2.字符集
KIF字符集包括大写字符,小写字符,数字,希腊字符,特殊字符,空格和其它字符。
upper::=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
lower::=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
digit::=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
alpha::=! | $ | % | & | * | + | - | . | / | < | = | > | ? | @ | _ | ~
special::=” | # | ’ | ( | ) | , | / | ^ | `
white::=space | tab | return | linefeed | page
常规的字符为大写字符,小写字符,数字和希腊字符。
normal::=upper | lower | digit | alpha
2.3.词汇
将字符转换为词汇的过程称为词汇分析。该过程的输入为字符流,输出为词汇流。
词汇分析器的功能是循环的。它从输入串中顺序地读入字符,直到当前字符与前面的字符组成合法的词汇,此时将前面的字符组成的词汇输出,然后,它又开始一个新的处理过程。空白字符引起此法分析过程的暂停并且空白字符被遗弃。
KIF中有五类词汇—特殊词汇,单词,字符参考,字符串,字符块。
每个特殊字符形成它自己的词汇,除了采用如下的转义语法外,它不能与其它字符一起形成更复杂的词汇。
单词是由(1)常规字符或者(2)由转义字符/引导的其它字符构成的连续字符组成。
word::=normal | word normal | word/character
在单词中,可以通过在/的前面采用/引导来表示/字符本身,即两个连续的/表示一个/字符。例如,字符串A//’B是由A,/,’和B四个字符构成的单词。
除了跟随在/后面的字符外,单词的此法分析是大小写无关的。输出的词汇都被转换为大写字符来构成单词。如单词a/bc和A/bC是相同的,但与ABC不同。
字符参考由#,/和其它任何字符构成。字符参考使我们可以将字符组作为可以参照到其它对象的字符组,而非单个的字符使用。
charref::=#/character
字符串是包含在引号中的字符组。转义字符/用来使字符串中包含引号和转义字符本身。
string::=”quotable”
quotable :: = empty | quotable strchar | quotable/character
strchar ::= character-{”,/}
有时希望能够使用一组任意的字节或者字符而不是用转义字符,即编码图像、音频或者视频等特殊格式。字节块使用特定的前缀表明气候多少个字符组成这样的块来完成这样的用途。字符块由#及紧随的十进制非负整数n,字符Q或者q,以及跟随的n个任意字符组成。
block ::= # int(n) q character^n | # int(n) Q character^n
为了程序分析的方便,将单词进一步分类为变量、常量和运算符是有用的。
变量是第一个字符为?或者@的单词。以?开头的变量称为独立变量,以@开头的变量称为顺序变量。
variable ::= indvar | seqvar
indvar ::= ?word
seqvar ::= @word
运算符用来形成各种类型的复杂表达式。KIF有三种类型的运算符,术语运算符,句运算符和定义运算符。术语运算符用于形成复杂术语,句运算符用于形成复杂句子,而定义运算符用于形成定义。
operator ::= termop | sentop | defop
termop ::= value | listof | quot | if
sentop ::= holds | = | /= | not | and | or | => | <= | <=> | forall | exists
defop ::= defobject | defunction | defrelation | deflogical | := | :-> | :<= | :=>
所有其它的单词称为常量。
constant ::= word-variable-operator
从语义上讲,KIF有四类常量,对象常量,功能常量,关系常量和逻辑常量。对象常量用来表示对象个体,功能常量表示这些对象的功能,关系常量表示关系,逻辑常量关于现实的条件,具有真和假值。KIF是一种常规的逻辑语言,四种类型的常量间没有句法上的区别,在能够使用常量的地方可以使用任何类别的常量,四种类别仅仅是语义上的区分。
2.4.表达式
表达式依据本节描述的规范由词汇构成。又三类相互没有关联的表达式:术语、句子和定义。术语用来表述需要描述的现实对象;句子表述关于现实的事实;定义用于定义常量。句子和定义被称为形态(forms)。知识库就是一组有限的形态。
KIF有九类术语--独立变量,常量,字符参考,字符串,字符块,功能术语,列表术语,引用,逻辑术语。独立变量,常量,字符参考,字符串,字符块已经在前面讨论过。
term ::= indvar | constant | charref | string | block | funterm | listterm | quoterm | logterm
一个隐含的功能术语由常量和任意数量的论据术语组成,由可选的循序变量结束,并包围在配对的圆括号中。注意论据术语的数量没有句法上的约束,KIF中的约束数量由语义确定。
funterm ::= (constant term* [seqvar])
一个显式的功能术语由value运算符和一个或者多个论据术语组成,由可选的顺序变量结束并被圆括号包围。
funterm ::= (value term* [seqvar])
一个列表术语由listof运算符和有限个列表术语组成,由可选的循序变量结束并被圆括号包围。
listterm ::= (listof term* [seqvar])
引用包括quote运算符和一个列表表达式。列表表达式可以是一个原子或者是一个由圆括弧括起来的列表表达式。原子可以是单词、字符参考、字符串或者字符块。注意在KIF中不将列表表达式用引号引起来是合法的。
quoterm ::= (quote listexpr) | ’listexpr
listexpr ::= atom | (listexpr*)
atom ::= word | charref | string | block
逻辑术语包括if和cond运算符。if运算符允许对一个或者多个条件进行测试,最后的可选术语用于当其它条件都不成立时的隐含描述。cond运算符具有类似的功能,只不过只对成对的由圆括号包围的句子和术语进行操作,并且没有最后的隐含值。
logterm ::= (if logpair+ [term])
logpair ::= sentence term
logterm ::= (cond logitem*)
logitem ::= (sentence term)
下面的BNF定义了KIF中合法的句子。共有六种类型的句子,前面我们已经提到了逻辑常量。
sentence ::= constant | equation | inequality | relsent | logsent |quantsent
等式由=号和两个术语组成,不等式由/=号和两个术语组成。
equation ::= (= term term)
inequality ::= (/= term term)
隐含的关系句子由一个常量和任意数量的论据术语组成,并由可选的顺序变量结束。当使用功能术语时,关系句子的术语数量没有语义上的限制。
relsent ::= (constant term* [seqvar])
显式关系句子由holds运算符和一个或者多个论据术语组成,由可选的循序变量结束并用圆括号括起来。
relsent ::= (holds term* [seqvar])
值得注意的是隐含关系句子和隐含功能术语的语法、意义和区别都是相同的。幸运的是,每个这也的表达式的内容决定了它的类型(一种情况作为嵌入的术语,另一种情况作为一些句子操作符的顶层句子和论据),所以,这样轻微的含混并不会产生什么问题。
逻辑句子的语法依赖于逻辑运算符。包含not运算符的句子被称为一个非。包含and运算符的句子被称为一个合取,而操作数被称为合取项。包含or运算符的句子被称为一个析取,而操作数称为析取项。包含=>操作符的句子成为蕴含式,除最后一个操作数的其它所有操作数称为前件,最后一个操作数称为后件。包含<=运算符的句子称为反向蕴含,第一个操作数称为后件,其余操作数称为前件。包含ó运算符的句子称为等式。
logsent ::= (not sentence) | (or sentence*) | (and sentence*)
| (=> sentence sentence*) | (<= sentence* sentence) | (<=> sentence sentence)
有两类限定句子。一个全体的限定句子由全称运算符forall引导,一个存在限定句子由存在运算符exists引导。它们的第一个操作数是一个变量描述列表。变量描述可以是变量,也可以是一个变量列表和一个限定变量描述领域的术语。
quantsent ::= (forall (varspec+) sentence) | (exists (varspec+) sentence)
varspec ::= variable | (variable constant)
应该注意,根据规则,可以采用自由变量,也就是没有包含在任何量词范围内的变量,来书写句子。自由变量的意义依据于句子的用法。当我们断言一个具有自由变量的句子为真时,实际上就是说该句子对自由变量的所有值为真,即变量具有全称限定。当我们问一个具有自由变量的句子是否为真时,实际上就是说该变量是否存在任何值使句子为真,即变量具有存在限定。
下面的BNF定义了一组KIF定义。有三类定义—无限制的、完全的和部分的。在每一类内,存在与常量类别对应的四种情况。对象常量由defobject操作符定义,功能常量由deffunction操作符定义,关系常量由defrelation操作符定义,逻辑常量由deflogical操作符定义。
definition ::= unrestricted | complete | partial
unrestricted ::= (defobject constant [string] sentence*) |
(deffunction constant [string] sentence*) |
(defrelation constant [string] sentence*) |
(deflogical constant [string] sentence*)
complete ::= (defobject constant [string] := term) |
(deffunction constant (indvar* [seqvar]) [string] := term) |
(defrelation constant (indvar* [seqvar]) [string] := sentence) |
(deflogical constant [string] := sentence)
partial ::= (defobject constant [string] :-> indvar :<= sentence) |
(defobject constant [string] :-> indvar :=>sentence) |
(deffunction constant (indvar* [seqvar]) [string] :-> indvar :<= sentence) |
(deffunction constant (indvar* [seqvar]) [string] :-> indvar :=>sentence) |
(defrelation constant (indvar* [seqvar]) [string] :<= sentence) |
(defrelation constant (indvar* [seqvar]) [string] :=> sentence) |
(deflogical constant [string] :<= sentence) |
(deflogical constant [string] :=> sentence)
在KIF中,一个形态也是一个句子或者定义。
form ::= sentence | definition
必须注意,定义是顶层结构。当定义包含句子时,句子不再是句子本身,因此,它不能作为句子或者其它定义的组成要素(除非它被包含在括号中)。
知识库是一组有限的形态。必须记住的是,知识库是一组句子,而不是一个句子,因此,知识库内的其它形态是不重要的。通过排序句子可能会对推理操作带来启发性的值,但是,这种知识交换的隐含措施存在于KIF定义外。