我用 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 的事实并仅搜索该事实的规则。我希望我的条目类似于 (Peter) which Peter=?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)))
您可以阅读有关查询的更多信息 here.
我是一名优秀的程序员,十分优秀!