【发布时间】: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