2013-09-23 16 views
1

我寫我在傑斯的代碼是:我們如何從終端傑斯選擇deffacts規則

;;;************* 
;;;* 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)那樣Peter =?x。

回答

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.

+0

Mr.Ernest非常感謝你很多爲您的答案。更多的東西..我會盡力做出更具體的...如果我有100個deffacts,並且我想只運行名爲「FirstFact」的變量名爲nameofFact,它將由(綁定?nameofFact(讀取))。我的問題是我們如何才能選擇只有我們需要...重新計算所有事實的事實。 – NickName