2012-03-25 4 views
0

Ich verwende CLIPS für ein Projekt.Finden von Fakten einer Vorlage, die etwas mit einer anderen Vorlage gemeinsam hat

Ich verwende diese Vorlage A, die ein Attributmodell und eine andere Vorlage B hat, die auch ein Attributmodell hat.

Also, was ich erreichen will auf dem Attribut-Modell basiert, diese Tatsachen der Vorlage A zurück, die das gleiche Attribut Modellwert als von Fakten aus Vorlage B.

I

(find-all-facts((?a template_A)(?b template_B)) 
    (and 
     //condition to be met 
    ) 
) 
versucht, mit diesem Format hat

es gibt mir die Ergebnisse, aber es gibt mir sowohl die Ergebnisse für A und B, die Duplikate sind .. Wie mache ich es in einer Weise, die nicht doppelte Werte, entweder A oder B zurückgibt?

Antwort

1
CLIPS> 
(deftemplate template_A 
    (slot model)) 
CLIPS>  
(deftemplate template_B 
    (slot model)) 
CLIPS>  
(deffacts start 
    (template_A (model 1)) 
    (template_A (model 2)) 
    (template_A (model 3)) 
    (template_B (model 2)) 
    (template_B (model 3)) 
    (template_B (model 4))) 
CLIPS>  
(deffunction extract-every-nth-value (?values ?start ?increment) 
    (bind ?rv (create$)) 
    (while (<= ?start (length$ ?values)) 
     (bind ?rv (create$ ?rv (nth$ ?start ?values))) 
     (bind ?start (+ ?start ?increment))) 
    (return ?rv)) 
CLIPS> (reset) 
CLIPS> (facts) 
f-0  (initial-fact) 
f-1  (template_A (model 1)) 
f-2  (template_A (model 2)) 
f-3  (template_A (model 3)) 
f-4  (template_B (model 2)) 
f-5  (template_B (model 3)) 
f-6  (template_B (model 4)) 
For a total of 7 facts. 
CLIPS> 
(find-all-facts ((?a template_A)(?b template_B)) 
    (eq ?a:model ?b:model)) 
(<Fact-2> <Fact-4> <Fact-3> <Fact-5>) 
CLIPS>  
(extract-every-nth-value 
    (find-all-facts ((?a template_A)(?b template_B)) 
    (eq ?a:model ?b:model)) 
    1 2) 
(<Fact-2> <Fact-3>) 
CLIPS> 
Verwandte Themen