我们如何在 Jess 规则中选择终端的 deffacts



我用Jess编写了我的代码,即:

;;;*************
;;;* MODULES   *
;;;*************
(defmodule EXAMPLE)
;;;*************
;;;* TEMPLATES *
;;;*************
(deftemplate EXAMPLE::status
(slot name)
(slot age)
)
;;;*************
;;;* FACTS     *
;;;*************
(deffacts EXAMPLE::?x
(status (name Peter)
    (age 24)
)
)
;;;***********************
;;;* GENERATE PATH RULES *
;;;***********************
(defrule EXAMPLE::rule1
    ?res <-
    (status (name Peter)
        (age 24)            
    )
    => 
    (printout t "Hello Peter" crlf)
    (restract ?res)
)
(run)

如何从我的终端使用 ?x 调用规则。

因为我想找到名称为 ?x 的事实并仅搜索此事实的规则。我希望我的条目是类似 (彼得) 彼得=?x .

执行此操作的正确方法是 (1) 使用显式触发事实,或 (2) 使用 defquery 而不是 defrule - 查询很像规则,只是您可以显式调用查询。

第一种方法看起来像

(defrule EXAMPLE::rule1
    (greet ?x)
    ?res <- (status (name ?x))
    => 
    (printout t "Hello, " ?x "!" crlf)
    (retract ?res))

Jess> (assert (greet Peter))
<Fact-1>
Jess> (run)
Hello, Peter!

虽然第二个看起来像这样:

(defquery EXAMPLE::query1
    (declare (variables ?x))
    ?res <- (status (name ?x))))

Jess> (bind ?result (run-query* EXAMPLE::query1 Peter))
Jess> (while (?result next)
          (printout t "Hello, " (?result getString ?x) crlf)
          (retract (?result getObject res)))

您可以在此处阅读有关查询的更多信息。

相关内容

  • 没有找到相关文章

最新更新