首先,分析转换步骤。对于任何逻辑形式表达式E,在数据库查询语言中E的转换将表示成T(E)。表达式的转换随结构的不同而有所变化。例如,像(NAME c1 "Chicago")这样的表达式可以转换成合适的数据库常量,在这种情况下就是CHI。但除此之外,符号c1必须和称为符号表的结构中的常量CHI一起保存。这样,如果在逻辑形式中的其他部分再发现c1,就可以用值CHI来替换它。
某些逻辑形式关系可以直接转换成数据库关系,而其他关系会转换成更复杂的表达式。例如,数据库中没有用到逻辑形式关系DEST;相反,是将航班的目的地表示成ATIME关系,其中既包含航班目的地,也包含到达时间。因此,逻辑形式关系(DEST f1(NAMEc1“Chicago”))(其中f1已经和变量?f关联在一起)被转换成数据库关系:
(ATIME ?f CHI ?t)
因为在DEST关系中没有包括时间信息,所以在转换过程中将其解释为一个不受约束的变量。一般来说,逻辑表达式中的每一个关系的转换都必须进行指定。
程序语义学方法在解释逻辑连词和量词的时候更有趣,这两种词在关系数据库中很显然没有对应的结构。逻辑运算符可解释成如下形式:
合取:(&R1,...,Ra)——转换成形式为(CHECK-ALL-TRUE T(R1),..…,T(Rn))的一个程序。在执行程序时,依次查询每个T(Ri),确认为真,并将变量的约束传递给后面的查询。如果存在一组变量约束,用其查询每个T(Ri)都为真,那么该程序成功;否则失败。
析取:(OR R1,.….,Ra)——转换成形式为(FIND-ONE-TRUE T(R1),..…,T(Rn))的一个程序。在执行时,依次查询每个T(Ri),直到其中一个Ri为真,这样该程序成功;如果没有Ri为真,该程序失败。
否定过程对数据库中的所有关系做了一个封闭世界假设,并使用失败证明(proof by failure):
(NOT R)——可转换成形式为(UNLESS T(R))的一个程序。只有查询T(R)失败了,该程序才成功。
最复杂的转换常常与量词有关。每个量词都转换成对数据库进行适当操作的程序。由于数据库语言的限制,通常只支持复数量词的个体性解读。这里,分析问答系统中比较重要的三个量词:THE, EACH和WH。
(THE x:Rx Px)——转换为程序(FIND-THE ?x T(R?x)T(P?x))。首先,进行一次查询以找到所有满足T(Rx)的?x,也就是说(Retrieve?x T(Rgx))。如果只找到一个答案,就用该答案替换整个表达式中的?x,并执行T(P2)以提供整个表达式的答案。如果查询T(R,),但没找到符合条件的对象,则与假设存在冲突,该冲突可由问答系统以一种特殊的方式进行处理,比如,通知用户没有这种对象。如果找到多个答案,系统的设计者必须决定哪一个才是最佳答案。一些系统能处理这种情境,并对每个值执行T(P,);而其他系统将这种情况看成失败。
(EACHx: RxPx)——转换为程序(TTERATE?x T(Rx)T(Px)),也是先执行一次查询以找出所有满足T(R?x)的?x。然后,对每个找到的值重复执行T(P?x),只有所有的查询都成功,该程序才成功。
(WH x: RxPx)——转换为程序(PRINT-ALL ?x T(Rx)T(Px)),查找所有满足Rx和Px的转换的对象,即(Retrieve?x T(Rx)T(Px)),然后打印结果。确定打印答案的最佳格式,尤其是确定是否还要提供附加信息,这是一个很复杂的问题。这里,假定只是简单地打印找到的答案。
这里介绍的方法足以解释一些使用了图1中的数据库的例子。查询“Which flight to Chicago leaves at 4PM?”的逻辑形式为(经过辖域指定之后):
(WH f1 : (& (FLIGHT f1) (DEST f1 (NAME c1 "Chicago")))
(LEAVE l1 (NAME t1 “4PM”)))