2010-05-24 65 views
7

我有一組具有屬性和一組規則的對象,當它們應用於對象集時,提供了這些對象的一個​​子集。爲了使這更容易理解,我將提供一個具體的例子。推理引擎根據內部規則計算匹配集

我的對象是人,每個人都有三個屬性:原籍國,性別和年齡組(所有屬性都是離散的)。我有許多規則,比如「來自美國的所有男性」,這些規則與這組較大的對象的子集相對應。

我正在尋找一個現有的Java「推理引擎」或類似的東西,它將能夠從規則映射到人員子集,或者關於如何去創建我自己的東西的建議。我已經閱讀了規則引擎,但是這個術語似乎專門用於使業務規則具體化的專家系統,並且通常不包括任何高級形式的推理。以下是我需要處理的更復雜場景的一些示例:

  1. 我需要規則的連接。因此,當提出「包括所有男性」和「排除10-20歲年齡段的所有美國人」時,我只對美國以外的男性和美國以外的男性感興趣, 20歲年齡段。

  2. 規則可能有不同的優先級(明確定義)。因此,一條規定「排除所有男性」的規則將覆蓋一條規定,說「包括所有美國男性」。

  3. 規則可能有衝突。因此,我可以同時擁有「包括所有男性」和「排除所有男性」,在這種情況下,優先事項必須解決問題。

  4. 規則是對稱的。所以「包括所有男性」相當於「排除所有女性」。

  5. 規則(或更確切地說子集)可能有與它們相關的元規則(明確定義)。在應用原始規則或通過推理達到子集的任何情況下,都必須應用這些元規則。因此,如果「排除美國」的元規則附加到規則「包括所有男性」,並且我爲引擎提供了「排除所有女性」的規則,則應該能夠推斷「排除所有女性」子集相當於「包含所有男性」子集,因此另外應用「排除美國」規則。

我完全有可能沒有第5項活,但我確實需要提到的所有其他屬性。我的規則和對象都存儲在數據庫中,並且可以在任何階段進行更新,所以我需要在需要時實例化「推理引擎」,並在之後將其摧毀。

+0

RDBMS中的數據是?爲什麼不在數據級別嘗試這一點?這聽起來更像是你需要一個報告工具給我。 – used2could 2010-05-24 14:05:19

+0

數據在RDBMS中,是的,但我不確定報告工具是否足夠。我幾乎沒有什麼經驗,但似乎複雜性與實時使用而不是報告相結合會使它變得不可行? – Zecrates 2010-05-26 07:48:46

+0

我認爲你可以在業務分析方面做更多的工作。從你的描述中,我發現業務需求翻譯不夠專業術語 - 例如:「因此,一條規定」排除所有男性「的規則將覆蓋一條規定,說」包括所有美國男性「。 - 這可以被解釋爲一條單獨的規則」排除美國以外的所有男性「,並且在任何運行規則引擎的權力範圍內,我建議你閱讀一下NLP和形式邏輯,最後一件事 - 避免優先級和瘟疫,這是最簡單的最終導致無法維護的混亂。訂購也很糟糕,但並不壞。 – ddimitrov 2010-08-04 15:06:55

回答

3

有一堆類似於Java的嵌入式Prolog-like SLD求解器;我最喜歡的方法是使用mini-Kanren for Scala,因爲這是乾淨的,並允許您使用Scala懶洋洋地處理查詢的結果,但我沒有深入使用它。其他選項請參閱Embedded Prolog Interpreter/Compiler for Java,以及Ross的回答。

SLD求解器處理所有這些標準,只要他們有Prolog有一些額外的功能:

  1. 的規則的契合:基本SLD目標處理;
  2. 規則可能有不同的優先級:Prolog的裁減規則允許表示否定,前提是查詢是可判定的;
  3. 規則可能有衝突:同樣,如果滿足更高優先級目標,則可以使用cut來確保不應用較低優先級的子句。有幾種方法可以做到這一點。
  4. 規則是對稱的:使用剪切,這可以很容易地確保可判定謂詞。
  5. 規則(或更確切的說是子集)可能有與其關聯的元規則(明確定義):您的示例似乎表明這相當於4,因此我不確定在此之後我會得到什麼。

的優勢,在描述基於邏輯的工具SLD求解器的缺點是:

  1. 編程能力,靈活性:你通常可以找到建模困難,其中描述邏輯可能需要您重新思考編程解決方案你的模型。但是,當然缺少管道膠帶意味着描述邏輯解決方案會迫使你變得乾淨,這可能是一個很好的紀律。
  2. 健壯性:SLD求解器是一種非常好理解的技術,而描述邏輯工具通常並不是從他們誕生於博士論文的許多步驟。
  3. 缺乏語義工具:描述邏輯與一階邏輯和模型邏輯有很好的聯繫,併爲您提供了一套非常豐富的技術來推理它們。 Prolog的靈活性通常使這非常困難。

