Поиск фактов шаблона, который имеет что-то общее с другим шаблоном - PullRequest
0 голосов
/ 25 марта 2012

Я использую CLIPS для проекта.

Я использую этот шаблон A, который имеет модель атрибута, и другой шаблон B, который также имеет модель атрибута.

Итак, чего я хочу добиться, это на основе модели атрибутов, вернуть те факты шаблона A, которые имеют то же значение модели атрибута, что и факты из шаблона B.

Я пытался использовать этот формат

  (find-all-facts((?a template_A)(?b template_B))
    (and
      //condition to be met
    )
  )

он дает мне результаты, но он дает мне и результаты для A и B, которые являются дубликатами. Как мне сделать так, чтобы он возвращал неповторяющиеся значения, либо A, либо B?

1 Ответ

1 голос
/ 24 апреля 2012
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> 
...