版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/1470393
章二 軟體體系結構的構模組化式(3)
一、知識庫模式
1、知識庫模式特征
采用知識庫模式建構的系統通常有兩個截然不同的功能構件:
(1)中央資料單元構件:代表系統目前的各種狀态;
(2)一些相對獨立的元件的集合:對中央資料單元進行操作。
這樣,中央資料單元和外部元件集合之間的資訊互動就成為基于知識庫模式的系統中至關重要的問題。
這種資訊互動的方式也存在很大差異。
資訊互動方式的差異導緻了控制政策的不同。主要的控制政策有兩種。依據這兩種不同的控制政策,基于知識庫模式的系統被分成兩個子類。
(1)如系統由輸入資料流中的事務資訊來驅動,則該系統可以稱為基于傳統資料庫知識庫模式的應用系統;
(2)如系統由知識庫的目前狀态來驅動,則該系統可稱為基于黑闆型知識庫模式的應用系統。
2、一個标準的黑闆型知識庫模式系統通常包括3個組成部分:
(1)知識源;
(2)中央資料單元:是整個系統的核心部件,它對系統需要解決的問題預先進行了分析和定義,總結出了系統運作過程中将要出現的多種狀态,并制定了這些狀态下系統的相應對策;
(3)控制單元:其驅動完全是由知識庫的狀态編号承擔的。
3、知識庫模式執行個體:
人工智能領域-->專家系統ES(Expert System)
知識庫正是專家系統的基礎。
專家系統-->知識工程:知識擷取、知識表示、知識推理。
專家系統:把某一領域内專家的知識和人們長期總結出來的經驗方法輸入其中,模仿人類專家的思維規律和處理模式,按照一定的推理機制和控制政策,利用計算機進行演繹和推理,使專家的經驗變成共享資源,進而可克服專家嚴重短缺的現象。
專家系統的核心内容是知識庫和推理機制,主要組成部分是:知識庫、推理機、工作資料庫、使用者界面、解釋程式和知識擷取程式。
專家系統的結構有:人機接口、知識擷取機構、知識庫及其管理系統、推理機、資料庫及其管理系統、解釋機構、ES的通訊方法。
二、解釋器模式
1、解釋器模式特征:
基于解釋器模式的系統核心在于虛拟機。
一個基于解釋器模式的系統通常包括正在被解釋執行的僞碼和解釋引擎。
僞碼由需要被解釋執行的源代碼和解釋引擎分析所得的中間代碼組成;
解釋引擎包括文法解釋器和解釋器目前的運作狀态。
一個解釋器模式中就有4個基本的構成部分:
(1)完成解釋工作的解釋引擎;
(2)包含僞碼的資料存儲區;
(3)記錄引擎目前工作狀态的資料結構;
(4)記錄源代碼被解釋執行的進度的資料結構。
2、解釋器模式執行個體
解釋器模式在模式比對系統和語言編譯器等方面的應用已經非常成熟了。
(1)布爾表達式求值系統
以文法搜尋比對作為布爾表達式求值的理論基礎,從文法比對的角度來分析和解決布爾表達式求值問題。
如果一個特定文法的比對問題發生的頻率足夠高,那麼就有必要将該文法的各個執行個體表述為一種語言的句子,這樣就可以建構一個解釋器,該解釋器通過解釋這些句子來解決該文法的比對問題。
正規表達式是描述字元串模式的标準語言,與其為每一個模式都構造一個特定的算法,不如用一種通用的搜尋算法來解釋執行一個正規表達式,該正規表達式定義了待比對字元串的集合。
正規表達式的解釋執行結果就是布爾表達式的最終計算值。
本執行個體的内容可概括為如何為正規表達式定義一個布爾表達式,如何表示一個特定的布爾正規表達式,以及如何解釋這個正規表達式,得出布爾表達式的結果。
由如下文法定義布爾正規表達式:
BooleanExpression::=VariableExpression | Constant | OrExpression |
AndExpression | NotExpression | '('BooleanExpression ')'
AndExpression::=BooleanExpression 'and' BooleanExpression
OrExpression::=BooleanExpression 'or BooleanExpression
NotExpression::='not' BooleanExpression
Constant::= 'true' | 'false'
VariableExpression::='A'|'B'...'Y'|'Z'
(2)布爾表達式求值系統的優缺點:
在文法規則比較簡單的情況下,解釋器模式工作得很好,但如果文法規則複雜,則文法的層次變得龐大而無法管理,系統中需要包含許多表示文法規則的類。
最高效的解釋器通常不是通過直接解釋文法分析樹實作的,而是首先将它們轉換成另一種形式。例如:正規表達式通常被轉換為狀态機。
易于改變和擴充文法。因為解釋器模式使用類來表示文法規則,使用者可以使用繼承來改變或擴充文法。
易于實作文法。定義抽象文法樹中各個節點的類的實作大體類似,易于直接編寫,通常它們也可以用一個編譯器或文法分析程式生成器自動生成。
(3)布爾表達式求值系統中的角色
BooleanExpression 抽象布爾表達式
TerminalExpression 終結符表達式
NonterminalExpression 非終結符表達式
Context 上下文
Client 客戶
描述:Client建構一個布爾表達式,它是TerminalExpression和NonterminalExpression的執行個體的一個抽象文法樹,然後初始化上下文并調用解釋操作;每一個NonterminalExpression節點定義相應字表達式的求值操作,而各表達式的求值操作構成了遞歸求值的基礎;每一個節點的求值操作用上下文來存儲和通路解釋器系統的狀态。
(4)布爾表達式求值系統的實作
建立抽象文法樹;定義求值操作;共享終結符。
BooleanExpression的實作:
public interface BooleanExpression{
BooleanExpresion();
boolean evaluate(Context aContext);
BooleanExpression replace(String str, BooleanExpression de);
BooleanExpression copy();
}
Context的實作:
class Context{
public boolean lookup(String str);
public void assign(VariableExpression ve, boolean bool);
VariableExpression的實作:
class VariableExpression implements BooleanExpression{
private String _name;
VariableExpression(String str){
_name=str;
}
boolean evaluate(Context aContext){
return aContext.lookup(_name);
BooleanExpression replace(String str, BooleanExpression be){
if(str.equals(_name)){
return be.copy();
}
else{
return new VariableExpression(str);
BooleanExpression copy(){
return new VariableExpression(_name);
AndExpression的實作:
class AndExpression implements BooleanExpression{
private BooleanExpression _operand1, _operand2;
public AndExpression(BooleanExpression be1, BooleanExpression be2){
_operand1=be1;
_operand2=be2;
public boolean evaluate(Context aContext){
return (_operand1.evaluate(aContext)&&_operand2.evaluate(aContext));
public BooleanExpression replace(String str, BooleanExpression be){
return new AndExpression(_operand1.replace(str.be), _operand2.replace(str,be));
public BooleanExpression copy(){
return new AndExpression(_operand1.copy(), _operand2.copy());
Client的實作:
class Client{
public static void main(String[] args){
public BooleanExpression expression;
public Context context;
VariableExpression x=new VariableExpression("X");
VariableExpression y=new VariableExpression("Y");
expression=new OrExpression(new AndExpression(new Constant(true),x),new AndExpression(Y, new NotExpression(x)));
context.assign(x,false);
context.assign(y,true);
boolean result=expression.evaluate(context);
System.out.println(result);