2015-09-29 46 views
0

我想將複雜模式與剪輯匹配:它涉及簡單事實的檢測,並在第二步中檢測更復雜其創建需要處理簡單事實的實例。目前,我處理這三個規則:剪輯:匹配由許多事實和實例組成的複雜模式,其創建基於這些事實

  1. Rule1檢查大量簡單的事實,並且,如果存在的話,創建一個基於匹配簡單的事實複雜的類實例i_complex
  2. Rule2也尋找簡單的事實和i_complex,如果存在,使用它們來創建一個更復雜的實例i_really_complex
  3. Rule3也查找簡單的事實,i_complexi_really_complex,並且如果全部存在,則在屏幕上打印某些內容。

我目前的做法是複製粘貼大量從Rule1的LHS到Rule2Rule3的LHS簡單的事實。這顯然不完美。

我已經考慮了以下選擇:

  • 在一個規則將所有內容。這實際上是我最喜歡的解決方案。問題在於不能在規則的LHS中添加事實/實例。這意味着,例如,我無法檢查是否符合i_complex的要求,如果符合,則創建並斷言它。然而,這是正確匹配i_really_complex所必需的。

    我想到了一個自我修改的規則,它被調用/匹配兩次:第一次它在RHS上創建了i_complex。第二次它可以匹配LHS上的i_complex並創建i_really_complex等等。

匹配這種模式的首選方法是什麼?

回答

1

所有其他的事情都是平等的,我建議選擇最能維護的方法。所以一些簡單的規則會比一個笨重的和/或自我修改的複雜規則更好。

模式將爲使用相同初始模式集合的規則共享,因此複製多個規則模式的計算負擔不大,但它確實使規則更難以維護,因爲對這些常見模式的更改將會需要跨越多個規則。

在你的情況下,如果i_complex只是由於檢測到簡單事實而產生的,i_complex的存在表明這些事實存在,因此這些簡單事實的條件不需要包含在其他規則中匹配i_complex。類似地,i_really_complex的存在將表明存在簡單事實和i_complex。

如果i_complex或i_really_complex不包含匹配的簡單事實的所有變量值,則可以將這些變量包含爲實例的一部分或創建事實來表示這些值。

例如,這些規則:

(defrule rule1 
    (a ?x) 
    => 
    (assert (conclusion 1 ?x))) 

(defrule rule2 
    (a ?x) 
    (conclusion 1 ?x) 
    (b ?x) 
    => 
    (assert (conclusion 2 ?x))) 

(defrule rule3 
    (a ?x) 
    (conclusion 1 ?x) 
    (b ?x) 
    (conclusion 2 ?x) 
    (c ?x) 
    => 
    (assert (conclusion 3 ?x))) 

可以改寫爲:

(defrule rule1 
    (a ?x) 
    => 
    (assert (conclusion 1 ?x))) 

(defrule rule2 
    (conclusion 1 ?x) 
    (b ?x) 
    => 
    (assert (conclusion 2 ?x))) 

(defrule rule3 
    (conclusion 2 ?x) 
    (c ?x) 
    => 
    (assert (conclusion 3 ?x))) 

如果您需要在該前提條件仍然忠實後續規則進行驗證,您可以使用邏輯條件元素:

(defrule rule1 
    (logical (a ?x)) 
    => 
    (assert (conclusion 1 ?x))) 

(defrule rule2 
    (logical (conclusion 1 ?x) 
      (b ?x)) 
    => 
    (assert (conclusion 2 ?x))) 

(defrule rule3 
    (logical (conclusion 2 ?x) 
      (c ?x)) 
    => 
    (assert (conclusion 3 ?x))) 
+0

很多好處。特別是使用邏輯的提示 – stackoverflowwww