2011-07-21 60 views
11

我正在處理的應用程序是各種「配置器」。它是用C#編寫的,我甚至寫了一個規則引擎來處理它。這個想法是,有一堆命題邏輯陳述,用戶可以做出選擇。根據他們選擇的內容,其他一些項目將變爲必需或完全不可用。Prolog初學者 - 這是一個壞主意嗎?

命題邏輯語句通常採取以下形式:

A => ~X 
ABC => ~(X+Y) 
A+B => Q 
A(~(B+C)) => ~Q A <=> B 

的符號:

=> -- Implication 
<=> -- Material Equivalence 
~ -- Not 
+ -- Or 
Two letters side-by-side -- And 

我很新的序言,但似乎它可能是能夠處理所有對我來說「規則處理」,允許我擺脫當前的規則引擎(它可以工作,但並不像我想的那樣快速或容易維護)。

此外,所有可用選項都屬於層次結構。例如:

Outside 
    Color 
     Red 
     Blue 
     Green 
    Material 
     Wood 
     Metal 

如果在第二級(特徵,諸如顏色)的項目是隱含的,然後在第三級(選項,如紅色)的項目必須被選擇。同樣,如果我們知道一個功能是錯誤的,那麼它下面的所有選項也是錯誤的。

問題在於每個產品都有自己的一套規則。建立一個包含這些運算符作爲謂詞的知識庫是否合理,然後在運行時開始建立產品的所有規則?

我想象它可能會工作的方式是設置組件,功能和選項的想法。然後建立之間的關係(例如,如果該功能爲false,則其所有選項均爲false)。在運行時,添加產品的特定規則。然後將所有用戶的選擇傳遞給一個函數,將其作爲輸出檢索哪些項是真的,哪些項是假的。

我不知道我所問的所有問題,因爲我剛剛進入Prolog,但我正試圖避免走上不利的道路,並浪費大量時間。

一些問題,這可能有助於針對什麼,我試圖找出:

  1. 這聽起來做,能?
  2. 我吠叫錯了樹嗎?
  3. 嘗試在運行時創建所有這些規則是否有任何缺點或顧慮?
  4. 有沒有更好的系統可以讓我擠進一個C#應用程序(準確地說是Silverlight)?
  5. 我應該檢查其他競爭系統嗎?
  6. 你有關於這種事情的一般建議嗎?

在此先感謝您的建議!

+0

我會改變這個問題的標題,以便它包含短語「產品配置」或一些這樣的。你自己寫「抓住每個產品都有自己的一套規則」,所以我認爲你對這個領域比對一般邏輯更感興趣。 –

回答

7
  1. 當然,但Prolog有一條學習曲線。
  2. 基於規則的推理是Prolog的遊戲,儘管您可能必須將許多規則重寫爲Horn clausesA+B => Q是可行的(它變成q :- a. q :- b.q :- (a;b).),但您的其他示例必須重寫,包括A => ~X
  3. 取決於您的Prolog編譯器,特別是它是否支持索引動態謂詞。
  4. 圍繞「前瞻性檢查」,「推理引擎」和「業務規則」搜索術語。各個社區不斷爲這個問題發明不同的術語。
  5. Constraint Handling Rules (CHR)是一種邏輯編程語言,實現爲Prolog擴展,它更接近基於規則的推理/前向鏈接/業務規則引擎。如果你想使用它,你仍然需要學習基本的Prolog。
  6. 請記住,Prolog是編程語言,而不是邏輯推理的銀彈。它削減了一階邏輯的一些角落,以保持有效的可計算性。這就是爲什麼它只處理Horn子句:它們可以與程序/子程序一一對應。
4

您還可以投入DCG生成物料清單。這個想法大致是 ,大致上終端可以用來指示子產品,而非終端可以定義越來越複雜的子產品組合 ,直到您到達最終的可配置產品。

以{紅色,藍色,綠色} 中的兩個屬性值對和{木材,金屬}材質中的顏色爲例。這些可以指定一個門把手,由此 並不是所有的組合都是可能的:

knob(red,wood) --> ['100101']. 
knob(red,metal) --> ['100102']. 
knob(blue,metal) --> ['100202']. 

然後,您可以定義一個門爲:

door ... --> knob ..., panel ... 

有趣的是,你不會看到任何邏輯公式在這樣的產品規格, 只有事實和規則,以及大量的參數傳遞。您可以在知識獲取組件中使用 參數。通過運行未經證實的 目標,您可以獲得屬性值對的可能值。你謂詞 SETOF/3將整理和removen重複:

?- setof(Color,Material^Bill^knob(Color,Material,Bill,[]),Values). 
Value = [blue, red] 
?- setof(Material,Color^Bill^knob(Color,Material,Bill,[]),Values). 
Material = [metal, wood] 

現在你知道屬性的範圍,可以讓終端用戶陸續 選擇一個屬性和值。假設他將屬性Color和其值設爲藍色。 屬性材料的範圍內,那麼相應地縮小:

?- setof(Material,Bill^knob(blue,Material,Bill,[]),Values). 
Material = [metal] 

在當已指定的所有屬性,你可以讀出文章 號碼中的子結束。您可以使用此價格計算,通過添加一些 的事實,給你的文章編號,其他信息,或產生 排序列表等:

?- knob(blue,metal,Bill,[]). 
Bill = ['100202'] 

問候

PS: 哦似乎在產品配置器 中使用的物料清單概念可以追溯到Clocksin & Mellish。至少我在這裏找到相應的 評論: http://www.amzi.com/manuals/amzi/pro/ref_dcg.htm#DCGBillMaterials

相關問題