規則庫
規則庫是規則的集合。建立規則庫,就是用你喜歡的文字編輯器,編寫 .krb 規則檔案。
規則庫中,可同時包含正向和反向兩種推斷規則。
為了斷言新事實而啟用規則庫時,正向推斷規則即自動運行。可見,正向推斷規則不直接用於確定具體事實是否真實。
反向推斷規則,直接用於確定某一具體規則的真實性。因此,如果一個事實陳述的名稱中,包括知識庫名字(更確切地說,是規則庫的類型名稱),那麼,它是這個規則庫裡的反向推斷規則。
注 意
Pyke 首先運行正向規則,然後運行反向規則。
正向推斷規則中的事實陳述,禁止以規則庫名稱當做知識庫名稱,因為這擾亂了兩種規則的運行順序。
多個規則庫並存的原因
多個規則庫(.krb)檔案並存的理由有兩個:
- 把大量規則分解成便於人工管理的單位。
因此要求 Pyke 把全部規則庫組合起來。
例如,你有些規則控制 SQL 陳述式的自動產生,還有些規則控制 HTML 文檔的產生。為了便於管理這些規則,把它們放在不同規則庫中。
- 為了讓你的 Python 程式,能在不同規則庫之間,做出適合不同需要的選擇。
例如,一些控制 SQL 陳述式自動產生的規則,可能非常依賴所啟動並執行資料庫(如 mysql, postgresql, oracle 等)。
這時,你可以要求 Pyke,根據所要啟動並執行資料庫,選擇相應的規則庫。在同一時間段,你只需要一個規則庫,因而,這些規則庫是各自獨立、互斥的。
以上需求的實現,依靠以下三項功能:
規則庫分類
規則庫是分類組成的。每一類規則庫只能有一個規則庫處於啟用狀態。
若要同時啟用一些規則庫,就應把它們分別放到不同的規則庫類別中,並且,這些規則庫之間是互斥的關係。例如,把 mysql, postgresql 和 oracle 相關的規則庫,置入同一規則庫類別中。
每個規則庫類別,有唯一的名稱。在上例中,你要的是兩個規則庫類別:資料庫產生,和 HTML 文檔產生。
規則庫類別名稱,是作為規則庫名稱,供規則中的事實陳述使用的。這些規則處在某一規則庫類別中,但要引用另一規則庫類別。例如,在類別 html_generation 中的規則庫,需要用名稱 database.insert(...) 引用在類別 database 中的規則。
規則庫的繼承
同類別的規則庫,通過規則庫的繼承,共用相關規則。
規則庫繼承另一規則庫的規則,是單向繼承。單向繼承可達任意深度。正向和反向的推斷規則均可繼承。
這使得互斥的規則庫,可以共用上級規則庫的規則,從而避免了複製它們。
下面是關於規則庫類別的定義:
- 處於繼承關係最底層的規則庫,定義了唯一的規則庫類別。從這一規則庫類別中,直接或間接繼承產生的規則,屬於同一規則庫類別。
- 規則庫類別的名稱,就是繼承關係中最底層規則庫的名稱。
樣本中的 database 和 html_generation,看上去是這樣的:
規則庫類別
底層規則庫名叫 database,由它派生出的規則庫,叫做 mysql, postgresql 和 oracle。還有個底層規則庫,名叫 html_generation,它派生出了 firefox 和 internet_explorer。
這兩個底層規則庫,定義了兩個規則庫類別:
- database,包含著:
- database
- mysql
- postgresql
- oracle
- html_generation,包含著:
- html_generation
- firefox
- internet_explorer
注 意
作為規則庫的 .krb 檔案,可以儲存在你的 Pyke 源檔案目錄的任何地方,也就是說,檔案目錄不必與規則庫的繼承關係相匹配。
任何時候,在規則庫類別中,只許有一個規則庫啟用。
在規則庫中,如果某個反向推斷規則中的事實陳述,省略了知識庫名稱,則其預設的名稱是規則庫類別名,不是規則庫名。例如,在 規則庫 postgresql 中,事實 insert(...),是指 database.insert(...);而在規則庫 firefox 中,make_tag(...) 是指 html_generation.make_tag(...)。
重 要
無論直接或間接地引用規則庫類別,引用總會指向處於啟用狀態的規則庫。指向的不會是底層規則庫,也不會隱含使用規則庫類別。例如,在派生的規則庫 postgresql 中,如果規則庫 oracle 處於啟用,那麼,事實陳述 insert(...) 就會結束它對 oracle 中 insert 規則的引用。
如果引用的規則屬於外部規則庫類別,必須直接引用規則庫類別名稱。例如,引用規則庫類別 html_generation 中規則庫 databases 的 insert 規則,應當寫出 database.insert(...)。
如此,各個規則庫類別中,處於啟用的規則庫,都可使用。
規則的繼承
在 Pyke 規則庫中,反向推斷規則的繼承方式,與 Python 類中方法的繼承方式,二者之間有重要區別:
注 意
上級規則庫中的正向推斷規則,必須全部包含在派生規則庫中。without 子句,只適用於反向推斷規則。
啟用規則庫
把規則庫載入記憶體,只能使其可用,但並未啟用運行。要啟用它,必須直接用你的 Python 程式。它可以根據不同情況,決定啟用不同規則庫。
另外,正向推斷規則,可根據推理需要,啟用多個規則庫。但是,如果規則庫已經作為規則庫類別而啟用,那麼,只有它的下級子庫,可以接著被啟用。由於子庫繼承了已經啟用的上級庫,因此得到新的規則,而不會使規則減少。規則庫啟用、正向規則運行時,不會受到其後啟用的規則庫的幹擾妨礙。
在我們的資料庫樣本中,你的程式會啟用底層規則庫 database,使其正向推斷規則,根據此時正在啟動並執行資料庫的情況,確定哪個規則庫啟用。