如果您在描述邏輯中沒有特別的專業知識,我推薦使用SLD求解器。

0

這聽起來很像我的描述邏輯和知識庫。你有概念,角色和個人。

如果你想推出你的問題作爲描述基於邏輯的推理,你應該很好地建模你的問題,並對其執行推理。

有一些免費reasoners availaibe,可以找到一個清單here

但請注意,這是一個相當複雜而強大的方法。

使用Java時,您可能需要特別注意KAON2DIG

+0

我看了一下描述邏輯和reasoners,但我有一些疑慮。首先是解決方案的複雜性。其次是需要一個相當富有表現力的描述邏輯,這會影響推理時間或甚至使其不可能。最後,優先級要求不是通過我所知的任何描述邏輯開箱即用,這需要我開發自己的描述邏輯變體。謹慎評論? – Zecrates 2010-05-26 07:54:55

+0

描述性邏輯似乎並沒有在「模糊」方面做得很好。您的要求聲明可能存在衝突規則。基於類似OWL的方法應該是「開放式」,這意味着它可以代表衝突。問題是,推理(Pellet等)對衝突做了什麼?不速之客我想你可以在模型中添加額外的陳述來消除歧義。也許有人知道確切的答案。 – 2010-10-27 14:00:51

+0

@Ross - 我的問題中的第2項提到了優先級,這些優先級將被手動分配,並將用於確定如何處理衝突。 – Zecrates 2010-11-15 07:54:09

0

我相信你可以使用排序ID3 algorithm從對象的初始狀態中提取一組規則。我不知道任何具體的Java實現,儘管Wikipedia指出了從Ruby到C的不同實現(我不能發佈多個超鏈接:-)),但它不是一個難以學習的算法。

一旦它建立了決策樹,它可以用規則格式表達,你可以用它來查看你的對象屬於哪個類:從美國的所有男性到10到20之間的所有女性,......當有人更新數據庫中的對象時,可以重建決策樹。

+0

我注意到的問題。這隻會有助於分類,而不是逆向(給定一套規則,找到匹配的人羣)。這是基於機器學習的,因此不是100%準確的。規則具有這樣的性質,可以做出100%準確的推論。沒有初始人口,我不得不手動創建並將它們歸類爲培訓數據。 – Zecrates 2010-06-28 15:48:02

0

好的,這可能是一個愚蠢的答案。但我會盡量嘗試.... 你可以使用的BeanShell做出這樣的事情:

  • 創建一個簡單的選擇命令(如選擇(東西inicialSet,PARAMNAME,paramValue))返回一組元素,其在inicialSet並匹配你的參數。

  • 創建一些常量,可以幫助您編寫出色的BeanShell腳本。

這樣,您可以將規則編寫爲簡單腳本和嵌套規則。

所以,這

我需要規則的結合。因此,當提出「包括所有男性」和「排除10-20歲年齡段的所有美國人」時,我只對美國以外的男性和美國以外的男性感興趣, 20歲年齡段。

會變成這個樣子的腳本:

originalSet = getOriginalSet(); //Get all from DB 

//elements in originalSet that have gender=male 
males = select(originalSet, PARAM.GENDER, GENDER.MALE); 

//elements in males that have age in [10,20] 
youngMaleGuys = select(males, PARAM.AGE, AGE.10_20); 

//Exclude from 
males.removeAll(youngMaleGuys); 

notYoungUSMaleGuys = select(males, PARAM.COUNTRY, COUNTRY.US); 

males.removeAll(notYoungUSMaleGuys); 

return resp; 

當然,這吮吸。我現在做了。但是你可以編寫非常漂亮的命令並找到一種方法使其更具可讀性。

不是那麼快,但容易維護和閱讀(我認爲)。而且你不必擔心訂購

那就是它。我試過了。 :)

0

一個最強大的基於Java的生產規則引擎(推理引擎)是JBoss DROOLS。

http://jboss.org/drools

我會說實話,雖然,除非你的應用得到了很多更復雜,使用規則引擎是WAY矯枉過正。另一方面,如果您的應用程序變得太大並且有太多衝突的規則,那麼它將無法提供結果。

如果您可以更好地控制您的客戶或問題域,最好完全避免推理引擎。

2

對於你描述的情況,我想你會想要使用反向鏈接,而不是正向鏈接(像Drools這樣的RETE系統是正向鏈接,默認行爲)。

結賬tuProlog。易於與Java,100%純Java結合,並且可以完成你想要的推理。您需要充分理解Prolog來描述您的規則集。

Prova也可以做推理和處理複雜的規則系統。

+0

+1,嵌入式SLD求解器。 tu-Prolog似乎是被接受的答案http://stackoverflow.com/questions/1817010/embedded-prolog-interpreter-compiler-for-java – 2010-10-22 09:27:35

+0

謝謝,我會看看。目前我正在接受培訓,但只要我有足夠的時間對其進行適當評估,我會盡快回復。 – Zecrates 2010-10-26 13:58:56