2015-04-30 5 views
0

Я был бы очень признателен за помощь в моем проекте CLIPS.CLIPS incrementing variable без бесконечного цикла

Хорошо, поэтому я пытаюсь создать советника по породам собак. Deftemplate выглядит следующим образом:

(deftemplate breed 
    (multislot name) 
    (slot size) 
    (slot type-owner) 
    (slot Living_Space) 
    (slot children) 
    (slot grooming) 
    (slot exercise) 
    (slot noisiness) 
    (slot trainability) 
    (slot aggression) 
    (slot playfulness) 
    (slot excitability) 
    (slot score)) 

А deffacts выглядит следующим образом:

(deffacts dog-breeds 
(breed (name Great_Dane) 
     (size 5) 
     (type-owner No) 
     (Living_Space 5) 
     (children 5) 
     (grooming 1) 
     (exercise 4) 
     (noisiness 2) 
     (trainability 1) 
     (aggression 2) 
     (playfulness 2) 
     (excitability 3) 
     (score 0)) 

Так я пишу два типа defrules: один втягивается факты, которые не отвечают (задаваемым пользователем) критерии и другой тип увеличивает значение «оценка» каждый раз, когда этот факт соответствует критериям. Только несколько правил втягиваются, поэтому для меня важно, чтобы правила приращения работали. Пользовательский ввод и критерии для каждого слота могут быть от 1 до 5.

Мой вопрос: как мне изменить следующий код, не входя в бесконечный цикл? В конце я хочу найти факт с максимальным счетом и отобразить его.

(defrule children 
(input 1) 
?children <- (breed (name ?)(size ?)(type-owner ?)(Living_Space ?) (children 1|2)(grooming ?)(exercise ?)(noisiness ?) 
(trainability ?)(aggression ?)(playfulness ?)(excitability ?)(score ?score) 
=> 
(bind ?sc (+ ?score 1)) 
(modify ?children (score ?sc)) 

ответ

0

Если единственная цель (вход 1) то, не должен увеличить счет и больше не нужен после того, как счет увеличивается, просто убрать этот факт.

(defrule children 
    ?f <- (input 1) 
    ?children <- (breed (children 1|2) (score ?score)) 
    => 
    (retract ?f) 
    (bind ?sc (+ ?score 1)) 
    (modify ?children (score ?sc))) 

Обратите внимание, что я удалил все слоты из шаблона, содержащего символ? потому что они не нужны.

Если факту (ввод 1) необходимы другие правила, вы можете создать промежуточный факт, который можно отменить.

(defrule create-intermediate 
    (input 1) 
    => 
    (assert (increment))) 

(defrule children 
    ?f <- (increment) 
    ?children <- (breed (children 1|2) (score ?score)) 
    => 
    (retract ?f) 
    (bind ?sc (+ ?score 1)) 
    (modify ?children (score ?sc))) 

Вы также можете отслеживать, что вы забили в рамках этого факта. Добавить (мультислот забил) в вашей породе deftemplate, а затем вы можете сделать это:

(defrule children 
    (input 1) 
    ?children <- (breed (children 1|2) (score ?score) (scored $?scored)) 
    (test (not (member$ children ?scored))) 
    => 
    (bind ?sc (+ ?score 1)) 
    (modify ?children (score ?sc) (scored children ?scored))) 

Наконец, шаблоны объектов не RETRIGGER, когда слоты изменяются, которые не присутствуют в образце. Поэтому, если вы использовали defclasses вместо deftemplates, вы можете сделать это:

(defrule children 
    (input 1) 
    ?children <- (object (is-a BREED) (children 1|2)) 
    => 
    (bind ?sc (+ (send ?children get-score) 1)) 
    (send ?children put-score ?sc)) 
+0

Спасибо, работает как шарм! –

 Смежные вопросы

  • Нет связанных вопросов^_^