Oop 剪辑:多批次中的插槽

Oop 剪辑:多批次中的插槽,oop,clips,Oop,Clips,我目前在剪辑工作,我是新来的。我正在尝试在模板中复制以下信息: [Person, [Class,Class],[[M 9,11],[F,9,11]]] (deftemplate person (slot Name) (multislot Class) (multislot Available)) 它有一个人,多个课程,他们可以采取和时间,他们可以采取的类。我尝试在以下模板中复制此信息: [Person, [Class,Class],[[M 9,11],[F,9,11]]]

我目前在剪辑工作,我是新来的。我正在尝试在模板中复制以下信息:

[Person, [Class,Class],[[M 9,11],[F,9,11]]]
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available))
它有一个人,多个课程,他们可以采取和时间,他们可以采取的类。我尝试在以下模板中复制此信息:

[Person, [Class,Class],[[M 9,11],[F,9,11]]]
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available))

我的问题是我不明白在可用的多批次中应该做什么,因为它有三个输入。有没有办法在多批次中制作插槽?我在网上寻找了一些方法,但是没有能够正确地解决这个问题

这里有四种不同的方法。我建议采用类似于方法3或4的方法,因为这些方法涉及事实/实例之间的简单联系

CLIPS> (clear) ; Approach 1
CLIPS> 
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available))
CLIPS>    
(deffacts people
   (person (Name Frank)
           (Class Biology Calculus)
           (Available M 9 11 F 9 11)))
CLIPS> 
(deffunction #-of-triplets (?mf)
   (div (length$ ?mf) 3))
CLIPS>    
(deffunction nth-triplet (?mf ?n)
   (subseq$ ?mf (+ 1 (* (- ?n 1) 3))(* ?n 3)))
CLIPS>    
(defrule print-availability
    (person (Name ?name)
            (Available $?a))
    =>
    (loop-for-count (?i (#-of-triplets ?a))
       (bind ?triplet (nth-triplet ?a ?i))
       (bind ?d (nth$ 1 ?triplet))
       (bind ?b (nth$ 2 ?triplet))
       (bind ?e (nth$ 3 ?triplet))
       (printout t ?name " " ?d " " ?b " " ?e crlf)))
CLIPS> (reset)
CLIPS> (run)
Frank M 9 11
Frank F 9 11
CLIPS> (clear) ; Approach 2
CLIPS> 
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available-Weekday)
   (multislot Available-Begin)
   (multislot Available-End))
CLIPS>    
(deffacts people
   (person (Name Frank)
           (Class Biology Calculus)
           (Available-Weekday M F)
           (Available-Begin 9 9)
           (Available-End 11 11)))
CLIPS> 
(defrule print-availability
    (person (Name ?name)
            (Available-Weekday $?f1 ?d $?)
            (Available-Begin $?f2 ?b $?)
            (Available-End $?f3 ?e $?))
    (test (= (length$ ?f1)
             (length$ ?f2)
             (length$ ?f3)))
    =>
    (printout t ?name " " ?d " " ?b " " ?e crlf))
CLIPS> (reset)
CLIPS> (run)
Frank M 9 11
Frank F 9 11
CLIPS> (clear) ; Approach 3
CLIPS> 
(deftemplate person 
   (slot Name)
   (slot ID)
   (multislot Class))
CLIPS>    
(deftemplate availability
   (slot owner-ID)
   (slot Weekday)
   (slot Begin)
   (slot End))
CLIPS>    
(deffacts information
   (person (Name Frank) (ID 1)
           (Class Biology Calculus))
   (availability (owner-ID 1) (Weekday M) (Begin 9) (End 11))
   (availability (owner-ID 1) (Weekday F) (Begin 9) (End 11)))
CLIPS>  
(defrule print-availability
    (person (Name ?name) (ID ?id))
    (availability (owner-ID ?id) (Weekday ?d) (Begin ?b) (End ?e))
    =>
    (printout t ?name " " ?d " " ?b " " ?e crlf))
CLIPS> (reset)
CLIPS> (run)
Frank F 9 11
Frank M 9 11
CLIPS> (clear) ; Approach 4
CLIPS> 
(defclass PERSON
   (is-a USER)
   (slot Name)
   (multislot Class)
   (multislot Available))
CLIPS>    
(defclass AVAILABILITY
   (is-a USER)
   (slot Weekday)
   (slot Begin)
   (slot End))
