在Jess Tab / Protege中使用slot-insert $

时间:2018-04-15 18:45:51

标签: protege jess

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))

但是,如果我用打印输出替换插槽插入$功能,它按预期工作。我做错了什么?

更新: 显然,它不断地将相同的实例插入插槽中,但是打印输出时每个匹配仅打印一次。

1 个答案:

答案 0 :(得分:0)

请参阅Jess手册,了解如何修改右侧的事实:

如果规则包含声明(declare (no-loop TRUE)),则规则在触发时不执行任何操作可导致立即重新激活同一规则;即,如果无循环规则与事实匹配,并且规则修改同一事实使得事实仍然匹配,则规则将不会被放回议程,从而避免无限循环。