chrest-2.lisp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. ;;; mini-Chrest architecture version 2
  2. ;;; written by Peter Lane, February 2008
  3. ;;; Patterns
  4. (defclass pattern () ())
  5. (defclass visual-pattern (pattern) ())
  6. (defclass verbal-pattern (pattern) ())
  7. (defmethod visual-pattern-p ((pattern visual-pattern)) t)
  8. (defmethod visual-pattern-p ((pattern t)) ())
  9. (defgeneric make-pattern-for (pattern))
  10. (defgeneric empty-pattern-p (pattern))
  11. (defgeneric equal-patterns-p (pattern-1 pattern-2))
  12. (defgeneric matching-patterns-p (pattern-1 pattern-2))
  13. (defgeneric get-next-item (source-pattern target-pattern))
  14. (defgeneric combine-patterns (source-pattern target-pattern))
  15. ;; - some implementations of fall back calls,
  16. ;; required when pattern types do not match
  17. (defmethod equal-patterns-p ((pattern-1 pattern) (pattern-2 pattern))
  18. ())
  19. (defmethod matching-patterns-p ((pattern-1 pattern) (pattern-2 pattern))
  20. ())
  21. ;; - root pattern
  22. ;; (empty pattern type, used only for root node)
  23. (defclass root-pattern (visual-pattern) ())
  24. (defmethod make-pattern-for ((pattern root-pattern))
  25. pattern)
  26. (defmethod equal-patterns-p ((pattern-1 root-pattern) (pattern-2 root-pattern))
  27. t)
  28. (defmethod matching-patterns-p ((pattern-1 root-pattern) (pattern-2 pattern))
  29. "Root pattern matches any other kind of pattern"
  30. t)
  31. (defmethod get-next-item ((source-pattern pattern) (target-pattern root-pattern))
  32. "Use empty pattern of source-pattern type as target-pattern"
  33. (get-next-item source-pattern (make-pattern-for source-pattern)))
  34. (defmethod combine-patterns ((source-pattern root-pattern) (target-pattern pattern))
  35. target-pattern)
  36. ;; - verbal-learning pattern
  37. (defclass vl-pattern (visual-pattern)
  38. ((data :accessor get-data :initarg :data :initform ())))
  39. (defmethod make-pattern-for ((pattern vl-pattern))
  40. "Create a new empty pattern of same type as given"
  41. (make-instance 'vl-pattern))
  42. (defmethod empty-pattern-p ((pattern vl-pattern))
  43. (null (get-data pattern)))
  44. (defmethod equal-patterns-p ((pattern-1 vl-pattern) (pattern-2 vl-pattern))
  45. (and (= (length (get-data pattern-1)) (length (get-data pattern-2)))
  46. (matching-patterns-p pattern-1 pattern-2)))
  47. (defmethod matching-patterns-p ((pattern-1 vl-pattern) (pattern-2 vl-pattern))
  48. "Pattern 1 matches pattern 2 if its data is a presequence"
  49. (presequence-p (get-data pattern-1) (get-data pattern-2)))
  50. (defmethod get-next-item ((source-pattern vl-pattern) (target-pattern vl-pattern))
  51. "Return a new pattern with an item from source which is not present in target"
  52. (let ((new-items (remove-matching-presequence (get-data source-pattern)
  53. (get-data target-pattern))))
  54. (make-instance 'vl-pattern
  55. :data (if (null new-items)
  56. ()
  57. (list (first new-items))))))
  58. (defmethod combine-patterns ((source-pattern vl-pattern) (target-pattern vl-pattern))
  59. "Combining two patterns means concatenating their component lists"
  60. (make-instance 'vl-pattern
  61. :data (append (get-data source-pattern)
  62. (get-data target-pattern))))
  63. ;; -- utility functions
  64. (defun presequence-p (list-1 list-2)
  65. (cond ((null list-1)
  66. t)
  67. ((null list-2)
  68. nil)
  69. ((equalp (car list-1) (car list-2))
  70. (presequence-p (cdr list-1) (cdr list-2)))
  71. (t
  72. nil)))
  73. (defun remove-matching-presequence (list-1 list-2)
  74. "Return the part of list-1 after removing the elements which match the start of list-2"
  75. (cond ((null list-1)
  76. ())
  77. ((null list-2)
  78. list-1)
  79. ((equalp (car list-1) (car list-2))
  80. (remove-matching-presequence (cdr list-1) (cdr list-2)))
  81. (t
  82. list-1)))
  83. ;;; Memory is a discrimination network,
  84. ;;; chunks are held in nodes, interconnected with test links
  85. (defstruct node contents image children)
  86. (defstruct link test child)
  87. (defun familiarise (model node pattern)
  88. "Extend image of node with a new item from pattern"
  89. (assert (matching-patterns-p (node-image node) pattern))
  90. (unless (equal-patterns-p pattern (node-image node)) ; don't familiarise if everything known
  91. (incf (chrest-clock model) (chrest-familiarisation-time model))
  92. (setf (node-image node) (combine-patterns (node-image node)
  93. (get-next-item pattern (node-image node))))))
  94. (defun discriminate (model node pattern)
  95. "Add a new child to node, with a new item from pattern, taken from node contents"
  96. (assert (eq (recognise-pattern (create-chrest) pattern node) node))
  97. (assert (and (matching-patterns-p (node-contents node) pattern)
  98. (not (equal-patterns-p (node-contents node) pattern))))
  99. (incf (chrest-clock model) (chrest-discrimination-time model))
  100. (let* ((new-item (get-next-item pattern (node-contents node)))
  101. (new-node (make-node :contents (combine-patterns (node-contents node)
  102. new-item)
  103. :image (make-pattern-for (node-image node))
  104. :children nil)))
  105. (add-to-stm new-node (chrest-stm model)) ; add new node to STM
  106. (push (make-link :test new-item
  107. :child new-node)
  108. (node-children node))))
  109. ;;; short-term memory
  110. (defstruct stm visual verbal)
  111. (defun add-to-stm (node stm)
  112. (if (visual-pattern-p (node-image node))
  113. (add-item node (stm-visual stm))
  114. (add-item node (stm-verbal stm))))
  115. ;; - utility structure, fixed length queue
  116. (defstruct fixed-queue size (items ()))
  117. (defun add-item (item queue)
  118. (setf (fixed-queue-items queue)
  119. (take (fixed-queue-size queue)
  120. (cons item (remove item (fixed-queue-items queue))))))
  121. (defun take (n lst &optional (taken ()))
  122. "Return a list of first n items in lst"
  123. (cond ((zerop n) (reverse taken))
  124. ((null lst) (reverse taken))
  125. (t (take (1- n) (cdr lst) (cons (car lst) taken)))))
  126. ;;; Model holds a pointer to discrimination network
  127. (defstruct chrest clock discrimination-time familiarisation-time ltm stm)
  128. (defun create-chrest ()
  129. (make-chrest :clock 0
  130. :familiarisation-time 2000
  131. :discrimination-time 10000
  132. :ltm (make-node :contents (make-instance 'root-pattern)
  133. :image (make-instance 'root-pattern)
  134. :children nil)
  135. :stm (make-stm :visual (make-fixed-queue :size 4)
  136. :verbal (make-fixed-queue :size 2))))
  137. ;;; Key processes for model
  138. (defun recognise-pattern (model
  139. pattern
  140. &optional (current-node (chrest-ltm model))
  141. (remaining-children (node-children current-node)))
  142. "Sort given pattern through LTM, returning the deepest node found"
  143. (cond ((null remaining-children)
  144. (add-to-stm current-node (chrest-stm model)) ; add retrieved node to STM before returning it
  145. current-node)
  146. ((matching-patterns-p (node-contents (link-child (car remaining-children))) pattern)
  147. (recognise-pattern model pattern (link-child (car remaining-children))))
  148. (t
  149. (recognise-pattern model pattern current-node (cdr remaining-children)))))
  150. (defun recognise-and-learn-pattern (model pattern &optional (input-time (chrest-clock model)))
  151. "Train the node found after recognition: time assumed to be model time"
  152. (let ((found-node (recognise-pattern model pattern)))
  153. (unless (> (chrest-clock model) input-time)
  154. (setf (chrest-clock model) input-time) ; bring clock upto input time
  155. (if (or (eq found-node (chrest-ltm model))
  156. (not (matching-patterns-p (node-image found-node) pattern)))
  157. (discriminate model found-node pattern)
  158. (familiarise model found-node pattern)))))
  159. (defun recall-pattern (model pattern)
  160. "Finds the remembered part of the given pattern"
  161. (node-image (recognise-pattern model pattern)))