簡體   English   中英

剪輯如何不重復執行規則?

[英]How does clips not repeat rules execution?

我很難理解為什么這些剪輯代碼不會陷入無限循環

(defrule rule0
=>
        (assert (my-fact))
)

(defrule rule1
        ?f <- (my-fact)
=>
        (retract ?f)
)

據我所知,執行rule0斷言my-fact然后執行rule1撤消它。 為什么rule0現在不rule0執行?
這是我的想法:

  • 如果每個規則是使用某些基本事實執行的,則剪輯會記住該規則,並避免使用相同的基本事實重新執行此規則。
  • 有某種優化程序可以檢測並避免循環。
  • Clips會記住已插入和刪除的事實,並避免重新插入這些事實(高度懷疑,我幾乎可以肯定情況並非如此)。

注意:我從另一個使用模板而不是事實的小程序中提取了這段代碼。

Wikipedia很好地概述了Rete算法的工作原理。 要理解的關鍵概念之一是規則不會尋找滿足它們的數據,而是數據尋找滿足它們的規則。 Rete算法假定在每次觸發規則后大多數數據保持相同,因此讓規則查找數據效率很低,因為在每次觸發規則后只有一小部分數據發生變化。 相反,規則將保存已匹配內容的狀態,並在對數據進行更改以影響該狀態時對其進行更新。

定義規則rule0后,由於沒有條件,因此將其激活。 定義規則rule1時,不會激活它,因為my-fact尚不存在。 執行規則rule0時,將聲明事實事實,然后規則rule1的狀態將更新並被激活。 當執行Rule Rule1時,因為my-fact與my-fact匹配,所以my-fact會縮回,並且狀態會更新。 規則rule0不受此撤消的影響,因為它沒有符合我的事實的條件。

您的第一個解釋是與之相關的。 規則不會針對同一組事實再次觸發的原理稱為折射 對於同一組事實,我不僅意味着相同的值,而且具有相同的事實地址。

在這里,我們有一個特例。 由於rule0沒有LHS,因此即使事實依據發生了更改,它也不會再次觸發。 沒有LHS意味着沒有模式匹配,因此沒有進一步的激活。

但是您可以使用refresh命令再次觸發規則。

CLIPS> (run)
CLIPS> (refresh rule0)
CLIPS> (agenda)
0      rule0: *
For a total of 1 activation.

通常,如果事實庫中已經存在相同的事實,則您將無法插入事實(如果已撤消該事實,則可以自由地再次添加它)。 您可以使用( set-fact-duplication )進行更改:

CLIPS> (set-fact-duplication TRUE)

但我不建議這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM