Jess Tab中的以下代码会将相同的实例连续插入多值插槽。
(defrule satisfactibleEstudio
(object (is-a Estudio)
(OBJECT ?user)
(nombre ?name)
(preferencias_minimas ?pref))
(object (is-a Chalet)
(OBJECT ?viv)
(precio ?p&: (and
(>= ?p (slot-get ?pref precio_minimo))
(<= ?p (slot-get ?pref precio_maximo))))
(tamanno ?t&: (and
(>= ?t (slot-get ?pref tamanno_minimo))
(<= ?t (slot-get ?pref tamanno_maximo))))
(componentes $?comp&: (>= (get-dorms $?comp) (slot-get ?pref dormitorios))))
=>
(slot-insert$ ?user satisfactibles 1 ?viv))
但是,如果我用打印输出替换插槽插入$功能,它按预期工作。我做错了什么?
更新: 显然,它不断地将相同的实例插入插槽中,但是打印输出时每个匹配仅打印一次。
答案 0 :(得分:0)
请参阅Jess手册,了解如何修改右侧的事实:
如果规则包含声明(declare (no-loop TRUE))
,则规则在触发时不执行任何操作可导致立即重新激活同一规则;即,如果无循环规则与事实匹配,并且规则修改同一事实使得事实仍然匹配,则规则将不会被放回议程,从而避免无限循环。