用于弧上测试的谓词很多,例如X-AGREE代表着DET-N-AGREE,SUBJ-V-AGREE等一组用来检查两个表达式之间某种一致关系的谓词。x-START是另一组所谓"向前看谓词",通常用于JUMP和PUSH弧。例如,IMP-START用在起始状态为S的一条外射的JUMP弧上,以便测试输入句子的开头有没有一个无时态动词;Q-START用来检查句子是否以一个疑问词作为开头。PP-START用在一条(PUSH PP/…)的弧上,以便测试下一个词是否为介词。此外,LISP语言的布尔函数AND,OR,NOT和EQUAL等也可以作为测试的谓词来使用;NIL是一个LISP常量,表示测试失败,通常用采作为谓词失败时的回送值;T是另一个LISP常量,意思为真。当T作为<test>出现在-条弧上的时候,表示这条弧的测试条件自动得到满足。但是在LISP中,任何一个非NIL的值都可以用来表示布尔值"真",所以任何函数都有可能被当作谓词来使用。例如,(GETR SUBJ)这个<form>不仅可以用来提取寄存器SUBJ的内容,而且可以当作谓词来使用,后者测试寄存器SUBJ是否曾经被赋值。 下面我们通过一个名词短语(NP)的ATN语法来具体解释语法的描述。NP的转移网络如图9.14所示:
以下是用LISP形式给出的这部ATN语法的细节。在以下的语法描述中,转移网络上的每个状态都用一张表来表示,它相当于BNF定义中的<arc-set>,表的第一个元素是该状态的名字,表的其他元素分别对应于该状态的每-条外射弧。描述中的注释用%号后面的中文给出。 (NP/ (CAT ART T %T是一个谓词,它总为真,% (SETR ART (BUILDQ((ART*)))) (TO NP/ART)) (JUMP NP/ART T)) (NP/ART (CAT QUANT T (SETR QUANT (BUIIDQ ((QUANT *)))) (TO NP/QUANT)) (JUMP NP/QUANT T)) (NP/QUANT (CAT ADJ T (ADDR ADJS (BUILDQ (@ (ADJ) # (*)) (GETF DEGREE))) %DEGREE是形容词的比较级特征,如当前词为"biggest",则记入寄存器ADJS的结构为(ADJ SUPERLATIVE BIG),如当前词为"big",就记入(ADJ BIG)。% (TO NP/QUANT)) (JUMP NP/ADJ T)) (NP/ADJ (CAT N T (SETR N *) (SETR NU (GETF NUMBER)) (TO NP/N)) (CAT N T (ADDL ADJS(BUILDQ(ADJ (NP(N*) (NU#))) (GETF NUMBER))) %在由"名词-名词"组成的名词短语中,把前-名词看作是后-名词的定语,所以把有关它的信息也存储在寄存器ADJS中。 % (TO NP/ADJ))) (NP/N (PUSH PP/ (PP-START) (ADDL NMODS *) %这个动作要求把下一层子网络PP/的回送值加到本层寄存器NMODS内容的前头。% (TO NP/N)) (POP(BUILDQ(@(NP)+++(N+))((NU+))+) ART QUANT ADJS N NU NMODS) (DET-N-AGREE ART NU))) %谓词DET-N-AGREE用来测试ART和NU两个寄存器之间 的一致关系,以便排除象"a books","an table"那样的不合法搭配。 % (PP/ (CAT PREP T (SETR PREP *) (TO PP/PREP))) (PP/PREP (FUSH NP/(NP-START) %如果下一个词不能作为一个NP的头,则谓词NP-START失败。% (SETR:NP *) %这个动作要求用下一层子网络NP/的回送值来设置本层寄存器NP。% (TO PP%NP))) (PP%NP (POP(BUILDQ(PP(PREP十)十)PREP NP)T)) 这部名词短语的ATN语法可以用来生成或接受如下的短语: the new red law books each beautiful picture in the recent exibit men with wives in Professional careers the tallest boy in a gorup of students. |