原文地址:http://sophieling.iteye.com/blog/837926算法
最近在研讀Jena的推理機源代碼,Jena推理機的實現主要也是用的RETE算法,因此研究了RETE算法的基本流程。RETE算法是由Forgy在他的論文《A Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem》中提出的。網絡
1 RETE算法的基本思想
RETE算法是一個用於產生式系統的高效模式匹配算法。在一個產生式系統中,被處理的數據叫作working memory,用於斷定的規則分爲兩個部分LHS(left-hand-side)和RHS(right hand side),分別表示前提和結論。主要流程能夠分爲如下步驟:ide
(1)Match:找出符合LHS部分的working memory集合spa
(2)Confilict resolution:選出一個條件被知足的規則orm
(3)Act:執行RHS的內容blog
(4)返回1 get
RETE算法主要改進Match的處理過程,經過構建一個網絡進行匹配。
2算法詳細描述it
RETE網絡主要分爲兩個部分,alpha網絡和beta網絡。以下圖所示。io
(1)alpha網絡:過濾working memory,找出符合規則中每個模式的集合,生成alpha memory(知足該模式的集合)。有兩種類型的節點,過濾type的節點和其餘條件過濾的節點(我以爲這兩種是依照須要設定的,也並不必定須要兩種節點)。table
(2)Beta網絡:有兩種類型的節點Beta Memory和Join Node。前者主要存儲Join完成後的集合。後者包含兩個輸入口,分別輸入須要匹配的兩個集合,由Join節點作合併工做傳輸給下一個節點。
3 匹配過程描述
(1)導入須要處理的事實到facts集合中。
(2)若是facts不爲空,選擇一個fact進行處理。不然中止匹配過程。
(3)選擇alpha網的第一個節點運行(創建網絡的時候設定的),經過該節點則進入alpha網的下一個節點,直到進入alpha memory。不然跳轉到下一條判斷路徑。
(4)將alpha memory的結果加入到beta memory中,若是不爲Terminal節點,則檢測另外一個輸入集合中是否存在知足條件的事實,知足則執行join,進入到下一個beta memory重複執行(3)。若另外一個輸入集合無知足條件的事實,返回到(2)。若是該節點爲Terminal節點,執行ACT並添加到facts中。
4 用一個例子描述過程
(1)如今WME中有如下這些事實。
w1:(B1 ^on B2)
w2:(B1 ^on B3)
w3:(B1 ^color red)
w4:(B2 ^on table)
w5:(B2 ^left-of B3)
w6:(B2 ^color blue)
w7:(B3 ^left-of B4)
w8:(B3 ^on table)
w9:(B3 ^color red)
(2)下面描述規則
下面是三條匹配條件
C1: (<x> ^on <y>)
C2:(<y> ^left-of <z>)
C3:(<z> ^color red)
下面是規則要知足的全部條件,即全部LHS
p1 has conditions C1^C2^C3
p2 has conditions C1^C2^C4^C5
p3 has conditions C1^C2^C4^C3
(3)推理描述
暫且忽略圖中的紅色節點(用於斷定類型)。那麼,根據Ci,圖中的藍色alpha結點應該有三種,分別斷定on,left-of和color。則黃色的alpha memory中包含三個集合,分別是知足C1:{w1 w2 w4 w8}
知足C2:{w5 w7}
知足C3:{w2 w6 w9}
以p1爲例,首先以C1,C2爲輸入,在綠色Dummy Input節點中進行操做,並傳入到梅紅色beta momory中,此時這個節點存儲的是(w1^w5,w2^w7)。而後以這個集合和C3爲輸入,操做得出w1^w5^w9,此時發現沒有更多的模式須要匹配,到達Terminal節點,匹配結束。這樣就獲得知足規則的集合組合了。
接下來的時間要研究Jena中Rete算法的具體實現方式。