說明:本文是Knowledge-based systems with thecommonKADS method文章的翻譯。html
1、知識庫系統的背景ios
1. 什麼是知識庫系統(KBS)git
知識庫系統是人工智能的一個分支,能夠真正地應用於現今的系統開發領域。他們一般內嵌於其餘的應用中,來執行特定知識的任務。算法
知識庫系統是AI科學家長期研究的成果。從上個世紀70年代開始,科學家們開始理解計算機程序解決問題的關鍵不在於規整的表達式或者推理邏輯的模式,而是在於這些問題自己擁有的知識。擁有豐富知識和經驗的人類專家能夠高效地解決不一樣種類的問題----即便他們對這些問題的描述並非十分明確----只要是這些問題處於專家的研究領域。所以,知識庫系統是一組計算機程序,用來仿真(在某些狀況下甚至超越)人類專家解決問題的能力。固然,知識庫系統的目標並非用機器來代替人類的思考,而是發揮出計算機強大的計算能力。爲了打造一個知識庫系統,工程師們須要接受來自專家的大量的建議。在一些領域,這些專家都是基於規則進行建議的,儘管他們自身並無意識到這一點。數據庫
知識庫系統在不基於直覺或者常識而得到有效的結果方面是很是強大的。編程
知識庫系統的發展過程經歷了兩代:在第一代系統中,工程師們侷限於根據專家定義的規則進行編碼實現,這種形式並非十分有效的,由於項目難以維護而且修改代價十分巨大。除此以外,知識獲取的過程嚴重依賴專家的輸出;在第二代系統中,Allen Newel提出了‘知識等級’的概念,知識不依賴於具體的實現,而是根據不一樣種類的知識等級進行結構化表示:網絡
l 知識等級:Agent,Knowledge,Goal,Actions架構
l 表示等級:Computer,Symbols,Instructions編程語言
l 邏輯等級:Digital System,Bits,Logic and Arithmetic Operationside
l 鏈路等級:Electronic System, Current
Newel提出了使用模型的必要性,這樣,咱們把‘知識獲取’定義成一個過程,在這個過程當中,工程師們先建立‘知識模型’,隨後把它們編碼成計算機可運行的形式。
如今一般使用第二代知識庫系統。
2. 編程語言
知識庫系統一般基於Prolog,Lisp,C++和CLIPS語言來實現,其中CLIPS是本文介紹的重點。Lisp是一種函數式編程語言,一直以來都應用於AI領域而且取得了不錯的效果。與此相對,Prolog是一種聲明式語言,與面向過程的編程語言經過實現一個算法來解決問題的模式不一樣,它經過推理引擎來論證事實和關係。過程式語言面向‘How’,聲明式語言面向‘What’。另外,C++是一種很是高效而且高度優化的編程語言,可是它缺乏推理引擎,須要從零開始實現。
3. 應用領域
4. 知識庫系統的結構
5. 目前的趨勢
知識庫系統的開發並無統一的標準,儘管如此,ESPRIT項目提供了一套方法論來開發知識庫系統,簡稱CADS(Knowledge Acquisition Design System)。在KADS中,構造知識庫系統基本上就是一種基於模型的活動,其中一個最重要的特性就是構造一個與具體實現無關的、完備的知識模型。KADS是面向結果的方法論,產品中每一個開發活動產生的結果是整個項目控制和方向的惟一檢驗標準。
2、CommonKADS方法論
1. 歷史簡介
CommonKADS是KBS工程中領先的方法論,已經被許多公司和高校基於歐洲ESPRIT項目集進行開發和測試過。如今是知識庫系統開發的事實標準,而且被歐洲、美國和日本的不少公司所採納、使用。CommonKADS同時也提供方法來進行知識任務和進程的詳細分析,下圖展現了知識庫系統方法論的演進過程:
CommonKADS起源於KADS-I項目----一個擁有悠久歷史和衆多技術人員參與的項目----儘管這套方法論缺乏形式標準。從1990年冬季開始,一個新的方法論具備商業可行性而且覆蓋了KBS整個生命週期,它就是CommonKADS。
2. 模型套件
模型套件在知識工程中提供任務分解,來減小複雜性。當考慮構造一個模型的時候,其餘方面能夠延後考慮。CommonKADS涉及的模型以下圖所示:
在這些模型中,本篇文章將重點關注Knowledge Model,其結構以下圖所示。
² Domain knowledge:描述了關於應用領域的實體和內容,和其餘知識類型的使用無關。
² Inference knowledge:處理不一樣類型的推理(在任務解決過程當中被專家使用的論據)。一個推薦由輸入和輸出定義----也就是它們的領域角色。推理不容許進一步的分解。
² Task knowledge:指明瞭任務的目標以及解決方法。
² Problem solving methods:描述了任務解決方法,肯定遞歸分解的子任務以及它們的執行順序。
² Strategic knowledge:說明了任務執行計劃,爲了設計更加靈活的系統而加以考量。
3. 角色
和其餘的軟件項目同樣,須要人員來組織、管理和開發知識庫系統。在KBS的開發中,一共存在6種相關的角色,以下圖所示。
3、使用CommonKADS開發KBS
爲了理解以上說明的內容,咱們開發了一個用來展現專家系統特性的小型的圖書輔助應用。此應用的基本想法是根據讀者的年齡、受教育程度和興趣來推薦一本特定的圖書。此應用不是真正可應用的系統,可是加以修改能夠展現最基本的功能。所以,它能夠應用在圖書館或者書店中,來推薦讀者應該讀什麼類型的書籍。
1. 領域知識
描述了一個領域中的內容以及內容之間的關係,內容能夠表示成知識領域中的中心實體,咱們經過名字來識別內容,包括抽象的實體和具體的實體對象。它很像C++或者Java中的Class的概念。這些內容被表示成他們的屬性或者特性,經過類型和名字來識別;屬性是知識領域內容的原子表示。領域知識由下面三種元素組成:
1) 類圖
咱們使用UML語言來定義內容和屬性,也可使用其餘AI建模語言,如KIF,Ontolingua等。
完成建模以後,使用CML(CommonKADS Conceptual Modeling Language)語言進行編寫代碼。
Concept Person;
ATTRIBUTES:
Name: String;
Age: Int;
Stage: String;
Interests: String;
Education: String;
END CONCEPT Person;
CONCEPT Reading-type;
ATTRIBUTES:
Genre: String;
END CONCEPT;
CONCEPT Reader-type;
ATTRIBUTES:
Level: String;
END CONCEPT;
CONCEPT Book;
ATTRIBUTES:
Title: String;
Author: String;
END CONCEPT;
2) 表達式關係
表達式之間的關係以if…then的形式進行表現:條件表達式在前,賦值表達式在後。咱們假設她們之間的一種因果關聯關係,本例中展現的關係以下:
RULE-TYPE Abstraction-rules; DESCRIPTION: Abstract the age of a person ANTECEDENT: Person; CARDINALITY: 1; CONSEQUENT: Stage; CARDINALITY: 1; CONNECTION-SYMBOL: Abstracts; END-RULE-TYPE Abstraction-rules;
RULE-TYPE Genre-preferences; DESCRIPTION: Genre selection starting from the interests ANTECEDENT: Interests; CARDINALITY: 1; CONSEQUENT: Genre; CARDINALITY: *; CONNECTION-SYMBOL: Prefers; END-RULE-TYPE Genre-preferences;
RULE-TYPE Level-assignation; DESCRIPTION: Assigns a level according the education ANTECEDENT: Education; CARDINALITY: 1; CONSEQUENT: Level; CARDINALITY: 1; CONNECTION-SYMBOL: Assigns; END-RULE-TYPE Level-assignation;
RULE-TYPE Assign-book; DESCRIPTION: Assign books ANTECEDENT: Genre and Level; CARDINALITY: *; CONSEQUENT: Book; CARDINALITY: *; CONNECTION-SYMBOL: Final assignation; END-RULE-TYPE Assign-book;
3) 知識庫
知識庫經過以前定義的通用規則來獲取表達式對,下面展現了知識庫的一個樣本實例:
KNOWLEDGE-BASE Literary-assistant-base USES Abstraction-rules FROM literary-assistant-scheme; Genre-preferences FROM literary-assistant-scheme; Level-assignation FROM literary-assistant-scheme; Assign-book FROM literary-assistant-scheme; EXPRESSIONS /* Select stage */ Person.age <= 13 ABSTRACT Person.stage = CHILD Person.age > 13 AND Person.age <= 19 ABSTRACT Person.stage = TEENAGER Person.age > 19 AND Person.age <= 40 ABSTRACT Person.stage = YOUNG Person.age > 40 ABSTRACT Person.stage = ADULT /* Discriminate interests */ Person.interests = "Music" OR Person.interests = "Painting" OR Person.interests = "Cinema" OR Person.interests = "Sculpture" PREFER reading-type.genre = ART . . . /* Adjust reader level */ Person.education = SECONDARY AND Person.stage = YOUNG SELECT-LEVEL reader-type.level = ADVANCED Person.education = SECONDARY AND Person.stage = ADULT SELECT-LEVEL reader-type.level = ADVANCED Person.education = UNIVERSITARY SELECT-LEVEL reader-type.level = ADVANCED . . . /* Science section */ reader-type.level = CHILD AND reading-type.genre = SCIENCE SELECT-BOOK Book.title = "Arithmetics handouts" reader-type.level = BASIC AND reading-type.genre = SCIENCE SELECT-BOOK Book.title = "Basic arithmetics and geometry " reader-type.level = INTERMEDIATE AND reading-type.genre = SCIENCE SELECT-BOOK Book.title = "Derivatives and integrals" reader-type.level = ADVANCED AND reading-type.genre = SCIENCE SELECT-BOOK Book.title = "Differential equations" . . . END KNOWLEDGE-BASE Literary-assistant-base;
2. 推理知識
推理知識是指不須要進行分解的子任務的集合,它們是任務執行過程當中的原子論證步驟和元素。經過指明使用的函數以及函數的輸入和輸出來描述推理知識。須要注意的是,推理的描述並無暗示它們是如何執行的,由於它們很是依賴特定的應用和領域。
1) 推理模式
就像以前解釋的那樣,推理是一個基本的論證步驟,可是它依賴於領域角色:
INFERENCE Abstract ROLES INPUT: Person; OUTPUT: Stage; STATIC: Abstraction-model; SPECIFICATION: "Abstracts the age of a person" END INFERENCE Abstract;
INFERENCE Select-genre ROLES INPUT: Interest; OUTPUT: Genre; STATIC: Preferences-model; SPECIFICATION: "Selects a genre according the user's interests" END INFERENCE Abstract;
INFERENCE Select-level ROLES INPUT: Education,Stage; OUTPUT: Level; STATIC: Level-model; SPECIFICATION: "Selects a level according the user's education and stage" END INFERENCE Abstract;
INFERENCE Select-book ROLES INPUT: Genre, Level; OUTPUT: Book; STATIC: Book-selection-model; SPECIFICATION: "Assigns a book according the user's level and selected genres" END INFERENCE Abstract;
2) 領域連接
完成推理知識的建模以後,有必要來描述它們是如何與知識領域的元素進行鏈接的,以下圖所示。
KNOWLEDGE-ROLE Person; TYPE: DYNAMIC; DOMAIN-MAPPING: Person; END KNOWLEDGE-ROLE Person;
KNOWLEDGE-ROLE Abstraction-model; TYPE: STATIC; DOMAIN-MAPPING:Abstraction-rules FROM literary-assistant-scheme; ; END KNOWLEDGE-ROLE Abstraction-model;
KNOWLEDGE-ROLE Stage; TYPE: DYNAMIC; DOMAIN-MAPPING: Stage; END KNOWLEDGE-ROLE Stage;
KNOWLEDGE-ROLE Interest; TYPE: DYNAMIC; DOMAIN-MAPPING: Interest; END KNOWLEDGE-ROLE Interest;
KNOWLEDGE-ROLE Preferences-model; TYPE: STATIC; DOMAIN-MAPPING:Genre preferences FROM literary-assistant-scheme; ; END KNOWLEDGE-ROLE Preferences-model;
KNOWLEDGE-ROLE Genre; TYPE: DYNAMIC; DOMAIN-MAPPING: Genre; END KNOWLEDGE-ROLE Genre;
KNOWLEDGE-ROLE Education; TYPE: DYNAMIC; DOMAIN-MAPPING: Education; END KNOWLEDGE-ROLE Education;
KNOWLEDGE-ROLE Stage; TYPE: DYNAMIC; DOMAIN-MAPPING: Education; END KNOWLEDGE-ROLE Education;
KNOWLEDGE-ROLE Level-model; TYPE: STATIC; DOMAIN-MAPPING:Level-assignation FROM literary-assistant-scheme; END KNOWLEDGE-ROLE Level-model;
KNOWLEDGE-ROLE Level; TYPE: DYNAMIC; DOMAIN-MAPPING: Level; END KNOWLEDGE-ROLE Level;
KNOWLEDGE-ROLE Genre; TYPE: DYNAMIC; DOMAIN-MAPPING: Genre-and-Level; END KNOWLEDGE-ROLE Genre;
KNOWLEDGE-ROLE Level; TYPE: DYNAMIC; DOMAIN-MAPPING: Genre-and-Level; END KNOWLEDGE-ROLE Level;
KNOWLEDGE-ROLE Book-selection-model; TYPE: STATIC; DOMAIN-MAPPING:Assign-book FROM literary-assistant-scheme; END KNOWLEDGE-ROLE Book-selection-model;
KNOWLEDGE-ROLE Book; TYPE: DYNAMIC; DOMAIN-MAPPING: Book; END KNOWLEDGE-ROLE Book;
3. 任務知識
任務表明着一個整體目標,爲了達到這個目標,咱們使用‘method’來對基本任務進行子任務分解,使用‘control’對子任務在運行時進行排序。在對任務進行遞歸分解的時候,咱們把不能繼續分解的、位於葉子節點的子任務稱爲‘inferences’。‘control method’知識是最終實現一個任務的必要條件,它清晰地、精確地、明確地指明瞭連接到各個‘inferences’的過程。下圖展現了任務、子任務分解和最終的‘inferences’:
TASK Literary-assistant GOAL: "Advice a book to a reader"; ROLES: INPUT: Person: "A person who wants to read a book"; OUTPUT: Book: "Some books to read"; SPEC: "Assign a book to a person according to its education and age"; END TASK Literary-assistant; TASK-METHOD Literary-assistant-sequential; REALIZES: "Literary assistant"; DECOMPOSITION: INFERENCES: Abstract, Select-genre, Select-level, Select-book; TRANSFER-FUNCTIONS:; ROLES: INTERMEDIATE: Abstraction-model: Preferences-model: Level-model: Book-selection-model: CONTROL-STRUCTURE: Abstract(+Stage,-Person,-Abstraction-model); Select-genre(+Genre,-Interest,-Preferences-model); Select-level(+Level,-Education,-Stage,-Level-model); Select-Book(+Book,-Genre,-Level,-Book-selection-model); END-TASK-METHOD Literary-assistant-sequential;
4、一個簡單的實現
咱們選擇使用CLIPS來實現一個例子,CLIPS是起源於1985年的一個專家系統,具備如下的特性:
下面是本文案例的所有源代碼,基於CLIPS編寫。
; Select level according to education (defrule select_level ?f1<-(start_level) (person (education ?edu)(stage ?stg)) (level (education ?edu)(stage ?stg)(level ?lev)) => (assert (reader-type (level ?lev))) (retract ?f1) ) ; Find interests in interest list (deffunction has_person (?mat $?interests) (return (member$ ?mat $?interests)) ) ; Select genre according to interests (defrule select_genre (interests) (person (interests $?interests)) (matter (interest $?cat)(genre ?genre)) => (bind ?i 1) (while (<= ?i (length$ $?interests)) (bind ?mat (nth$ ?i $?interests)) (if (has_person ?mat $?cat) then (assert (reading-type (genre ?genre))) ) (bind ?i (+ ?i 1)) ) ) ; Select book according to interests (defrule recommend_book (reader-type (level ?level)) (reading-type (genre ?genre)) (category (level ?level)(genre ?genre)(book ?book)) => (printout t "According to this data, you should read: " ?book crlf) )
下圖展現了使用CLIPS編寫的應用的運行結果。
注意:若是輸入了系統不能匹配的年齡或者受教育程度,系統將不會返回任何結果。例如:當你的年齡是50歲可是受教育程度是‘幼兒園’時,系統將不會給你推薦任何的圖書。
5、內嵌C++
下面的代碼展現瞭如何將CLIPS內嵌到C++的項目中。
#include <iostream> extern "C" { #include "clips.h" } using namespace std; int main(int argc, char* argv[]) { InitializeEnvironment(); Load("literary assistant.clp"); // Insert the CLIPS source code here Reset(); Run(-1L); cin.get(); return 0; }
6、進一步閱讀和引用