2012-07-03 2 views
0

je un vin défini comme ceci:CLIPS incrémenter certitude certains éléments dans une liste

(deftemplate wine 
    (slot name) 
    (slot color) 
    (slot certainty (type NUMBER) (default 0))) 

Et la liste dof vins définis comme ceci:

(deffacts wines 
    (wine (name "Chardonnay") (color white)) 
    (wine (name "Merlot") (color red)) 
    (wine (name "Cabernet sauvignon") (color red))) 

Maintenant, dans le cas où une règle obtient déclenché, je voudrais augmenter la valeur de certitude pour les éléments dans une liste qui ont un emplacement de couleur réglé sur "rouge".

Toute idée comment y parvenir?

Répondre

1

Je suis nouveau CLIPS donc je suis sûr qu'il ya une meilleure façon, mais les règles suivantes font ce que vous voulez:

(defrule inc-wines-with-color 
    (increase-all-with color ?color ?amount) 
    (wine (name ?name) (color ?color)) 
    => 
    (assert (increase-certainty ?name ?amount))) 

(defrule retract-inc-all-with 
    ?f <- (increase-all-with $?) 
    => 
    (retract ?f)) 

(defrule increase-wine-certainty 
    (not (increase-all-with $?)) 
    ?ic <-(increase-certainty ?name ?amount) 
    ?wine <- (wine (name ?name) (certainty ?c)) 
    => 
    (printout t "Incrementing " ?name " from " ?c " to " (+ ?amount ?c) crlf) 
    (modify ?wine (certainty (+ ?amount ?c))) 
    (retract ?ic)) 

Voici les résultats de l'exécution: il

CLIPS> (reset) 
CLIPS> (assert (increase-all-with color red 0.2)) 
<Fact-4> 
CLIPS> (run) 
Incrementing Merlot from 0 to 0.2 
Incrementing Cabernet sauvignon from 0 to 0.2 
CLIPS> (facts) 
f-0  (initial-fact) 
f-1  (wine (name "Chardonnay") (color white) (certainty 0)) 
f-7  (wine (name "Merlot") (color red) (certainty 0.2)) 
f-8  (wine (name "Cabernet sauvignon") (color red) (certainty 0.2)) 
For a total of 4 facts. 

Remarque: Vous devrez peut-être définir votre stratégie de résolution de conflit sur LEX ou MEA pour garantir un classement correct des règles.

+0

très bien, merci! :) –

Questions connexes