CLIPS>    
(definstances information
   (of PERSON (Name Frank)
              (Class Biology Calculus)
              (Available (make-instance of AVAILABILITY (Weekday M) (Begin 9) (End 11))
                         (make-instance of AVAILABILITY (Weekday F) (Begin 9) (End 11)))))
CLIPS>                          
(defrule print-availability
    (object (is-a PERSON) (Name ?name) (Available $? ?a $?))
    (object (is-a AVAILABILITY) (name ?a))
    =>
    (printout t ?name " " (send ?a get-Weekday) 
                      " " (send ?a get-Begin) 
                      " " (send ?a get-End) crlf)))
CLIPS> (reset)
CLIPS> (run)
Frank F 9 11
Frank M 9 11
CLIPS> 

这里有四种不同的方法。我建议采用类似于方法3或4的方法,因为这些方法涉及事实/实例之间的简单联系

CLIPS> (clear) ; Approach 1
CLIPS> 
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available))
CLIPS>    
(deffacts people
   (person (Name Frank)
           (Class Biology Calculus)
           (Available M 9 11 F 9 11)))
CLIPS> 
(deffunction #-of-triplets (?mf)
   (div (length$ ?mf) 3))
CLIPS>    
(deffunction nth-triplet (?mf ?n)
   (subseq$ ?mf (+ 1 (* (- ?n 1) 3))(* ?n 3)))
CLIPS>    
(defrule print-availability
    (person (Name ?name)
            (Available $?a))
    =>
    (loop-for-count (?i (#-of-triplets ?a))
       (bind ?triplet (nth-triplet ?a ?i))
       (bind ?d (nth$ 1 ?triplet))
       (bind ?b (nth$ 2 ?triplet))
       (bind ?e (nth$ 3 ?triplet))
       (printout t ?name " " ?d " " ?b " " ?e crlf)))
CLIPS> (reset)
CLIPS> (run)
Frank M 9 11
Frank F 9 11
CLIPS> (clear) ; Approach 2
CLIPS> 
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available-Weekday)
   (multislot Available-Begin)
   (multislot Available-End))
CLIPS>    
(deffacts people
   (person (Name Frank)
           (Class Biology Calculus)
           (Available-Weekday M F)
           (Available-Begin 9 9)
           (Available-End 11 11)))
CLIPS> 
(defrule print-availability
    (person (Name ?name)
            (Available-Weekday $?f1 ?d $?)
            (Available-Begin $?f2 ?b $?)
            (Available-End $?f3 ?e $?))
    (test (= (length$ ?f1)
             (length$ ?f2)
             (length$ ?f3)))
    =>
    (printout t ?name " " ?d " " ?b " " ?e crlf))
CLIPS> (reset)
CLIPS> (run)
Frank M 9 11
Frank F 9 11
CLIPS> (clear) ; Approach 3
CLIPS> 
(deftemplate person 
   (slot Name)
   (slot ID)
   (multislot Class))
CLIPS>    
(deftemplate availability
   (slot owner-ID)
   (slot Weekday)
   (slot Begin)
   (slot End))
CLIPS>    
(deffacts information
   (person (Name Frank) (ID 1)
           (Class Biology Calculus))
   (availability (owner-ID 1) (Weekday M) (Begin 9) (End 11))
   (availability (owner-ID 1) (Weekday F) (Begin 9) (End 11)))
CLIPS>  
(defrule print-availability
    (person (Name ?name) (ID ?id))
    (availability (owner-ID ?id) (Weekday ?d) (Begin ?b) (End ?e))
    =>
    (printout t ?name " " ?d " " ?b " " ?e crlf))
CLIPS> (reset)
CLIPS> (run)
Frank F 9 11
Frank M 9 11
CLIPS> (clear) ; Approach 4
CLIPS> 
(defclass PERSON
   (is-a USER)
   (slot Name)
   (multislot Class)
   (multislot Available))
CLIPS>    
(defclass AVAILABILITY
   (is-a USER)
   (slot Weekday)
   (slot Begin)
   (slot End))
CLIPS>    
(definstances information
   (of PERSON (Name Frank)
              (Class Biology Calculus)
              (Available (make-instance of AVAILABILITY (Weekday M) (Begin 9) (End 11))
                         (make-instance of AVAILABILITY (Weekday F) (Begin 9) (End 11)))))
