人工智慧知識推理--大數據與深度學習之下,不應該被拋棄的經典方法
一種基於漢語類自然語言的知識表示及邏輯推理方法研究
本文基於經典人工智慧的一階邏輯、產生式系統等思想,試圖仍用經典的人工構建智能模式的方法,設計知識表示、邏輯推理以及機器學習為一體的綜合系統,用於智能人機交互、智能機器人系統、自然語言交互等....(因為,在大數據與深度學習盛行的今天,經典的人工智慧方法或許並不是毫無價值,在知識表示和邏輯推理等方面,或許經典的方法我們仍然沒有嘗試到機制,甚至遠遠沒有,而深度學習或許很長一段時間之內,仍無法完美解決高效推理、高效學習、高效交互的智能系統問題....)
...................................
近年深度學習技術取得重大發展,甚至改變了整個人工智慧領域的技術發展方向,深度學習通過構建大規模的神經網路,搜集海量的信息資源,經過訓練後的神經網路可以在某些領域有很出色的表現,如語音識別、圖像識別、自然語言處理等領域,該方法的特點是不再需要人為建立結構化的知識表示系統,知識是經過海量信息訓練後直接融合在網路中,這使得經典的知識表示和邏輯推理等思想在人工智慧領域的作用逐步弱化。
然而,深度學習終究不能解決人工智慧的所有問題,以其在自然語言處理領域的表現為例,成功的應用主要是機器翻譯和自動知識問答等領域,而機器翻譯相當與對不同語言空間完成映射,知識問答相當與在問題空間和答案空間建立匹配模型,它們都不代表機器人真正理解了語言的含義,也無法進行深層的推理和思考。實際上,即使是經典的一階邏輯、產生式系統等方法所具備的能力,仍是深度學習目前難以做到的,因為經典的規則推理系統能夠動態學習規則,而且系統能在多項規則的關聯作用下級聯推理,挖掘信息的深層聯繫,雖然此類系統由於目前難以構建大規模的知識系統,限制了其表現水平,但其仍然是非常接近人類大腦思考機制的系統,所以仍是值得深入研究的問題。
本文方法最大的優點在於:系統用於知識表示、邏輯推理和語言交互所採用的是同一種載體—CQNL,當人類以該語言與機器人交互,並令其學習新知識時,只要符合特定的句法格式,該語句直接被記錄進現有的語句庫中即相當於完成了整個學習過程,當機器人對新的問題求解或執行新任務時,新錄入的語句知識和原有的語句知識將無差別地被推理演算法使用,且系統能自動解析出語句知識庫中所包含的大量隱含邏輯信息,也就是說,一條合法的CQNL語句被輸入的同時,也就被系統真正地「理解」了,這意味著系統具有非常強大的學習能力,而通過CQNL語句,同樣可以對系統提出各種求解問題和下達命令,知識表示、邏輯推理和語言理解過程在本系統中被高度地統一了。最重要的是,本文提出的CQNL語法結構已經比較接近漢語自然語言形式,雖然句法類型比較單調,但經過文中的分析和驗證,該語言系統已具備強大的知識表達能力,只要稍加訓練,任何了解漢語的非專業人員均可以掌握該語言並且與系統進行交互,從而完成知識庫的建立和命令的指定。
1知識系統構成
以漢語類自然語言(CQNL語言)為載體,實現了知識表示、邏輯推理、語言解析、智能規劃等技術的集成,圖1給出了CQNL知識系統構成,系統包括本元知識庫、邏輯推理知識庫和擴展知識庫3部分:
本元知識庫:本元知識是指系統內在認知的單詞或邏輯,該部分知識是在代碼級層面維護的,是永遠不變、不可學習的,類似於傳統推理演算法中表示包含關係或邏輯關係的基本算符,在本系統中將對應各個關鍵的漢語單詞,但本元知識不僅限於此,還包含了對一些特定句法結構、隱含邏輯的預設認知。本元知識的選擇對系統的學習能力有決定性影響,適當引入本元單詞或邏輯可大大提高系統知識表示能力和學習能力,但由於本元知識無法再學習,因此,為了避免系統學習潛力,本元知識應盡量選取最頂層、最抽象的概念或最根本性的邏輯。
圖1 CQNL知識系統構成
邏輯推理知識庫:邏輯推理知識庫是系統的核心,由CQNL語言組成,可動態學習和擴充,並作為推理和智能規劃的知識基礎,該部分是連接系統各環節的中樞,因此,邏輯推理知識庫及CQNL語言的設計,對系統的各項性能指標有至關重要的作用。
系統知識均採用語句形式描述,推理過程主要依賴基於規則的推理以及基於本元知識中隱含邏輯的推理,從基於規則的推理過程看,系統有些類似於產生式系統,但不同的是,系統中規則知識及非規則類知識均有一系列可拆分的單詞按照一定的句法格式組成,推理過程中可自動分類句型,提取子句,解析每個片語、單詞、關鍵性連接詞,並支持各種形式的匹配和置換,通過各單詞的有效排列和重組,系統的知識表示能力和推理能力極大及增強,此外,部分本元知識庫中的隱含邏輯引入,更加提升了系統的綜合能力。
數據知識庫:數據知識庫是只系統知識表示和推理過程必要的數據文件、資料庫,甚至是圖片、聲音、輔助演算法庫等資源,該部分知識由邏輯推理知識庫連接和調配,可在CQNL語言中以單詞、對象或屬性等形式出現。與前兩部分相比,該部分與系統整體耦合關係較小,可在設計邏輯推理知識庫時留有兼容擴展數據知識庫的介面,後續逐步完善即可。本文對數據知識庫僅引入概念,暫不作深入討論。
2 CQNL語言結構
2.1 CQNL單詞
CQNL單詞是組成CQNL語言的基本單元,包括本元關鍵詞、定義單詞和非標單詞3部分:
1)本元關鍵詞
本元關鍵詞(後文簡稱「關鍵詞」)只系統直接認知的單詞,無需定義、不可學習,系統中包括「如果、那麼、名詞、種類名稱、實例名詞、是、是一個、是一種、的、和、個、被包含於、屬性、屬性單位、屬性值、屬性包含於、屬性值為、屬性單位為、相對稱謂、相對稱謂主體、某__、而且、或者、非、數值、大於、小於、等於、大於等於、小於等於、不等於、事件模板、發生事件」等單詞,同時還包括:「(、)、{、}、;、+、-、*、/」等符號,主要用來引導推理規則、名詞定義、屬性定義等各類語句。
2)定義單詞
定義單詞是指通過本元關鍵詞間接定義的單詞,下面一一介紹可以用來定義單詞的語句類型,及其對應的本元關鍵詞用法:
(1)名詞定義:
名詞定義利用關鍵詞「是一個」和「是一種」來定義,名詞包括實例名詞和種類名稱兩種,系統約定以「是一個」來定義的名詞為實例名詞,以「是一種」來定義的名詞為種類名稱,可以從「實例名詞」、「種類名詞」這兩個頂級的本元關鍵詞出發,按照類別的樹形結構,依次向下定義各個名詞,例如(以分號表示句子結尾,而不是換行):
生物 是一種 種類名詞;植物 是一種 生物;
動物 是一種 生物;人類 是一種 動物;
樹木 是一種 植物;男人 是一種 人類;
白楊樹 是一種 樹木; 李四 是一個 男人;
小白楊1 是一個 白楊樹; ...
根據系統約定,當要把某個單詞直接定義成種類名詞時,應該也採用關鍵詞「是一種」,所以上面例句中第一句採用「生物 是一種 種類名詞」,而不是「生物 是一個 種類名稱」,當定義好某個種類名詞後,即可再次利用該名詞定義其它名詞,例如例句中的「植物 是一種 生物」,相當於把單詞「植物」定義成了種類名稱,而在「男人」這個種類名詞被定義後,後續語句「李四 是一個 男人」,相當於將單詞「李四」定義成了一個實例名詞。當採用上述方式定義各種類名詞和實例名詞後,同時也相當於指定了名詞類別間樹型關係結構,例如上面的例句中相當於同時指明了「李四 是一個 人類」、「李四 是一個 生物」等一系列的隱含的含義。
(2)屬性定義:
利用關鍵詞「屬性包含於」,為某個其它的單詞定義屬性,需要關聯屬性的單詞應該主要集中在名詞(但系統並不作強制限定),屬性定義方式如下:
身高 屬性包含於 人類; 體重 屬性包含於 人類;
直徑 屬性包含於 樹木; 壽命 屬性包含於 生物;
顏色 屬性包含於 植物; ...
當採用以上方式定義屬性後,同時也指定了屬性與對象之間的關聯,例如語句「身高 屬性包含於 人類」,相當於定義了單詞「身高」是一個屬性,並且是關於對象「人類」的屬性,當指定屬性關聯後,可以通過片語(詳見後文)的形式來訪問特定屬性,如「(李四 的 身高)」(註:因為「身高」已經指定為「人類」的屬性,而李四又被定義為人類,故系統自動認定「身高」同時也是「李四」的合理屬性)。
(3)數值項:
數值項單詞包括數值常量和數值表達式,其中數值常量不需要定義,當系統檢測到的某個分離單詞中所包含的所有字元中均為數字、小數點或負號,則該單詞自動被認定為數值常量,例如:
(小白楊1 的 直徑) 是 0.25 米 的;
上句中以「的」字結尾,是系統對屬性值賦值句型的約定形式(詳見後文),此外,句中的單位「米」也是需要定義的,定義形式見下文第(5)小節。
(4)屬性值定義:
此處介紹的屬性值定義,指的是非數值型(文本型)屬性值,對於數值類屬性值,無需單獨定義,直接按照第(3)小節例句的形式為屬性賦值即可。對於文本型屬性值,以關鍵詞「屬性值為」引出,定義格式如下:
紅色 屬性值為 顏色; 綠色 屬性值為 顏色;
例句中,「A 屬性值為 B」含義是「A 是 B 的 屬性值(之一)」,之所以將屬性值放在屬性前面,是為了突出被定義的屬性值(後文同理),屬性值與屬性間為多對一的對應關係;
(5)屬性單位定義:
屬性單位的定義以關鍵詞「屬性單位為」引出,具體方式如下:
千克 屬性單位為 體重;米 屬性單位為 直徑;
米 屬性單位為 身高;歲 屬性單位為 壽命;
同理,「A 屬性單位為 B」指的是「A 是 B 的 屬性單位」,不同屬性的屬性單位可以是相同的,例如例句中的單位「米」即被定義為「直徑」的單位,也被定義為「身高」的單位。
(6)相對稱謂及相對稱謂主體定義:
相對稱謂用來描述兩個獨立對象間的相對關係,如「A 是 B 的 哥哥」、「C 是 D 的 領導」、「E 是 F 的 財產」等,而句中的「哥哥」、「領導」、「財產」就是相對稱謂,而可以用相對稱謂表示其相對關係的對象稱為相對稱謂主體,如上面句中的「A、B、C...」,多數情況下相對稱謂主體應該集中在名詞範圍內,但系統也允許非名詞作為相對稱謂主體。相對稱謂定直接利用關鍵詞「是一種」(也可用「是一個」)定義,格式如下:
哥哥 是一種 相對稱謂; 財物 是一種 相對稱謂;
除直接定義外,還可間接定義:
親戚稱謂 是一種 相對稱謂;
社交稱謂 是一種 相對稱謂;
哥哥 是一種 親戚稱謂; 姐姐 是一種 親戚稱謂;
朋友 是一種 社交稱謂; 同事 是一種 社交稱謂;
相對稱謂主體定義格式如下:
人類 是一種 相對稱謂主體;
城市 是一種 相對稱謂主體;
當將某一個種類名詞定義成相對稱謂主體時,其所有子類將自動被認定為相對稱謂主體,例如上面句子將「人類」定義為相對稱謂主體,那麼「男人」、「李四」等各對象均自動成為合法相對稱謂主體。
3)「某字項」單詞:
以關鍵詞「某」和其它已定義單片語合,可以構成「某字項」,例如「某男人」、「某植物」、「某屬性值」、「某相對稱謂」等,「某字項」可與多種已知類型單詞聯用,主要用於規則語句的定義或問題提問,當一個句子中出現多個同類別的「某字項」單詞,但又有不同指代時,可用「某**_N」的形式來表示,N表示在本條語句中的「某字項」單詞的編號。
4)非標單詞:
非標單詞只的是CQNL語言中既不是關鍵詞,又不是已定義的單詞,相當於生詞,CQNL語句中同樣允許此類生詞的出現,但推理過程對非標單詞的支持僅限於直接匹配,而對其它單詞,則支持更深層次的解析和處理。
2.2 CQNL片語
CQNL語句中,除了單詞外,還允許出現CQNL片語,該片語按特定的語法條件構成,在推理過程中有著重要的作用。各片語必須以小括弧或化括弧括起,包括以下幾類:
1)屬性描述型片語:
描述已定義對象的特定屬性,形式如下:
(李四 的 身高) ; (小白楊1 的 直徑) ;
採用「對象」+「的」+「屬性」的結構形式定義,此外,作為合法的片語,要求屬性和對象之間必須已定義鏈接關係(見前文)。
2)修飾型片語:
修飾型片語是指在名詞前冠以一個或多個修飾短語構成的片語,修飾可以是對對象的形容,也可以是對對象取值的限定。被修飾的單詞一般應為種類名詞,因為對於實例名詞,其名稱本身就相當於已經精確指出了特定目標,無需再根據修飾詞限定其範圍。修飾型片語定義格式如下:
(桌子1 上面 的 蘋果) ;(顏色 綠色 的 樹木) ;
(高大 的 男人) ;(直徑 大於 0.3 米 的 樹木) ;
系統還允許定義任意多項修飾的片語,如:
(桌子1 上面 的 新鮮 的 顏色 綠色 的 蘋果) ;
需要說明的是,作為合理的片語,被修飾的單詞與修飾詞之間仍需定義其修飾關係,定義方式見下文。
3)相對稱謂型片語:
利用上文給出的方式定義相對稱謂和相對稱謂主體後,即可使用相對稱謂型片語,格式如下:
(李四 的 哥哥) ;(李四 的 財物) ;
4)混合型片語:
以上各片語類型可以混合搭配,構成混合型片語(為了區分,我們將上面幾種片語類型稱為單純型片語),混合型片語格式如下:
((桌子1 上面 的 顏色 綠色 的 蘋果) 的 重量) ;
(((李四 的 哥哥)的 領導) 的 身高) ;
作為混合型片語,各級括弧的對應關係必須準確,通過各種修飾的組合,混合型片語能夠表示非常寬泛的含義。
5)數值表達式:
數值表達式以花括弧項的形式出現,內部可包括數學運算符及小括弧等輔助符號,例如:
{10.0+20.5};{(12.5+16.8)*2.0};
此外,數值表達式內還可以包括屬性值的文本表示形式,如:
{(李四 的 身高)*2.0 + 1.5};
{(((李四 的 領導) 的 身高)+(李四 的 身高))/2 };
2.3 CQNL語句
CQNL語句(簡稱語句)是構成語言的主體,系統包括多種句型格式,分類介紹如下:
2.3.1 定義句型:
包括名詞、屬性、屬性單位、屬性值、相對稱謂、相對稱謂主體等各類定義語句,各定義句型已在2.1節介紹。其中名詞種類定義「是一個/是一種」是應用最多的,可將眾多名詞概念描述成概念樹(見2.1節中的名詞定義),此外,名詞定義允許出現多對多的關係,用來表示概念的多種類別體系劃分,如:
貓 是一種 貓科動物 ; 貓 是一種 哺乳動物 ;
貓科動物 是一種 動物 ;哺乳動物 是一種 動物 ;
2.3.2 包含關係句型:
用來描述兩個概念間的包含關係,為規範化推理,統一用關鍵詞「被包含於」引導,即如果要描述「A 包含 B」的關係,也統一寫成「B 被包含於 A」,例如:
北京 被包含於 中國 ; 蘋果A 被包含於 蘋果集K ;
包含關係句型描述形式與上節介紹的名詞種類定義句型接近,同樣可以描述一個樹型網路,並且允許多對多的描述關係,可用來描述地域、集合等概念的從屬關係。應注意區分包含關係與種類定義句型間的區分,包含關係用來連接具有從屬關係但又不是類別從屬關係的概念,通常句子兩端均為實例名詞,而名詞種類定義句型的兩端至少有一個是種類名詞。
2.3.3 相對稱謂描述句型:
相對稱謂描述句型用來描述對象間的相對關係,如:
李二 是 李四 的 哥哥;手錶A1 是 李四 的 財物;
印表機1 是 電腦1 的 指定外設;
北京 是 中國 的 首都;
上面的「哥哥」、「財物」、「指定外設」等詞是必須按照上文格式定義的相對稱謂,而句中被描述相對關係的對象也需定義成相對稱謂主體,從上面例句可見,此類句型可靈活描述人與人、人與物、物與物間的相對關係,當指定相對關係後,便可在其它句型中利用片語對具有相對稱謂關係的對象互相間接指代。
2.3.4 廣義定義句型
廣義定義句型是指由「單詞/片語+是/是一個/是一種+單詞/片語」格式構成的句型,即句子的中間由關鍵詞「是」、「是一個」或「是一種」連接,兩端分別為單詞或片語,按照單詞對單詞、單詞對片語、片語對單詞,可將其分為3類,關於片語對片語,由於變化過於複雜,無法完整解析,系統將其歸結為非標句型(見下文)處理。在此類句型中,由「是一個/是一種」作為連詞的句型中,一部分是與上文的定義句型有交叉的,即涵蓋了名詞定義的句型。廣義定義句型一般在與規則和提問句型聯用(見下文)時,才能充分體現其多變性和靈活性,而作為獨立句型的情況,此處僅給出單詞對單詞句型的舉例:
密碼 是 abc ; 答案 是 35 ;
該句型可用於概念的等效代換和轉義。而對於含有片語的廣義定義句型,在獨立句型中應減少使用,即使有,系統也將先對其進行預處理,將片語求解並化簡,對於無法化簡的情況,則按非標句型處理。
2.3.5 屬性賦值句型
屬性賦值句型是為各類對象的屬性指定取值的過程,該句型在知識庫中的使用頻率將是非常高的,為方便推理過程,將其格式規範化為「片語+是+修飾子句+的」,句中的片語用來指定特定對象的特定屬性,片語內部的對象仍然可以嵌套為混合型片語,修飾子句可以由一個或多個單片語成,同時約定屬性賦值型語句必須以「的」字結尾。定義格式如下:
(蘋果A1 的 顏色)是 綠色 的;
(蘋果A1 的 重量)是 0.1 千克 的;
(李四 的 身高)是 1.75 米 的;
系統將對象的屬性值分為數值類型和文本類型,描述時無需特殊指明,系統在推理解析過程根據屬性值描述語句自動辨別類型,當屬性值描述語句中存在單獨的數值常量或數值表達式時,則被認為是數值類型屬性,否則,認為是文本類型屬性。對於數值型屬性,修飾子句中可同時包含屬性單位,單位名稱需經過定義,對於文本型屬性,其屬性值應為獨立單詞,且經過定義,此外,對於數值類型屬性,屬性描述子句還可包含「大於」、「小於」等不等式關係描述關鍵詞,例如:
(蘋果A1 的 重量)是 大於 0.1 千克 的;
(蘋果A2 的 重量)是 小於等於 0.2 千克 的;
上述對屬性值約束範圍的描述均是被推理函數本元認的(詳見後文)。當屬性類型為文本型時,也允許用多個單詞來描述屬性,如:
(蘋果A1 的 位置狀態)是 桌子B 上面 的;
但此時的屬性描述短句「桌子B 上面」中的各單詞變化情況較多,並不是嚴格的屬性值類型,因此利用規則或問句指代該知識時會有一定約束,不能用「某屬性值」指代。
2.3.6 修飾句型
修飾語句以「被修飾對象+是+修飾子句+的」的格式構成,被修飾對象為名詞,修飾子句可以包括多個單詞,其定義格式如下:
李四 是 容易衝動 的;蘋果A1 是 鮮嫩可口 的;
蘋果A1 是 桌子A 上面 的;
桌子A 是 N03房間 裡面 的;
本屆班長 是 老師 親自 指定 的;
從例句看出修飾子句可以描述對象的特徵、對象間的相對位置以及其它更複雜的關係,某些情況下,修飾句型描述的含義也可以被屬性值描述句型代替,如上面例句中的前兩句可以改成「(李四 的 脾氣) 是 容易衝動 的」、「(蘋果A1 的 口味) 是鮮嫩可口的」,但兩種句型間是有區別的,屬性值描述要求嚴謹性、單值性,但系統對屬性值型知識描述也具有更強的理解能力,而修飾句型相對寬鬆靈活,但系統對其理解力度卻不如屬性值描述。
系統推理演算法對修飾句型的解析多數基於對修飾子句的直接匹配,而不去深究組成子句內的各單詞含義,修飾句型可用來描述其它句型所不能覆蓋的知識面,可極大程度地拓寬句型靈活性,但考慮系統對其解析深度不足,因此在條件允許的情況下,應盡量優先選擇其它標準句型,而不是修飾句型。當某對象被指定了修飾關係後,就可以用混合型片語來描述對象,如:
(鮮嫩可口 的 蘋果); ((N03房間 裡面 的 桌子) 上面 的 鮮嫩可口 的 蘋果);
在系統預先輸入前面修飾子句型知識的前提下,再用上面兩個片語檢索對象時,系統均能自動定位至對象「蘋果A1」。
2.3.7 非標句型:
非標句型是只不屬於任何其它已知類型的語句,系統仍然允許這樣的句型出現,其實上面介紹的修飾句型中,其修飾子句部分就可以認為是非標的,而本節的非標句型是指整個語句都沒有特定格式要求,系統對非標句型的理解程度最小,僅限於直接匹配層面的推理,而不支持各類隱含邏輯的處理,但更加靈活的句子形式仍使得非標句型是系統必不可少的補充。此外,通過規則的互相轉義,可以將現有的標準句型以特定規則映射成多種非標句型,從而是交換語言更加接近自然語言形式,本節不再給出非標句型舉例,詳見後文推理演算法中的論述。
2.3.8 基本規則句型
規則句型是系統中非常重要的一種句型,可以和前面的任意句型搭配使用,該句型是推理的關鍵,由關鍵詞「如果」
和「那麼」引導,基於規則語句的推理過程類似於產生式系統,但是通過和前面眾多形式的句型搭配,並通過對「某字項」以及片語的支持,使得系統能夠描述的邏輯規則非常豐富,這將極大程度地提高系統的知識表示和邏輯推理能力,但如果對規則句型的使用形式全無限制,將導致推理過程的難度是無法想像的。因此,須對規則句型的使用範圍和原則作出適當限制,本節介紹的基本規則句型,是對使用條件限制較嚴格的,但也是最通用的,兼容系統中的任何推理演算法,基本規則句型用來描述系統的全局規則庫,具有海量性、系統性。
1)系統推理原則介紹
為更好地理解規則句型及其使用原則,此處首先簡單介紹系統整體推理原則:
(1)封閉推理假設:系統採用封閉推理原則,即當某問題求解不到正確匹配的解時,則認為該問題的答案是否定的。
(2)逆向推理與正向推理:本文介紹的推理以逆向推理為主,因為如果規則庫中存在大量的不同類型的規則,過多的正向將導致推理過程的盲目性,實際上在建立了完整的知識語句和規則語句形式後,系統後續很容易擴展為逆向推理與正向推理相結合的形式。
2)基本規則定義形式舉例
下面分別列舉規則句型與其他句型的聯用情況:
與定義句型聯用:
如果 某物體 是一個 蘋果 那麼 … ;
與相對稱謂描述句型聯用:
如果 李二 是 李四 的 哥哥 那麼 … ;
如果 某人_1 是 某人_2 的 哥哥 那麼 … ;
與廣義定義句型聯用:
如果 開機密碼 是 某字元串 那麼 … ;
如果 (房間里 的 人) 是 李四 那麼 … ;
與屬性賦值句型聯用:
如果 (某人 的 性格) 是 溫和 的 那麼 … ;
如果 (某樹木 的 直徑) 是 大於 0.3 米 的 那麼 … ;
與修飾句型聯用:
如果 某物體 是 沉重 的 那麼 … ;
如果 某蘋果 是 桌子A 上面 的 那麼 … ;
與非標句型聯用:
如果 某人_1 不小心 撞 了 李四 一下 那麼 … ;
以上例句中,僅以「如果」引導的子句為例,給出了與各句型的搭配方法,實際使用中,「那麼」引導的從句一樣可以搭配各種句型,而且推理過程中個,前後子句中的「某字項」自動按同名的進行匹配,例如:
如果 某水果 是 鮮嫩可口 的 那麼 人類 是 喜歡 某水果的;
如果 (某蘋果 的 顏色) 是 綠色 的 那麼 某蘋果 是 未成熟 的;
如果 某人_1 是 某人_2 的 領導 那麼 某人_2 應該尊重 某人_1;
當句中同類別的「某字項」多於1個時,以「某+單詞+_N」的形式區分,推理系統將自動按照同序號同類別的「某字項」進行匹配。在規則從句的如果子句中,允許出現邏輯連詞「而且」、「或者」、「非」,從而構成複合邏輯子句,例如:
如果 某物體 是 某桌子 上面 的 而且 某桌子 是 某房間 裡面 的 那麼 某物體 是 某房間 裡面 的;
如果 某工件 是 必須 的 而且 非 某工件 是 房間_A 裡面 的 那麼 無法施工;
如果 某人_1 是 某人_2 的 弟弟 而且 某人_2 是 某人_3 的 爸爸 那麼 某人_1 是 某人_3 的 叔叔;
當如果子句存在邏輯連詞時,系統將首先根據邏輯連詞「而且」、「或者」對句子進行斷句,分成一系列子句,對於每個子句,再優先檢測句首的邏輯詞「非」,如存在,則對其後面引導的子句求解結果自動取反。
3)基本規則的使用原則
本節將給出基本規則使用過程的約束和限制,限制條件的選擇依據是為了在簡化推理和保留規則靈活性間尋求更好的折中,本節並未針對所有限制條件給出詳細解釋,部分原因將在後文推理演算法的介紹中有所體現。
(1)邏輯連詞使用原則:規則語句可以用邏輯連詞「而且」、「或者」、「非」構成複合句,但約定邏輯連詞「而且」、「或者」應主要集中在條件從句中,而盡量避免在結果從句中使用,因為系統採用逆向推理為主,需首先匹配結果從句,然後再轉化為對條件從句的求解,因此,當「那麼」從句存在一個邏輯子句而條件從句存在多個邏輯子句時,逆向推理過程恰好構成樹型搜索策略,減小了求解難度。此外,系統中應盡量用肯定邏輯,而減小對「非」邏輯的使用,因為系統採用封閉推理假設,容易將「不成立」和「不存在解」構成混淆,即使有不得不用「非」邏輯的情況時,也應謹慎,避免歧義。
(2)「某字項」的單詞類型限制
基本規則中「某字項」可以與種類名詞、屬性值、相對稱謂、相對稱謂主體聯用,但不能與屬性聯用,例如以下語句是合法的:
如果 (某蘋果 的 顏色) 是 某屬性值 的 那麼 … ;
而以下語句是不合法的:
如果 (某蘋果 的 某屬性) 是 某屬性值 的 那麼 …;
(3)「某字項」與片語聯用的約束
基本規則語句的「如果」子句中,「某字項」可作為屬性引用片語的主語使用,如第(2)節中的例句1,此外,條件從句中的「某字項」要使用在修飾名詞型片語或相對稱謂型型片語中時,不能獨立使用,但當句中存在多個邏輯子句,並且前面某有效邏輯子句中已經出現過某字項,則允許使用,如以下語句是不合法的:
如果 (某桌子 上面 的 蘋果) 是 新鮮 的 那麼 … ;
如果 ((某人 的 哥哥) 的 領導) 是 嚴肅 的 那麼 … ;
而以下語句則是合法的:
如果 某桌子 是 房間A 裡面 的 而且 (某桌子 上面 的 蘋果) 是 新鮮 的 那麼 … ;
如果 (某人 的 年齡) 是 大於 20 歲 的 而且 ((某人 的 哥哥) 的 領導) 是 嚴肅 的 那麼 … ;
有些情況下,我們並不希望前面的邏輯子句引入任何附加限制,那麼可以直接利用重言句來引導,如:
如果 某桌子 是一個 桌子 而且 (某桌子 上面 的 蘋果) 是 新鮮 的 那麼 … ;
如果 某人 是一個 人類 而且 ((某人 的 哥哥) 的 領導) 是 嚴肅 的 那麼 … ;
以上介紹的都是在「如果」子句中的使用方式,而在「那麼」從句中個,對片語中的「某字項」限制更加嚴格,僅允許在屬性短語中出現,例如下句是合法的:
如果 某紅富士蘋果 是 成熟 的 那麼 (某紅富士蘋果 的 顏色) 是 紅色 的;
而以下句型則是不合法的:
如果 某水果盤 是 不幹凈 的 那麼 (某水果盤 裡面 的 水果) 是 不幹凈 的;
但是卻可以改寫成如下合法句型:
如果 某水果盤 是 不幹凈 的 而且 某水果 是 某水果盤 裡面 的 那麼 某水果 是 不幹凈 的;
從上面例句中看出,雖然基本規則句中對片語中的「某字項」有限制,但是卻可以通過各種句子變型來表達同樣的含義,雖然增加了句子長度,但是卻方便了推理過程,當然這些限制不是絕對的,而是與本文採取的推理策略有關,隨著推理機制的繼續優化和完善,規則的使用限制也將會逐步減少。
2.3.9 屬性值間接運算規則
許多情況下,我們想描述不同對象屬性的屬性值間的間接運算關係,從而根據部分已知條件,間接推算出其他隱含的各項數據,本節的屬性值間接運算規則語句就用來描述此類知識。之所以未把該規則統一歸於基本規則中,是考慮到屬性值相互引用時需要用到數值表達式、片語的混合使用,而且屬性值間的間易出現嵌套循環引用關係,系統將此類規則單獨分類,在推理函數中也為其設計單獨的邏輯分支,進行針對性處理,避免了規則間過於複雜的耦合關係。該句型由關鍵詞「如果數值屬性」引導,句型描述格式如下:
如果數值屬性 (李四 的 年齡) 是 某數值 歲 的 那麼 (李二 的 年齡) 是 {某數值+2} 歲 的;
如果數值屬性 (某集合 的 數量) 是 某數值_1 個 的 而且 (某集合 的 單體重量) 是 某數值_2 千克 的 那麼 (某集合 的 總體重量) 是 {某數值_1*某數值_2} 千克 的;
花括弧內的數值表達式計算公式目前可以使用加、減、乘、除等各項運算符號,如進一步完善推理演算法,可支持更複雜的數學運算,該規則句型的引入使得系統能夠有效表示數學運算型知識,與其它句型表示的邏輯型知識配合,將能表示更加廣泛的知識範圍。
2.3.10 事件描述語句
事件型知識僅在系統中的高層推理部分(見下文)被用到,主要用於智能任務規劃。前面各知識句型多為靜態知識,而本節給出的事件描述可用來描述一個動態過程,事件可以是一個或一系列動作引發,系統主要描述事件的啟動條件、執行過程和執行後果,事件描述知識語句包括對事件模板的描述和對事件實例的描述:
1)事件模板
事件模板由關鍵詞「事件模板」引導,按下列複合結構句型定義:
事件模板 [事件名稱] [事件描述語句] 如果 [事件觸發條件] 那麼 [事件引髮結果];
其中事件觸發條件可以包含多個邏輯子句,由關鍵詞「而且」或「或者」連接,事件引髮結果也可包含多個子句,只能由「而且」連接(為了保證結果的唯一性)。例如,我們可以用事件模板來描述機器人的某項能力:
事件模板 RA_桌間移物 機器人_RA 移動 某物體 從 某桌子_1 到 某桌子_2
如果 (某物體 的 位置狀態) 是 某桌子_1 上面 的 而且 (某桌子_1 的 高度) 是 小於 1.3 米 的 而且 (某桌子_2 的 高度) 是 小於 1.3 米 的 而且 (某物體 的重量) 是 小於 5 千克 的
那麼 (某物體 的 位置狀態) 是 某桌子_2 上面 的;
該事件模板的名稱叫做「桌間移動物體」,用來表示機器人_RA的一項能力,能夠將某物體從一個桌子上移動到另一個桌子上,但是考慮到機器人的能力上限,該物體的重量不能超過5千克,而且兩個桌子的高度都不能超過1.3米,事件執行後的結果就是物體的位置從桌子1的上面變成了桌子2的上面。需要注意的是,在描述事件發生前後對象的狀態變化時,應該用屬性描述的格式,如例句中的屬性「位置狀態」,而不是直接用修飾語句,因為針對屬性,系統求解時會自動保證其取值的唯一性,並且自動選用最新輸入的知識語句求解屬性狀態。
2)事件實例
當某個事件模板啟動條件被滿足,而且已經被執行時,就代表該事件真實發生了,事件實例語句由關鍵詞「發生事件」引導,一個事件模板可以衍生出任意多個事件實例,例如對應上面列舉的世界模板,可以發生以下實例事件:
發生事件 桌間移動物體 機器人A 移動 水杯1 從 白電腦桌 到 紅試驗桌;
發生事件 桌間移動物體 機器人A 移動 工具箱 從 紅試驗桌 到 繪圖桌;
3 CQNL本元認知邏輯
本元認知邏輯是系統本元知識中對邏輯的自動認知部分,該部分邏輯不需要任何規則語句的支持,由推理演算法自動解析和處理,可以理解為隱含形式的規則,不可學習或修改。系統將固定的、顯而易見的或難以用規則語句描述的邏輯設計成本元邏輯,由於直接得到了底層演算法的支持,使得本元邏輯推理比基於顯式規則語句的推理過程具有更高的推理效率。本元認知邏輯分類如下:
1)單詞類型的自動解析
系統中已定義的單詞類型包括種類名詞、實例名詞、屬性、屬性值、屬性單位、數值、相對稱謂、相對稱謂主體等類型,其中種類名詞和實例名詞又共同屬於名詞類型,部分單詞類型會有交叉,例如多數相對稱謂主體型單詞同時又是名詞類型。當採用上文介紹的各定義語句定義單詞時,系統將會自動解析單詞類型,供推理過程使用。
2)「是一個/是一種」邏輯處理
(1)間接從屬關係的自動認知
當採用「是一個」句型和「是一種」句型定義各個概念的從屬關係時,系統將自動進行間接從屬關係認知,即「A 是一個/是一種 B」以及「B 是一個/是一種 C」知識同時出現時,系統將自動認知「A 是一個/是一種 C」,系統可處理任意多級間接從屬關係。
(2)種類名詞與實例名詞的自動區分
當採用「A 是一個 B」句型定義單詞A時,A將被認定為實例名詞,當採用「A 是一種 B」句型定義單詞A時,A將被認定為種類名詞。
(3)單詞類型匹配
當採用「A 是一個/是一種 B」句型作為規劃描述或問題描述的子句時,如果A是一個已定義單詞,B是一個單詞類型名稱,而且B恰是A的單詞類型,那麼該子句邏輯自動成立。當A是實例名詞或種類名詞時,語句「A 是一個/是一種 名詞」同樣成立,此外,不論A為任何單詞類型,語句「A 是一個/是一種 單詞」成立,即系統隱含約定了「單詞」為所有單詞類型的頂級類型。
3)「某字項」的自動匹配
規則語句和提問語句中的利用「某字項」來指代一類單詞,當使用「某B」或「某B_N」指代時,系統自動提取有效詞根B,且對於任何滿足「A 是一個/是一種 B」的單詞A均可作為該「某字項」的有效匹配詞,需要注意的是,此處所指的「A 是一個/是一種 B」,同樣包含了上節介紹的對「是一個/是一種」句型的本元隱含邏輯處理,也就是說只要滿足B和A滿足間接從屬關係,或者B恰為A的單詞類型時,均可實現「某字型」的有效指代,同理,「某單詞」作為頂級指代單詞,可指代任意類型單詞。
4)包含關係自動認知
由「被包含於」引導的包含關係句型支持間接包含關係的自動認知,即「A被包含於 B」以及「B 被包含於 C」知識同時出現時,系統將自動認知「A 被包含於 C」,系統可處理任意多級間接包含關係。
5)屬性的隱含邏輯處理
(1)屬性值的自動分類
系統將對象的屬性分為數值類型和文本類型兩類,不需顯式定義,在為屬性指定屬性值時,如屬性描述子句為數值項加屬性單位構成時,則被認為是數值類型,否則認為是文本類型,如採用「(A 的 屬性B) 是 0.5 千克 的」句型為屬性賦值時,則屬性B自動被認為是數值類型,此外,用花括弧項表示的數值表達式代替句中的數值常量時,同樣被自動認定為數值類型屬性。
(2)屬性值的預設處理
當某對象的屬性值沒有對應的描述時,系統會自動根據概念從屬關係向上追溯,直到最頂層的概念,一旦發現對應的屬性描述,則直接作為該對象的屬性值,例如在系統中輸入以下知識:
(水果 的 營養價值) 是 豐富 的;
(蘋果 的 重量) 是 小於 0.5 千克 的;
蘋果 是一種 水果; 蘋果A 是一個 蘋果;
那麼當利用問句求解蘋果A的顏色或重量時,由於搜索不到直接針對蘋果A的對應屬性描述,系統將自動向上層概念追溯,並利用蘋果及水果的共性屬性描述給出解答。
(3)屬性值的不等式關係自動求解
對於數值類型的屬性,在描述屬性或提問屬性時,不僅可用等式關係,還可用不等式關係,系統求解過程將自動判定,並給出正確結果,例如在系統中輸入以下知識:
(蘋果A 的 重量) 是 0.3千克 的;
當對系統提問,求解「(蘋果A 的 重量) 是 大於 0.2 千克 的」,系統將求出命題成立,而當求解「(蘋果A 的 重量) 是 大於 某0.4 千克 的」時,系統將求出命題不成立,當求解「(蘋果A 的 重量) 是 某數值 千克 的」,將得出答案0.3,而當系統輸入以下知識:
(蘋果A 的 重量) 是 大於 0.3千克 的;
當對系統提問,求解「(蘋果A 的 重量) 是 大於 0.2 千克 的」,系統將求出命題成立,當求解「(蘋果A 的 重量) 是 大於 某0.4 千克 的」時,系統將求出命題不成立,當求解「(蘋果A 的 重量) 是 某數值 千克 的」,將得不到答案,因為系統僅可從等式關係遞推不等式關係,反之則無法遞推。
(4)屬性值的單值性
系統約定屬性值具有單值性,當同一屬性存在多項描述時,系統自動按最新輸入的知識語句求解(每條知識語句都自動記錄的輸入時間)。但對於數值類型的屬性,當存在多條不等式約束時,允許上界和下界並存,推理演算法自動獲取最新的上界和最新的下界描述作為屬性值求解依據。
6)修飾句型的隱含邏輯處理
(1)屬性值自動轉義
當規則句型的條件從句或著提問句型與修飾句型聯用時,而修飾句型的修飾子句又恰為主語對象的某個文本類型屬性對應的屬性值時,推理演算法將自動轉調屬性求解,例如在系統中輸入以下知識:
(桌子A 的 位置狀態) 是 房間裡面 的;
並且系統中存在如下規則語句:
如果 桌子A 是 房間裡面 的 那麼 ...;
當推理過程遭遇該規則時,條件將被觸發,該隱含規則的引入使系統在規則表示及提問過程中適當化簡語句,更接近自然語言形式。但該邏輯反過來並不成立,即以修飾句型來描述知識,系統無法為其自動鏈接到屬性值求解上,因為指代不明確。
(2)修飾句型預設處理
與屬性值的預設處理機制相同,修飾句型也支持預設處理,系統會自動根據概念從屬關係向上追溯,直到最頂層的概念,一旦發現對應的修飾句型,則返回成功,句型使用原理與屬性值求解情況類似,此處不再舉例。
(3)修飾句型的多值性
修飾句型可以由多個同類的語句共同修飾同一個對象,例如:
蘋果A 是 鮮嫩可口 的;蘋果A 是 美味 的;
蘋果A 是 優質 的; ...
即可以用任意多個修飾短句修飾某對象,而各修飾語句中可以有含義相近的情況,這與屬性描述的單值性約束是有明顯區別的,實際構建知識庫時,可利用修飾句型和屬性描述句型的兩種不同特點間的互補性,有效選擇知識句型,提高系統知識表示和推理能力。
7)片語自動解析
前面已介紹,系統支持靈活多變的片語結構,系統推理過程將根據片語中主詞與修飾詞間的詞性和相互關係,自動解析並求解片語含義,例如:
(天空 的 顏色);(彎彎 的 小河);(窗子 外面 的 風鈴);(體魄 強健 的 戰士);(李四 的 戰友);
例句中第1個片語表示對象與屬性的關係,第2、3個片語表示修飾關係,第4個片語表示利用屬性值修飾的關係(假設「體魄」已被定義為「戰士」的屬性),第5個片語表示相對稱謂關係,實際知識表示中,還可以出現個類片語的任意嵌套組合,只要小括弧的層次關係正確、連接詞「的」的位置使用合理、各屬性及相對稱謂等詞性被有效定義,系統就能自動逐級解析片語內容,提取主語及修飾部分,並根據主語及修飾子句的詞性及相對關係自動求解片語的最終指代(詳見推理演算法)。
8)「是」句型與「是一個/是一種」句型的通換處理
有些情況下,某些句型的語法即適合關使用鍵詞「是」,又適合使用關鍵詞「是一個/是一種」,例如「羚羊 是一種 動物」,也可以表示成「羚羊 是 動物」,因此系統引入隱含邏輯處理,在提問語句中,由「是」或「是一個/是一種」引導的句型中,當關鍵詞兩端均為獨立的單詞或獨立的片語時,推理過程可通換使用,該邏輯仍是為了提高系統在提問交互過程中的靈活性,但提問句型外,其它知識語句仍需按前文介紹的格式進行定義。
4 推理演算法設計
多種表示句型、「某字項」、片語以及各類規則語句的綜合使用,使得系統的推理演算法具有很高的難度,為提高可實現性,系統對推理演算法進行分層設計(如圖2),包括輔助演算法庫、底層推理演算法庫、中層推理演算法庫和高層推理演算法庫,其中輔助演算法庫實現知識語句的預處理以及句子結構的初步解析,底層推理實現本元認知邏輯的處理,中層推理實現基於規則的推理,並實現「某字項」的解析,高層推理實現正、逆向混合推理、句型轉義推理、任務規劃等推理內容,高層推理之上則是人機介面,實現知識學習、規則學習、問題提問等交互操作。
圖2 推理演算法結構
4.1 知識庫結構設計
4.1.1 單詞及語句
CQNL知識庫主體知識均採用語句格式描述,每條語句由多個單詞構成,因此,欲構建知識庫,需先給出單詞和語句的結構形式:
4.1.1 語句表示結構
語句結構包括語句主體、語句生效時間和虛構標誌:
1)語句主體:即描述語句的字元串,句子中各單詞以空格隔開,除單詞外,還可包含括弧、花括弧、分號、數學運算符等符號;
2)語句的生效時間:為每條語句指定了一個唯一的時刻,精確至毫秒,當系統推理過程搜索某問題的答案或某對象屬性的取值時,可能會遇到多解或矛盾的情況,此時推理演算法將依據知識來源的語句的時刻新舊進行取捨;
3)語句的虛構標誌:虛構標誌屬性用任務規劃演算法,演算法推理過程需動態將一些可能發生的情況加入知識庫中,統一參與推理,因此,需將新加入的知識語句設為虛構模式,用以與原知識庫中的真實知識進行區分。
4.1.2單詞庫、框架及索引表
雖然CQNL知識語句定義了完整的句型分類和語法格式,並可依此推出單詞類型,但推理過程中有可能會大量用到單詞類型判別,如果每次都搜索知識庫語句重新判定,耗時較大,因此,系統在知識庫結構中引入單詞庫,單詞庫中的單詞採用上節介紹的單詞結構表示,具有單詞類型項,系統會自動篩選知識庫中的相關定義語句,判斷各單詞詞性,並裝載於單詞類型項中,後續推理過程可反覆查詢使用,提高推理效率。
除單詞類型外,一些基本的邏輯,如「是一個/是一種」表示的類別從屬關係、「被包含於」表示的包含關係,這些基本邏輯在推理過程中被使用的頻率非常高,為了提高推理效率,系統引入基於框架的表示形式,將單詞類型、類別從屬和包含關係等最基本的邏輯作為框架的槽,並將框架結構與單詞庫關聯,且為單詞庫中的任何一個單詞都對應該通用的框架結構,如圖3所示,框架的單詞類型槽直接裝載對應的類型字元串,支撐推理過程快速檢索,「是一個/是一種」槽和「被包含於」槽的槽值直接裝載著單詞表中其它單詞的索引,利用不斷檢索單詞表中各單詞的級聯索引關係,推理演算法能夠快速求解概念類別從屬及包含關係子問題,此外,系統對框架的槽結構採用動態槽鏈表結構設計,即每個框架對象可鏈接任意多個槽,只要合理指明各個槽的名稱和槽值描述即可,該描述結構恰可支撐系統對類別從屬關係和包含關係實現多對多(見2.3.1)連接形式的需求,同時,動態可變的槽鏈表結構,也使得系統具有更高的升級潛力,可擴充添加其它類型的槽,當某單詞不需要框架中某個槽時,動態槽鏈表可直接省略相應數據項,從而節省內存空間。
圖3 知識庫的綜合索引表及框架表示
從框架知識表示的原理出發,我們當然可以為每個單詞定義更多的槽,例如用來表示某個對象的各種屬性,但系統面向通用設計,對象類型、對象屬性均是可動態學習的知識,不同對象的屬性很難預知,更難以統一,因此在框架的槽結構中暫未引入表示各屬性的槽,屬性推理過程仍靠動態解析知識語句獲取。當然,在將該系統應用於某一特定領域,用來表示某一類知識時,如果可提取該領域的共性屬性,則可擴展至系統的槽結構中,實現快速推理。
基於單詞庫結構,不僅實現了框架型知識表示,還為每個單詞建立了一個語句索引鏈表,分別鏈接至語句知識庫中每一個出現過該單詞的知識語句,這樣在推理過程中,根據將要搜索的知識語句的部分限定單詞,可在海量知識語句中快速定位搜索範圍,並匹配最終結果,極大程度地提高了知識檢索速度。
本系統採用的以語句為主體的知識表示形式,雖具有便於理解、交互和學習等優點,但推理過程需要不斷在各類語間中進行檢索和匹配,容易降低推理速度,而本節給出的知識庫結構設計,藉助單詞表、框架、語句索引表等手段,恰恰有效補充了系統推理效率方面的不足。需要說明的是,無論是單詞庫、框架還是索引表,均是知識表示的輔助手段,其中包含的所有信息均來源於語句知識庫,系統提供給用戶的交互界面僅限於語句層面,單詞庫、框架及索引表均由系統在推理過程自動建立並維護。
4.2 輔助演算法
輔助演算法用來實現句子字元串的查找、比較、預處理等操作,由於系統包含演算法較多,因此對於實現過程較簡單的演算法進行簡略介紹。
4.2.1 語句基本操作輔助演算法
1)演算法4.2.1:字元子串查找演算法
系統中包含多個字元子串查找演算法(統一指代),目的均是在知識語句中查找一段感興趣的字元子串,但細節功能各有不同,包括一般查找、括弧項之外查找、括弧項和引號項之外查找等模式,其中在括弧或者引號外查找,是指將語句中包含的括弧項或引號項作為整體考慮,而不進入其內部匹配,例如以下語句:
(桂林 的 風景) 是 迷人 的;
在語句中以括弧之外的模式尋找子串「迷人」,能夠成功,但查找子串「桂林」將失敗。本部分演算法實現:略。
2)演算法4.2.2:單詞的串類型檢測
根據入口單詞,檢測其串類型,此處的串類型並不是前文介紹的單詞類型,而是直接根據單詞字元串特點,將其分為文本類型、數值類型和其它類型,當構成單詞的所有字元單元均為漢字、字元、數字和下劃線等元素構成時,將被檢測為文本類型,當各元素均為數字、小數點或負號(僅限於首字元)時,將被檢測為數值類型,當各單元中出現上述內容以外的其它字元時,將被檢測為其他類型。
演算法實現步驟如下(為描述方便,演算法中將漢字、字元、數字和下劃線稱為合法字元,其餘字元稱為非法字元):
(1)提取首字元元素(當遇到漢字等雙位元組單元時,則整體讀取),如為合法字元或者為負號,則繼續,否則返回為其他類型;
(2)遍歷後續字元元素(仍自動認讀雙位元組單元),檢測各字元元素,遇到小數點以外的非法字元則返回為其它類型,否則記錄本字元元素類型,繼續;
(3)檢測到單詞結尾時,統計各字元元素類型,如首字元元素為負號或數字,且後續元素均為數字或小數點,則返回為數值類型,如首字元為數字或負號,但後續元素存在數字或小數點外的其它字元,則返回為其它類型,如首字元元素及後續各元素均為合法字元類型,且首字元不為數字,則返回為文本類型。
經檢測後,單詞的串類型檢測結果如表4.1所示。
表4.1 單詞的串類型檢測結果
單詞的串類型單詞舉例文本類型天空; _草地;某牛羊_1;小2哥;數值類型12.43; 100; -38.27;其它類型+;-;&A;他&她; #35;3)演算法4.2.3:獲取語句中下一個有效單詞
根據入口的語句字元串,提取句首的第一個有效AI單詞,當首個單詞為文本類型或數值類型時,則返回整體單詞(單詞的截斷以首次遇到空格或不合理字元為準),否則,僅返回第一個字元。該演算法實現原理與演算法4.2.2相近(演算法略),基於該演算法獲取以下語句中的首單詞:
桌子 前方 有一個 椅子; 12 + 24;
(紅色 的 玫瑰花); {(機器人RA 的 重量)};
將分別得到「桌子」、「12」、「(」和「{」;
4)演算法4.2.4:拆解語句中的單詞列表
該演算法將入口的知識語句全部拆解,拆成一系列的單詞列表並返回,並支持對小括弧項、花括弧項整體解讀的設置入口,任何一個入口標誌被置位則表示該括弧項整體作為一個單詞項處理,否則則拆開處理。演算法實現如下:
(1)建立初始單詞列表,個數設置為0;
(2)調用演算法4.2.3,獲取當前子句的下一個單詞;
(3)如果下一單詞為「(」且入口的小括弧整體讀取標誌被置位,則向後檢索對應的回括弧「)」位置,然後將整個小括弧項整體插入單詞列表,語句起始位置偏移至回括弧後一個字元;如下一單詞為「{」 且入口的花括弧整體讀取標誌被置位,尋找對應的「}」,採用同樣處理策略;否則,直接將演算法4.2.3獲得的單詞插入單詞列表,語句初始位置移動到該單詞的後一個字元;
(4)如果已經檢測至語句結尾,則返回,否則,將起始點移位後產生的新的字元子串作為句子入口,轉(2)。
在以上演算法的步驟(3)中,尋找小括弧或花括弧的對應回括弧時,需要考慮到括弧的嵌套使用,下面以小括弧的回括弧搜索過程為例,給出該搜索子演算法:
(1)遇到句首為「(」時,啟動演算法,定義括弧深度變數,初值設置為1,搜索起始位置為括弧後第1個字元;
(2)如當前子句的下一個單詞為「(」,則括弧深度加1,搜索位置後移一個字元,繼續搜索,如下一單詞為「)」則括弧深度減1,搜索位置後移一個字元,繼續搜索,如為其它單詞,深度不變,繼續搜素;
(3)當首次檢測到括弧深度變數為0時,搜索成功,返回最後的回括弧位置,當檢測到句子結尾,且括弧深度不為0時,搜索失敗,入口為非法語句。
將該演算法用於小括弧及花括弧的匹配搜索過程,嵌入單詞拆解演算法的步驟中,即可實現完整的單詞拆解,利用該演算法對以下語句進行拆解:
(大明 的 體重) 是 {(二明 的 體重)*1.2} 千克 的;
在設置不同的括弧整體讀取標誌後,得到結果如下表:
表4.2 語句的單詞列表拆解
入口設置拆解後單詞列表無整體讀取(;大明;的;體重;);是;{;(;二明;的;體重;*;1.2;);千克;的;小括弧
整體讀取(大明 的 體重); 是;{;(二明 的 體重);*; 1.2;};千克;的;花括弧
整體讀取(;大明;的;體重;);是;{(二明 的 體重)*1.2};千克;的;全部整體讀取(大明 的 體重);是;{(二明 的 體重)*1.2}; 千克; 的;5)演算法4.2.5:同級括弧深度內字元子串查找
該演算法可根據入口知識語句,以及指定的起始查找位置,在與起始位置同一級的括弧深度內檢索特定的字元子串,需藉助演算法4.2.3,在括弧深度檢測的機制上,與演算法4.2.4中的處理方式接近(演算法略),該演算法主要用於輔助其它推理演算法中對片語的解析過程,例如對下面語句:
(小李 和 (王阿姨 的 朋友) 的 鄰居) 從前 認識;
當調用該演算法在語句中搜素「的」,且搜索位置為單詞「小李」之後時,演算法將自動搜索到單詞「鄰居」前面的「的」的位置。
6)演算法4.2.6:語句化簡
該演算法用於在推理前對語句演算法進行化簡和歸一化處理,步驟如下:
(1)尋找分號位置,從分號後截斷,保留分號前子句(不包括分號),作為主句;
(2)去除子句的外層括弧;
(3)去除單詞的獨立括弧;
(4)去除子句的前後導空格。
以上各步僅給出了目標描述,略去了詳細實現過程,表4.3以某語句為例,給出了各步化簡後的結果,表格中的「&_&」符號並非真實存在,僅代表句子中含有前後導空格,在第(2)步化簡括弧處理過程中,僅當第一步處理後的結果子句中的外層括弧括起了整個語句時,才會去除外層括弧,而如果將語句改成「( (紅色) 的 玫瑰花 ) 很漂亮;」,則在第(2)步處理時將不會觸發外括弧化簡操作。本節的化簡操作並不僅僅是針對原始語句進行的,而是考慮到推理過程中經過語句的轉型、置換等操作,常會出現多餘的括弧或空格,因此,各推理子函數中常需調用該演算法,實現對子句的歸一化處理。
表4.3 語句化簡過程示意
原始語句( (紅色) 的 玫瑰花 ); ***第(1)步化簡後( (紅色) 的 玫瑰花 )第(2)步化簡後 &_&(紅色) 的 玫瑰花 &_&第(3)步化簡後&_& 紅色 的 玫瑰花 &_&第(4)步化簡後紅色 的 玫瑰花7)演算法4.2.7:語句格式化比較
將兩個入口的語句(模板語句和匹配語句)進行逐個單詞比較,並判斷是否匹配,並允許入口的模板語句中用「?」來通配指代任意一個有效單詞,或用「&*」通配指代任意子句,所有的通配指代項均會在出口字元串列表中返回,演算法實現如下:
(1)建立初始出口單詞列表,個數為0;
(2)依次調用演算法4.2.3,分別獲取入口模板語句和匹配語句的下一個單詞;
(3)如下一模板語句單詞為「?」,則直接將模板語句起始位置移至問號之後,將匹配語句起始位置移至下一單詞,並將匹配語句的當前單詞加入出口單詞列表;如下一模板語句單詞為「&」,則再次獲取其下一字元,兩字元連接後如為「&*」,則將匹配語句中剩餘子句整體作為一個單詞項,放入出口單詞列表,演算法返回匹配成功;如下一模板語句單詞和匹配語句單詞相同,則各自將語句起始位置移動到當前單詞後,演算法繼續,如不同,則返回匹配失敗;
(4)如模板語句與匹配語句已經同時達到句尾,則返回匹配成功,如僅有一句達到句尾,則返回匹配失敗,如均為達到句尾,則以新的起始位置構建子句,轉(2)。
基於該演算法,對以下兩個子句進行匹配:
模板語句:(? 的 叫聲) 是 ? 的;
匹配語句:(百靈鳥 的 叫聲) 是 動聽 的;
匹配後返回成功,且返回單詞列表「百靈鳥」和「動聽」,當利用演算法對以下兩個子句進行匹配:
模板語句:本次會議 的 目的 是 &*;
匹配語句:本次會議 的 目的 是 學習 雷鋒精神;
匹配後返回成功,並返回單詞項「學習 雷鋒精神」。
4.2.2 知識庫操作輔助演算法
1)演算法4.2.8:插入單詞至單詞表
向知識庫的單詞表中插入特定單詞,知識庫的單詞表按照單詞的字元串間比較結果進行有序存儲,以便於快速檢索,單詞插入過程採用二分法檢測插入位置,演算法略。
2)演算法4.2.9:單詞表中檢索單詞
在有序存儲的單詞表中,利用二分法快速查找特定是否存在,如存在,則返回單詞位置索引,演算法略。
3)演算法4.2.10:知識庫中插入知識語句
將知識語句插入至知識庫的句子集中,同時更新相關的單詞表、語句索引表及框架等內容,實現步驟如下:
(1)將語句插入知識庫句子集;
(2)調用演算法4.2.4,將語句拆解成單詞列表(同時拆解各括弧項),然後遍歷該句包含的所有單詞,進行簡單預處理並進行有效性檢驗,有效單詞利用演算法4.2.9檢測單詞是否在單詞表中已存在,如不存在,則在單詞表中插入該單詞;
(3)繼續遍歷語句中包含的各個單詞,針對各單詞,檢索其在單詞表中的索引,並依次遍歷各單詞對應的語句索引鏈表,在鏈表中增加對本語句位置的索引;
演算法中第(2)步中對拆解後的單詞預處理,是指對「某字項」單詞自動去除「某」字及後綴標號,提取有效詞根作為插入詞,有效性檢驗是指僅允許插入有效單詞,而對數值常量、符號等內容不進行操作。
4)演算法4.2.11:知識庫中刪除知識語句
在知識庫中刪除某知識語句,同時清除單詞表中相關的句子鏈接,但針對語句中的各單詞,不再將其從單詞表清除(因為單詞可能是由其它知識語句中引入的),演算法略。
5)演算法4.2.12:更新框架槽值
系統框架結構的槽包括單詞類型槽、「是一個」槽、「是一種」槽和「被包含於」槽,其中單詞類型檢測演算法涉及到某些其它推理演算法的調用,將放在後文介紹,本節僅實現其它三種槽的槽值更新。下面以「是一個」槽的槽值更新過程為例,給出演算法實現過程(其餘槽值更新過程同理):
(1)對於入口給定的某知識語句,首先檢測語句是否是「A 是一個 B」的句型,調用語句格式化比較演算法4.2.7,並設定模板句格式為「? 是一個 ?」,當入口語句與模板句型匹配成功,則演算法繼續,否則返回失敗;
(2)利用上步語句匹配中,兩個問號處獲得的匹配單詞,分別作為主索引詞和槽值單詞;
(3)利用主索引詞為入口,調用演算法4.2.9,查找單詞在知識庫的單詞表中的位置,然後在單詞對應的槽鏈表中插入節點,節點對應的槽名稱為「是一個」,節點對應的槽值為上步獲得的槽值單詞。
以上演算法僅針對一條特定的知識語句,檢測並更新知識庫中相應的槽值,實際應用過程中,遍歷知識庫中各語句,對滿足句型匹配條件的語句依次進行更新槽值處理,即可建立起完整的框架知識結構。
6)演算法4.2.13:格式化語句檢索
該演算法針對入口的某模板語句,檢索知識庫,返回所有滿足匹配條件的語句列表,該演算法將利用知識庫的單詞表對句子的索引機制,快速查找需要的語句。因為知識庫單詞表中每個單詞均對包含該單詞的所有知識語句進行了鏈接索引,因此只要求取入口語句各單詞對應的索引句子集合的交集,即可確定需要查找的語句集,演算法實現如下:
(1)調用演算法4.2.4,將入口語句拆解成單詞列表,並去掉「某字項」單詞;
(2)利用拆解後的單詞列表,依次調用演算法4.2.9,查找單詞在知識庫的單詞表中的位置,並去除查找失敗的單詞,僅保留單詞表中查找成功的有效單詞,構成查詢單詞列表;
(3)遍歷查詢單詞列表,查詢各單詞對應的語句索引鏈表,並選擇鏈接項最少的單詞所對應的語句索引鏈表,作為主遍歷索引表(選擇最小鏈接項的索引表是為了縮小搜索範圍,提高搜索速度);
(4)遍歷上步選中的主遍歷索引錶鏈接的句子,依次檢測各句子是否被查詢單詞列表中的所有單詞鏈接,只有當某語句被所有列表中單詞鏈接時,才能作為候選匹配語句。此外,在檢測的過程中,還要同時確保查詢單詞列表在表中的排序與在待匹配語句中的排序一致,為此,在知識庫的單詞表對應的語句索引鏈表中引入了單詞序號變數,記錄了單詞在語句中的位置序號,演算法在檢測某語句是否被查詢單詞列表中所有單詞鏈接時,將不斷動態更新最新鏈接單詞在語句中的序號變數,檢測下一單詞的鏈接關係時,必須保證其在語句中的序號大於上一單詞的序號才視為有效。匹配成功的語句,均加入到待返回的語句列表中。
(5)返回所有符合條件的語句列表集合。
演算法在第(1)步構建單詞列表時,去掉了「某字項」,表示針對「某字項」單詞不作交集約束,被找語句的對應位置上可以是任意單詞,甚至沒有單詞。
該演算法是支撐上層推理演算法的一個非常有用的演算法,推理過程中,可通過已經掌握的若干主要單詞,利用該演算法在知識庫中快速獲取感興趣的語句集合,提供的已知單詞越多,演算法定位越準確,搜到的句子集約小,然後在該子集內可繼續進行其它各項精確匹配和處理操作,這樣就避免了對知識庫中海量知識語句進行逐句篩選,極大提高了推理效率。下面舉例說明該演算法的推理結果,假設知識庫中存在以下知識語句:
桌子A 是 方形 的; 桌子B 是 圓形的;
桌子A 是 白色 的; 桌子B 是 白色 的;
(桌子A 的 高度) 是 1.1 米 的;
(桌子B 的 高度) 是 1.2 米 的;
然後利用該演算法對知識庫進行檢索,當設定入口模板語句為「桌子A 方形」時,演算法將所有符合「** 桌子 ** 方形 **」的句型全部檢出,也就是被檢索語句只要包含了模板中給定的單詞,而且各單詞出現的先後順序與模板給定的句子中的順序相同即可,而各關鍵詞間包括一個或多個其它連接詞時,仍然被視為成功匹配,那麼「桌子A 方形」模板語句檢索,將返回上述第1個例句,而利用模板語句「是 白色 的」檢索,將得到第3、4條例句,當利用模板語句「高度 是 的」檢索,將得到第5、6條例句。
檢索演算法中允許出現「某字項」單詞,但演算法將自動剔除「某字型」後再進行檢索,因此,某字型單詞在模板句子中並無任何實際約束,僅用於句子過渡,是句法更完整,例如用「某桌子 的 高度 是」檢索時,將得到第5、6條例句,而換成「某椅子 的 高度 是」進行檢索時,仍會得到同樣的結果,該演算法返回結果相當於一個粗略的匹配集合,至於返回的句子集是否與需要的含義準確匹配的問題,將由更上層的推理演算法進一步篩選確認。
此外,由上面介紹看出,該演算法的匹配方式與演算法4.2.7相比,對模板句式要求更寬鬆,該演算法僅需指定句中的部分單詞,而對括弧等各類輔助符號均可忽略。
4.3 底層推理演算法
底層推理演算法實現基於知識庫的初步推理,推理過程主要考慮對本元認知邏輯的處理,而不考慮基於規則的間接推理,大多數底層推理演算法不支持提問句型中帶有「某字項」的情況,各演算法實現如下:
1)演算法4.3.1:「是一個/種」型問題底層求解
該演算法用於求解「A 是一個/種 B」句型的問題,演算法之所以稱為「底層求解」,是為了區分於後續上層推理演算法中,要繼續介紹的屬性值更高層求解演算法(後文凡演算法名稱中帶有「底層」的,均是此原因,不再介紹)。該演算法對問題語句不支持包含「某字項」的情況,該演算法即可以作為獨立的問題求解演算法,直接求解問題語句,也可在推理演算法中作為其它推理演算法的子環節使用,其實本系統的推理樹中,除了最頂層的推理演算法外,其它推理演算法均具有這樣的特點(即同時可獨立推理或被其它推理演算法轉調),後面將不再一一說明。該演算法實現如下:
(1)首先對單詞A和單詞B進行直接字元串比較,如相同,則返回成立,否則繼續;
(2)調用演算法4.2.2對單詞A進行串類型檢測,如果A為數值類型,而且單詞B的字元串內容為「數值」,則返回成立,否則繼續;
(3)通過知識庫的框架槽值,檢測單詞A的類型,如果單詞A的類型恰好與單詞B相同,則返回成立,否則繼續;
(4)檢測單詞B,如為字元串「單詞」,且單詞A為有效單詞,則返回成立,否則繼續;
(5)開始利用知識庫中知識,檢測單詞A和B是否具有間接類別從屬關係:首先構建open表和closed表,分別存儲當前待訪問的節點和已經訪問過的節點,並先將單詞A插入open表和closed表;
(6)從open表中取出首節點,利用演算法4.2.9查找其在知識庫單詞表的位置,並遍歷該單詞對應的框架槽值列表,當遇到「是一個」或「是一種」槽時,如果且槽值與單詞B相同,則演算法返回成立,否則檢測該槽值單詞是否在closed表中存在,如不存在,則將槽值單詞同時插入到open表和closed表,重複該過程,直到完成框架槽值列表的遍歷;
(7)重複步驟(6),一旦找到與單詞B的成功匹配,則返回成立,當open表已經為空且未找到成功匹配時,演算法返回失敗。
該演算法考慮了對多種隱含邏輯的處理,包括單詞A和B直接相同的情況、單詞為數值常量的情況、單詞B為單詞A的類型描述的情況等,最重要的是藉助知識庫的框架機制,快速推理單詞A和B是否具有間接類別從屬關係,由演算法的(5)到(7)步實現。此外,演算法中對「是一個」和「是一種」的情況是統一處理的,但有些情況(如為了檢測某單詞是種類名詞還是實例名詞)需要加以區分,為此,可在演算法的第(6)步中檢測演算法首次遇到的是「是一個」槽還是「是一種」槽,並依據此返回不同的標誌即可。
2)演算法4.3.2:「被包含於」型問題底層求解
該演算法用於求解「A 被包含於 B」句型的問題,求解原理與演算法4.3.1相同,只是沒有其中前面幾步的隱含邏輯處理,僅採用演算法中(5)到(7)步的過程,只是將對「是一個/種」槽的匹配過程改成對「被包含於」槽的匹配過程即可,該演算法實現過程略。
3)演算法4.3.3:單詞類型檢測
按照上文介紹的單詞類型定義規則,檢測單詞類型,演算法實現如下:
(1)首先調用演算法4.2.9檢測單詞在知識庫中單詞表的位置,並檢測該單詞對應的單詞類型的槽是否已經填充了有效值,如果有,則直接返回該類型,否則演算法繼續;
(2)調用演算法4.2.2,進行單詞的串類型檢測,如果是非法單詞類型,則直接返回為非法類型,如果為數值類型,則返回為數值常量類型,如果為文本類型,則演算法繼續;
(3)設被檢測單詞為A,構建問題子句「A 是一個名詞」調用演算法4.3.1,如匹配成功,則再次確認返回值類型,返回為實例名詞或種類名詞,否則繼續;
(4)構建問題子句「A 是一個相對稱謂」調用演算法4.3.1,如匹配成功,則返回為相對稱謂類型,否則繼續;
(5)檢測是否為屬性類型:構建模板語句「A 屬性包含於」作為入口,調用演算法4.2.13—格式化語句檢索演算法,該演算法將會自動將滿足「** A ** 屬性包含於 **」格式的句子集全部檢出,然後再利用演算法4.2.7,對已檢索出的句子集進行一一匹配測試,並設定匹配模板語句為「A 屬性包含於 &*」,一旦找到有成功匹配的語句,則返回為屬性類型,否則繼續;
(6)按照第(5)步的方法,繼續檢測單詞是否為屬性值類型、屬性單位類型,只要將上面步驟中的關鍵詞「屬性包含於」依次換成「屬性值為」和「屬性單位為」即可,如匹配成功,則返回相應類型,否則繼續;
(7)當以上類型匹配均未成功時,則返回為非標類型(即未知類型)。
單詞類型檢測演算法應盡量離線完成,一般在載入新的知識庫並進行初始化時,遍歷知識庫單詞表中的單詞,檢測其單詞類型的框架槽值,如尚未賦值,則調用該演算法檢測出相應的類型並填充,這樣在後續推理過程中,可直接訪問框架槽值(見本節演算法的第(1)步)來快速獲得類型,但是當系統在人機交互過程中錄入了新的單詞或知識語句,應根據新增知識,定期對相關單詞類型進行更新。
4)演算法4.3.4:語句格式化比較
上文已介紹了語句格式化比較演算法4.2.7,該演算法同樣用于格式化比較,但該演算法位於整個演算法體系結構的更上層,通過其它底層演算法的支持,該演算法具有更強的功能,最主要是體現在對「某字項」的支持,演算法入口為模板語句、待匹配語句和「某字項」匹配模式,其中「某字項」匹配模式分為單向匹配模式和雙向匹配模式(含義見演算法實現),演算法出口為「某字項」單詞列表和匹配單詞列表,演算法實現如下:
(1)調用演算法4.2.6,分別對入口的模板語句和待匹配語句進行歸一化處理;
(2)調用演算法4.2.3,分別獲取入口模板語句和匹配語句的下一個單詞;
(3)如下一模板語句單詞為「&」,則再次獲取其下一字元,兩字元連接後如為「&*」,則將待匹配語句中剩餘子句整體作為一個單詞項,插入出口的匹配單詞列表,同時將字元串「&*」插入出口的「某字項」單詞列表,演算法返回匹配成功;
(4)如果入口的「某字項」匹配模式為雙向模式,則採用鏡向模式再次執行演算法(3)的步驟,即檢測待匹配語句中下一單詞是否為「&*」,成功後,將模板語句中剩餘子句插入出口的「某字項」單詞列表,而將「&*」插入出口的匹配單詞列表,演算法返回成功;
(5)檢測當前獲取的模板語句單詞和待匹配語句單詞,如果僅有模板語句單詞為「某字項」,則提取該「某字項」單詞的有效詞根(去除某字以及後面的數字後綴),然後以當前待匹配語句單詞、「是一個」、模板語句的「某字項」詞根連接成問題語句,調用演算法4.3.1的「是一個/種」問題求解,如求解失敗,則演算法整體返回失敗,如求解成功,則將待匹配語句單詞插入到出口的匹配單詞列表,並將模板語句的「某字項」單詞插入到出口的「某字項」單詞列表,演算法繼續;
(6)如果入口的「某字項」匹配模式為雙向模式,則檢測當前模板語句單詞和待匹配語句單詞,當僅有待匹配語句單詞為「某字項」或兩單詞均為「某字項」時,則採用鏡向模式再次執行演算法(5)的步驟;
(7)當兩個當前單詞均不是某字型,則直接檢測兩單詞是否相同,不相同則返回匹配失敗,否則繼續;
(8)如兩個語句均為到達結尾,則轉步驟(2);
(9)如僅有某一個語句到達結尾,而另一語句還有剩餘字元,則返回匹配失敗;
(10)當兩語句同時到達結尾時,最後對出口的「某字項」單詞列表和匹配單詞列表進行檢測,要求相同的「某字項」單詞必須對應相同的匹配單詞,而不同的「某字項」單詞也必須對應不同的匹配單詞,符合條件則返回匹配成功,否則返回匹配失敗;
該演算法對上層推理演算法有重要支撐作用,現舉例說明演算法功能:
對於以下入口語句:
模板語句:(某桌子 的 重量)是 某數值 千克 的;
待匹配語句:(桌子A 的 重量)是 25 千克 的;
匹配結果成功(假設「桌子A」等名詞均已被正確定義類別,下文同理),並返回某字項單詞列表為「某桌子」、「某數值」;返回匹配單詞列表為「桌子A」、「25」。
對於以下入口語句:
模板語句:某桌子 與 椅子B 是 配套 的;
待匹配語句:桌子A 與 某椅子;
當入口的「某字項」匹配模式設置為單項模式,則匹配失敗,如設置為雙向模式則匹配成功,並返回某字項單詞列表為「某桌子」、「椅子B」;返回匹配單詞列表為「桌子A」、「某椅子」。
對於以下入口模板語句:
模板語句:某人_1 是 某人_2 的 同學 而且 某人_2 是 某人_3 的 領導;
當採用以下待匹配語句時:
待匹配語句:小張 是 小李 的 同學 而且 小李 是 小王 的 領導;
則匹配成功,且返回某字項單詞列表為「某人_1」、「某人_2」、「某人_3」;返回匹配單詞列表為「小張」、「小李」、「小王」。而對於同樣的模板語句,採用下面待匹配語句時:
待匹配語句:小張 是 小李 的 同學 而且 小李 是 小張 的 領導;
則匹配失敗,因為此時「某人_1」和「某人_3」兩個不同的「某字項」對應了相同的匹配單詞「小張」,不滿足演算法第(10)步的合理性檢測。
5)演算法4.3.5:類型樹向上追溯求解
知識庫中利用「是一個/種」句型,定義了各個概念的從屬關係,本演算法求解某入口單詞的上層概念,以及上層的上層概念,直到最頂層概念,演算法實現如下:
(1)設入口單詞為A,首先構建open表和closed表,分別存儲當前待訪問的節點和已經訪問過的節點,並將單詞A插入open表和closed表;
(2)從open表中取出首節點,利用演算法4.2.9查找其在知識庫單詞表的位置,並遍歷該單詞對應的框架槽值列表,當遇到「是一個」或「是一種」槽時,則檢測該槽值單詞是否在closed表中存在,如不存在,則將槽值單詞同時插入到open表和closed表;
(3)重複步驟(2),直到open表為空,此時將closed中所有單詞構成列表返回。
6)演算法4.3.6:類型樹向下追溯求解
該演算法與上一演算法相對應,但求解的是入口單詞的向下追溯結果。但該演算法無法借用框架槽值求解(因為知識庫中的框架僅對類別的向上從屬關係進行了描述),演算法實現過程如下:
(1)設入口單詞為B,首先構建兩個closed表:closed1表和closed2表,表1用於存儲從屬於類型B的實例名詞,表2用於存儲從屬於類型B的種類名詞;
(2)檢測滿足從屬於B的實例名詞:調用演算法4.2.13,傳遞入口模板語句為「是一個 B」,將符合「** 是一個 ** B **」格式的語句集檢出,並遍歷集合,一一調用演算法4.3.4進行精確匹配,設定匹配模板入口句型為「某實例名詞 是一個B」,對於匹配成功的語句,如果不存在於現有的closed1表,則將其插入closed1表;
(3)繼續向下層類別追溯:調用演算法4.2.13,傳遞入口模板語句為「是一種 B」,將符合「** 是一種 ** B **」格式的語句集檢出,並遍歷集合,一一調用演算法4.3.4進行精確匹配,定匹配模板入口句型為「某實例名詞 是一種B」,對於匹配成功的語句,如果不存在於現有的closed2表,則將其插入closed2表,同時針對當前語句對應的從屬於B的種類名詞作為新的入口單詞,並傳遞closed1表和closed2表的當前狀態,繼續遞歸調用該演算法本身。
(4)通過遞歸調用,將從屬於入口單詞B的單詞不斷檢出,分別放置於closed1表和closed2表,直到完成全部類別樹的檢索,或達到設定的最大許用遞歸深度。
該演算法能夠自動檢索出從屬於單詞B的全部種類名詞和實例名詞,當知識庫中的知識比較豐富且單詞B為比較頂層的概念時,該演算法往往會返回較長的單詞列表,因此使用該演算法時必須謹慎,此外,第(4)步中提到的最大許用遞歸深度,是為了防止知識庫中的概念存在循環定義,而使演算法陷入死循環,深度上限可根據需要設定,後文多處演算法中仍需用到最大許用遞歸深度的技術。
7)演算法4.3.7:檢測某名詞是否與某屬性詞關聯
前文演算法已能夠檢測單詞的類型,其中包括了屬性類型的檢測,但僅能確定某單詞是否為屬性類型,卻不能檢測其是否是某給定名詞的屬性,且根據系統設定的本元認知邏輯(見第3節),當給定名詞的向上追溯類別單詞中任何一個與給定的屬性單詞是關聯的,那麼該名詞將也被認為與給定屬性單詞關聯,演算法針對該情況仍需有效檢測,該演算法具體實現如下:
(1)設給定入口名詞為A,入口屬性單詞為B,首先檢測A與B是否關聯:調用演算法4.2.13,傳遞入口模板語句為「屬性包含於 B」,將符合「** 屬性包含於** B **」格式的語句集檢出,遍歷集合,調用演算法4.3.4進行精確匹配,設定模板句型為「某單詞 屬性包含於B」,如匹配成功,演算法直接返回成立(即有關聯),否則繼續;
(2)調用演算法4.3.5進行類型樹向上追溯求解,並將單詞A作為入口,求出單詞A上層的各個概念;
(3)遍歷第(2)步求解到的各個概念,依次作為入口名詞,利用第(1)步的方法檢測該概念是否與屬性單詞B關聯,如列表中任何概念檢測成立,則演算法返回成立,否則,返回不成立。
8)演算法4.3.8:檢測某單詞是否為另一名詞的屬性值
對於入口給定的單詞A和名詞B,檢測單詞A是否是B的合法屬性值,為正確檢測,演算法需尋找另一屬性單詞C,使得C是A的屬性,而且B是C的合法屬性值,演算法實現如下:
(1)調用演算法4.2.13,傳遞入口模板語句為「屬性值為」,將符合「** 屬性值為 **」格式的語句集檢出;
(2)遍歷上步求得語句集合,調用演算法4.3.4進行精確匹配,設定模板句型為「A 屬性值為 某屬性」,如匹配成功,則提取語句對應的屬性單詞,並調用演算法4.3.7,檢測該屬性單詞是否與名詞B關聯,檢測成立則演算法返回成立,否則返回失敗。
9)演算法4.3.9:屬性值底層求解
根據知識庫中的知識,求解特定對象的特定屬性的屬性值,演算法給定入口的主語名詞和屬性單詞,入口不能包含「某字項」,演算法將自動檢索符合語法的所有解,並返回整個結果列表,屬性值之間以原始匹配到的描述字元串形式返回,可能由1個或多個單詞構成,此外,演算法還將返回一個知識生效時間列表,用於存儲每條求解結果用到的各知識語句中的最新時間,因為系統在更高層推理過程中,可能要用到該時間信息,例如屬性值存在多個衝突解時,就需要根據最新有效時間進行取捨(詳見第3節中關於屬性的隱含邏輯處理的描述),演算法實現如下:
(1)設入口主語名詞為A,屬性單詞為B,首先調用演算法4.2.13,傳遞入口模板語句為「A 的 B 是 的」,將符合「** A ** 的 ** B ** 是 ** 的 **」格式的語句集檢出;
(2)遍歷上一步檢索到的語句集,並調用演算法4.3.4進行精確匹配,設定模板句型為「(A 的 B)是 &*」,此處的「&*」在演算法4.3.4中代表語句通配符,當前面部分子句匹配有效時,被匹配語句後面剩餘的任意長度短句均被視為成功匹配。對於匹配成功的語句,將其與「&*」對應的子句插入到出口的屬性值描述列表中,並將該知識語句在知識庫中存儲的生效時間屬性插入到出口的知識生效時間列表;
(3)重複第(1)、(2)步的過程,並將第(1)步搜索模板語句改成「A 是 的」,將第(2)步匹配模板語句改成「A 是 某屬性值 的」,重新得到一組匹配列表,針對新的匹配列表,逐一調用演算法4.3.8,檢測對應匹配項的屬性值項是否是關於主語名詞A的合理描述,最終檢測成功的作為有效結果,一併補充添加到第(2)步求得的結果列表中。下面舉例說明演算法求解過程:
設定知識庫中的知識語句:
顏色 屬性包含於 桌子;紅色 屬性值為 顏色;
重量 屬性包含於 桌子;
(桌子A 的 顏色) 是 紅色 的;
(桌子A 的 重量) 是 小於 25 千克 的;
(桌子A 的 重量) 是 大於 15 千克 的;
當設定入口名詞為「桌子A」,入口屬性單詞為「顏色」,調用本演算法時,將得到求解結果「紅色 的」,當把入口屬性單詞改成「重量」時,將得到兩項求解結果「小於 25 千克 的」、「大於 15 千克 的」。從求解結果看出,即使對於數值類型的屬性,演算法也僅返回屬性值的描述字元串,而不對數值含義進行深入解析,詳細的解析操作將在更高層的屬性值求解演算法中完成。
此外,需要說明的是,演算法的第(3)步,是為了實現對屬性本元認知邏輯的處理,即對於文本類型的屬性,如果以修飾子句形式描述屬性值,系統在屬性求解時,需仍給出正確答案,例如,在上述例子中,將知識庫語句中第4條語句「(桌子A 的 顏色) 是 紅色 的」改成「桌子 是 紅色 的」時,如果以同樣的問句提問,由於演算法第(3)步的作用,保證了系統一樣能夠給出正確答案「紅色 的」。
10)演算法4.3.10 修飾句型底層求解
求解修飾句型問句,句型如「某單詞 是 *** 的」結構,演算法稱為「底層求解」的原因同上,因為後續上層推理演算法中將繼續介紹修飾句型求解的更高層求解演算法。演算法入口為主語名詞A和修飾子句B,均不能包含「某字項」,演算法返回結果表示問題是否成立,此外演算法仍將返回一個知識生效時間列表,演算法實現如下:
(1)將入口的名詞A修飾子句B分別經過演算法4.2.6歸一化處理後,並各自去掉結尾的「的」(如果有的話),再經過演算法4.3.4比較兩句型是否匹配,如匹配成功則返回成立,否則繼續;
(2)用演算法4.2.13,傳遞入口模板語句為「A是 的」,將符合「** A ** 是 ** 的 **」格式的語句集檢出,遍歷語句集,分別調用演算法4.3.4進行匹配求解,並傳遞入口模板語句為「A 是 &*」,對於匹配成功的語句,提取「&*」對應的子串,再次調用演算法4.3.4將之與入口修飾子句B進行比較,如比較成功則返回成立,並將源知識語句的知識生效時間返回;
(3)調用演算法4.2.13,傳遞入口模板語句為「A 的 是 B」,將符合「** A ** 的 ** 是 ** B **」格式的語句集檢出,遍歷語句集,分別調用演算法4.3.4進行匹配求解,並傳遞入口模板語句為「(A 的 某屬性) 是 &*」,對於匹配成功的語句,提取「某屬性」對應的屬性單詞,調用演算法4.3.7檢測屬性是否與名詞A相關聯,成功關聯後,再次提取匹配語句中「&*」對應的子句,調用演算法4.3.4將其與演算法入口修飾子句B(匹配兩子句均先經過演算法4.2.6歸一化處理),一旦有最終匹配成功的語句,則演算法返回成立,同時將匹配項對應的源知識語句的知識生效時間返回;
(4)當以上步驟均為成功匹配,則返回失敗。
該演算法的第(1)步用來檢測入口的名詞A修飾子句B是否完全相同,相同則直接判成立,雖然正常提問時不會出現該情況,但上層推理演算法間接推理、置換過程中會出現間接轉調該演算法並具有類似的介面,因此必須考慮;演算法第(2)步自動搜索知識庫中具有「A 是 ** 的」形式的知識語句,判定是否包含了問題語句的含義,而第(3)步則搜索知識庫中具有「(A 的 某屬性) 是 ** 的」形式的知識語句,判定是否隱含了問題語句的含義(因為系統在本元認知邏輯中約定了以修飾句型提問時,相當於自動隱含了對相關屬性知識的間接推理)。
11)演算法4.3.11 數值屬性描述知識的整合求解
系統對數值屬性描述的知識語句包括屬性值、屬性單位、不等關係描述等元素,當存在多個語句對同一屬性值進行等式或不等式關係描述時,該演算法可在求解過程中自動整合,最終給出統一的結果,演算法入口為該屬性的原始描述語句列表,出口為整合後的語句列表,並返回匹配後的屬性單位,演算法實現如下:
(1)遍歷入口知識語句,分別調用演算法4.3.4進行比較,並傳遞入口模板語句為「某數值 某屬性單位 的」,一旦某條語句匹配成功,則返回成立,同時返回匹配成功的知識語句,並返回匹配後的屬性單位,匹配失敗則繼續;
(2)再次遍歷入口知識語句,構建模板語句「某不等關係詞 某數值 某屬性單位 的」,調用演算法4.3.4進行比較,針對匹配成功的語句(該步允許多條匹配語句),分別提取「某不等關係詞」和「某數值」對應的內容,根據不等關係詞的類型,分別提取屬性的上限及下限範圍,並計算交集,如不存在交集,則返回失敗,如存在交集,則計算屬性值範圍的上界和下界,並重新構建合成後的屬性值範圍描述語句返回。
下面舉例說明演算法的推理過程:假設入口的(重量)屬性描述語句列表為「25 千克 的」、「大於 10 千克 的」,演算法在第(1)步比較過程中,首先檢測第1條入口語句滿足匹配條件,則直接返回,因為此時第1條入口語句是對屬性值的準確描述,匹配成功後,演算法將自動忽略第2條入口語句的範圍限定的描述;而當入口語句列表由 「大於等於 12 千克 的」、「大於 10 千克 的」、 「小於 15 千克 的」共3條語句組成時,則演算法第(2)步對之一一匹配,並求解上下界範圍的交集,最終返回描述語句列表為:「大於等於 12 千克 的」、「小於 15 千克 的」。
此外,需要說明的是,演算法假定對同一屬性的描述,單位均是統一的,系統並為考慮不同單位的轉換,因此構建知識語句時,可首先將屬性描述語句統一成標準單位形式。
12)演算法4.3.12 屬性值比較求解
根據對某一數值屬性描述的兩個不同的語句集—模板語句集和比較語句集,判斷兩種描述所限定的屬性值範圍是否一致,此外,在模板語句集中可包含特定的「某字項」,用來查詢某屬性的取值或上、下限值,演算法實現如下:
1)針對入口的模板語句集,調用演算法4.3.11,實現屬性描述的整合求解,同時,對於語句集中用「某字項」描述的取值或上、下限值,如「某數值_1」、「某數值_2」等,分別進行針對性記錄;
2)針對入口的比較語句集,再次調用演算法4.3.11,實現屬性值描述的整合求解;
3)當入口的模板語句集及比較語句集均不存在「某字項」時,直接對比兩個語句集整合後的取值或上、下限值,如存在確定取值描述並相同,則返回成功,如均不存在確定取值描述,但模板描述句對應的上限大於比較描述句的上限,且下限小於比較描述句的下限(即只要從比較描述句子集限定的範圍中能推理出模板描述句的範圍成立),也返回成功,否則返回失敗;
4)當入口模板語句集中對屬性值範圍描述含有部分「某字項」時,首先檢測非「某字項」的部分的數值是否匹配(檢測方法同第3)步),如成功匹配,則返回成功,同時則將比較語句集描述中與模板描述中「某字項」對應部分的數值列表返回,否則返回失敗。
下面舉例說明演算法的推理過程:針對某重量屬性描述語句,模板描述語句集為 「大於 15 千克 的」,比較描述語句集為「小於 30 千克 的」、「大於 18 千克 的」,則演算法檢測後認為匹配成功,因為當重量屬性大於18千克時也必然會大於15千克,另外,當將模板描述語句集改為「大於 某數值_1 千克 的」,則匹配成功,同時返回「某數值_1」對應的匹配數值「18」。
13)演算法4.3.13 數值常量計算表達式求解
求解常量型數值表達式的最終取值,表達式中可以包括數值常量和加減乘除等運算符號,演算法求解如下:
1)首先調用演算法4.2.6對語句進行整理化簡,去除最外層的多餘括弧,然後檢測表達式語句中是否只剩單獨的一項數值常量,如果是,則直接返回該常量數值,否則繼續;
2)當語句中存在運算符號時,檢索出其中一個算符的位置,在此調用演算法4.2.1,在括弧項和引號項之外查找算符,查找的優先順序順序為「+、-、*、/」,一旦查到算符,則以算符位置為基準,將表達式語句分裂成前後兩個語句,並將兩個語句作為新的入口分別再次回調該演算法本身,然後將兩個子句運算得到的數值按照符號含義進行相應運算後返回最終數值。
該演算法為遞歸演算法,能夠層層化簡運算過程,並求得最終運算結果,運算過程中,每次分裂後產生的多餘括弧項會被演算法的第1)步自動化簡,演算法第二步語句分裂實時選取算符順序為先加減、後乘除,這樣演算法在回溯運算時,自然會按照先乘除、後加減的順序,也就是保證了乘除運算的高優先順序。演算法的入口表達式可以支持任意多級運算,並支持任意多級括弧嵌套,例如傳遞如下數值表達式:
12*2+15*3; (4+5)*3+13; ((3-2.5)*3+3.5)/2;
演算法均能正確給出計算結果:54、40和2.5。
14)演算法4.3.14 求解片語的修飾項列表
對於一個具有多個修飾項的片語,該演算法自動解析提取修飾項列表並返回,同時返回片語的主詞,因此,該演算法不僅可用來求解片語的修飾項,同時可以用於獲取片語中的主詞項,演算法實現如下:
(1)首先進入片語括弧內的子串查找,並反覆調用演算法4.2.5,在同級括弧深度內查找子串「的」,以此作為斷句的位置,將修飾項一一分割;
(2)檢測最後一個「的」後面的剩餘子句,如果為合法的單詞(利用演算法4.2.3檢測),則返回成功,同時將第(1)步求得的修飾子串列表一併返回,否則返回失敗。
下面舉例說明演算法提取結果,對於以下入口片語:
(桌子A 上面 的 新鮮 的 蘋果);
演算法提取成功,並返回修飾串列表「桌子A 上面 的」、「新鮮 的」,並返回主詞「蘋果」。此外,對於具有嵌套結構的片語,演算法僅會在本層深度內分割修飾項,例如:
((屋子 裡面 的 桌子) 上面 的 新鮮 的 蘋果);
求解後的修飾串列表直接返回為:「(屋子 裡面 的 桌子) 上面 的」、「新鮮 的」,也就是第一個修飾項內部嵌套的片語項不會被繼續拆解。
15)演算法4.3.15 非標句型的底層求解
非標句型指不符合以上任意一種限定格式的語句,對於此類語句,系統仍支持其推理,但僅限於直接匹配層面,而不支持各類隱含邏輯的處理,其實現步驟如下:
(1)調用演算法4.2.6對語句進行預處理和化簡;
(2)調用演算法4.2.13對語句進行格式化檢索,得到知識庫中可能匹配的語句列表;
(3)遍歷檢索到的每條語句,依次調用演算法4.3.4,實現語句的格式化比較,將比較成功的語句插入到求解結果集合中,同時填充問號等通配項對應的匹配單詞。
4.4 中層推理演算法
中層推理演算法是實現規則推理的核心,也是推理系統中最複雜的環節,因為本層各子推理演算法之間存在著高度的相互耦合關係,眾多演算法間構成了網狀的遞歸調用關係。中層推理與底層推理的最大區別在於支持入口語句中含有「某字項」,演算法自動檢測語句類型,當入口問句中不含有「某字項」時,則該語句將被當做命題是否成立的問句處理,並返回「是」或「否」,當含有「某字項」時,則問題含義自動變成求解「什麼樣的對象才能滿足語句描述的條件」,此時演算法一般為多解模式,演算法會自動求解出所有符合條件的解集合。
4.4.1 推理通用介面設計
在各子演算法的相互調用過程中,需要傳遞的中間數據也是比較複雜的,為此,系統專門設計了通用推理介面模塊,集成了推理過程需要傳遞的句子集及多項必要的狀態參量,來簡化演算法推理過程的參量傳遞,下面將詳細介紹推理介面設計、各個推理演算法設計及相互調用關係。通用介面模塊由若干變數及若干演算法組成,其中變數如下:
1)問句匹配結果鏈表:問句匹配結果主要用來裝載求解成功後的匹配單詞列表,由於系統問句均以「某字項」的形式作為提問詞,因此出口匹配單詞列表中的「某字項」單詞和結果單詞是一一對應的關係,此外,該結果變數中還包括匹配單詞個數,以及本項匹配結果的知識生效時間等參量。而由於本層推理演算法基本上都支持帶有「某字項」的問句輸入,因此求解成功後對應的匹配結果也有多項,所以介面模板必須維持多項問句匹配結果變數,系統利用一個關於問句匹配結果類型的鏈表來滿足推理需求。
2)問題跳轉路徑鏈表:在利用知識庫中的規則不斷為求解問題進行間接推理時,當前待求解的子問題也在動態地發生著變化,而當知識庫較大、規則體系複雜時,推理過程中經常會出現多級間接跳轉後,某問句重複出現,從而陷入死循環,為此,系統在介面模塊中引入問題跳轉路徑鏈表,動態記錄著從最初始問題開始,一直跳轉到當前問題時所經歷過的所有中間問題列表,以作為防止邏輯死循環的依據。
3)當前間接跳轉次數:動態記錄著演算法經過規則推理後的問題跳轉次數。雖然系統利用維護問題跳轉路徑鏈表的方式防止陷入邏輯循環,但是隨著知識庫複雜性的提高、知識語句和規則語句的多樣性體現、規則知識設計失誤等原因,有時會難以避免地引起間接跳轉次數過高,超出系統負擔,因此系統動態維護當前跳轉次數,並與某設定的最大次數上限作對比,當超限後強制返回,提高推理演算法的可靠性。
4)最大許用解數量:當提問句型為包含多個邏輯子句的複合句,且句中「某字項」較多時,會導致解的數量很大,為此在演算法介面中引入最大需用解數量,用於限制推理過程中求得的解的數量,當結果列表中解的數量超過最大許用數時,即使再遇到可行解,也不再加入到結果列表中。此外,有些情況下,提問問題時僅關心是否至少存在一組可行解,而不需要列出所有可行解,此時可在介面中將最大許用解數量設置為1即可。
通用介面模塊除包含以上主要變數外,還包括若干演算法,作為推理演算法的輔助函數,主要演算法如下:
1)插入求解結果:向問句匹配結果鏈表中插入一項求解結果,並自動填充「某字項」單詞列表、結果單詞列表等相關數據,演算法實現:略。
2)問題求解的重複性檢測:根據問題跳轉路徑鏈表中的記錄,以及本次調用傳遞的入口問句,檢測是否存在問題重複出現的情況,用來避免死循環,演算法實現:略。
3)介面重構:根據一個推理過程中正在使用的介面類變數,重新構建一個新的介面變數,並自動構建相應的鏈表和數據,使其與參考介面變數結構完全一致,用於推理時問題跳轉的過程中,發生了求解目標的轉變的情況,此時在新的推理分支上,需要重新複製一套推理介面變數,使其保留原推理過程的記憶,後續分支推理利用複製後的介面變數繼續推理,從而避免破壞原主分支的介面狀態,演算法實現:略。
4)「某字項」的匹配詞查找:針對問句匹配結果鏈表中的某項求解結果,在提供一具體「某字項」單詞的情況下,自動匹配查找其對應的結果單詞,演算法略。
4.4.2 中層推理演算法的調用關係
中層推理各子演算法之間的相互調用關係是整個推理系統中最複雜的,各演算法不是一般的樹型結構,而是構成了網狀的遞歸調用結構,圖4給出了中層推理中18個主要演算法之間的相互調用關係,圖中各個演算法均具有明確標號,在4.4.3節中將逐一介紹每個子演算法的實現過程,以及相互調用時的跳轉條件。
圖4 中層推理演算法調用關係
在實際推理過程中,中間層推理演算法的多數子演算法仍然是需要底層推理演算法支撐的(詳見圖2描述的整個系統的推理演算法結構),圖4中並未明確標出中層演算法與底層演算法的連接關係,詳細的跳轉邏輯在4.4.3節演算法描述中給出。,
4.4.3 中層推理演算法實現
1)演算法4.4.1 中層推理綜合問題求解
中層推理演算法中的綜合問題求解入口,中層推理中,該演算法支持最一般、通用的問題形式,並且問句可由多個邏輯子句構成,演算法入口為提問語句,以及通用介面類指針,演算法實現如下:
(1)調用演算法4.2.1,在括弧項和引號項之外查找邏輯連接詞「或者」及「而且」(優先查找「或者」,未查到時再查找「而且」),查找成功後,按照連接詞前及連接詞後的部分將問句分成兩個子句;
(2)如第(1)步未找到邏輯連詞,即整個問句只有1個邏輯子句,那麼首先檢測句首是否有邏輯詞「非」,如沒有,則以原問題子句以及介面類變數指針為入口,調用演算法4.4.2求解問題,並將求解後的結果返回,如果句首存在邏輯詞「非」,則去掉子串「非」後形成的問題子句為入口,調用演算法4.4.2,並將求解後的結果取反後返回;
(3)如第(1)步子句分裂成功,則先求解前半子句,具體方法為:首先定義新的臨時介面類變數1,然後調用介面類中的介面重構演算法,使其傳承本演算法入口介面類的歷史信息,然後以新的臨時介面類變數1以及前半子句作為新的問題入口回調函數自身進行求解,此外,調用前檢測前半子句中「某字項」個數為0,則退化為單值求解模式,將臨時介面類變數1的最大許用解個數為1(原值為某一許用上限值);
(4)如果第(3)步中檢測前半子句為無「某字項」問句,則繼續判第(1)步求得的邏輯連詞,如果為「而且」,那麼前半子句求解失敗後就直接返回失敗(傳遞原始介面類變數),不再求解後半子句,如前半子句求解成功,則繼續求解後半子句,並將其求解結果作為最終結果返回;如果判第(1)步求得的邏輯連詞為「或者」,那麼前半子句求解成功則直接返回成功,前半子句求解失敗則繼續求解後半子句,並將其求解結果作為最終結果返回;
(5)如果第(3)步中檢測前半子句含有「某字項」,且第(1)步求得的邏輯連詞為「或者」,則定義新的臨時介面類變數2(變數設置方法同第(3)步),並以該新介面變數及後半子句為入口,回調函數自身進行求解,求解後的結果與第(3)步前半子句的求解結果(分別位於臨時介面類1及臨時介面類2中)求並集後作為最終結果返回;
(6)如果第(3)步中檢測前半子句含有「某字項」,且第(1)步求得的邏輯連詞為「而且」,則進行「某字項」級聯擴展求解,做法為:遍歷第(3)步求解的前半子句的結果列表,針對列表中的每項結果,分別在後半子句中尋找存在於前半子句相同的「某字項」,並依據前半子句求解結果後對應的結果單詞對其進行置換,針對置換後的後半子句,構建新的臨時介面類變數2(變數設置方法同第(3)步),並以該新介面變數及後半子句為入口,回調函數自身進行求解,當後半子句仍求解成功時,將後半子句及本次遍歷對應的前半子句求解結果中的「某字項」列表合併,構成完整的「某字項」及結果列表,並對合成後的「某字項」列表進行合理性檢驗(不同的「某字項」須對應不同的結果單詞,檢驗過程略),檢驗通過後作為最終結果的一項,插入到入口的介面類變數中,同時將本條結果對於的知識生效時間設置為兩個半子句求解生效時間中較新的值。如遍歷完所有的前半子句列表後,均為發現與之匹配的後半子句成功求解結果,則演算法返回失敗。
至此,演算法完成,本演算法為綜合問題的入口,但主要的工作是負責邏輯子句的分解,以及最終求解結果的合成,演算法不斷利用邏輯連詞對問題句子進行分割,並回調自身,直到某一層分解為只剩單一邏輯子句,則轉調演算法4.4.2進行求解。演算法對「而且」邏輯的處理是最複雜的,且在第(6)步中採用一種「級聯擴展求解」的方法,這是因為「而且」邏輯在規則的表示中是非常重要的,下面舉例說明「而且」邏輯的演算法處理過程,給定如下問句入口:
某人_1 是 在 A公司 工作 的 而且 某人_2 是 某人_1 的 哥哥;
則演算法會在求解前半子句「某人_1 是 在 A公司 工作 的」時將符合條件的「某人_1」全部求出,例如共包括「張三」和「李四」兩項,然後分別將該結果代入後半子句,即「某人_2 是 張三 的 哥哥」和「某人_2 是 李四 的 哥哥」,然後在後半子句求解成功後一併返回,此時如果後半子句存在多個解,則解的數量會被自動「級聯擴展」,例如張三有2個哥哥而且李四有3個哥哥,那麼演算法會自動將所有可能的5組解全部返回。
當兩個子句沒有重疊的「某字項」時,演算法仍會將所有可能的解的組合返回,例如以下問句:
某人_1 是 在 A公司 工作 的 而且 某人_2 是 在 A公司 工作 的;
加入知識庫中共已知4個人在公司工作,那麼演算法會將滿足兩兩組合的6種情況全部返回,而這種作法在推理過程中也是十分必要的,例如以下問句:
某人_1 是 在 A公司 工作 的 而且 某人_2 是 在 A公司 工作 的 而且 (某人_1 的 爸爸) 是 某人_2 的 上司;
則演算法在求解前兩個子句求解中,分別列出了所有在A公司工作的兩人組合的情況,再分別代入第3子句檢測兩人是否滿足相應的邏輯關係即可,這樣才能保證不漏掉任何可能解。此外,對於某兩個或多個「某字項」之間具有複雜的邏輯關係,如上面例句的第3子句(片語中含有相對稱謂關係的「某字項」),無法單獨提問,此時需通過重言句的形式先對某字項作限定(詳見2.3.8節中第3)小節的描述),例如:
某人_1 是一個 人 而且 某人_2 是一個 人 而且 ((某人_1 的 **)的 **) 是 (某人_2 的 **) 的 **;
例句的第3子句表示兩個「某字項」間各種可能的複雜邏輯關係,此時前有兩個重言句限定的情況下,系統能夠對問題正常求解,而求解的保證也恰是本演算法的處理機制。
2)演算法4.4.2 中層推理邏輯單句綜合求解
該演算法仍用來求解綜合型問題,但要求入口的問題語句必須是邏輯單句,即不能含有「而且」、「或者」、「非」等邏輯連詞,實際推理過程中該演算法主要作為演算法4.4.1的子函數使用,演算法入口為提問語句,以及通用介面類指針,具體實現如下
(1)檢測入口的通用介面類中當前函數遞歸調用的深度變數是否已達上限,如達到上限,則返回失敗,否則為該深度變數加1,演算法繼續;
(2)檢測入口的通用介面類,並調用其內部的「問題求解的重複性檢測」演算法,判斷前面各層問題求解路徑中是否存在問題重複的情況,如存在重複,則返回失敗;
(3)將當前求解的入口問題語句插入到介面類的「問題跳轉路徑鏈表」中;
(4)對入口問句預處理,刪除其前後導空格,並檢測語句中「某字項」的個數;
(5)檢測語句結構類型,按照獨立單詞、獨立片語、複合句型三種類型進行分類(檢測方法略)。
(6)如問句為獨立單詞,則調用演算法4.4.3求解,並直接傳遞原問句和介面類指針;
(7)如問句為獨立片語類型,並且檢測問句中沒有「某字項」,則調用演算法4.4.4求解片語的取值,傳遞原始問句及介面類,並將片語求解返回結果插入到介面類的「問句匹配結果鏈表」中(僅插入結果項,「某字項」置空),同時將片語求解時返回的知識生效時間放入該項結果中,如果檢測到問句中含有「某字項」則返回失敗;
(8)如問句為複合句型,則進一步檢測問句的詳細類型,按照「是一個/種句型」、「「是」字句型」、「包含句型」、「非標句型」進行分類;
(9)如問句為「是一個/種句型」,則直接調用演算法4.4.11求解,並傳遞原始的入口問題語句和介面類指針;
(10)如問句為「「是」字句型」,則直接調用演算法4.4.14求解,並傳遞原始的入口問題語句和介面類指針;
(11)如問句為「包含句型」,則直接調用演算法4.4.15求解,並傳遞原始的入口問題語句和介面類指針;
(12)如問句為「非標句型」,則直接調用演算法4.4.16求解,並傳遞原始的入口問題語句和介面類指針。
從演算法實現看出,該演算法仍是通過轉調其它多個具體類型的問題求解函數來完成最終求解,演算法第(1)步進行了遞歸上限處理,第(2)步進行了防止問題重複求解的處理,這均是為避免複雜的邏輯推理過程陷入死循環。演算法第(10)步提到的「是」字句型,並不是CQNL語言的最終有效句型,而是一個初步的宏觀分類,在演算法4.4.14中對其進行了進一步分類求解。
3)演算法4.4.3 獨立單詞型問題求解
當推理過程中某一級問句僅有一個獨立單詞,則調用該演算法求解,入口為問題單詞及介面類指針,演算法實現如下:
(1)當入口單詞不是「某字項」單詞時,直接查詢知識庫的單詞表,如存在該單詞則返回成功,否則返回失敗;
(2)當入口單詞為「某字項」單詞時,調用演算法4.3.6實現類型樹向下追溯求解,並將所有匹配的實例單詞放入到介面類中,如存在匹配單詞則返回成功,否則返回失敗。
從演算法求解過程看出,當入口單詞為正常的非「某字項」單詞時,直接相當於查詢知識庫中是否存在該單詞,而當入口為「某字項」單詞時,相當於列舉求解,例如問題單詞為「某筆記本電腦」,系統會自動將知識庫中所有已知的筆記本電腦一一列舉,如入口單詞改為「某電腦」,則系統會自動列舉台式機、筆記本電腦等所有類別的電腦。
4)演算法4.4.4 獨立片語型問題求解
當入口問題為獨立片語時,則調用該演算法求解,而構成片語的可能性有多種,包括屬性描述、相對稱謂描述、修飾關係描述等,需分類求解,該演算法不支持入口片語中含有「某字項」的情況,但間接推理過程其它演算法轉調該演算法求解片語取值時,如片語中含有「某字項」,可先對「某字項」進行預求解後再調用本演算法(詳見後文)。
演算法入口為獨立片語語句和介面類指針,出口為片語的最終求解結果,該演算法並未通過介面類來返回結果,是因為演算法為非「某字項」求解,結果為獨立字元串且具有唯一性,直接返回結果可省去演算法外對介面類解析的複雜過程,但入口的介面類變數中關於推理的歷史信息,在演算法中仍然被參考並使用,此外,由於結果已不通過介面類返回,那麼知識生效時間參量也將設置單獨的返回介面,後文仍有其它推理演算法具有類似情況,仍採用在通用介面類之外額外設定返回結果及知識生效時間等介面的處理方式,原因同此,後文不再解釋。本演算法實現過程如下:
(1)調用演算法4.3.14, 求解片語的修飾項列表,同時解析片語中的被修飾主詞;
(2)遍歷片語的修飾項列表,針對每個修飾項字元串,首先刪除其前後導空格,然後調用演算法4.4.5進行片語解嵌套處理,然後檢驗該修飾項是否仍是一個片語(檢驗是否整體被小括弧括起),如果不是,則直接將本步處理結果作為新的修飾項,如果是,則回調演算法自身,求解修飾項的片語取值,並傳遞原始介面類變數,最後將求解後的結果作為新的修飾項;
(3)調用演算法4.3.3,檢測第(1)步提取的片語中的被修飾主詞的類型,按屬性、種類名詞、相對稱謂進行分類,如不屬於其中任何一種類型,則返回失敗,否則繼續;
(4)如果主詞類型為屬性,則轉調演算法4.4.6,求解屬性值(此時需檢驗並確認片語的修飾項僅有一項,否則返回失敗),然後將修飾項作為主體名詞,將被修飾主詞作為屬性單詞,作為演算法4.4.6的入口,同時傳遞原始的介面類變數(因求解目標並未改變),然後將求解後的結果作為本演算法的返回結果,同時將演算法4.4.6返回的知識生效時間參量作為本演算法的知識生效時間返回結果;
(5)如果主詞類型為種類名詞,則調用演算法4.4.7,求解被修飾名詞的取值,並將片語的主詞以及預處理後的修飾項列表一併傳遞,同時傳遞原始的介面類變數,然後將求解後的結果作為本演算法的返回結果,同時將演算法返回的知識生效時間參量作為本演算法的知識生效時間返回結果;
(6)如果主詞類型為相對稱謂,則構建新的「是」字句型問句進行求解,具體做法為:首先構建臨時的介面類變數並使其傳承本演算法入口介面類的歷史信息,並將該臨時介面類變數的最大許用解數的參量設置為1,然後構建新的問句為「某相對稱謂主體 是 **」,其中「**」代表的內容為入口片語項去除首尾括弧後的內容,將新構建的問句及臨時介面類變數作為入口,調用演算法4.4.16進行求解,最後將求解後的結果作為本演算法的返回結果,同時將演算法4.4.16返回的知識生效時間參量作為本演算法的知識生效時間返回結果。
該演算法可求解各類片語的取值,如:
(張三 的 哥哥);(房間 裡面 的 桌子);(機器人A 的 重量);
此外,片語中的修飾項可嵌套包含其它片語結構,這在演算法第(2)步預處理的過程體現,但解嵌套的處理過程是通過本演算法與下面介紹的演算法4.4.5共同完成的,因此將在下節再給出嵌套片語求解的實例。演算法第(6)步處理相對稱謂類型的片語時,是通過轉調非標句型求解演算法完成的,該演算法是對間接匹配推理的一種通用處理的機制,因為相對稱謂求解不需要像屬性值等求解時要進行各類專門處理,故而可行。
5)演算法4.4.5 片語的解嵌套處理
該演算法主要用於配合其它演算法完成對片語的預處理,即檢測片語修飾項中的嵌套片語,同時,該演算法也與上面的獨立片語型問題求解演算法配合,完成各類複合型的片語求解,演算法入口為語句字元串以及介面類變數,出口為處理後的語句結果(該演算法的處理結果仍從單獨出口返回,而不經過介面類變數返回),本演算法實現如下:
(1)檢測入口語句,是否首尾被小括弧括起,如是,則設置記錄標記,然後將首尾括弧解除;
(2)遍歷處理後的入口語句,並不斷檢測語句中的「(」,查找成功後再次查找與之相匹配的「)」(查找方法可參見演算法4.2.4),每成功查找一個括弧對後,就將之單獨提出,然後調用演算法4.4.4求解該片語項的取值,求解成功後,將取值結果代替原括弧項,放回原知識語句中;
(3)將全部替換完成後的語句作為返回結果,並判斷第(1)步的檢測結果,如果入口語句原本帶有首尾括弧,則在此處將最終處理後的語句再次加上首尾括弧再返回。
下面舉例說明演算法求解過程,給定如下入口語句:
(房間A 裡面 的 桌子) 上面 的;
則調用本演算法求解後,將得到化簡後語句「桌子A 上面 的」(假定桌子A是房間A裡面唯一的桌子),但如果給定以下入口語句,
((房間A 裡面 的 桌子) 上面 的 蘋果);
則演算法化簡後將得到語句為「(桌子A 上面 的 蘋果)」,也就是說演算法僅會對語句中包含的片語化簡,或對片語內部包含的嵌套片語化簡,但對於整體片語型的語句,演算法並不會破壞最外層的片語結構,該演算法與上一片語求解演算法結合,可求解各類複合型片語的取值,而單獨使用該演算法時又與片語求解演算法具有差別,這是為了滿足後續不同推理演算法的需求。
6)演算法4.4.6 屬性值求解
該演算法實現屬性值求解,在演算法4.3.9的屬性值底層求解基礎上,繼續增加了逆向規則推理、預設推理、數值屬性的自動整合等處理機制,從而形成了完善的屬性值求解演算法,演算法入口為對象名詞、屬性詞和介面類指針,入口單詞不允許含有「某字項」,出口為屬性取值字元串和知識生效時間,演算法返回唯一結果,當滿足求解條件的具有多個可能解時,演算法將返回知識生效時間最新的有效解,演算法實現如下:
(1)檢測入口的對象名詞字元串是一個獨立單詞還是仍是一個修飾型片語,如果仍為片語,則調用演算法演算法4.4.4求解片語的取值,並將最終取值作為新的對象名詞;
(2)建立臨時的屬性值字元串結果列表以及知識生效時間列表,並調用演算法4.3.9進行屬性值底層求解,傳遞處理後的對象名詞和屬性單詞,將演算法返回的多項求解結果及知識生效時間一併插入臨時列表中,如存在有效解則轉(6);
(3)調用規則逆向推理演算法4.4.17求解,通過定義新的臨時介面類變數,並構建新的問題語句,假定處理後的對象名詞為A、屬性詞為B,則構建新的問題語句為「(A 的 B) 是 &*」,如存在有效解,則將臨時介面類變數中返回的結果列表及知識生效時間列錶轉至第(2)步構建的臨時列表中,並轉(6);
(4)調用數值型屬性規則逆向推理演算法4.4.18,調用方式同(3),仍然是存在有效解則轉(6);
(5)調用演算法4.3.5類型樹向上追溯求解,傳遞處理後的對象名詞(該演算法將返回名詞所從屬的各個種類名詞,並按順序排列,排序越靠前的種類越具體,否則越宏觀),循環遍歷演算法返回的種類名詞列表,依次調用演算法4.3.9進行屬性值底層求解,一旦某層求解時存在可行解,則存儲結果至臨時屬性值列表和知識生效時間列表,然後退出循環,轉(6);
(6)檢測臨時的屬性值字元串結果列表中是否存在可行解,不存在則返回失敗,否則通過屬性值結果列表中的描述檢測屬性值的類型是文本型還是數值型,具體做法可通過遍歷臨時屬性值字元串列表,如某項為數值項和屬性單位構成的語句,則說明本項為數值型描述,否則為文本型描述,遍歷所有列表後,如不同項間的描述類型存在矛盾,則以數量較多的類型為準;
(7)如最終檢測屬性類型為文本型,則將所有可行解列表按照知識生效時間排序,並將時間最新的結果返回;
(8)如檢測屬性類型為數值型,則調用演算法4.3.11 數值屬性整合求解函數,將關於屬性值範圍描述的多項結果自動整合,並返回最終統一的屬性描述結果。
系統中對某屬性的類型是數值型還是文本型的不需要明確定義,而是推理演算法在根據知識庫中對於屬性的值的描述句子形式自動判斷。該演算法雖然僅返回唯一的屬性值求解結果,但在求解過程中卻遍歷了關於屬性值的多項描述知識,並在綜合各項結果基礎上,得出最終答案,對於文本類型的屬性,僅取其中生效時間最新的一項返回,對於數值類型的屬性,考慮到多項描述一般用來限定屬性取值的不同取值範圍,演算法將綜合所有約束範圍的交集作為結果。此外,演算法還支持對屬性值的預設推理和間接規則推理,其中預設推理由演算法第(5)步實現,實現後的結果見文中第3節本元認知邏輯中關於屬性值的預設處理的描述部分,基於規則的間接推理結果如下,給定以下知識:
如果 某男人 是 高個子 的 那麼 (某男人 的 身高) 是 大於 1.75 米 的;
張三 是一個 男人; 張三 是 高個子 的;
當調用本演算法求解張三的身高時,演算法自動給出答案「大於 1.75 米 的」,該推理實例涵蓋了屬性值預設推理和規則間接推理的綜合應用。此外,演算法還允許某對象的屬性值是基於其它對象的屬性值通過間接運算來描述,對此推理過程見演算法第(4)步,實現後的結果見文中第2.3.9節關於屬性值間接運算規則的介紹。
7)演算法4.4.7 被修飾名詞求解
對於由被多項修飾語句修飾的種類名詞構成片語型問句,該演算法自動搜索滿足條件的實例名詞,演算法入口為修飾語句列表、被修飾的種類名詞和介面類指針,出口為實例名詞求解結果、知識生效時間。與以上演算法不同的是,該演算法支持單解模式和多解模式兩種求解方式,靠入口傳遞的標誌量來區分,對於單解求解模式,演算法僅在符合條件的結果列表中返回最新搜索到的解,直接從出口返回,而對於多解求解模式,演算法直接從介面類中返回所有的求解結果列表,演算法實現如下:
(1)調用演算法4.3.3,檢測入口被修飾單詞類型是否為種類名詞,如果不是,則直接返回失敗;
(2)調用演算法4.3.6類型樹向下追溯求解,求解入口種類名詞類別之下的所有實例名詞和種類名詞列表;
(3)遍歷第(2)步求得的實例名詞列表,針對每個實例名詞,遍歷修飾語句列表中的語句,分別調用演算法4.4.8檢測修飾語句是否是名詞的合理修飾項,當某個實例名詞與列表中所有的修飾語句匹配成功時,則該名詞被認為是合理結果。此外,在轉調演算法時需構建新的臨時介面類變數,傳承入口的介面類變數中的歷史信息後,作為新的介面傳遞;
(4)對於入口求解模式為單解的情況,直接將滿足匹配的第一項名詞結果返回,如果為多解模式,則將所有滿足匹配條件的名詞結果均通過入口的介面類變數返回。
該演算法用於求解以下類型的問題:
入口修飾語句:桌子A 上面 的 今年 出版 的;
入口名詞:雜誌;
演算法將自動檢索滿足符合給定條件的所有雜誌。
8)演算法4.4.8 片語修飾語句求解
該演算法用於求解「片語」+「是 ** 的」類型的問句,演算法支持入口的片語及修飾語句中含有「某字項」的情況,並且返回結果為多解模式,演算法入口包括被修飾片語、修飾語句和介面類指針,演算法實現如下:
(1)分別檢測入口的被修飾片語及修飾語句中所包含的「某字項」的個數;
(2)如果入口的片語中僅含有1個「某字項」而且修飾語句中不含有「某字項」,則繼續調用演算法4.3.8檢測修飾語句是否是關於入口片語的某合理屬性值,如檢測成功,演算法4.3.8會自動返回與屬性值及對象相關聯的屬性名稱,然後調用演算法4.4.4求解入口片語的取值,並以求解後的片語取值、關聯屬性名稱以及入口的修飾語句作為參數,調用演算法4.4.9檢測屬性修飾句型是否成立,如果成立則本演算法返回成功,如果在調用演算法4.3.8的過程中檢測成功但後面步驟未成功,則返回失敗,否則繼續;
(3)如果入口的片語及修飾語句中均不含有某字項,則調用演算法4.4.4求解入口片語的取值,同時調用演算法4.4.10對修飾語句進行複合項預求解,然後針對求解和預處理後的片語和修飾語句,調用演算法4.3.10 修飾句型底層求解,如求解成功,則本演算法返回成功,如未成功,則調用演算法4.3.5類型樹向上追溯求解,求解入口片語取值對應的更高層的種類名詞,並由底至上遍歷,然後一一調用演算法4.3.10 修飾句型底層求解,一旦某層概念求解成功,則演算法返回成功,由於本演算法出口僅能通過介面類返回,但本步的結果僅需返回信息「成立」即可,不需要「某字項」等附加信息,此時可通過在介面類的結果鏈表中插入一個空項來標記成功,同時可利用該項將本步求得的知識生效時間返回(後文類似情況均照此辦理);
(4)調用演算法演算法4.4.5,對入口片語進行解嵌套處理,然後調用演算法4.4.10對入口的修飾語句進行複合項預求解;
(5)針對第(4)步處理後的修飾語句,利用演算法4.2.3提取其首個有效單詞,並調用演算法4.3.7檢測該單詞是否是(處理後)入口片語的合法屬性,如果是,則調用演算法4.4.9求解,將處理後的片語作為主體對象、已提取的首單詞作為屬性詞,並將入口修飾語句去除首單詞後的部分作為新的修飾語句入口,同時傳遞原始的介面類變數(因求解目標並未改變),如求解後至少存在1組解,則演算法返回成功;
(6)針對第(4)步處理後的入口片語,調用演算法4.3.14 對片語進行解析,求解片語的修飾語句列表以及被修飾主詞,如果被修飾詞的類型為屬性,而且修飾語句僅有1項,則仍調用演算法4.4.9求解,只是此時將修飾語句(去除後面的「的」)作為主體對象、而將被修飾詞作為屬性詞,修飾語句直接採用第(4)步預處理後的修飾語句,仍傳遞原始介面類變數,如求解後至少存在1組解,則演算法返回成功;
(7)重新構建問題語句,假設第(4)步處理後的片語為A、處理後的修飾語句為B,則構建語句「A 是 B 的」,然後調用演算法4.4.16求解,入口傳遞原始的介面類變數,如求解後至少有1組解,則演算法返回成功;
(8)如以上各步均為求解成功,則演算法返回失敗。
該演算法涉及的問句形式較多變,其中步驟(2)用來處理以下形式的入口:
入口片語:李三 ; 修飾語句: 肥胖 的;
入口片語:某蘋果; 修飾語句: 可口 的;
此時屬性名稱並未明顯出現,如第1句中的「體型」和第2句中的「味道」,但只要這些屬性已被合理定義,而且各對象的屬性值已知,則此類問句即可求解,該步推理是為了支持系統的本元認知邏輯(詳見第3節中修飾句型的隱含邏輯處理部分的介紹),此外,如第2例句,本演算法支持入口片語中含有「某字項」的情況,演算法在第2例句求解過程將會自動搜索並返回所有滿足條件的蘋果。演算法第(3)步用來處理入口片語及修飾語句均不含某字項的情況,此時不僅通過底層修飾句型求解演算法實現了基本的求解功能,還支持概念的自動向上追溯,該步支持了本元邏輯中對修飾句型預設處理的要求(見第3節)。第(4)步的處理保證了演算法支持複合句型描述,如以下入口:
入口片語:((李四 的 哥哥) 的 年齡);
修飾語句:大於 (張三 的 年齡) 的;
只要知識庫中已知各人物的關係及年齡,演算法即可正確求解該命題是否成立。演算法第(5)步用來處理以下的入口類型:
入口片語:工件A; 修飾語句:重量 大於 5 千克 的;
該步主要用途是配合調用該演算法的其它上層演算法,完成特定的句型求解,如演算法4.4.4的片語求解,具有該步支持後(經多次間接調用後用到了該路徑),將可求解以下片語的取值:
(重量 大於 3 千克 的 顏色 紅色 的 工件);
當「重量」和「顏色」均被定義為工件的合法屬性後,該問句即可正確求解。演算法第(6)步將具有屬性修飾描述的句型自動轉調,第(7)步用來在前面各步均未找到解的情況下,調用非標求解演算法進行最後的無解析匹配求解。
9)演算法4.4.9 屬性修飾語句求解
該演算法用來求解「(某對象 的 屬性) 是 ** 的」類型的問句,入口變數為對象名詞、屬性詞、修飾語句和介面類指針,入口名詞支持「某字項」,出口為多解模式,演算法實現如下:
(1)調用演算法4.4.10對入口的修飾語句進行複合項預求解;
(2)檢測入口名詞及(處理後)修飾語句中的某字項個數(其中入口屬性詞中不允許含有某字項);
(3)當名詞及修飾語句均不含「某字項」,或僅修飾語句中含有「某字項」時,調用演算法4.4.6屬性值求解,然後針對求解後的屬性值,調用演算法4.3.12屬性值比較求解,分別將入口的修飾語句及本步求解的屬性值語句作為模板語句和比較語句傳入,如果匹配成功,則將本項結果通過介面類返回,同時設置知識生效時間,當修飾句中含有「某字項」時,此處還需將演算法4.3.12返回的「某字項」及比較結果列表插入至介面類返回;
(4)當僅在入口對象名詞中含有「某字項」時,則調用演算法4.3.6類型樹向下追溯求解,求解入口「某字項」對應的名詞詞根所涵蓋的所有實例名詞列表,然後遍歷列表,分別按步驟(3)的方法進行屬性值比較求解,並將所有符合條件的結果通過介面類返回;
(5)當以上各步均未求解成功,則返回失敗。
該演算法用於求解以下類型的問句:
入口名詞:某男人; 入口屬性:身高;
修飾語句:大於 1.70 米 的;
多數情況下,該演算法作為演算法4.4.8的子演算法使用。
10)演算法4.4.10 問句的複合項預求解
自動化簡併求解問句中的複合項,包括片語和數值表達式等內容,但是當複合項中包含「某字項」時則不予求解,該演算法主要用於對複雜提問句型的預先化簡,演算法實現如下:
(1)調用演算法4.2.4,將語句拆解成單詞列表,並設置參數,將小括弧項和花括弧項作為整體項處理;
(2)遍歷拆解項,當遇到小括弧項時,如檢測該項不包含「某字項」,則調用片語求解演算法4.4.4,求解片語取值,並將其替換原句型中的小括弧項;
(3)遍歷拆解項,當遇到花括弧項時,如檢測該項不包含「某字項」,調用演算法演算法4.3.13實現花括弧內的數值常量表達式求解,經演算法確認為合理的常量表達式並求解成功,則將求解後的數值重新轉換為字元串形式,並替換原句型中的花括弧項。
該函數是一個輔助函數,演算法4.4.5的片語解嵌套處理、演算法4.4.4的片語求解,均常被用於在演算法推理過程對問題語句進行化簡,但各演算法的功能各有不同,以滿足不同推理演算法的需要,各演算法功用詳見其它演算法對這些演算法的調用過程。
11)演算法4.4.11 「是一個/種」型問題求解
求解諸如「A 是一個/種 B」型的問句,該演算法在演算法4.3.1「是一個/種」型問題底層求解基礎上,繼續擴展了對片語和「某字項」的支持,更完整地支持了該類句型的求解,演算法入口為問題語句以及介面類指針,入口支持「某字項」,出口為多解形式,演算法實現如下:
(1)利用演算法4.2.1,在入口語句的括弧項之外查找關鍵詞「是一個」或「是一種」,如未查找到,則返回失敗;
(2)以關鍵詞位置為基準,將入口分為前半子句和後半子句(不包括關鍵詞);
(3)針對前半子句及後半子句,分別刪除前後導空格,然後檢測子句類型,按照獨立單詞、獨立片語、複合語句分類(檢測方法略);
(4)當前、後子句均為單詞類型,直接調用演算法4.4.12求解,並將前、後子句分別傳入,同時傳遞原始的介面類變數(求解目標並未改變);
(5)當前半子句是片語,而後半子句為單詞時,直接轉調演算法4.4.13求解,並將前、後子句分別傳入,同時傳遞原始的介面類變數;當前半子句是單詞,而後半子句為片語時,仍調用該演算法,只是傳遞入口是將前後子句的位置調換;
(6)前面求解如已經遇到可行解,則返回成功,否則直接以原始問題語句和介面類變數,轉調演算法4.4.16求解。
該演算法的主要功能是利用第(4)步轉調的單詞對單詞的「是一個/種」求解及第(5)步的片語對單詞的「是一個/種」求解來實現的,併當前面未求到可行解時,在第(6)步最後用非標句型的匹配法間接推理求解。
12)演算法4.4.12 單詞對單詞的「是一個/種」求解
該演算法是演算法4.4.11的專用子演算法,用於求解「單詞A 是一個/種 單詞B」型的問題求解,演算法入口為單詞A、單詞B以及介面類指針,入口支持「某字項」,出口為多解模式,演算法實現如下:
(1)檢測入口單詞,如果單詞A和單詞B均不是「某字項」單詞,則直接調用演算法4.3.1「是一個/種」問題底層求解,如求解成功則演算法返回成功;
(2)如入口單詞A為「某字項」而單詞B為非「某字項」,則求取單詞A的詞根,並以此調用演算法演算法4.3.6類型樹向下追溯求解,求解單詞A的類別之下的所有實例名詞,然後遍歷該名稱列表,將列表中每個實例名詞與入口單詞B配對,然後調用演算法4.3.1檢測該實例名詞是否同時從屬於單詞B的類別,如檢測成功,則將該項結果插入到介面類變數中返回;
(3)如入口單詞A為非「某字項」而單詞B為「某字項」,則直接調用演算法4.3.5類型樹向上追溯求解,將單詞A所從屬的各級種類名詞求出並插入到介面類變數中返回;
(4)當入口的兩個單詞均為「某字項」時,則不處理,直接返回失敗。
演算法根據入口單詞是否為「某字項」進行分類處理,均為非「某字項」時則直接退化為演算法4.3.1的求解,僅A為「某字項」時,如以下問句:
某男人 是一個 工程師;
則系統自動搜索知識庫中已知的所有男人列表,並一一檢測其是否同時是一名工程師,最終返回的結果列表中,將是所有男工程師的集合,當僅有入口單詞B為某字項時,如:
梅花 是一個 某種類名稱;
則系統會自動將梅花所屬的類別(如花朵、植物、生物)列表全部返回,此處要說明的時,該句型下演算法對後面的「某字項」的具體詞根類型不作判斷,只要是「某字項」就採用該處理方式,如將上面例句最後「某字項」換做「某植物」、「某生物」,仍會得到同樣的求解結果。當入口兩個單詞均為「某字項」時,由於限定範圍太寬,演算法不予求解。
13)演算法4.4.13 片語對單詞的「是一個/種」求解
該演算法仍是演算法4.4.11的專用子演算法,用於求解「片語GA 是一個/種 單詞B」型的問題求解, 演算法入口為片語GA、單詞B以及介面類指針,入口支持「某字項」,出口為多解模式,演算法實現如下:
(1)調用演算法4.4.5 片語的解嵌套處理,對入口片語GA進行預處理,同時檢測GA和B中是否含有「某字項」;
(2)調用演算法4.3.14 求解片語GA的修飾項列表,同時獲取片語GA的被修飾主詞(設為MA);
(3)檢測被修飾主詞MA,如為「某字項」則直接返回失敗,否則調用演算法4.3.3檢測MA的單詞類型,如果為「屬性」類型,則調用演算法4.4.9 屬性修飾語句求解,並將片語GA的修飾項部分作為主體名詞,將被修飾詞MA作為屬性詞,將入口單詞B結尾連接「的」後作為新的修飾語句入口,求解時直接傳遞原始介面類變數(求解目標並未改變);
(4)如被修飾主詞MA的類型為「種類名詞」,且僅在入口B中含有「某字項」,則調用演算法4.4.7 被修飾名詞求解(以多解模式調用),直接傳遞原始入口類變數;
(5)如被修飾主詞MA的類型為「種類名詞」,且入口的GA和B中均不含「某字項」,仍調用演算法4.4.7 被修飾名詞求解,但此時以新構建的臨時介面類變數作入口,求解成功後,在得到的結果列表中檢測是否有與入口B相匹配的項,如有則返回成功,否則返回失敗。該演算法用於求解以下類型問題:
入口片語:(房間 裡面 的 桌子); 入口單詞:桌子A;
入口片語:(桌子 上面 的 工件); 入口單詞:某工件;
入口片語:(某工件 的 顏色); 入口單詞:紅色;
通過演算法4.4.11對該演算法調用前的預處理,可自動將問題中的片語和單詞進行調整順序,這樣對整個系統提問的演算法將可自由選擇問句中片語在前或單詞在前。
14)演算法4.4.14 「是」字句型求解
在中層推理演算法結構中,本演算法為較綜合型的演算法,通過路徑分解並轉調其它各子演算法實現,演算法用於求解所有以「是」作為主要連詞的問題語句,入口為問題語句及通用介面類指針,入口語句支持「某字項」,出口為多解形式,演算法實現如下:
(1)檢測入口語句並查找單詞「是」,然後將該單詞前後兩部分分裂成兩個子句,化簡去除兩子句的前後導空格;
(2)檢測前後兩個子句的句子類型,如果均為單詞或者獨立片語,則將入口語句的連詞「是」改成「是一個」,然後直接轉調演算法4.4.11求解,並直接將入口的介面類指針作為新的調用介面;
(3)檢測語句是否以單詞「的」結尾,如果是,則說明是修飾型語句,直接轉調演算法演算法4.4.8 片語修飾語句求解,同時傳遞入口的介面類指針;
(4)如以上條件均為滿足,則轉調演算法4.4.16求解,同時傳遞入口的介面類指針。
需注意演算法中的第(2)步,當問題語句的結構形式滿足「是一個」型的語句形式,僅是連詞為「是」時,則直接進行句型轉換,然後統一調用「是一個」型語句求解演算法。
15)演算法4.4.15 「被包含於」型問題求解
該演算法用於求解「A 被包含於 B」句型的問題,其中A和B即可以是單詞,也可以是片語,入口為問題語句及通用介面類指針,入口語句支持「某字項」,出口為多解形式,演算法實現如下:
(1)根據語句中單詞「被包含於」的位置,將語句分裂為前、後兩個子句,並化簡去除兩子句的前後導空格;
(2)對於兩個子句,分別檢測其類型,如果任何子句為片語類型,則調用演算法4.4.4片語求解演算法求解片語取值,將最終結果單詞替換各自子句;
(3)檢測化簡後的前、後子句中是否為「某字項」,如果均不為「某字項」,則直接調用演算法4.3.2「被包含於」型問題底層求解,如求解成功,則直接在介面類指針中插入一項條目作為求解結果;
(4)如前半子句為「某字項」而後半子句為非「某字項」,則首先將後半子句對應的「某字項」求取詞根,然後求解該詞所包含的所有名詞列表(可參考演算法4.3.6類型樹向下追溯求解演算法步驟,將關鍵詞換成「被包含於」即可),然後針對列表中的單詞,分別調用演算法4.3.1「是一個/種」型問題底層求解,所有滿足條件的結果均作為可行解插入到介面類中返回;
(5)如前半子句為非「某字項」而後半子句為「某字項」,則求解包含了前半子句的詞根的所有單詞列表(參考演算法4.3.5類型樹向上追溯求解的方法),然後將列表中所有有效單詞插入到介面類中返回;
(6)對於前後子句均為「某字項」的情況,不予求解(上層演算法對此類句型會自動轉調非標句型求解演算法)。
演算法通過第(4)步及第(5)步的求解,可支持多解的情況,例如系統已知知識語句:
哈爾濱 被包含於 黑龍江;黑龍江 被包含於 中國;
中國 被包含於 亞洲; 亞洲 被包含於 世界;
則對系統提問「某城市 被包含於 亞洲」時,系統將求得「哈爾濱」,而提問「某地理名稱 被包含於 亞洲」時,系統將同時返回「哈爾濱」、「黑龍江」和「中國」,當對系統提問「黑龍江 被包含於 某地理名稱」時,系統將同時返回「中國」、「亞洲」和「世界」。
16)演算法4.4.16 非標句型問題求解
該演算法用於求解句型結構不符合任何一種已定義句型的情況,針對此類語句僅採用通用方法處理,不能向針對專用語句那樣進行深入解析,但該求解仍然支持對語句內部「某字項」片語的自動化簡,支持基於規則的間接推理等機制,推理過程中直接對符合條件的某字項自動置換。
演算法思想是首先調用4.4.10演算法對「某字項」預求解,然後檢測語句中是否仍有未化簡的「某字項」,如沒有,則退化為底層推理問題,直接轉調4.3.15演算法求解,如果有,則轉調4.4.17進行規則轉折推理(演算法步驟略)。
該演算法在整個推理過程不僅用來處理各種規範外的多樣句型,同時也作為規則間接推理的轉折紐帶,當任何一種規範句型(如屬性值求解、是一個/種句型等)問題求解,當直接利用隱含規則在本層求解任務完成時,均將問題修改入口後退化為非標問題求解,然後轉調本演算法,再經本演算法轉調規則間接推理。
17)演算法4.4.17 規則間接推理
該演算法在整個推理過程中實現所有語句的規則轉折部分,是推理過程中非常重要的一環,步驟如下:
(1)基於演算法4.2.13等底層支撐函數,快速檢測知識庫中所有規則語句,將其中「那麼」從句所引導的句型與該入口問題句型向匹配的子集全部提出,檢索過程會自動對「某字項」按類別的符合性作通配處理;
(2)遍歷符合匹配條件的規則子集,針對每條規則均作下面步驟處理;
(3)根據規則中「那麼」從句與入口問題語句的匹配情況,得到匹配過程中需要置換的「某字項」對應列表,然後提取規則子句中的「如果」從句,將其中對應的「某字項」一一置換;
(4)根據置換後得到的新的問題,重新構建通用求解類入口,然後轉調演算法4.4.1主求解演算法進行新一輪問題求解;
(5)求解完成結果後,將本層新構建的問題求解結果,根據當前採用的規則語句,自動進行問題轉換,仍轉換為入口問題語句對應的答案,結果累積加入到本函數入口傳遞的通用介面類中,轉折過程中需將前面進行的「某字項」匹配和置換過程再次反向還原,以及其它輔助轉換工作(詳細步驟略)。
18)演算法4.4.18 屬性值運算規則間接推理
該演算法相當於對上一演算法(演算法4.4.17)的專項補充,專門用於支撐屬性值間接運算規則(見2.3.9節),演算法運行原理與演算法4.4.17相似,但本演算法專門解析「如果數值屬性」引導的規則語句(而不是「如果」引導的規則),演算法專門針對這一類規則進行設計,對規則中「某數值」等詞具有針對性的處理方法(演算法步驟略),利用該規則處理機制,可以實現各物體屬性值的相對運算關係描述,如:
如果數值屬性 (蘋果A 的 重量) 是 某數值 千克 的 那麼 (蘋果B 的 重量) 是 {(某數值+2)*5.0} 千克 的;
此規則與一般的邏輯規則混合,將可以表述更加複雜的知識。
4.5 高層推理演算法
高層推理可以在底層推理和中層推理的基礎上,支持更加自動化和智能化的推理機制。在建立了完善的底層推理和中層推理基礎上,將容易設計多種更高級的推理機制,本文目前僅重點針對系統的自動任務規劃問題開展研究,任務的描述採用單句形式的綜合型的CQNL語句(實際上,可為系統建立更加強大的多語句任務描述形式,系統地描述某綜合任務的目標、行動方案和指導原則等,本文暫不討論)。任務規劃採用經典的狀態空間搜索方法,但本系統任務和約束的描述均是以CQNL語言進行的,CQNL語句靈活的表達能力使得系統能快速理解各類複雜的任務,並及時給出問題求解結果。
4.5.1 功能算符的引入
為了進一步增強推理過程的靈活性,可以在語句中嵌入特殊的功能算符,算符的範圍提前固化,不具有再學習的功能,本系統引入的功能算符如下:
1)「%求解計數」算符:
例如以下規則語句,演算法解析時根據關鍵詞「%求解計數」觸發專門的處理,方法是將該關鍵詞後面引導的問題語句(關鍵詞後第2個花括弧內部的子句)當做問題入口來調用中層推理的主求解函數(演算法4.4.1),最終統計符合條件的結果的個數,將個數值代替「那麼」從句中的「某數值」,作為推理結果。需要說明的是,本規則仍然是以逆向推理的方式來引導的。
如果 %求解計數 {某數值} = {某蘋果 是 某物體 上面 的} 那麼 某物體 上面 有 某數值 個 蘋果;
上述例句形式有著廣泛的應用,例如我們以許多條不同類型的知識語句描述眾多事物,但提問時我們想知道符合某些特定條件的物體到底有多少個,例如房間里到底有幾張桌子,桌上到底有幾個蘋果,等等,那麼在引入上面例句的規則後,就可以對系統以「桌子1 上面 有 某數值 個 蘋果」的形式提問,來求得「桌子1」上面到底有幾個蘋果。該規則引入的意義不僅在於可以以這樣的形式提問,更重要的是該規則仍可作為多級規則間接推理中的一環,通過此類規則的承上啟下作用,系統邏輯表達能力被進一步拓寬。
2)「$某」算符:
上一節「%求解計數」對應的規則語句的引入,使演算法推理時可以描述符合某種狀態的物體個數,為了減少規則數量,此類語句應儘可能在更抽象的層面描述問題,第1)節例句中僅針對「蘋果」類別,如果將例句結尾的「蘋果」也換成「某字項」,規則具有更通用的含義,但提問的時以如「桌子1 上面 有 某數值 個 蘋果」,最後一個單詞往往是某一類物體的名稱而不是「某字項」,如果語句結尾換成「某蘋果」,則變成了特指,無法正確求解,可以考慮替換成「某種類名詞」,但此時求解時會遇到一個問題,提問時結尾詞一某物體種類名稱為入口時,會在轉折置換時將前面的「某種類名詞」也實例化成非「某字項」類別名詞,失去了原有含義,為此通過引入「$某」演算法,將規則語句改寫如下:
如果 %求解計數 {某數值} = { $某(某種類名詞) 是 某物體 上面 的} 那麼 某物體 上面 有 某數值 個 某種類名詞;
例句中的「$某(某種類名詞)」項表示特殊處理標記,演算法解析時會在該項括弧內的單詞被實例化後在詞前貫一個「某」而重新構成「某字項」,這樣上面的例句就可以表示更寬的含義。
此外,上面舉出的求解計數問題時,也可以讓系統推理時自動隱含處理此類問題,但隱含處理的邏輯過多會進一步加重演算法負擔,而像前面例句那樣通過規則的描述來擴展知識則非常方便,可以快速擴充知識和動態學習。在推理系統中,還可以引入更多此類的算符來增強知識表示的靈活性和系統推理能力。
4.5.2 事件模板的引入
為了實現任務規劃推理,引入事件模板的概念,事件模板用來描述一個可能發生的過程或者動作,包括事件本身的描述語句、事件啟動條件和執行事件後的結果描述,其語句格式如下:
事件模板 事件名稱 事件描述語句
如果 事件 啟動條件描述語句
那麼 執行結果描述語句;
其中事件描述語、執行條件語句和執行後結果句語句均可以是任意的CQNL語句,事件描述語可包括該事件行為的主體、動作以及操作對象的描述,結果語句可用連詞「而且」來並列多個子句,條件語句可用「而且」和「或」來描述符複合條件,其中事件描述、條件描述和結果描述語句中均可以帶有「某字項」,各句間同名的「某字項」將會被自動匹配,舉例如下:
事件模板 開箱 機械手A 打開 某箱子
如果 某箱子 是 關閉 的
那麼 某箱子 是 打開 的;
事件模板 物品裝箱 機器人 將 某物品 裝入 某箱子
如果 某箱子 是 打開 的 而且 某物品 是 在 桌子 上面 的
那麼 某物品 是 在 箱子 裡面 的;
在任務規劃推理過程中,一旦某事件模板被啟用,均會有相應的實例名詞置換模板中的「某字項」,使之成為與特定事物關聯的一次具體事件,每個事件模板均可以被反覆使用,任務推理時會在輸入的事件模板庫中反覆級聯搜索,直到遍歷所有可能或者成功求解任務。
4.5.3 事件的關聯觸發
當某些事件已經發生時,按照邏輯約束,常有一些其它的相關事件同步發生,引入事件觸發語句可用來處理此類情況,句型如下:
如果 發生事件… 而且 發生事件 … 那麼 發生事件…;
目前系統引入該句型僅用於描述任務求解過程中的禁止路徑,提高系統對任務約束條件的描述能力,句型如下:
如果 發生事件 機械手 拿起 某物體 而且 (某物體 的 重量)是 大於 5 千克 的 那麼 發生事件 任務失敗;
該句用來描述機械手抓取物體時的重量限制,知識庫中加入此句後,任務規劃推理演算法將可自動避免機械手抓取5千克以上的物體。實際上,此類任務約束也可在前面事件模板的執行條件語句中實現,但是當執行任務時附加條件較多時,將導致事件模板描述語句過於冗長,而且當條件動態變化時還需反覆修改事件模板,利用該事件觸發語句描述可靈活地實現任務附加約束的補充描述,且方便動態增減,實際系統中該句型和事件模板描述語句可靈活配合使用。
關於該類型語句的推理,與演算法4.4.17描述的規則間接推理類似,只是在搜索執行子句時以「那麼 發生事件」作為整體來代替「那麼」,在搜索條件子句時以「如果 發生事件」代替「如果」,該推理路徑需統一歸併到演算法4.4.1 中層推理綜合問題求解中,並與前文其它各類型語句混合推理,才能滿足下節介紹的任務規劃推理演算法的需求。
4.5.3 任務規劃推理
任務規劃演算法實現如下:
(1)給定任務求解的目標描述語句,一般為某些目標需要達到的狀態,可以是「而且」等連詞構成的多個並列子句;
(2)建立Close表,記錄已經執行過的事件模板路徑;
(3)檢測是否發生路徑失敗,檢測方式為調用演算法4.4.1 中層推理綜合問題求解,並將「發生事件 路徑失敗」直接作為問題代入語句;
(4)檢測是否完成求解任務,直接調用演算法4.4.1,並將本演算法入口的目標描述語句直接作為問題代入,如求解成功,則演算法退出,Close表中事件模板列表即為求解結果;
(5)遍歷知識庫中所有的事件模板庫列表,檢測本輪激活的事件模板,檢測方法為直接截取事件模板的啟動條件子句,並以之為入口調用演算法4.4.1,當條件語句包括「某字項」時,求解會自動求解與之匹配的所有可能實例組合列表,並通過通用介面類指針返回。如果本次檢測不到任何符合條件的事件模板,則推理失敗,否則對於每個檢測通過的事件模板,執行後續操作;
(6)對於當前檢測通過的事件模板,遍歷條件語句求解時返回的匹配結果列表(在通用介面類中),並遍歷每一項正確的匹配,執行後續操作;
(7)針對事件模板的任一正確匹配結果,嘗試執行事件,具體做法是將模板對應的執行結果語句作為新增知識加入到知識庫中,加入前需要對各個「某字項」進行實例化置換,另外對此處新增的知識需要作臨時標記,完成本次事件模板相關推理後需要清除臨時知識語句,以避免干擾其它推理路徑;
(8)遞歸調用該演算法本身,以原始問題入口以及當前動態的Close表和新增的臨時知識語句狀態為新的入口,回到步驟(1);
(9)清除當前事件模板加入的臨時知識語句,以及Close表中的插入項;
5 綜合試驗
5.1 基本問題求解試驗
本節以機器人對環境的理解問題為例,通過CQNL語句對環境內的物體屬性及相對位置關係等信息進行描述,然後對機器人進行提問,檢測其知識理解及推理過程。
需要指出的是,本推理系統在初始為輸入知識時是一無所知的,除了2.1節中給出的「種類名詞」、「是一個」、「被包含於」等本元關鍵詞之外,其餘所有的信息均可動態定義,只要輸入語句符合CQNL語法格式,語句錄入的過程即相當於完成了學習的過程,任何錄入的合法語句均作為已知的知識參與推理,支持後續的問題求解過程。
1)基本知識語句推理試驗
首先,為系統錄入與環境與物體相關的基本知識語句,暫時不考慮規則語句,語句如下表:
物體 是一種 種類名詞;
重量 屬性包含於 物體;
體積 屬性包含於 物體;
顏色 屬性包含於 物體;
形狀 屬性包含於 物體;
價值 屬性包含於 物體;
物體 是一種 相對稱謂主體;
子物體 是一種 相對稱謂;
配套物體 是一種 相對稱謂;
千克 屬性單位 重量;
立方米 屬性單位為 體積;
元 屬性單位為 價值;
紅色 屬性值為 顏色;
灰色 屬性值為 顏色;
白色 屬性值為 顏色;
黑色 屬性值為 顏色;
方形 屬性值為 形狀;
圓形 屬性值為 形狀;
桌子 是一種 物體;
電腦桌 是一種 桌子;
(電腦桌 的 顏色) 是 白色 的;
實驗桌 是一種 桌子;
(實驗桌 的 顏色) 是 灰色 的;
椅子 是一種 物體;
試驗椅 是一種 椅子;
(試驗椅 的 顏色) 是 黑色 的;
辦公椅 是一種 椅子;
(辦公椅 的 顏色) 是 黑色 的;
杯子 是一種 物體;
茶杯 是一種 杯子;
玻璃杯 是一種 杯子;
電腦 是一種 物體;
A型電腦 是一種 電腦;
B型電腦 是一種 電腦;
電腦主機 是一種 物體;
顯示器 是一種 物體;
滑鼠 是一種 物體;
盤子 是一種 物體;
水果 是一種 物體;
蘋果 是一種 水果;
桔子 是一種 水果;
然後針對某特定的環境場景,對場景中的具體物體的位置關係以及屬性進行描述,語句列表如下:
實驗桌1 是一個 實驗桌;
實驗椅1 是一個 實驗椅;
實驗椅2 是一個 實驗椅;
實驗椅1 是 實驗桌1 的 配套物體;
實驗椅2 是 實驗桌1 的 配套物體;
實驗椅1 是 在 實驗桌1 附近 的;
試驗椅2 是 在 試驗桌1 附近 的;
電腦桌1 是一個 電腦桌;
電腦桌1 是 在 實驗桌1 右側 的;
電腦桌2 是一個 電腦桌;
電腦桌2 是 在 電腦桌1 右側 的;
辦公椅1 是一個 辦公椅;
辦公椅2 是一個 辦公椅;
辦公椅1 是 電腦桌1 的 配套物體;
辦公椅2 是 電腦桌2 的 配套物體;
辦公椅1 是 在 電腦桌1 附近 的;
辦公椅2 是 在 電腦桌2 附近 的;
電腦1 是一個 A型電腦;
電腦2 是一個 B型電腦;
電腦1 是 在 電腦桌1 上面 的;
電腦2 是 在 電腦桌2 上面 的;
電腦1主機 是一個 電腦主機;
(電腦1主機 的 顏色) 是 黑色 的;
電腦1主機 是 電腦1 的 子物體;
電腦2主機 是一個 電腦主機;
(電腦2主機 的 顏色) 是 白色 的;
電腦2主機 是 電腦2 的 子物體;
電腦1顯示器 是一個 顯示器;
電腦1顯示器 是 電腦1 的 子物體;
電腦2顯示器 是一個 顯示器;
電腦2顯示器 是 電腦2 的 子物體;
電腦1滑鼠 是一個 滑鼠;
電腦2 滑鼠 是一個 滑鼠;
電腦1滑鼠 是 電腦1 的 子物體;
電腦2滑鼠 是 電腦2 的 子物體;
盤子1 是一個 盤子;
盤子2 是一個 盤子;
(盤子1 的 顏色) 是 紅色 的;
(盤子1 的 形狀) 是 方形 的;
(盤子2 的 顏色) 是 白色 的;
(盤子2 的 形狀) 是 圓形 的;
盤子1 是 在 實驗桌1 上面 的;
盤子2 是 在 實驗桌1 上面 的;
蘋果1 是一個 蘋果;
蘋果2 是一個 蘋果;
桔子1 是一個 桔子;
桔子2 是一個 桔子;
桔子3 是一個 桔子;
針對以上兩個表格中輸入的知識語句,對系統進行提問求解測試,求解過程如下表,其中「/*--*/」間的內容為補充說明(下文同理):
提問 電腦1 是一個 物體;
求解 成立;
提問 盤子1 是一個 水果;
求解 不成立;
提問 (電腦桌1 附近 的 辦公椅);
求解 辦公椅1;
提問 (紅色 的 方形 的 盤子);
求解 盤子1;
提問 某物體 是 電腦1 的 子物體;
求解 電腦1主機;
電腦1顯示器;
電腦1滑鼠;
提問 某盤子 是 在 某桌子 上面 的;
求解 盤子1 實驗桌1;
盤子2 實驗桌1;
提問 (某物體 的 顏色) 是 白色 的
求解 電腦2主機;
盤子2;
電腦桌1;
電腦桌2;
/*說明:其中「電腦桌1」和「電腦桌2」的顏色並未直接描述,而是根據語句「(電腦桌 的 顏色) 是 白色 的」含義間接求得*/
提問 某電腦;
求解 電腦1;
電腦2;
/*說明:相當與列出所有已知的電腦*/
提問 ((電腦桌1 的 配套物體) 的 顏色);
求解 黑色;
/*說明:先求解出「辦公椅1」再求解出其顏色屬性*/
提問 (顏色 紅色 的 盤子);
求解 盤子1;
/*說明:如果以「(紅色 的 盤子)」提問,得到結果相同,演算法會自動在兩種句型間轉換*/
2)引入規則後推理試驗
下面為系統引入推理規則,並測試求解過程,下表為在以上已定義的知識語句基礎上,繼續補償添加的知識語句,補充的知識語句包括規則語句和其它知識語句,其中以「如果」和「如果數值屬性」單詞引導的為規則語句。需要說明的是,下表中的非規則部分知識語句,如對物體價值屬性的定量描述等,在規則語句引入前即可獨立推理,即原本可放在第1)節介紹,放在此處是為了方便觀察各知識語句與規則語句的聯繫,從而更便於理解系統推理過程。實際推理系統中對各類知識語句和規則語句的輸入順序也沒有限定,只要各類需要的知識均曾經被輸入系統,即可正確推理。
如果 (某物體 的 價值) 是 大於 1000 元 的 那麼 某物體 是 貴重 的;
如果 (某物體 的 價值) 是 大於 600 元 的 而且 (某物體 的 價值) 是 小於 1000 元 的 那麼 某物體 是 較貴重 的;
(實驗桌 的 價值) 是 800 元 的;
(電腦桌 的 價值) 是 500 元 的;
(辦公椅 的 價值) 是 200 元 的;
如果 (某物體 的 重量) 是 大於 10 千克 的 那麼 某物體 是 沉重 的;
如果 (某物體 的 重量) 是 大於 5 千克 的 那麼 某物體 是 不輕 的;
如果 (某物體 的 重量) 是 小於 1 千克 的 那麼 某物體 是 較輕 的;
(實驗桌 的 重量) 是 15 千克 的;
(電腦桌 的 重量) 是 8 千克 的;
(辦公椅 的 重量) 是 3 千克 的;
(顯示器 的 重量) 是 3 千克 的;
(滑鼠 的 重量) 是 0.1 千克 的;
如果 %求解計數 {某數值} = { $某(某種類名詞) 是 某物體 上面 的} 那麼 某物體 上面 有 某數值 個 某種類名詞;
如果 某物體_1 是 在 某物體_2 裡面 的 而且 某物體_2 是 在 某物體_3 上面 的 那麼 某物體_1 是 在 某物體_3 上面的;
蘋果1 是 在 盤子1 裡面 的;
蘋果2 是 在 盤子1 裡面 的;
桔子1 是 在 盤子2 裡面 的;
桔子2 是 在 盤子2 裡面 的;
桔子3 是 在 盤子2 裡面 的;
如果 某物體_1 是 某物體_2 的 子物體 而且 某物體_2 是 在 某物體_3 上面 的 那麼 某物體_1 是 在 某物體_3 上面 的;
如果 (某物體_1 的 顏色) 是 某屬性值_1 的 而且 (某物體_2 的 顏色) 是 某屬性值_1 的 那麼 某物體_1 和 某物體_2 是 顏色相同 的;
如果 (某物體_1 的 重量) 是 大於 (某物體_2 的 重量) 的 那麼 某物體_1 是 比 某物體_2 重 的;
如果 某物體_1 是 超重 的 而且 某物體_2 是 比 某物體_1 重 的 那麼 某物體_2 是 超重 的;
如果數值屬性 (A型電腦 的 價值) 是 某數值_1 元 的 那麼 (B型電腦 的 價值) 是 {某數值_1+1000} 元 的;
(A型電腦 的 價值) 是 4000 元 的;
基於補充上表知識語句後的知識庫,繼續對系統進行提問求解測試,求解過程如下表:
提問 (實驗桌1 的 價值);
求解 800 元;
提問 (某桌子 的 價值) 是 小於 600 元 的;
求解 電腦桌1;
電腦桌2;
提問 某物體 是 比較 貴重 的;
求解 實驗桌1;
實驗桌2;
/*說明:根據對「比較貴重」描述的規則語句間接推理*/
提問 (電腦1 的 價值);
求解 4000 元;
/*說明:A型電腦的價值描述求解*/
提問 (電腦2 的 價值);
求解 5000 元;
/*說明:根據電腦1、電腦2的類型屬性以及上表中對A、B型電腦價值關係的規則(「如果數值屬性」規則)推理*/
提問 某物體 是 貴重 的;
求解 電腦1;
電腦2;
/*說明:其中「電腦2」是先根據數值屬性規則求得其載入,然後再根據對「貴重」描述的規則求得*/
提問 某數值 個 水果 是 在 盤子2 裡面 的;
求解 3個;
/*說明:根據規則「如果 %求解計數…」推理*/
提問 某數值 個 水果 是 在 實驗桌1 上面 的;
求解 5個;
/*說明:根據知識描述,實驗桌2上面有2個盤子,分別裝有2個蘋果和3個桔子,根據上表第7條規則對相對位置關係的級聯描述,實驗桌2上共有5個水果*/
提問 某物體 是 在 電腦桌1 上面 的;
求解 電腦1;
電腦1主機;
電腦1顯示器;
電腦1滑鼠;
/*說明:其中答案「電腦1」為知識庫直接描述,後面各電腦部件為根據上表第8條規則關於子物體與所屬物體的位置關係描述推理求得*/
5.2 任務規劃試驗
案例1:機器人取物品推理
在以上已定義的知識語句基礎上,繼續補償添加的知識語句(如下表),表中關於「事件模板」的定義方式及其推理規則的說明見4.5.2節。
桌子抽屜 是一種 物體;
桌1左抽屜 是一個 桌子抽屜;
桌1左抽屜 是 電腦桌1 的 子物體;
桌1右抽屜 是一個 桌子抽屜;
桌1右抽屜 是 電腦桌1 的 子物體;
桌2左抽屜 是一個 桌子抽屜;
桌2左抽屜 是 電腦桌2 的 子物體;
桌2右抽屜 是一個 桌子抽屜;
桌2右抽屜 是 電腦桌2 的 子物體;
位置狀態 屬性包含於 物體;
書本 是一種 物體;
書本A 是一個 書本;
(書本A 的 位置狀態) 是 在 桌2右抽屜 裡面 的;
開合狀態 屬性包含於 桌子抽屜;
(桌1左抽屜 的 開合狀態)是 關閉 的;
(桌1右抽屜 的 開合狀態)是 關閉 的;
(桌2左抽屜 的 開合狀態)是 關閉 的;
(桌2右抽屜 的 開合狀態)是 關閉 的;
如果 某物體 是 在 某桌子 上面 的 那麼 (某物體 的 位置狀態) 是 在 某桌子 上面 的;
事件模板 桌上取物 機器人 從 某桌子 拿取 某物體
如果 (某物體 的 位置狀態) 是 在 某桌子 上面 的 而且 (某物體 的 重量)是 小於 2千克 的
那麼 (某物體 的 位置狀態) 是 在 機器人 手中 的;
模板結束;
事件模板 桌上放物 機器人 向 某桌子 放置 某物體
如果 (某物體 的 位置狀態) 是 在 機器人 手中 的
那麼 (某物體 的 位置狀態) 是 在 某桌子 上面 的;
模板結束;
事件模板 打開抽屜 機器人 打開 某桌子 的 某抽屜
如果 某抽屜 是 某桌子 的 子物體 而且 (某抽屜 的 開合狀態) 是 開著 的
那麼 (某抽屜 的 開合狀態)是 關閉 的;
模板結束;
事件模板 關閉抽屜 略(原理同上);
事件模板 抽屜取物 機器人 從 某抽屜 取出 某物體
如果 (某物體 的 位置狀態) 是 某抽屜 裡面 的 而且 (某物體 的 重量)是 小於 2千克 的
那麼 (某物體 的 位置狀態) 是 在 機器人 手中 的;
模板結束;
事件模板 抽屜放物 略(原理同上);
基於補充上表知識語句後的知識庫,繼續對系統進行提問求解測試,求解過程如下表:
提問 任務求解 (電腦1滑鼠 的 位置狀態) 是 在 機器人 手中 的;
求解
執行事件 機器人 從 電腦桌1 拿取 電腦1 滑鼠;
/*說明:根據前面知識描述,結合電腦1的位置描述以及電腦1滑鼠與電腦的從屬關係推斷該滑鼠的位置,並結合桌上去物事件模板的推理,得出求解結果*/
提問 任務求解 (顯示器1 的 位置狀態) 是 在 機器人 手中 的;
求解
求解失敗;
/*說明:桌上取物的事件模板中限定約束物體的重量小於2千克,顯示器重量不滿足要求*/
提問 任務求解 (書本A 的 位置狀態) 是 在 機器人 手中 的 而且 如果 某抽屜 是一個 桌子抽屜 那麼(某抽屜 的 開合狀態)是 關閉 的;
/*說明:後半句約束條件要求在取出物體的同時,保證所有的桌子抽屜處於關好的狀態*/
求解
執行事件 機器人 打開 電腦桌2 的 桌2右抽屜;
執行事件 機器人 從 桌2右抽屜 取出 書本A;
執行事件 機器人 關閉 電腦桌2 的 桌2右抽屜;
/*說明:以上任務求解時,均可以在操作者不知道目標物體位置(機器人知道)的情況下,由機器人自動找到物體並取出,實際求解時,也可先詢問機器人該物體的位置狀態,然後下達更有針對性的指令*/
案例2:狀態空間搜索問題求解
下面針對一典型的狀態空間搜索問題進行推理,問題描述為:共有6隻猴子想要過江,有3隻老猴,各自帶著一個孩子(小猴),江面上只有一條船,船每次只能容納兩隻猴子,過江時至少需要有一隻猴子會划船,其中所有的老猴都會划船,小猴中只有一隻會划船。在過江過程中,任何一隻小猴,在其母親不在的情況下都不能和其它老猴單獨相處(包括在岸上和在船上),否則將被其它老猴殺害,導致任務失敗。
下面先將問題描述成類自然語言(以下描述中未用到前面表中的知識,僅由下表的知識描述完整問題),如下表:
猴子 是一種 種類名詞;
猴子 是一種 相對稱謂主體;
老猴 是一種 猴子;
小猴 是一種 猴子;
孩子 是一種 相對稱謂;
母親 是一種 相對稱謂;
船 是一種 種類名詞;
小船A 是一個 船;
狀態 屬性包含於 猴子;
狀態 屬性包含於 船;
如果 某猴子 是一個 老猴 那麼 某猴子 是 會划船 的
如果 某猴子_1 是 某猴子_2 的 母親 那麼 某猴子_2 是 某猴子_1 的 孩子;
如果 %求解計數 {某數值}={ ( $某(某種類名詞_1) 的 狀態) 是 某屬性值 的 } {} 那麼 某數值 個 某種類名詞_1 是 某屬性值 的;
事件模板 一猴過江 某猴子 過江
如果 某猴子 是 在此岸 的 而且 某猴子 是 會划船 的 而且 (小船A 的 狀態) 是 在此岸 的
那麼 某猴子 是 在彼岸 的 而且 (小船A 的 狀態) 是 在彼岸 的;
事件模板 兩猴過江 某猴子_1 和 某猴子_2 過江
如果 某猴子_1 是 在此岸 的 而且 某猴子_2 是 在此岸 的 而且 某猴子_1 是 會划船 的 而且 (小船A 的 狀態) 是 在此岸 的
那麼 某猴子_1 是 在彼岸 的 而且 某猴子_2 是 在彼岸 的 而且 (小船A 的 狀態) 是 在彼岸 的;
模板結束;
事件模板 一猴返回 某猴子 返回
如果 某猴子 是 在彼岸 的 而且 某猴子 是 會划船 的 而且 (小船A 的 狀態) 是 在彼岸 的
那麼 某猴子 是 在此岸 的 而且 (小船A 的 狀態) 是 在此岸 的;
模板結束;
事件模板 兩猴返回 某猴子_1 和 某猴子_2 返回
如果 某猴子_1 是 在彼岸 的 而且 某猴子_2 是 在彼岸 的 而且 某猴子_1 是 會划船 的 而且 (小船A 的 狀態) 是 在彼岸 的
那麼 某猴子_1 是 在此岸 的 而且 某猴子_2 是 在此岸 的 而且 (小船A 的 狀態) 是 在此岸 的;
模板結束;
如果 發生事件 某老猴 和 某小猴 過江 而且 非 某小猴 是 某老猴 的 孩子 那麼 發生事件 任務失敗;
如果 發生事件 某小猴 和 某老猴 過江 而且 非 某小猴 是 某老猴 的 孩子 那麼 發生事件 任務失敗;
如果 發生事件 某老猴 和 某小猴 返回 而且 非 某小猴 是 某老猴 的 孩子 那麼 發生事件 任務失敗;
如果 發生事件 某小猴 和 某老猴 返回 而且 非 某小猴 是 某老猴 的 孩子 那麼 發生事件 任務失敗;
如果 某小猴 是一個 小猴 而且 (某小猴 的 狀態) 是 某屬性值 的 而且 (某老猴 的 狀態) 是 某屬性值 的 而且 非 ((某小猴 的 母親) 的 狀態) 是 某屬性值 的 那麼 發生事件 任務失敗;
老猴A 是一個 老猴;
老猴B 是一個 老猴;
老猴C 是一個 老猴;
小猴A 是一個 小猴;
小猴B 是一個 小猴;
小猴C 是一個 小猴;
老猴A 是 小猴A 的 母親;
老猴B 是 小猴B 的 母親;
老猴C 是 小猴C 的 母親;
(老猴A 的 狀態) 是 在此岸 的;
(老猴B 的 狀態) 是 在此岸 的;
(老猴C 的 狀態) 是 在此岸 的;
(小猴A 的 狀態) 是 在此岸 的;
(小猴B 的 狀態) 是 在此岸 的;
(小猴C 的 狀態) 是 在此岸 的;
(小船A 的 狀態) 是 在此岸 的;
針對以上輸入的知識和信息描述,提出求解問題,目標是所有的猴子都要過到對岸,問題的提問形式及最終求解結果如下表:
提問 任務求解 如果 某猴子 是一個 猴子 那麼 (某猴子 的 狀態) 是 在彼岸 的;
求解
執行事件 老猴B 和 小猴B 過江;
執行事件 老猴B 返回;
執行事件 小猴A 和 小猴C 過江;
執行事件 小猴A 返回;
執行事件 老猴C 和 老猴B 過江;
執行事件 老猴B 和 小猴B 返回;
執行事件 老猴A 和 小猴A 過江;
執行事件 老猴C 和 小猴C 返回;
執行事件 老猴B 和 老猴C 過江;
執行事件 小猴A 返回;
執行事件 小猴A 和 小猴B 過江;
執行事件 小猴A 返回;
執行事件 小猴A 和 小猴C 過江;
分析表中的求解結果可見,按照系統規劃的執行步驟,能夠有效完成任務。
本節針對機器人抓取物品以及另一典型狀態空間搜索問題演示了系統的推理能力,從問題的複雜度來看,已求解的問題遠算不上複雜,甚至有許多更簡單的其它方法和系統可以實現該求解任務,但該系統的優勢在於,在問題描述被輸入系統之前,系統是一無所知的,包括什麼是「物體、電腦、桌子、猴子、抓取、孩子、過江」等所有定義、所有動作和所有規則都是可動態學習的,這將賦予系統最大的靈活性。本節限於篇幅和結果的可讀性,並未舉例更加複雜的推理任務,而實際上系統具備的推理潛力是非常大的,因為所有的定義、規則和任務描述過程中都可以嵌入前文描述的任何一種句型,在系統化的類自然語言體系的支撐下,我們可以很容易地將我們要達成的任務目標告知系統,也很容易將該任務需要涉及的背景知識告知系統。
另外,案例中還可看出,系統用來描述知識和規則的語句並沒有做到簡潔和高效,但大部分知識描述是非常簡單的句型,只有少量涉及規則的語句相對複雜,但仍是很容易被人類理解的句型,況且實際的智能系統知識庫並不是一次性建立的,可將大量通用的知識和規則事先設計好,建成常備知識庫,然後針對特定任務時,只要再將任務用到的附加知識告知系統即可。
6 結論
論文設計了一種漢語類自然語言體系CQNL,並基於該語言設計了完善的知識表示和邏輯推理方法,該方法使得知識的表示過程、推理過程和學習過程高效融合,因為三種過程均以CQNL為載體,無需作任何中間轉換。雖限於篇幅,文中並未舉例更加複雜的知識庫和求解任務,但是通過對求解演算法設計思路以及各句型的分析可以看出,本文設計的系統具有很強的知識表示和推理能力。系統仍存在許多不足及需要完善之處:
1)CQNL語句類型雖接近自然語言,但形式仍相對僵化,要求用戶輸入時各個單詞是斷開的,而且用來連接的括弧等符號不能省略,這將影響交互效率,況且也不能直接和語言識別系統連接。但可以考慮以CQNL語言為中間載體,再設計一層語言翻譯或預處理系統,將用戶原始輸入的語音或者文本信息按照CQNL語句格式進行規範化和斷句等處理,從而允許用戶以更靈活和高效的方式與系統交互,由於CQNL複雜度終究遠小於自然語言,所以該預處理工作並不會過於複雜;
2)系統推理時採用完全推理形式,即每一次邏輯轉折,均搜索知識庫中所有符合條件的規則,該推理保證了系統能夠將現有知識庫所有隱含的可能信息挖掘出來用於問題求解,但是當規則體系過於龐大,且相互耦合複雜時,求解速度會減慢,本系統為防止推理轉折次數過多而導致求解過程不可控(同時也為了限制規則不合理引起的推理死循環),引入了最大推理深度限制(8次轉折)。該特點使得系統無法像目前其它優秀的大數據處理系統一樣處理海量信息,但在智能服務機器人、特定智能軟體系統、特定知識庫智能求解等中小型知識系統中仍有廣泛的應用價值,而且後續可進一步考慮將該系統與其它具有大數據處理能力的系統結合,以該系統為推理核心,其它大數據系統進行外圍子問題處理,從而擴展系統應用範圍。
3)系統目前設計的知識表示及推理體系仍是不完善的,實際上,現階段幾乎不可能設計出適用任何領域的通用推理系統,所以後續如要繼續完善推理系統,需設定應用範圍。以智能服務機器人為例,如要應用該系統還需考慮空間幾何位置及碰撞等問題的精確計算,並將其與語言描述形式的知識混合推理,另外系統中對各物體的描述仍是以個體實例為主,這樣在同類物體數量較多時,描述過程過於繁瑣,可考慮在知識推理中引入對集合的專門處理機制,最後,對機器人作業任務描述時,除了文中的事件模板外,還可引入更高級的形式,如利用CQNL構成腳本語言段落,更系統地描述作業任務的需求、情景設定,對各類異常情況的處理措施等。
推薦閱讀:
※商湯科技副總裁楊帆:安防行業需要具備強大自我進化能力的AI
※這年頭,你連吵架都吵不過AI了……
※學習人工智慧必讀這30本書!
※人工智慧最有前景公司有哪些?
※【報道】谷歌正式開源 Hinton 膠囊理論代碼,即刻用 TensorFlow 實現吧