1

私は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)であるPeter=?xにしたいです。

4

1 に答える 1

1

これを行う正しい方法は、(1) 明示的なトリガー ファクトを使用するか、(2) a のdefquery代わりに a を使用する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!

2番目は次のようになります。

(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)))

クエリの詳細については、こちらをご覧ください。

于 2013-09-23T20:50:31.983 に答える