2013-09-23 7 views
1

меня написать свой код в Джесс, которая:Как мы выбираем deffacts из терминала в 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 и искать правила только для этого факта. Я хочу, чтобы моя запись была чем-то вроде этого (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 дефрактов, и я бы хотел «запустить» только факт с именем «FirstFact» для моей переменной? NameofFact, который он будет выдавать (bind? nameofFact (read)). Моя проблема заключается в том, как мы могли выбрать только тот факт, что нам нужно ... с нашими (сбросить) все факты. – NickName