歷史學家知識工程/基礎複合元素
到目前為止,我們一直很高興地混淆了一個概念,現在我們需要把它分開。當我們寫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))