【问题标题】:Using slot-insert$ in Jess Tab /Protege在 Jess Tab /Protege 中使用 slot-insert$
【发布时间】:2018-04-15 18:45:50
【问题描述】:

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$ 函数,它会按预期工作。我做错了什么?

更新: 所以显然它不断地将同一个实例插入到插槽中,但是通过打印输出,它每次匹配只打印一次。

【问题讨论】:

    标签: protege jess


    【解决方案1】:

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

    如果规则包含声明(declare (no-loop TRUE)),则规则在触发时所做的任何事情都不会导致同一规则立即重新激活;即,如果一个无循环规则匹配一个事实,并且该规则修改了相同的事实以使该事实仍然匹配,则该规则将不会被放回议程,从而避免了无限循环。

    【讨论】:

    • 非常感谢,我是个傻瓜。我最终做的是在规则中添加另一个检查,即实例不能是可变字段的成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2021-05-16
    • 2022-08-19
    • 2014-05-06
    • 2012-08-03
    相关资源
    最近更新 更多