Как вместе воплотить в реальность клипы

Как оформить факт в множественном шрифте? как в этом коде, объедините один и тот же факт ранга.

(P X Y) означает, что X - старший член Y, я пробовал это:

(deffacts  people
    (P a b)
    (P b c)
    (P a d)
    (P d e)
    (P d f)
)


(defrule ranking
    (P ?x ?y)
    (P ?y ?z)
    =>
    (assert (R ?x $?y $?z))
)

Я хочу получить полный стаж в семье, и получить (R a bd cef), но я просто получаю (R a b c) (R a d e) (R a d f), вы можете мне помочь?


person Redone    schedule 09.05.2015    source источник


Ответы (1)


Это немного сложнее, чем то, что вы пытались сделать, особенно если вы хотите, чтобы он работал должным образом для более чем 3 поколений и / или нескольких семейных групп.

CLIPS> 
(defmethod concat$ ((?m1 MULTIFIELD) (?m2 MULTIFIELD (>= (length$ ?m1) (length$ ?m2))))
   (bind ?rv (create$))
   (loop-for-count (?i 1 (length$ ?m2))
       (bind ?rv (create$ ?rv (sym-cat (nth$ ?i ?m1) (nth$ ?i ?m2)))))
   (create$ ?rv (mv-subseq (+ 1 (length$ ?m2)) (length$ ?m1) ?m1)))
CLIPS> 
(defmethod concat$ ((?m1 MULTIFIELD) (?m2 MULTIFIELD (< (length$ ?m1) (length$ ?m2))))
   (bind ?rv (create$))
   (loop-for-count (?i 1 (length$ ?m1))
       (bind ?rv (create$ ?rv (sym-cat (nth$ ?i ?m1) (nth$ ?i ?m2)))))
   (create$ ?rv (mv-subseq (+ 1 (length$ ?m1)) (length$ ?m2) ?m2)))
CLIPS> 
(deffacts  people
   (P a b) ; Family 1
   (P b c)
   (P a d)
   (P d e)
   (P d f)
   (P g h) ; Family 2
   (P h j)
   (P h k)
   (P k l)
   (P k m)
   (P k n)
   (P j o)
   (P j p)
   (P j q)
   (P q r)
   (P q s))
CLIPS> 
(defrule copy
   (P ?x ?y)
   =>
   (assert (R ?x ?y)))
CLIPS>   
(defrule extend
   ?f1 <- (R $?b ?x ?ym $?e1)
   ?f2 <- (R ?y $?z)
   (test (str-index ?y ?ym))
   =>
   (retract ?f1 ?f2)
   (assert (R ?b ?x ?ym (concat$ ?e1 ?z))))
CLIPS> 
(defrule combine
   ?f1 <- (R ?x $?b ?y1 $?e1)
   ?f2 <- (R ?x $?b ?y2&~?y1 $?e2)
   =>
   (retract ?f1 ?f2)
   (assert (R ?x ?b (sym-cat ?y1 ?y2) (concat$ ?e1 ?e2))))
CLIPS> (reset)
CLIPS> (run)
CLIPS> (facts)
f-0     (initial-fact)
f-1     (P a b)
f-2     (P b c)
f-3     (P a d)
f-4     (P d e)
f-5     (P d f)
f-6     (P g h)
f-7     (P h j)
f-8     (P h k)
f-9     (P k l)
f-10    (P k m)
f-11    (P k n)
f-12    (P j o)
f-13    (P j p)
f-14    (P j q)
f-15    (P q r)
f-16    (P q s)
f-37    (R g h jk opqlmn rs)
f-46    (R a bd cef)
For a total of 19 facts.
CLIPS>
person Gary Riley    schedule 10.05.2015
comment
Могу я спросить, что означает (defmethod ...? - person Redone; 22.05.2015
comment
Defmethod означает метод определения. Общие функции позволяют перегрузить имя функции одним или несколькими методами. При вызове метод, который выполняется, определяется ограничениями параметра для метода. - person Gary Riley; 22.05.2015
comment
(create$ ?rv (mv-subseq (+ 1 (length$ ?m2)) (length$ ?m1) ?m1))) что это делает? это сбивает меня с толку. как написать параметры-ограничение и что такое ?m1 ?m2? - person Redone; 03.07.2015
comment
? m1 и? m2 - это два списка строк, которые вы объединяете. В выражении (concat $ (create $ b c d) (create $ v w x y z))? M1 будет (b c d), а? M2 будет (v w x y z). Выражение (create $? Rv (mv-subsq (+ 1 (length $? M2)) (length $? M1)? M1))) объединяет список совпадающих строк в? M1 и? M2, (bv cw dx) , со списком несовпадающих строк в? m2, (yz). Возвращенный список будет (bv cw dx y z). - person Gary Riley; 06.07.2015