CLIPS>                          
(defrule print-availability
    (object (is-a PERSON) (Name ?name) (Available $? ?a $?))
    (object (is-a AVAILABILITY) (name ?a))
    =>
    (printout t ?name " " (send ?a get-Weekday) 
                      " " (send ?a get-Begin) 
                      " " (send ?a get-End) crlf)))
CLIPS> (reset)
CLIPS> (run)
Frank F 9 11
Frank M 9 11
CLIPS> 

这里有四种不同的方法。我建议采用类似于方法3或4的方法,因为这些方法涉及事实/实例之间的简单联系

CLIPS> (clear) ; Approach 1
CLIPS> 
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available))
CLIPS>    
(deffacts people
   (person (Name Frank)
           (Class Biology Calculus)
           (Available M 9 11 F 9 11)))
CLIPS> 
(deffunction #-of-triplets (?mf)
   (div (length$ ?mf) 3))
CLIPS>    
(deffunction nth-triplet (?mf ?n)
   (subseq$ ?mf (+ 1 (* (- ?n 1) 3))(* ?n 3)))
CLIPS>    
(defrule print-availability
    (person (Name ?name)
            (Available $?a))
    =>
    (loop-for-count (?i (#-of-triplets ?a))
       (bind ?triplet (nth-triplet ?a ?i))
       (bind ?d (nth$ 1 ?triplet))
       (bind ?b (nth$ 2 ?triplet))
       (bind ?e (nth$ 3 ?triplet))
       (printout t ?name " " ?d " " ?b " " ?e crlf)))
CLIPS> (reset)
CLIPS> (run)
Frank M 9 11
Frank F 9 11
CLIPS> (clear) ; Approach 2
CLIPS> 
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available-Weekday)
   (multislot Available-Begin)
   (multislot Available-End))
CLIPS>    
(deffacts people
   (person (Name Frank)
           (Class Biology Calculus)
           (Available-Weekday M F)
           (Available-Begin 9 9)
           (Available-End 11 11)))
CLIPS> 
(defrule print-availability
    (person (Name ?name)
            (Available-Weekday $?f1 ?d $?)
            (Available-Begin $?f2 ?b $?)
            (Available-End $?f3 ?e $?))
    (test (= (length$ ?f1)
             (length$ ?f2)
             (length$ ?f3)))
    =>
    (printout t ?name " " ?d " " ?b " " ?e crlf))
CLIPS> (reset)
CLIPS> (run)
Frank M 9 11
Frank F 9 11
CLIPS> (clear) ; Approach 3
CLIPS> 
(deftemplate person 
   (slot Name)
   (slot ID)
   (multislot Class))
CLIPS>    
(deftemplate availability
   (slot owner-ID)
   (slot Weekday)
   (slot Begin)
   (slot End))
CLIPS>    
(deffacts information
   (person (Name Frank) (ID 1)
           (Class Biology Calculus))
   (availability (owner-ID 1) (Weekday M) (Begin 9) (End 11))
   (availability (owner-ID 1) (Weekday F) (Begin 9) (End 11)))
CLIPS>  
(defrule print-availability
    (person (Name ?name) (ID ?id))
    (availability (owner-ID ?id) (Weekday ?d) (Begin ?b) (End ?e))
    =>
    (printout t ?name " " ?d " " ?b " " ?e crlf))
CLIPS> (reset)
CLIPS> (run)
Frank F 9 11
Frank M 9 11
CLIPS> (clear) ; Approach 4
CLIPS> 
(defclass PERSON
   (is-a USER)
   (slot Name)
   (multislot Class)
   (multislot Available))
CLIPS>    
(defclass AVAILABILITY
   (is-a USER)
   (slot Weekday)
   (slot Begin)
   (slot End))
CLIPS>    
(definstances information
   (of PERSON (Name Frank)
              (Class Biology Calculus)
              (Available (make-instance of AVAILABILITY (Weekday M) (Begin 9) (End 11))
                         (make-instance of AVAILABILITY (Weekday F) (Begin 9) (End 11)))))
CLIPS>                          
(defrule print-availability
    (object (is-a PERSON) (Name ?name) (Available $? ?a $?))
    (object (is-a AVAILABILITY) (name ?a))
    =>
    (printout t ?name " " (send ?a get-Weekday) 
                      " " (send ?a get-Begin) 
                      " " (send ?a get-End) crlf)))
