在框架結構中, 過程可以以各種不同的方式附在框架中,這裡過程通常被稱為“幽靈(Demon)”。框架中的幽靈主要有兩種:IF-ADDED型和IF-NEEDED型。當框架中的某槽填以某一值時, 幽靈就被激發,這類幽靈稱為IF-ADDED幽靈。例如,一個關於人的框架可以在婚姻狀況槽中附加一個IF-ADDED幽靈,如果該槽在某次例化中填以MARRIED值,那么該幽靈就被激發,它的作用是例化另一個框架,表示該框架的妻子或丈夫。當需要計算或求框架中某槽的值時,幽靈被激發,這類幽靈稱為IF-NEEDED幽靈。IF-ADDED幽靈可用來處理錯誤。例如,當槽值越界時就啟動幽靈進行必要的處理,比如顯示出錯信息或終止運行。幽靈的作用取決於套用。
基本介紹
- 中文名:Demon過程
- 外文名:Demonprocessing
- 別名:幽靈過程
- 所屬領域:人工智慧
- 相關概念:框架結構
基本介紹,框架結構,框架表達與推理的實現,
基本介紹
所謂面向對象的知識表示方法,進一步將幽靈過程思想一般化。對象表示方法的基本思想是世界由一些對象組成,一個對象具有自己的內部結構和內部狀態,同時也具有改變內部狀態的一組過程。對象之間的聯繫是通過通訊而發生關係的,一個對象可以向其他對象傳送信息,對象因接受信息而被激活。整個問題求解過程由各對象之間相互通訊,協同工作而完成。
對象表示法把狀態法和過程法普遍化,任一對象均具有狀態和過程兩方面。對象既可以看成附有狀態的過程,也可以看成附有過程的狀態。
框架結構
知識的框架結構表達方式是1957年由Minsky率先提出的一種基於日常生活經驗行為的表達法。由於我們對已知事物的了解或對新事物的判別常常表現為對事物各方面屬性的綜合掌握或判斷,用反應事物特性的屬性值表示事物,也就理屬當然。這樣的知識表達法中,事物屬性的總和稱為事物的框架,每個屬性稱為框架的一個槽,具體的屬性值稱為槽值,於是每個具體的事物就可以由這樣一組槽值表示。槽值既可以是固定的數值或符號,也可以是描述其它對象的框架,因為屬性值也可以看做是待描述的事物;槽值還可以附上過程描述,如if_added過程、if_needed過程等幽靈過程,方便地描述屬性的某些動態特性。最後,槽值還可以省缺,由上層框架或其它槽說明。
用框架系統進行推理,或者說認識事物,很類似日常生活中的行為,就是從現有系統中選出最接近待定事物的框架,進行符合性檢查。如果相差太大,就要修改原有框架甚至構造新框架,直至達到規定的符合程度。獲得的新框架實例就可以向我們提供新事物有關知識。
框架結構適於描述公共事實群,因為同類事物具有共同的框架。
框架表達與推理的實現
框架用謂詞表達十分簡單,例如其中的一種形式是
<Slot_Name>(< Frame_Name> ,<Slot_Value>).
主要問題是推理。
在框架系統中主要的操作有:
1. 槽值Slot_Value的檢索:給定框架-槽的檢索路徑,求出槽值。
2. 特性繼承(inheritance):多個框架(稱為子框架) 的某些共同屬性可由上一層框架(稱為母框架) 統一描述,子框架中不必列出母框架具有的屬性,而是繼承了母框架的全部屬性。查尋子框架的這些屬性需要到它的母框架中尋找。
3. 框架的修改(update):改變框架某些槽的值。
4. 附加幽靈過程(demon processing):根據計算、填值或撤消某個槽或槽值的需要,一個進程可自動觸發執行上述操作,這樣的進程稱為幽靈進程。使用幽靈進程能大大方便知識表示。例如我們可以在人的健康情況框架中,為體重槽設定人的身高-體重估算進程,如果在檢索體重時發現沒有填值,但可以檢索到身高值,就觸發該進程,計算體重估算值並作為體重槽值。估算進程可以根據經驗數據編寫。
5.槽輸入項的省缺值處理:如子框架中某一屬性的值與母框架中同一屬性的值相同,則可以省缺;如果不相同,則不能省缺。
以上功能可通過增加相應的react子句實現。如為了實現槽值的檢索,假設詢問目標Goal形式為
Slot_Name(Frame_Name,Slot_Value),
我們只需增加子句
react(Theory,Goal,fr( Frame_Name),Continuation)
:-
Goal =..[Slot_Name,Frame_Name | Rest_Part],
name_of(Frame_Name,Frame_Theory) ,
find(Goal,Frame_Theory,Continuation).
於是執行find謂詞目標時,在框架Frame_Theory中找到形如<Slot_Name> (< Frame_Name>,<Slot_Value>)的子句與Goal匹配,一旦成功就查尋到了Slot_Value。
name_of 謂詞的作用是提供查詢框架理論的策略,譬如採用數據分塊,索引查找等方法提高查詢效率,當然這些控制都是在元級進行的。
為了查尋子框架繼承的特性值,框架系統應有如下形式的斷言:
is_a(<Frame_Name>,<Super_Frame_ Name>).
於是可根據Frame_Name 查到上層框架名Super_Frame_Name,進而再到存貯了相應上層框架的真實內容的Super_Frame_Theory 中查尋相應槽值。為此增加react 子句:
react(Theory,Goal,inh( [Slot_Name | Inh_Trace] ),Continuation)
:-
Goal=..[Slot_Name,Frame_Name | Rest_Part],
name_of(Frame_Name,Frame_Theory),
find(is_a(Frame_Name,Super_Frame_Name),
Frame_Theory, _),
name_of(Super_Frame_Name,Super_Frame_Theory),
Super_Goal=..(Slot_Name,Super_Frame_Name |Rest_part),
react(Super_Frame_Theory,Super_Goal,
Inh_Trace,Continuation).
下一個問題是框架槽值的修改。過去,正規的做法是在老的框架上修改槽值。然而,在框架上進行直接修改會破壞理論的一致性。為此我們首先建立新的框架,再拋棄舊的框架。此項工作由drop_from和add_to兩謂詞完成,此兩謂詞與PROLOG中retr_act和assert謂詞十分相似,只是更局部一些。修改框架槽值的工作通過增加如下react子句完成:
react(Theory,update(Ftame_Name,Slot,
New_Value),upd(Frame_Name,Slot,New_Value), true)
:-
Old_Assert=..[Slot,Frame_Name,Old_Value),
name_of(Frame_Name,Frame),
drop_from(Frame,Old_Assert,Intermed_Frame),
New_Assert=..[Slot,Frame_Name,New_Value],
add_to(Intermed_Frame,New_Assert,New_Frame).
前面所敘述的特性繼承機制同樣支撐某些槽值的省缺的處理。儘管還可以提出一些不同的處理省缺的辦法,為簡單起見,這裡就不敘述了。
最後一個問題就是幽靈的處理。我們首先假定某框架包含子句頭形式如下的一些規則:
demon(<Slot>,<Old_Value>,<New_Value>,<Frame>)
:- .
這些規則就是附屬於槽Slot的過程。假定是換值幽靈過程,那么就應在修改槽值的過程中,執行此幽靈過程。為此,我們將上述已經描述的適合框架修改的react修改為
eact(Theory,update(Frame_Name,Slot,New_value),
upd(Frame_Name,Slot,New_Value),true)
:-
Old_Assert=..[Slot,Frame_Name,OId_Value].
name_of(Frame_Name,Frame),
dro_pfrom(Frame,Old_Assert,Intermed_Frame_0),
New_Assert=..[Slot,Frame_Name,New_Value],
add_to(Intermed_Frame_0,New_Assert,
Intermed_Frame_1),
demo(Intermed_Frame_1,demon(Slot,Old_Value,
New_Value, Intermed_Frame_1), _).
其他幽靈過程的處理,與此大致相同。
至此,已經使用元級PROLOG技術處理了所有的有關框架推理的問題,元級謂詞的編寫工作是很少的。