610 likes | 780 Views
第十章 邏輯推理系統. 10.1 簡介 10.2 索引、 檢索與一致化 10.3 邏輯程式系統 10.4 定理證明器 10.5 向前連鎖生產系統 10.6 框架系統與語意網路 10.7 描述邏輯 10.8 撤回管理、 假設與解釋. 10.1 簡介. 用代理人建立推理系統的想法很好─就是可以代表知識並推理的系統。這樣系統的主要優點為高度模組化。控制的結構可以跟知識分離,而每一知識單元可以完全獨立於其他知識單元。所以更容易實驗此系統並且修改它,系統可以更容易跟其他代理人解釋其運作,系統可以更容易自我學習。 .
E N D
第十章 邏輯推理系統 10.1 簡介 10.2 索引、 檢索與一致化 10.3 邏輯程式系統 10.4 定理證明器 10.5 向前連鎖生產系統 10.6 框架系統與語意網路 10.7 描述邏輯 10.8 撤回管理、 假設與解釋
10.1簡介 用代理人建立推理系統的想法很好─就是可以代表知識並推理的系統。這樣系統的主要優點為高度模組化。控制的結構可以跟知識分離,而每一知識單元可以完全獨立於其他知識單元。所以更容易實驗此系統並且修改它,系統可以更容易跟其他代理人解釋其運作,系統可以更容易自我學習。
自動推理系統有許多種,每一種設計都是針對不同的問題。我們將它們歸類為以下四種:自動推理系統有許多種,每一種設計都是針對不同的問題。我們將它們歸類為以下四種: 定理證明器與邏輯程式語言 生產系統 框架系統與語意網路 描述邏輯系統
這四種系統如何實作以及如何達到以下五個功能:這四種系統如何實作以及如何達到以下五個功能: 1.新增一個事實到知識庫裡。這事實可能是認知得來,或是從推論而來。我們稱此功能為TELL。 2.已有一個知識庫與一個新的事實,連接現有的知識庫與新的事實導出隱含的事實。在向後連鎖系統中,這也是TELL的功能。 3.決定一個查詢是否適用於知識庫。我們稱此功能為ASK。不同版本的ASK功能不同,包括回傳一組所有可能的替代讓此查詢為真。
4.定一個查詢是否存在知識庫─一個限制的 ASK。 5.從知識庫移除一個命題。此功能要能分辨修正一個證明為錯的命題與遺忘一個不再使用的命題,並且要能更新知識庫以反映真實世界的改變,以及能夠記得之前世界的狀態 (有些系統可以做到這些分別;其他系統則需要知識工程師盡量簡化知識的內容)。
10.2索引、檢索與一致化 TELL與ASK通常可以用正向與反向鏈結或解析來作複雜的推理。在本節中,我們使用兩個實作部分的TELL與ASK且較為簡單的功能。我們稱這兩個功能為STORE與FETCH。
命題與項目的實做 建立一個推理系統的第一不就是定義命題與項目的資料類型。這牽涉到定義命題的語法─在邏輯層級與使用者互動的格式─以及系統用來儲存與操作命題的內部表示格式。對於不同的命題可能有許多內部的表示方法。
儲存與擷取 在我們有命題與項目的資料類型後,我們要能夠在知識庫裡維護一組命題,讓它們可以有效率地擷取使用。通常,FETCH指令是用來尋找知識庫裡的命題使其符合查詢的要求,或是至少可以符合語法結構。ASK是用來作推論,過程中會呼叫一連串的FETCH。所以推論的計算所需包括兩方面:ASK所使用的搜尋策略,與用來實作FETCH的資料結構。
表格索引 用雜湊表來實做知識庫是比較好的方法。如果我們只需要處理基礎文字的命題,我們可以將STORE實做成當給定P時,在雜湊表裡的P鍵之下存一個「真」,給定時,在雜湊表裡存一個「偽」。這樣FETCH就可以對雜湊表做簡單的查詢,且FETCH與STORE都只需要O(1)。
雜湊表的鍵就是述詞的符號,而在每個鍵下所存的值包含四個部分:雜湊表的鍵就是述詞的符號,而在每個鍵下所存的值包含四個部分: l代表述詞的肯定文字列舉項目 l否定文字列舉項目 l當述詞在結果時的命題列舉項目 l當述詞在假設時的命題列舉項目
所以假定有以下的知識庫: 此知識庫的雜湊表如圖10.1。
樹狀索引 表格索引對於許多的術語符號且每個符號的子句很少時是個理想的方法。但是在某些應用裡,一個述詞可能有很多的子句。例如,在美國的戶口調查局知識庫裡用社會安全碼來代表人,所以Brother(012-34-5678,x) 的查詢需要從數百萬個Brother裡尋找。
若要讓此搜尋有效率,我們需要對參數做索引,對述詞符號也要做索引。一個方法就是把表格裡的Brother項目改用另一個表格代表,其索引使用Brother的第一個參數。我們也可以將尋找符合句子的程序看成遊走一個樹的結構。而查詢命題的某一個符號就代表樹的每個分支 (圖10.2)。
一致化演算法 透過聰明的索引,可以減少unification的呼叫,但是呼叫的次數可能還是很多。因此,這個unification的演算法必須要有效率。圖10.3的演算法是個簡單的例子。它以遞迴法同時查看兩個運算式,最後產生unification的結果,但是若中途遇到不相符合的狀況就停止。
10.3邏輯程式系統 用陳述的方法建立智慧系統有許多優點。邏輯程式語言則試著延伸這些優點到所有的程式設計。任何的計算都可看成是選擇某個程式到某個機器上並提供某些輸入後產生詳盡結果的程序。邏輯程式將程式與輸入視為對現實世界的邏輯陳述,而將產生詳盡結果程序視為一種推論的程序。
Prolog程式語言 當它使用於邏輯知識庫時,一個Prolog程式有以下的特色: l一個包含一連串其內部連結的句子的程式。所有的變數都隱含通用的量化,且在不同句子的相同變數是不同的。 l只有Horn子句可接受。這表示每一個子句不是單元命題就是一個沒有negated先行詞與單元結果的意涵。 l項目可以是常數符號、變數或是函數項目。
l查詢可以包括連結、分離、變數或函數。 l除了意涵的negated先行詞外,Prolog使用一個negation as failure運算子:如果系統無法證明P,則 not P 證明就成立。 l所有語法上不同的項目都假定是不同的物件。也就是說,當A是常數時,A=B或A=F(x) 不成立。當x是變數時,x=B或x=F(y) 成立。 l系統有預先建立許多數學、輸入/輸出、與不同的系統與知識庫功能的述詞。使用者些述詞的文句是在執行後就能證明,而不是用進一步的推論。在Prolog符號裡 (大寫的名稱為變數),X is 4+3 產生X為7。然而5 is X+Y不能計算,因為其內建的函數無法解任意的方程式。
實作 Prolog的設計者做了許多決定以提供一個簡單,快速執行的模式: l所有的推論都用反向鏈結,且是深度優先搜尋。這表示在證明一個命題遇到死路時,Prolog就回到最近一個包含不同路徑的步驟。 l先行詞的搜尋順序是由左而右,而應用知識庫的子句是由第一個到最後一個。 l忽略unification程序的occur-check。
邏輯程式的編譯 使用之前的一些方法就可以造出一個有效率的Prolog直譯器。不過就跟所有的語言一樣,以直譯式執行總是比執行編譯程式慢。這是因為直譯器通常是跟程式內容無關的。Prolog的直譯器在執行程式時必須要藉由資料庫搜尋找到符合目標的命題,以及分析命題結構決定要產生的子目標。所以大部分重要的Prolog程式都是用編譯碼執行的。
目前電腦的指令集跟Prolog的語法非常不符合,所以大部分的Prolog編譯器將程式編譯成中間語言,而不是編譯成機器碼。最常用的中間語言就是Warren Abstract Machine,或是WAM,。WAM是一組抽象的適合用於Prolog的指令集,且可以被直譯程式執行,也可以再編譯成機器碼。其它的編譯器將Prolog轉譯成高階語言,如Lisp或C,然後再用高階語言的編譯器將程式編譯成機器碼。例如,Member述詞的定義可以編譯成圖10.4的程式。
關於此可歸納為以下的重點: lMember的子句已經建立到程序裡,所以要推論時不用再搜尋知識庫,只要呼叫對應的程序就好。 l如前所述,目前變數的限制都放在trail裡,上面的程序第一步就是儲存trail的目前狀態,之後第一子句失敗時才能用RESET-TRAIL恢復。這樣會解除第一次UNIFY呼叫的所有變數限制。 l此程序最技巧性的地方就是用continuations來達到選擇點的功能。Continuation的作用就是決定當目前的目標完成時,下一個程序要達成的目標。
其它的邏輯程式語言 雖然Prolog是目前邏輯程式的標準,還是有許多其他的系統延伸基本的Prolog提供不同的功能。例如,Prolog程式的平行化也是一個重要的議題,在Prolog程式中有兩個地方適合平行化處理。第一個,稱為OR-平行化,就是要一致化知識庫裡許多不同的文句與意涵。每一種一致化都成是搜尋樹裡的一個分支,並且是可能的答案,且這些分支都能夠平行地處理。第二個是AND-平行化,就是要平行地處理某個意涵裡的每一個交集。
高等控制機制 再回到我們的戶口普查知識庫,如果有這樣的查詢 “總統配偶的收入是多少?” 這在Prolog可以描述如下: 執行此查詢可能需要許多時間,因為它必須列舉所有的person/income,然後取得每一個person的配偶,最後再檢查誰的工作室總統。
10.4定理證明器 定理證明器 (或稱為自動推理器) 跟邏輯程式語言有兩個地方不同。首先,大部分邏輯程式語言只處理Horn子句,而定理證明器可以接受完整的一階邏輯。第二,Prolog程式會把邏輯與控制綁在一起。程式設計師寫跟會影響程式的執行結果。在定理證明器裡,使用者可以寫任意一種表示方法,甚至寫成,其結果都會一樣。
定理證明器的設計 在本節裡,我們要討論OTTER (Organized Technique for Theorem-proving and Effective Research) (McCune, 1992) 這個定理證明器,並且著重在其控制策略上。在準備一個問題給OTTER時,使用者必須要將知識分為四個部分:
l一組稱為證實集合 (sos) 的子句,定義關於問題的重要事實。每一個解決步驟都會針對某個定理解決證實集合裡的一個成員,所以搜尋是著重於證實集合t。 l一組在證實集合之外可用的定理。這些定理提供問題領域的背景知識。而背景知識跟問題本身的界限就由使用者決定。 l一組方程式稱為rewrites或demodulators。雖然demodulator是方程式,它們都是由左至右來執行。因此,又定義了一個讓所有項目簡化的格式。例如,x + 0 = x 代表所有 x+0 都可以用x來取代。 l一組定義控制策略的參數與子句。使用者可以定義一個經驗法則函數來控制搜尋,以及一個過濾函數來消除不使用的目標。
單元的權重很輕,所以搜尋個過程可以視為單元優先策略。在每一個步驟裡,OTTER會將最輕的子句從set of support移到可用的清單,並同時加上一些解決子句所獲得的結果。當OTTER碰到反例時或是在set of support沒有新的子句時就會停止。此演算法如圖10.5。
Prolog的推廣 要建立一個定理證明器的另一個方法就是用Prolog編譯器,然後找一個完整的推理器來做完全的一階邏輯。Prolog Technology Theorem Prover或稱為PTTP (Stickel, 1988) 就是採用這種方法。PTTP包括了五個對於Prolog重要的改變:
把定理證明器當成助手 到目前為止,我們把推理系統當成一個獨立的代理人,必須要靠自己做決定與行動。我們也可以把定理證明器當成助手,提供建議給數學家。在此模式下,數學加成為監督者,決定下一步要做的動作,然後要定理證明器完成。這樣可以消除代理人自己決定的缺失,因為監督者可以取消一個耗時太久的查詢。
定理證明器的實際使用 定理證明器已經產生一些新的數學證明。SAM (Semi-Automated Mathematics) 這個程式是第一個可以證明lattice理論裡的一個lemma的證明器 (Guard et al., 1969)。而AURA程式也可以回答數學領域裡許多開放的問題 (Wos與Winker, 1983)。而Boyer-Moore定理證明器 (Boyer and Moore, 1979) 已經被使用並加強數年了,且被Natarajan Shankar 用來產生第一個Godel’s Incompleteness Theorem 的正規證明 (Shankar, 1986)。
10.5 向前連鎖生產系統 Prolog與大部分其它的邏輯程式語言是反向鏈結的。對於一個查詢,它們就會尋找一個合適的證明來建立可以符合此查詢的文句。另一種不使用查詢的方法是向前連鎖。推論規則直接應用到知識庫以產生新的宣告,此程序會一直進行直到某些條件成立為止。
一般的生產系統有三個特點: l系統維護一個稱為工作記憶的知識庫。這包含一組沒有變數的positive literals。 l系統也維護獨立的規則記憶。這包含一組推論規則,每一個都是的格式,而pi是literals,acti是當pi滿足時要執行的動作。允許的動作包括從工作記憶新增與刪除元素,以及其他如列印變數值。 l在每一個循環裡,系統會計算規則的子集合,其子式子的左手邊由工作記憶目前的內容滿足,這稱為匹配階段(match phase)。 l系統接著決定要執行的規則。這稱為衝突解決階段(conflict resolution phase)。 l在每一個循環的最後一步就是要從已選擇的規則裡執行動作。這稱為動作階段。
匹配階段 Unification會有比對一對literals的問題,而每一個literal都可能包含變數。我們可以直接使用unification來實作向前連鎖生產系統,但是這會非常沒有效率。如果在working memory裡有w個elements,以及r的規則 (其中每個規則的left-hand side都有n個elements),且解決一個問題需要c的循環,則一個基本的比對演算法必須執行wrnc次unification。
rete演算法首先把rule memory編譯成圖10.6的網路。在此圖裡,圓形的節點代表working memory的fetches (沒有unification)。在節點A,working memory元素A(1)與A(2)已經被fetched並儲存。
衝突解決階段 有些生產系統會執行所有規則的動作然後完成匹配階段。其它的生產系統會將這些規則當成建議,然後在衝突解決階段決定要接受的建議。這個phase可以當成控制策略。一些使用的策略如下: lNo duplication。不重複執行相同的規則與相同的參數。 lRecency。優先使用會參考到最近建立好working memory elements的規則。 lSpecificity。優先使用較特別的規則。 lOperation priority。優先使用較高優先的動作,例如一些ranking指定的。
生產系統的實際使用 向前連鎖生產系統代表許多AI的早期研究。尤其是XCON系統 (原本叫R1 (McDermott, 1982)),是生產系統 (規則為主) 的架構來建立的。XCON包含數千調規則來設計電腦組件設定給Digital Equipment Corporation的客戶使用。
10.6 框架系統與語意網路 在1986年,在Peano發展七年後目前成為標準的一階邏輯,Charles Peirce提出一個圖形的方法稱為existential graphs,並稱為未來的邏輯。之後就有一段時間在邏輯與語意網路的爭論。目前廣為大家所接受的是每一個語意網路或frame system都可以當成邏輯的命題,且大部分人都接受它也可以成為一階邏輯。
語意網路的語法和語意 語意網路著重於物件的分類與其間的關係。如下: 也就是說貓是哺乳類動物。我們也可以很容易寫,但是當語意網路首先在AI裡使用 (大約在1961年) 時,這還不能為人所接受。大部分人認為使用邏輯必須要寫成 這樣寫起來比較麻煩。加入讓人覺得此句不允許例外,而讓人覺得有一些轉圜的空間。
我們現在體認到語意比符號重要。圖10.7是一個典型的frame-based網路,以及把網路轉成first-order logic。此網路可以用來回答 “一個Opus有幾隻腳?”,然後透過 與 連結,從Opus到Penguins到Birds,然後知道鳥類有兩隻腳。
五種標準的連結歸納於圖10.8。請注意一個定理證明器或是邏輯程式語言可以使用連結的邏輯的轉譯,然後靠一般的邏輯推論來作推論。一個語意網路系統使用特殊目的的演算法來跟隨連結,因此可以比一般的邏輯推論要快。
包括例外的繼承 由圖的連結當成包括例外的繼承是很直覺的想法,但是把語意定義成first-order logic也是可行的。邏輯轉譯的第一步就是要reify關聯,一個關聯R城一個物件而不是predicate。這表示Rel(R,A,B)只是一般的單元命題,而不是一個複雜命題的縮寫。