历史学家知识工程/基础复合元素
到目前为止,我们一直很高兴地混淆了一个概念,现在我们需要把它分开。当我们写ConstantineTheGreat
时,我们当然不是在写一个实体;实体君士坦丁大帝已经不在我们之中,并且不能通过写作带回来。相反,我们一直在操作一个术语,即具有唯一字符字符串序列 "ConstantineTheGreat" 的术语,它应该指的是君士坦丁大帝.
这并不是吹毛求疵,因为一旦有了术语,就会很明显,多个术语实际上可以指代同一个实体。(这也给了我们一个机会展示等价关系的实际应用!)
;; some examples (the first is a classic) equals(MorningStar,EveningStar) equals(FirstWifeOfHenryVIII,CathrineOfArragon)
有时一个实体可以用另一个实体来定义。事实上,如果我们看一下术语介绍中的第二个例子,从术语的名称中可以很清楚地看出这个术语是根据另一个术语来定义的
equals(FirstWifeOfHenryVIII,CathrineOfArragon)
在知识工程中,这种情况通过一个函数来表达。函数是一个复合术语,它用一个或多个其他术语(包括自指术语,如字符字符串和数字)来表示一个实体。例如,我们可以将上面的例子改写如下
equals(NthWifeOfFn(HenryVIII,1),CathrineOfArragon)
注意附加Fn
并大写表达式的符号约定。这种方法的优点有很多
- 现在,我们已经捕获了函数中表示的附加信息(即序数位置),而不是偷偷地隐藏在简单术语的名称中。这很好,因为我们用于知识表示的程序在从名称中获取信息方面面临挑战,但它们在处理参数方面却做得很好!
- 现在我们可以输入自指术语(这将使我们能够撤消我们之前进行的一点欺骗)
;; typing dimensionless scalars MeterFn(272) ;; or tying them to a convention YearFn(272,CE) ;; we can now do a more proper rendition of old Constantine yearOfBirth(ConstantineTheGreat,YearFn(272,CE))
- 考虑使用函数项的替代方案;如果你对272本身既表示距离又表示年份感到不满意,那么你必须为它们中的每一个创建简单的术语
;; a pointless exercise ..., TheDistanceOf271Meters, TheDistanceOf272Meters, TheDistanceOf273Meters, ... ..., TheYear271CE, TheYear272CE, TheYear273CE ...
然而,并非所有表示语言都支持此功能,原因如下:灵活性的强大功能是以语言中现在有大量术语为代价的。这会给底层推理系统带来问题。因此,一些表示语言更喜欢通过不支持此功能来避免这个问题。在那里,你必须用关系和更复杂的语句来解决这个问题。
;; a more complex way if you dont have functions yearOfBirth(ConstantineTheGreat,?X) && typeOfScalar(?X,Year) && valueOfScalar(?X,272)
到目前为止,我们主要关注的是简单语句,但正如最后一个例子所示,通过引入一些额外的材料,即逻辑连接词和变量,我们可以说更复杂的事情。知识表示系统通常支持的逻辑连接词是
and
运算,这里表示为&&
- (包含的)
or
运算,这里表示为||
- 一元否定运算符,这里表示为
~
我们还需要简要谈谈量词,它指定对变量的约束。量词基本上有两种:存在量词,它表示至少有一个这种类型(存在一个,因此是存在);和全称量词,它表示以下对满足属性的所有实体都是真的。让我们简要地重新审视一下君士坦丁的非函数出生年份的例子
;; we had basically treated existential quantification as assumed thereExists(?X, yearOfBirth(ConstantineTheGreat,?X) && typeOfScalar(?X,Year) && valueOfScalar(?X,272)) ;; all birth years are years forAll(?X, forAll(?Y, yearOfBirth(?Y,?X) && typeOfScalar(?X,Year)))
现在我们知道了复杂语句,我们可以把注意力转向各种各样的复杂语句,这些语句被称为规则。规则就像能够同时说很多事情一样;它们陈述了一种制作特定类型语句的模式。这不仅是一种符号上的方便,而且使人们能够对尚未遇到的实体做出陈述。例如,所有的人都有一位母亲的陈述,对于还没有出生的人来说也是真的。
在符号上,我们将使用implies
运算符,它接受一个前置条件和一个后置条件(或前件和后件),并表示如果前置条件为真,则后置条件也为真。
;; all people have a mother implies(forAll(?X,person(?X)), thereExists(?Y,motherOf(?Y,?X))
由于前件是隐式全称的,因此许多语言允许省略forAll
;; with functional speak we get the veryt terse implies(person(?X),motherOf(MotherFn(?X),?X))