在 Jess Tab /Protege 中使用 slot-insert$
Using slot-insert$ in Jess Tab /Protege
Jess 选项卡中的以下代码连续将同一实例插入到多值槽中。
(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))
但是,如果我用打印输出替换 slot-insert$ 函数,它会按预期工作。我做错了什么?
更新:
很明显它不断地将同一个实例插入插槽中,但是打印输出每次匹配只打印一次。
查看右边关于修改事实的Jess手册:
如果规则包含声明 (declare (no-loop TRUE))
,则触发时规则所做的任何事情都不会导致同一规则立即重新激活;即,如果无循环规则匹配一个事实,并且该规则修改了相同的事实使得该事实仍然匹配,则该规则将不会被放回议程,从而避免无限循环。
Jess 选项卡中的以下代码连续将同一实例插入到多值槽中。
(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))
但是,如果我用打印输出替换 slot-insert$ 函数,它会按预期工作。我做错了什么?
更新: 很明显它不断地将同一个实例插入插槽中,但是打印输出每次匹配只打印一次。
查看右边关于修改事实的Jess手册:
如果规则包含声明 (declare (no-loop TRUE))
,则触发时规则所做的任何事情都不会导致同一规则立即重新激活;即,如果无循环规则匹配一个事实,并且该规则修改了相同的事实使得该事实仍然匹配,则该规则将不会被放回议程,从而避免无限循环。