CLIPS> (reset)
CLIPS> (run)
Frank F 9 11
Frank M 9 11
CLIPS> 

这里有四种不同的方法。我建议采用类似于方法3或4的方法,因为这些方法涉及事实/实例之间的简单联系

CLIPS> (clear) ; Approach 1
CLIPS> 
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available))
CLIPS>    
(deffacts people
   (person (Name Frank)
           (Class Biology Calculus)
           (Available M 9 11 F 9 11)))
CLIPS> 
(deffunction #-of-triplets (?mf)
   (div (length$ ?mf) 3))
CLIPS>    
(deffunction nth-triplet (?mf ?n)
   (subseq$ ?mf (+ 1 (* (- ?n 1) 3))(* ?n 3)))
CLIPS>    
(defrule print-availability
    (person (Name ?name)
            (Available $?a))
    =>
    (loop-for-count (?i (#-of-triplets ?a))
       (bind ?triplet (nth-triplet ?a ?i))
       (bind ?d (nth$ 1 ?triplet))
       (bind ?b (nth$ 2 ?triplet))
       (bind ?e (nth$ 3 ?triplet))
       (printout t ?name " " ?d " " ?b " " ?e crlf)))
CLIPS> (reset)
CLIPS> (run)
Frank M 9 11
Frank F 9 11
CLIPS> (clear) ; Approach 2
CLIPS> 
(deftemplate person 
   (slot Name)
   (multislot Class)
   (multislot Available-Weekday)
   (multislot Available-Begin)
   (multislot Available-End))
CLIPS>    
(deffacts people
   (person (Name Frank)
           (Class Biology Calculus)
           (Available-Weekday M F)
           (Available-Begin 9 9)
           (Available-End 11 11)))
CLIPS> 
(defrule print-availability
    (person (Name ?name)
            (Available-Weekday $?f1 ?d $?)
            (Available-Begin $?f2 ?b $?)
            (Available-End $?f3 ?e $?))
    (test (= (length$ ?f1)
             (length$ ?f2)
             (length$ ?f3)))
    =>
    (printout t ?name " " ?d " " ?b " " ?e crlf))
CLIPS> (reset)
CLIPS> (run)
Frank M 9 11
Frank F 9 11
CLIPS> (clear) ; Approach 3
CLIPS> 
(deftemplate person 
   (slot Name)
   (slot ID)
   (multislot Class))
CLIPS>    
(deftemplate availability
   (slot owner-ID)
   (slot Weekday)
   (slot Begin)
   (slot End))
CLIPS>    
(deffacts information
   (person (Name Frank) (ID 1)
           (Class Biology Calculus))
   (availability (owner-ID 1) (Weekday M) (Begin 9) (End 11))
   (availability (owner-ID 1) (Weekday F) (Begin 9) (End 11)))
CLIPS>  
(defrule print-availability
    (person (Name ?name) (ID ?id))
    (availability (owner-ID ?id) (Weekday ?d) (Begin ?b) (End ?e))
    =>
    (printout t ?name " " ?d " " ?b " " ?e crlf))
CLIPS> (reset)
CLIPS> (run)
Frank F 9 11
Frank M 9 11
CLIPS> (clear) ; Approach 4
CLIPS> 
(defclass PERSON
   (is-a USER)
   (slot Name)
   (multislot Class)
   (multislot Available))
CLIPS>    
(defclass AVAILABILITY
   (is-a USER)
   (slot Weekday)
   (slot Begin)
   (slot End))
CLIPS>    
(definstances information
   (of PERSON (Name Frank)
              (Class Biology Calculus)
              (Available (make-instance of AVAILABILITY (Weekday M) (Begin 9) (End 11))
                         (make-instance of AVAILABILITY (Weekday F) (Begin 9) (End 11)))))
CLIPS>                          
(defrule print-availability
    (object (is-a PERSON) (Name ?name) (Available $? ?a $?))
    (object (is-a AVAILABILITY) (name ?a))
    =>
    (printout t ?name " " (send ?a get-Weekday) 
                      " " (send ?a get-Begin) 
                      " " (send ?a get-End) crlf)))
CLIPS> (reset)
CLIPS> (run)
Frank F 9 11
Frank M 9 11
CLIPS>