Pyke 邏輯編程入門(15):知識庫之“規則庫”

來源:互聯網
上載者:User
規則庫

規則庫是規則的集合。建立規則庫,就是用你喜歡的文字編輯器,編寫 .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 類中方法的繼承方式,二者之間有重要區別:

  • 在 Python 的衍生類別中,定義的方法名字,若與其父類的相同,只有衍生類別中的方法會被調用。
  • 與此相反。在 Pyke 派生的規則庫中,如果為某一目標定義了反向推斷規則,而且,在上級規則庫中也有這種規則,那麼,派生的規則會擴充使用上級規則,以便證明這一目標。派生規則首先試用證明目標,若其全部失敗,再去嘗試上級規則。

    對於某一具體目標,如果不用上級規則,那麼,在派生規則庫開頭擴充子句 without 處,必須列出該目標的名稱。

注 意

上級規則庫中的正向推斷規則,必須全部包含在派生規則庫中。without 子句,只適用於反向推斷規則。

啟用規則庫

把規則庫載入記憶體,只能使其可用,但並未啟用運行。要啟用它,必須直接用你的 Python 程式。它可以根據不同情況,決定啟用不同規則庫。

另外,正向推斷規則,可根據推理需要,啟用多個規則庫。但是,如果規則庫已經作為規則庫類別而啟用,那麼,只有它的下級子庫,可以接著被啟用。由於子庫繼承了已經啟用的上級庫,因此得到新的規則,而不會使規則減少。規則庫啟用、正向規則運行時,不會受到其後啟用的規則庫的幹擾妨礙。

在我們的資料庫樣本中,你的程式會啟用底層規則庫 database,使其正向推斷規則,根據此時正在啟動並執行資料庫的情況,確定哪個規則庫啟用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.