【问题标题】:How to optimize pattern matching between different templated facts in CLIPS如何优化 CLIPS 中不同模板化事实之间的模式匹配
【发布时间】:2019-10-31 16:19:14
【问题描述】:

我有一个类似下面的规则:

(deftemplate person
    (slot name ( type INTEGER))
    (slot surname ( type INTEGER))
)

(defrule surname_cant_be_a_name
    ?p1<-(person (name ?n1))
    ?p2<-(person (surname ?n2&:(= ?n1 ?n2)))
    =>
    (retract ?p2)
)

从功能上讲,这是可行的。但是我在一个巨大的事实集上运行这个,并且复杂性很快就超过了屋顶。

因为该规则正在寻找两个人对象,所以存在嵌套的 for 循环有点会减慢执行速度。此设置会遍历所有可能的人配对,并且只有在配对后,规则才会根据我的设置“&:(= ?n1 ?n2))”过滤掉

我觉得必须有更聪明的方法来做到这一点。理想情况下,我希望 p1 遍历所有 person 对象,但只匹配符合我规则的 p2 对象。

为了更清楚地说明我的观点,我正在寻找类似以下的东西来避免双重循环:

(defrule surname_cant_be_a_name
    ?p1<-(person (name ?n1))
    ?p2<-(person (surname  %%JUST_MATCH_n1%% ))
    =>
    (retract ?p2)
)

这有可能实现这样的目标吗?任何优化此规则的建议都值得赞赏。

谢谢

附:对不起这个荒谬的例子,但它很好地突出了我的情况。

【问题讨论】:

    标签: c++ rule-engine clips


    【解决方案1】:

    如果您要比较变量是否相等,在两个地方使用相同的变量比使用两个单独的变量并调用 =eq 更有效比较相等的函数。跨模式,哈希表用于快速定位共享相同变量的事实,当您使用函数调用执行相等比较时,这是无法做到的。对于大量事实,这可以将性能提高几个数量级:

             CLIPS (6.31 6/12/19)
    CLIPS> (clear)
    CLIPS> 
    (deftemplate person
       (slot name (type INTEGER))
       (slot surname (type INTEGER)))
    CLIPS> 
    (defrule surname_cant_be_a_name
       ?p1<- (person (name ?n1))
       ?p2<- (person (surname ?n2&:(= ?n1 ?n2)))
       =>
       (retract ?p2))
    CLIPS> (timer (loop-for-count (?i 10000) (assert (person (name ?i) (surname (+ ?i 1))))))
    12.3485549999987
    CLIPS> (clear)
    CLIPS> 
    (deftemplate person
       (slot name (type INTEGER))
       (slot surname (type INTEGER)))
    CLIPS> 
    (defrule surname_cant_be_a_name
       ?p1 <- (person (name ?n1))
       ?p2 <- (person (surname ?n1))
       =>
       (retract ?p2))
    CLIPS> (timer (loop-for-count (?i 10000) (assert (person (name ?i) (surname (+ ?i 1))))))
    0.0177029999995284
    CLIPS> (/ 12.3485549999987 0.0177029999995284)
    697.540247434201
    CLIPS> 
    

    【讨论】:

    • 谢谢,这正是我一直在寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多