我用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)))
您可以在此处阅读有关查询的更多信息。