我在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那样的(彼得)。
答案 0 :(得分:1)
执行此操作的正确方法是:(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.
的更多信息