Tue Mar 13 15:29:16 UTC 2012 mantoniotti@common-lisp.net
* Added TIMESTAMP.
addfile ./TIMESTAMP
hunk ./TIMESTAMP 1
+20120116
Tue Mar 13 15:28:28 UTC 2012 mantoniotti@common-lisp.net
* Copyright updated.
hunk ./docs/html/index.html 377
- © 2004-2011, Marco Antoniotti, all rights reserved.
+ © 2004-2012, Marco Antoniotti, all rights reserved.
Tue Mar 13 15:28:15 UTC 2012 mantoniotti@common-lisp.net
* Copyright updated.
hunk ./COPYING 1
-Copyright (c) 2004-2011 Marco Antoniotti[_^M_][_$_]
+Copyright (c) 2004-2012 Marco Antoniotti[_^M_][_$_]
Thu Jun 16 00:10:47 UTC 2011 mantoniotti@common-lisp.net
* Added "CL-UNIFICATION" as package nickname to match the .asd and .system specs.
hunk ./unification-package.lisp 11
- (:nicknames "CL.EXT.DACF.UNIFICATION" "UNIFY" "unify")
+ (:nicknames "CL.EXT.DACF.UNIFICATION" "UNIFY" "unify" "CL-UNIFICATION")
Sat Apr 2 04:39:32 UTC 2011 rbrown@common-lisp.net
* Use *unify-string-case-sensitive-p* consistently.
Change the documentation.
hunk ./docs/html/string-template-class.html 125
- <p>The value of the variable *UNIFY-STRING-CASE-INSENSITIVE-P*.</p>
+ <p>The value of the variable *UNIFY-STRING-CASE-SENSITIVE-P*.</p>
hunk ./docs/html/unification-dictionary.html 41
- <li><a href="usci-variable.html"><i>Variable</i> <b>*UNIFY-STRING-CASE-INSENSITIVE*</b></a>
+ <li><a href="usci-variable.html"><i>Variable</i> <b>*UNIFY-STRING-CASE-SENSITIVE*</b></a>
hunk ./docs/html/unify-function.html 166
- condition. If the variable *UNIFY-STRING-CASE-INSENSITIVE-P* is NIL
+ condition. If the variable *UNIFY-STRING-CASE-SENSITIVE-P* is T
hunk ./docs/html/unify-function.html 338
- *UNIFY-STRING-CASE-INSENSITIVE-P*, OCCURS-IN-P,
+ *UNIFY-STRING-CASE-SENSITIVE-P*, OCCURS-IN-P,
hunk ./docs/html/usci-variable.html 3
- <title>CL Unification: Variable *UNIFY-STRING-CASE-INSENSITIVE-P*</title>
+ <title>CL Unification: Variable *UNIFY-STRING-CASE-SENSITIVE-P*</title>
hunk ./docs/html/usci-variable.html 14
- <strong><i>CL Unification: Variable *UNIFY-STRING-CASE-INSENSITIVE-P*</title></i></strong>
+ <strong><i>CL Unification: Variable *UNIFY-STRING-CASE-SENSITIVE-P*</title></i></strong>
hunk ./docs/html/usci-variable.html 36
- <h1><i>Variable</i> <strong>*UNIFY-STRING-CASE-INSENSITIVE-P*</strong></h1>
+ <h1><i>Variable</i> <strong>*UNIFY-STRING-CASE-SENSITIVE-P*</strong></h1>
hunk ./docs/html/usci-variable.html 59
- <p>The value of *UNIFY-STRING-CASE-INSENSITIVE-P* controls the
+ <p>The value of *UNIFY-STRING-CASE-SENSITIVE-P* controls the
hunk ./docs/html/usci-variable.html 61
- If NIL (the default), the method will use STRING= to test for
+ If T (the default), the method will use STRING= to test for
hunk ./test/unification-tests.lisp 46
- (test t (let ((*unify-string-case-insensitive-p* t))
+ (test t (let ((*unify-string-case-sensitive-p* nil))
hunk ./unification-package.lisp 19
- "*UNIFY-STRING-CASE-INSENSITIVE-P*"
+ "*UNIFY-STRING-CASE-SENSITIVE-P*"
hunk ./unifier.lisp 96
-*UNIFY-STRING-CASE-INSENSITIVE-P*, which defaults to NIL.
+*UNIFY-STRING-CASE-SENSITIVE-P*, which defaults to T.
hunk ./unifier.lisp 118
-*UNIFY-STRING-CASE-INSENSITIVE-P*, which defaults to NIL.
+*UNIFY-STRING-CASE-SENSITIVE-P*, which defaults to T.
Sat Apr 2 04:19:09 UTC 2011 rbrown@common-lisp.net
* match-block.lisp: Use &body in match-case and matchf-case so
code that uses them is correctly indented by editors.
hunk ./ChangeLog 1
+2011-03-28 Robert Brown <robert.brown at gmail.com>
+
+ * match-block.lisp: Use &body in match-case and matchf-case so
+ code that uses them is correctly indented by editors.
+
Sat Apr 2 04:16:51 UTC 2011 mantoniotti@common-lisp.net
* Copyright updated.
hunk ./docs/html/control-flow.html 211
- <h1>News</h1>
+<!-- <h1>News</h1>
hunk ./docs/html/control-flow.html 221
-
+-->
+ [_$_]
hunk ./docs/html/control-flow.html 237
- © 2003-2004, Marco Antoniotti, all rights reserved.
+ © 2003-2011, Marco Antoniotti, all rights reserved.
hunk ./docs/html/dictionary.html 282
-;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;; Copyright (c) 2004-2011 Marco Antoniotti, All rigths reserved.
hunk ./docs/html/dictionary.html 317
- <h1>News</h1>
+<!-- <h1>News</h1>
hunk ./docs/html/dictionary.html 327
-
+-->
hunk ./docs/html/dictionary.html 342
- © 2003-2004, Marco Antoniotti, all rights reserved.
+ © 2003-2011, Marco Antoniotti, all rights reserved.
hunk ./docs/html/downloads.html 100
- <h1>News</h1>
+<!-- <h1>News</h1>
hunk ./docs/html/downloads.html 112
-
+-->
hunk ./docs/html/downloads.html 127
- © 2003-2004, Marco Antoniotti, all rights reserved.
+ © 2003-2011, Marco Antoniotti, all rights reserved.
hunk ./docs/html/links.html 79
- <h1>News</h1>
+ <!-- <h1>News</h1>
hunk ./docs/html/links.html 97
-
+-->
+ [_$_]
hunk ./docs/html/links.html 113
- © 2003-2004, Marco Antoniotti, all rights reserved.
+ © 2003-2011, Marco Antoniotti, all rights reserved.
hunk ./docs/html/mailing-lists.html 58
-;;; Copyright (c) 2004-2005 Marco Antoniotti, All rigths reserved.
+;;; Copyright (c) 2004-2011 Marco Antoniotti, All rigths reserved.
hunk ./docs/html/mailing-lists.html 93
- <h1>News</h1>
+<!-- <h1>News</h1>
hunk ./docs/html/mailing-lists.html 105
-
+-->
hunk ./docs/html/mailing-lists.html 120
- © 2003-2004, Marco Antoniotti, all rights reserved.
+ © 2003-2011, Marco Antoniotti, all rights reserved.
hunk ./docs/html/templates.html 176
- <h1>News</h1>
+<!-- <h1>News</h1>
hunk ./docs/html/templates.html 186
-
+-->
hunk ./docs/html/templates.html 201
- © 2003-2004, Marco Antoniotti, all rights reserved.
+ © 2003-2011, Marco Antoniotti, all rights reserved.
hunk ./docs/html/unification-dictionary.html 109
- <h1>News</h1>
+<!-- <h1>News</h1>
hunk ./docs/html/unification-dictionary.html 121
-
+-->
hunk ./docs/html/unification-dictionary.html 136
- © 2003-2004, Marco Antoniotti, all rights reserved.
+ © 2003-2011, Marco Antoniotti, all rights reserved.
hunk ./docs/html/unifying-substitutions.html 165
- <h1>News</h1>
+<!-- <h1>News</h1>
hunk ./docs/html/unifying-substitutions.html 175
-
+-->
hunk ./docs/html/unifying-substitutions.html 190
- © 2003-2004, Marco Antoniotti, all rights reserved.
+ © 2003-2011, Marco Antoniotti, all rights reserved.
Sat Apr 2 04:11:54 UTC 2011 mantoniotti@common-lisp.net
* Updated copyright info and a News.
hunk ./docs/html/index.html 311
-;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;; Copyright (c) 2004-2011 Marco Antoniotti, All rigths reserved.
hunk ./docs/html/index.html 352
+ <li><strong>2011-02-20</strong><br>
+ CL-UNIFICATION is now in <a href="www.quicklisp.org">Quicklisp</a>.
hunk ./docs/html/index.html 377
- © 2004-2007, Marco Antoniotti, all rights reserved.
+ © 2004-2011, Marco Antoniotti, all rights reserved.
Sat Apr 2 04:09:17 UTC 2011 mantoniotti@common-lisp.net
* ChangeLog updated.
hunk ./ChangeLog 1
+2011-02-27 author <author at paniscia.local>
+
+ * .cvsignore: Updated.
+
+ * docs/html/images/Thumbs.db, docs/html/images/Thumbs.db:encryptable:
+ Removed Files:
+ Thumbs.db Thumbs.db:encryptable
+
+2011-02-26 author <author at paniscia.local>
+
+ * .cvsignore: Updated.
+
+ * variables.lisp, unifier.lisp:
+ Minor changes (added COPYING information and other minutiae).
+
+ * unification-package.lisp: Exported a few more symbols.
+
+ * templates-hierarchy.lisp:
+ Minor changes (added COPYING information and other minutiae).
+
+ * substitutions.lisp:
+ Changed some environment functions and improved the DUMP-* ones.
+
+ * match-block.lisp, lambda-list-parsing.lisp, cl-unification.system, cl-unification.asd, cl-unification-lib.asd, apply-substitution.lisp:
+ Minor changes (added COPYING information and other minutiae).
+
+ * ACKNOWLEDGEMENTS: Acknowledgements updated.
+
+2011-02-24 author <author at paniscia.local>
+
+ * ChangeLog, apply-substitution.lisp, cl-unification.system, lambda-list-parsing.lisp, lib-dependent/cl-ppcre-template.lisp, match-block.lisp, templates-hierarchy.lisp, unifier.lisp:
+ Delete trailing whitespace. In lambda-list-parsing.lisp this fixes a bug
+ with ~@<newline> format directives.
+
+ * ChangeLog, test/unification-tests.lisp, unifier.lisp:
+ unifier.lisp: Allow vectors to unify with sequence templates.
+ test/unification-tests.lisp: new test to verify the change
+
Sat Apr 2 04:08:13 UTC 2011 mantoniotti@common-lisp.net
* Remove Thumbs.db and friends
rmfile ./docs/html/images/Thumbs.db:encryptable
Sat Apr 2 04:05:30 UTC 2011 mantoniotti@common-lisp.net
* Exported a few more symbols.
hunk ./unification-package.lisp 18
- (:export
- "ENABLE-TEMPLATE-READER"
- "MAKE-TEMPLATE"
- "TEMPLATEP"
- "TEMPLATE-SPEC")
-
hunk ./unification-package.lisp 21
- "FIND-VARIABLE-VALUE"
- "V?"
hunk ./unification-package.lisp 22
- "MAKE-EMPTY-ENVIRONMENT"
hunk ./unification-package.lisp 30
- "ENVIRONMENT-P")
+ "ENVIRONMENT-P"
+ "MAKE-EMPTY-ENVIRONMENT"
+ "EMPTY-ENVIRONMENT-P"
+ "MAKE-SHARED-ENVIRONMENT"
+ "COPY-ENVIRONMENT"
+ [_$_]
+ "PUSH-FRAME"
+ "POP-FRAME"
+
+ "BINDING-VARIABLE"
+ "BINDING-VALUE"
+
+ "EXTEND-ENVIRONMENT"
+ "FILL-ENVIRONMENT"
+ "FILL-ENVIRONMENT*"
+
+ "FIND-VARIABLE-VALUE"
+ "V?"
+
+ "NEW-VAR"
+ "VARIABLEP"
+ "VARIABLE-ANY-P"
+ )
hunk ./unification-package.lisp 71
+ (:export
+ "ENABLE-TEMPLATE-READER"
+ "MAKE-TEMPLATE"
+ "TEMPLATEP"
+ "TEMPLATE-SPEC"
+
+ "COLLECT-TEMPLATE-VARS"
+ )
+
Sat Apr 2 04:05:18 UTC 2011 mantoniotti@common-lisp.net
* Minor changes (added COPYING information and other minutiae).
hunk ./apply-substitution.lisp 1
-;;; -*- Mode: Lisp -*-
+;;;; -*- Mode: Lisp -*-
hunk ./apply-substitution.lisp 3
-;;; substitutions.lisp
-;;; General CL structures unifier.
-;;; Substitution definitions.
+;;;; apply-substitutions.lisp --
+;;;; General CL structures unifier.
+;;;; Substitution definitions.
+;;;;
+;;;; See the file COPYING for copyright and licensing information.
hunk ./apply-substitution.lisp 85
-;;; end of file -- apply-substitutions.lisp --
+;;;; end of file -- apply-substitutions.lisp --
hunk ./cl-unification-lib.asd 5
+;;;;
+;;;; See file COPYING for copyright and licensing information.
hunk ./cl-unification.asd 5
+;;;; See file COPYING for copyright licensing information.
+
hunk ./cl-unification.system 6
+;;;; See file COPYING for copyright licensing information.
+
hunk ./lambda-list-parsing.lisp 5
+;;;; See file COPYING for copyright licensing information.[_^M_][_$_]
+[_^M_][_$_]
hunk ./match-block.lisp 6
+;;;; See file COPYING for copyright licensing information.[_^M_][_$_]
+[_^M_][_$_]
hunk ./substitutions.lisp 7
+;;;; See file COPYING for copyright licensing information.
+
hunk ./templates-hierarchy.lisp 5
+;;;; See file COPYING for copyright licensing information.
+
hunk ./unification-package.lisp 6
-;;;; Copyright (c) 2004-2009 Marco Antoniotti
-;;;; See file COPYING for licensing information.
+;;;; Copyright (c) 2004-2011 Marco Antoniotti
+;;;; See file COPYING for copyright licensing information.
hunk ./unifier.lisp 6
+;;;; See file COPYING for copyright licensing information.
+
hunk ./variables.lisp 1
-;;; -*- Mode: Lisp -*-
+;;;; -*- Mode: Lisp -*-
+
+;;;; variables.lisp --
+
+;;;; See file COPYING for copyright licensing information.
hunk ./variables.lisp 10
-(defun make-var-name (&optional (s (gensym "UNIFVAR-")) (package *package*))
- (intern (concatenate 'string "?" (symbol-name s)) package))
+(defun make-var-name (&optional (s (gensym "UV_")) (package *package*))
+ (declare (type (or string symbol character) s))
+ (intern (concatenate 'string "?" (string s)) package))
+
+
+(eval-when (:load-toplevel :execute)
+ (setf (fdefinition 'new-var) #'make-var-name))
Sat Apr 2 04:01:24 UTC 2011 mantoniotti@common-lisp.net
* Changed some environment functions and improved the DUMP-* ones.
hunk ./substitutions.lisp 116
+ (declare (type environment env))
hunk ./substitutions.lisp 119
-(defun make-shared-environment (env)
- (make-environment :frames (environment-frames env)))
+(defun make-shared-environment (env &optional (pushp nil))
+ (declare (type environment env))
+ (make-environment :frames (if pushp
+ (cons (make-frame) (environment-frames env))
+ (environment-frames env))))
+
+(defun push-frame (env)
+ (declare (type environment env))
+ (push (make-frame) (environment-frames env)))
+
+(defun pop-frame (env)
+ (declare (type environment env))
+ (pop (environment-frames env)))
+
hunk ./substitutions.lisp 208
- (terpri out)
hunk ./substitutions.lisp 209
- do (format out "~A~VT= ~A~%" var 8 value))
+ do (format out "~&~A~VT= ~A~%" var 8 value))
hunk ./substitutions.lisp 214
- (map nil #'(lambda (f) (dump-frame f out)) (environment-frames env)))
+ (if (empty-environment-p env)
+ (format out ">>> Empty unify environment ~S.~%" env)
+ (loop initially (format out ">>> Dumping unify environment ~S.~%" env)
+ for fr in (environment-frames env)
+ for fr-n downfrom (list-length (environment-frames env))
+ do (format out ">>> Frame ~D:~%" fr-n)
+ do (dump-frame fr out)
+ do (terpri out)
+ )))
Sat Apr 2 03:51:38 UTC 2011 mantoniotti@common-lisp.net
* Acknowledgements updated.
hunk ./ACKNOWLEDGEMENTS 10
+Brown, Robert
Sat Apr 2 03:50:19 UTC 2011 rbrown@common-lisp.net
* Delete trailing whitespace. In lambda-list-parsing.lisp this fixes a bug
with ~@<newline> format directives.
hunk ./ChangeLog 3
+ * lambda-list-parsing.lisp: Delete trailing whitespace that turned
+ ~@<newline> into a bogus format directive by converting it into
+ ~@<space><newline>
+
+ * unifier.lisp, apply-substitution.lisp, cl-unification.system
+ * match-block.lisp, templates-hierarchy.lisp, unifier.lisp
+ * lib-dependent/cl-ppcre-template.lisp: delete trailing whitespace
+
+2011-02-24 Robert Brown <robert.brown at gmail.com>
+
hunk ./apply-substitution.lisp 73
- [_$_]
- [_$_]
+
+
hunk ./cl-unification.system 23
- [_$_]
+
hunk ./lambda-list-parsing.lisp 52
-;;; definition of LAMBDA-LIST-KEYWORDS [_^M_][_$_]
+;;; definition of LAMBDA-LIST-KEYWORDS.[_^M_][_$_]
hunk ./lambda-list-parsing.lisp 93
- (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@[_^M_][_$_]
hunk ./lambda-list-parsing.lisp 115
- (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@[_^M_][_$_]
hunk ./lambda-list-parsing.lisp 142
- (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@[_^M_][_$_]
hunk ./lambda-list-parsing.lisp 168
- (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@[_^M_][_$_]
hunk ./lambda-list-parsing.lisp 190
- (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@[_^M_][_$_]
hunk ./lambda-list-parsing.lisp 213
- (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@[_^M_][_$_]
hunk ./lambda-list-parsing.lisp 280
- [_^M_][_$_]
+[_^M_][_$_]
hunk ./lib-dependent/cl-ppcre-template.lisp 147
- [_$_]
+
hunk ./unifier.lisp 443
- [_$_]
+
hunk ./unifier.lisp 492
- [_$_]
+
hunk ./unifier.lisp 939
- [_$_]
+
Sat Apr 2 02:51:32 UTC 2011 rbrown@common-lisp.net
* unifier.lisp: Allow vectors to unify with sequence templates.
test/unification-tests.lisp: new test to verify the change
hunk ./ChangeLog 1
+2011-02-24 Robert Brown <robert.brown at gmail.com>
+
+ * unifier.lisp: Allow vectors to unify with sequence templates.
+ * test/unification-tests.lisp: new test to verify the change
+
hunk ./test/unification-tests.lisp 105
+ (test '(42 T) (v? '?x (unify #(0 1 42 3 4 5) #T(sequence 0 1 ?x 3 4 5)))
+ :multiple-values t)
hunk ./unifier.lisp 479
-(defmethod unify ((a vector) (b vector-template)
+(defmethod unify ((a vector) (b sequence-template)
Sat Apr 2 02:49:30 UTC 2011 rbrown@common-lisp.net
* Add entry for cl-unification-test.asd.
hunk ./ChangeLog 1
+2011-02-16 Robert Brown <robert.brown at gmail.com>
+
+ * cl-unification.asd: Add support for asdf:test-system.
+
+ * cl-unification-test.asd: File added.
+
Sat Apr 2 02:47:50 UTC 2011 rbrown@common-lisp.net
* Add cl-unification-test.asd
Make (asdf:test-system 'cl-unification) work.
addfile ./cl-unification-test.asd
hunk ./cl-unification-test.asd 1
+;;;; cl-unification-test.asd
+
+
+(in-package #:asdf)
+
+;; Tests implemented using the ptester framework are run at *load* time, so
+;; we tell ASDF that loading a file containing ptester code is never done.
+;; This causes ASDF to run all the tests whenever ASDF:LOAD-SYSTEM or
+;; ASDF:TEST-SYSTEM is called with argument CL-UNIFICATION-TEST.
+
+(defclass ptester-source-file (cl-source-file)
+ ()
+ (:documentation "A Common Lisp source file containing ptester code."))
+
+(defmethod operation-done-p ((operation load-op) (component ptester-source-file))
+ nil)
+
+
+(in-package #:common-lisp-user)
+
+(defpackage #:cl-unification-test-system
+ (:use #:common-lisp #:asdf))
+
+(in-package #:cl-unification-test-system)
+
+(defsystem #:cl-unification-test
+ :depends-on (:cl-unification :ptester)
+ :components
+ ((:module "test"
+ :components
+ ((:ptester-source-file "unification-tests")))))
hunk ./cl-unification.asd 28
+ :in-order-to ((test-op (test-op :cl-unification-test)))
hunk ./test/unification-tests.lisp 4
-;;;; CL-UNIFICATION test suite. Requires Franz's util.test package on
-;;;; allegro or the ptester compatibility library on other lisps.
-#+allegro (require :tester)
-#-allegro (asdf:oos 'asdf:load-op :ptester)
+;;;; CL-UNIFICATION test suite. Requires ptester, the public version of
+;;;; Franz's util.test package.
+
+(defpackage "IT.UNIMIB.DISCO.MA.CL.EXT.DACF.UNIFICATION.TESTS"
+ (:use "CL" "UNIFY" "PTESTER")
+ (:nicknames "CL.EXT.DACF.UNIFICATION.TESTS" "UNIFY.TESTS"))
hunk ./test/unification-tests.lisp 11
-(cl:defpackage "UNIFY.TESTS"
- (:use "CL" "UNIFY" #+allegro "UTIL.TEST" #-allegro "PTESTER"))
Sat Apr 2 02:37:58 UTC 2011 rbrown@common-lisp.net
* Make sure that classes referenced in #T forms are defined
before the forms are read. This fixes compilation of
file unification-tests.lisp.
hunk ./test/unification-tests.lisp 114
+(eval-when (:compile-toplevel :load-toplevel :execute)
+
hunk ./test/unification-tests.lisp 123
+)
+
Tue Mar 29 23:22:33 UTC 2011 mantoniotti@common-lisp.net
* Copyright dates updated.
hunk ./COPYING 1
-Copyright (c) 2004-2009 Marco Antoniotti[_^M_][_$_]
+Copyright (c) 2004-2011 Marco Antoniotti[_^M_][_$_]
hunk ./README 3
-Marco Antoniotti (c) 2004-2008
+Marco Antoniotti (c) 2004-2011
Tue Mar 29 23:20:53 UTC 2011 mantoniotti@common-lisp.net
* ChangeLog updated.
hunk ./ChangeLog 1
+2011-01-18 author <author at paniscia.local>
+
+ * unifier.lisp:
+ After a careful reading of PAIP fixed a very subtle bug in VAR-UNIFY
+ that prevented the correct unification of:
+
+ (?x ?y a)
+
+ with
+
+ (?y ?x ?x)
+
+ * substitutions.lisp:
+ Added debugging functions DUMP-FRAME and DUMP-ENVIRONMENT.
+
+ * .cvsignore: Added .cvsignore file.
+
+2009-12-17 author <author at paniscia.local>
+
+ * ChangeLog: ChangeLog updated.
+
+ * lib-dependent/cl-ppcre-template.asd: Initial checkin.
+
+ * lib-dependent/cl-ppcre-template.lisp:
+ Patched to use Cl-PPCRE:SCAN-TO-STRINGS (thanks to Pixel // pinterface [a] gmail dot com).
+
+ * unifier.lisp: Minor cosmetic changes.
+
+ * unification-package.lisp: Exported MATCHF-CASE.
+
+ * templates-hierarchy.lisp:
+ Fixed a couple of problems with some accessors in the NUMBER,
+ STRUCTURE-OBJECT and STANDARD-OBJECT templates.
+
+ * match-block.lisp: Added MATCHF* macros.
+
Tue Mar 29 22:59:37 UTC 2011 mantoniotti@common-lisp.net
* Added debugging functions DUMP-FRAME and DUMP-ENVIRONMENT.
hunk ./substitutions.lisp 190
+;;;---------------------------------------------------------------------------
+;;; Simple debugging.
hunk ./substitutions.lisp 193
+(defun dump-frame (f &optional (out *standard-output*))
+ (declare (type frame f))
+ (terpri out)
+ (loop for (var . value) in (frame-bindings f)
+ do (format out "~A~VT= ~A~%" var 8 value))
+ )
+
+(defun dump-environment (env &optional (out *standard-output*))
+ (declare (type environment env))
+ (map nil #'(lambda (f) (dump-frame f out)) (environment-frames env)))
Tue Jun 15 03:21:37 UTC 2010 pix@kepibu.org
* Pull variable binding out of %match-expander
I'd like to tell you this is part of a plan to simplify %match-expander, but in
all honesty, the only reason I'm doing it is because I found myself thinking
with-unification-variables would be a handy macro while working on a private
extension to cl-unification, and I didn't want to duplicate the code.
hunk ./match-block.lisp 13
+(defmacro with-unification-variables ((&rest variables) environment &body body)[_^M_][_$_]
+ "Execute body with variables bound to their values in environment."[_^M_][_$_]
+ (flet ((variable-bindings (v)[_^M_][_$_]
+ `((,v (find-variable-value ',v ,environment))[_^M_][_$_]
+ (,(clean-unify-var-name v) ,v))))[_^M_][_$_]
+ `(let* ,(mapcan #'variable-bindings variables)[_^M_][_$_]
+ (declare (ignorable ,@(mapcar #'clean-unify-var-name variables)))[_^M_][_$_]
+ ,@body)))[_^M_][_$_]
+[_^M_][_$_]
hunk ./match-block.lisp 93
- (bind-variable (v)[_^M_][_$_]
- `((,v (find-variable-value ',v ,match-environment))[_^M_][_$_]
- (,(clean-unify-var-name v) ,v)))[_^M_][_$_]
hunk ./match-block.lisp 100
- (let* ,(mapcan #'bind-variable variables)[_^M_][_$_]
- (declare (ignorable ,@variables ,@(mapcar #'clean-unify-var-name variables)))[_^M_][_$_]
+ (with-unification-variables ,variables ,match-environment[_^M_][_$_]
Sun Feb 7 08:42:39 UTC 2010 pix@kepibu.org
* Marginally more straightforward?
hunk ./match-block.lisp 89
- clause[_^M_][_$_]
+ (munge-clause clause)[_^M_][_$_]
hunk ./match-block.lisp 115
- ,@(mapcar (lambda (c) (expand-clause (munge-clause c))) match-clauses)[_^M_][_$_]
+ ,@(mapcar #'expand-clause match-clauses)[_^M_][_$_]
Sun Feb 7 07:40:23 UTC 2010 pix@kepibu.org
* Declare ftype of find-variable-value and v? properly
hunk ./substitutions.lisp 169
-(declaim (ftype (function (symbol environment &optional boolean)
+(declaim (ftype (function (symbol &optional environment boolean)
+ (values t boolean))
+ find-variable-value)
+ (ftype (function (symbol environment &optional boolean)
hunk ./substitutions.lisp 174
- find-variable-value
Sun Feb 7 07:33:38 UTC 2010 pix@kepibu.org
* Fix export of lib-dependent symbols
hunk ./cl-unification.asd 2
-
hunk ./cl-unification.asd 5
-;;;;===========================================================================
-;;;; Simple stuff that should be built in ASDF.
-
hunk ./cl-unification.asd 12
-(defclass asdf-system-definition-file (asdf:cl-source-file) ())
-(defmethod source-file-type ((c asdf-system-definition-file) (s module)) "asd")
-
+(defclass load-only-file (cl-source-file)
+ ((last-loaded :accessor load-date :initform nil)))
+(defmethod operation-done-p ((op compile-op) (component load-only-file))
+ t)
+(defmethod perform :around ((op compile-op) (component load-only-file))
+ nil)
+(defmethod operation-done-p ((op load-op) (component load-only-file))
+ (and (load-date component)
+ (>= (load-date component) (file-write-date (component-pathname component)))))
+(defmethod perform ((op load-op) (component load-only-file))
+ (prog1 (load (component-pathname component))
+ (setf (load-date component)
+ (file-write-date (component-pathname component)))))
hunk ./cl-unification.asd 37
- (:file "apply-substitution")
- #+asdf-with-optional-dependencies
- (:module "lib-dependent"
- :pathname "lib-dependent"
- :depends-on ("templates-hierarchy" "unifier")
- :components ((:file "cl-ppcre-template"
- :depends-on (cl-ppcre))
- ))
- #-asdf-with-optional-dependencies
- (asdf-system-definition-file
- "cl-unification-lib")
- ))
+ (:file "apply-substitution")))
hunk ./cl-unification.asd 42
- :components ((:module "lib-dependent"
+ :components ((:load-only-file "unification-package")
+ (:module "lib-dependent"
hunk ./cl-unification.asd 49
- :components ((:module "lib-dependent"
+ :components ((:load-only-file "unification-package")
+ (:module "lib-dependent"
Sun Feb 7 07:30:06 UTC 2010 pix@kepibu.org
* Specialization on the second arg of print-object is not allowed
hunk ./templates-hierarchy.lisp 109
-(defmethod print-object ((template template) (stream stream))
+(defmethod print-object ((template template) stream)
Fri Feb 5 09:30:48 UTC 2010 pix@kepibu.org
* Whoops. Typo in test.
hunk ./test/unification-tests.lisp 233
- (test-error (match ('(x) '(xx) :errorp nil)
+ (test-error (match ('(x) '(x) :errorp nil)
Fri Feb 5 09:04:00 UTC 2010 pix@kepibu.org
* Create a named-readtable if the named-readtables library is also loaded
Because (in-readtable ...) is a beautiful thing.
hunk ./cl-unification.asd 50
+#+asdf-system-connections
+(asdf:defsystem-connection cl-unification+named-readtables
+ :requires (:cl-unification :named-readtables)
+ :components ((:module "lib-dependent"
+ :components ((:file "named-readtable")))))
+
addfile ./lib-dependent/named-readtable.lisp
hunk ./lib-dependent/named-readtable.lisp 1
+;;;; Set up a named-readtable
+(in-package "CL.EXT.DACF.UNIFICATION")
+
+(named-readtables:defreadtable template-readtable
+ (:dispatch-macro-char #\# #\t #'|sharp-T-reader|)
+ (:merge :common-lisp))
hunk ./unification-package.lisp 62
+
+ #+named-readtables
+ (:export
+ "TEMPLATE-READTABLE")
Fri Feb 5 09:02:42 UTC 2010 pix@kepibu.org
* Add (enable-template-reader), so it is easy to turn on the template reader
Useful when there are conflicts on #T, such as with closure-html.
hunk ./cl-unification.asd 28
+ (:file "template-reader")
addfile ./template-reader.lisp
hunk ./template-reader.lisp 1
+;;; Setting up the reader macro.
+(in-package "CL.EXT.DACF.UNIFICATION")
+
+;;; 20080711 MA:
+;;; Reverted to the old version with MAKE-LOAD-FORM added. Template
+;;; objects are created at read-time.
+
+(defun |sharp-T-reader| (stream subchar arg)
+ (declare (ignore subchar arg))
+ (let ((spec (read stream t nil t)))
+ (typecase spec
+ (null (make-template nil spec))
+ (cons (make-template (first spec) spec))
+ (t (make-template spec spec)))))
+
+(defmethod make-load-form ((x template) &optional env)
+ (make-load-form-saving-slots x :environment env))
+
+
+#||
+;;; Version with more 'macro-like' behavior. The previous version
+;;; created an object at read-time, which may cause problems with
+;;; MAKE-LOAD-FORMs, constant-ness etc etc.
+;;;
+;;; 20080713 MA
+;;; Removed because it was not working well with nested templates.
+;;; Reverted to the original one plus MAKE-LOAD-FORM.
+
+(defun |sharp-T-reader| (stream subchar arg)
+ (declare (ignore subchar arg))
+ (let ((spec (read stream t nil t)))
+ (typecase spec
+ (null `(make-template nil ',spec))
+ (cons `(make-template ',(first spec) ',spec))
+ (t `(make-template ',spec ',spec)))
+ ))
+||#
+
+(eval-when (:load-toplevel :execute)
+ (set-dispatch-macro-character #\# #\T '|sharp-T-reader|))
+
+
+#|| Useless with the read time templates and MAKE-LOAD-FORM.
+
+(defun rewrite-template-spec (spec)
+ "Rewrites a template specification.
+The rewriting simply makes sure that sub-templates are created as needed.
+The result is either the SPEC itself or an appropriate call to LIST."
+
+ (typecase spec
+ (atom `',spec)
+ (cons (destructuring-bind (head &rest tail)
+ spec
+ (case head
+ (quote spec)
+ (make-template `(make-template ,(first tail)
+ ,(rewrite-template-spec (second (second tail)))))
+ (t `(list ',head ,@(mapcar #'rewrite-template-spec tail)))
+ )))
+ (t `',spec)))
+
+||#
+
+(defmacro enable-template-reader ()
+ `(eval-when (:compile-toplevel :load-toplevel :execute)
+ (setf *readtable* (copy-readtable *readtable*))
+ (set-dispatch-macro-character #\# #\T '|sharp-T-reader|)))
hunk ./templates-hierarchy.lisp 234
-;;; Setting up the reader macro.
-
-;;; 20080711 MA:
-;;; Reverted to the old version with MAKE-LOAD-FORM added. Template
-;;; objects are created at read-time.
-
-(defun |sharp-T-reader| (stream subchar arg)
- (declare (ignore subchar arg))
- (let ((spec (read stream t nil t)))
- (typecase spec
- (null (make-template nil spec))
- (cons (make-template (first spec) spec))
- (t (make-template spec spec)))))
-
-(defmethod make-load-form ((x template) &optional env)
- (make-load-form-saving-slots x :environment env))
-
-
-#||
-;;; Version with more 'macro-like' behavior. The previous version
-;;; created an object at read-time, which may cause problems with
-;;; MAKE-LOAD-FORMs, constant-ness etc etc.
-;;;
-;;; 20080713 MA
-;;; Removed because it was not working well with nested templates.
-;;; Reverted to the original one plus MAKE-LOAD-FORM.
-
-(defun |sharp-T-reader| (stream subchar arg)
- (declare (ignore subchar arg))
- (let ((spec (read stream t nil t)))
- (typecase spec
- (null `(make-template nil ',spec))
- (cons `(make-template ',(first spec) ',spec))
- (t `(make-template ',spec ',spec)))
- ))
-||#
-
-(eval-when (:load-toplevel :execute)
- (set-dispatch-macro-character #\# #\T '|sharp-T-reader|))
-
-
-#|| Useless with the read time templates and MAKE-LOAD-FORM.
-
-(defun rewrite-template-spec (spec)
- "Rewrites a template specification.
-The rewriting simply makes sure that sub-templates are created as needed.
-The result is either the SPEC itself or an appropriate call to LIST."
-
- (typecase spec
- (atom `',spec)
- (cons (destructuring-bind (head &rest tail)
- spec
- (case head
- (quote spec)
- (make-template `(make-template ,(first tail)
- ,(rewrite-template-spec (second (second tail)))))
- (t `(list ',head ,@(mapcar #'rewrite-template-spec tail)))
- )))
- (t `',spec)))
-
-||#
- [_$_]
-
-
hunk ./unification-package.lisp 19
+ "ENABLE-TEMPLATE-READER"
Fri Feb 5 08:58:50 UTC 2010 pix@kepibu.org
* Export new MATCH* macros.
hunk ./unification-package.lisp 43
+ "MATCH-COND"
+ "MATCHF-COND"
hunk ./unification-package.lisp 47
+ "MATCH-ECASE"
hunk ./unification-package.lisp 49
+ "MATCHF-ECASE"
Fri Feb 5 03:21:40 UTC 2010 pix@kepibu.org
* Unified docstrings.
hunk ./match-block.lisp 120
+(defmacro %set-documentation ((&rest symbols) docstring)[_^M_][_$_]
+ `(eval-when (:load-toplevel :execute)[_^M_][_$_]
+ (mapcar (lambda (fn) (setf (documentation fn 'function) ,docstring))[_^M_][_$_]
+ ',symbols)))[_^M_][_$_]
+[_^M_][_$_]
hunk ./match-block.lisp 133
- "Sets up a lexical environment to evaluate FORMS after an unification.[_^M_][_$_]
-[_^M_][_$_]
-MATCH unifies a TEMPLATE and an OBJECT and then sets up a lexical[_^M_][_$_]
-environment where the variables present in the template are bound[_^M_][_$_]
-lexically. Note that both variable names '?FOO' and 'FOO' are bound[_^M_][_$_]
-for convenience.[_^M_][_$_]
-[_^M_][_$_]
-The MATCH form returns the values returned by the evaluation of the[_^M_][_$_]
-last of the FORMS.[_^M_][_$_]
-[_^M_][_$_]
-If ERRORP is non-NIL (the default) then the form raises a[_^M_][_$_]
-UNIFICATION-FAILURE, otherwise the result of evaluating ERROR-VALUE,[_^M_][_$_]
-whose default is NIL is returned. (Note that UNIFICATION-FAILUREs[_^M_][_$_]
-raising from the evaluation of FORMS will also be caught and handled[_^M_][_$_]
-according to ERRORP settings.)[_^M_][_$_]
-[_^M_][_$_]
-If MATCH-NAMED is not NIL, then a surrounding BLOCK named MATCH-NAMED[_^M_][_$_]
-is set up around the matching code.[_^M_][_$_]
-"[_^M_][_$_]
hunk ./match-block.lisp 151
- "Sets up a lexical environment to evaluate FORMS after an unification.[_^M_][_$_]
+ (when match-named-p[_^M_][_$_]
+ (warn ":match-named is deprecated. Use :named instead."))[_^M_][_$_]
+ (%match-expander 'matchf[_^M_][_$_]
+ 'nil[_^M_][_$_]
+ `((,template ,object ,@forms))[_^M_][_$_]
+ :default error-value[_^M_][_$_]
+ :named (or named match-named)[_^M_][_$_]
+ :environment substitution[_^M_][_$_]
+ :errorp errorp))[_^M_][_$_]
+[_^M_][_$_]
+(%set-documentation[_^M_][_$_]
+ (match matchf)[_^M_][_$_]
+ "Sets up a lexical environment to evaluate FORMS after an unification.[_^M_][_$_]
hunk ./match-block.lisp 165
-MATCHF unifies a TEMPLATE and an OBJECT and then sets up a lexical[_^M_][_$_]
+MATCH and MATCHF unify a TEMPLATE and an OBJECT and then set up a lexical[_^M_][_$_]
hunk ./match-block.lisp 173
-The MATCHF form returns the values returned by the evaluation of the[_^M_][_$_]
+MATCH and MATCHF forms return the values returned by the evaluation of the[_^M_][_$_]
hunk ./match-block.lisp 179
-raising from the evaluation of FORMS will also be caught and handled[_^M_][_$_]
+raising from the evaluation of FORMS will /not/ be caught and handled[_^M_][_$_]
hunk ./match-block.lisp 182
-If MATCH-NAMED is not NIL, then a surrounding BLOCK named MATCH-NAMED[_^M_][_$_]
-is set up around the matching code.[_^M_][_$_]
-"[_^M_][_$_]
- (when match-named-p[_^M_][_$_]
- (warn ":match-named is deprecated. Use :named instead."))[_^M_][_$_]
- (%match-expander 'matchf[_^M_][_$_]
- 'nil[_^M_][_$_]
- `((,template ,object ,@forms))[_^M_][_$_]
- :default error-value[_^M_][_$_]
- :named (or named match-named)[_^M_][_$_]
- :environment substitution[_^M_][_$_]
- :errorp errorp))[_^M_][_$_]
+A surrounding BLOCK named NAMED is set up around the matching code.")[_^M_][_$_]
hunk ./match-block.lisp 193
- "A combination of COND and MATCH."[_^M_][_$_]
hunk ./match-block.lisp 196
- "A combination of COND and MATCHF."[_^M_][_$_]
hunk ./match-block.lisp 203
- "MATCHING sets up a COND-like environment for multiple template matching clauses.[_^M_][_$_]
-[_^M_][_$_]
-The syntax of MATCHING comprises a number of clauses of the form[_^M_][_$_]
-[_^M_][_$_]
- <clause> ::= <regular-clause> | <default-clause>[_^M_][_$_]
- <regular-clause> ::= ((<template> <form>) &body <forms>)[_^M_][_$_]
- <default-clause> ::= (t &body <forms>)[_^M_][_$_]
- | (otherwise &body <forms>)[_^M_][_$_]
-<form> and <forms> are regular Common Lisp forms.[_^M_][_$_]
-<template> is a unification template.[_^M_][_$_]
-[_^M_][_$_]
-The full syntax of MATCHING is[_^M_][_$_]
-[_^M_][_$_]
- matching (&key errorp default-substitution) <clauses>[_^M_][_$_]
-[_^M_][_$_]
-Each clause evaluates its forms in an environment where the variables[_^M_][_$_]
-present in the template are bound lexically. Note that both variable[_^M_][_$_]
-names '?FOO' and 'FOO' are bound for convenience.[_^M_][_$_]
-[_^M_][_$_]
-The values returned by the MATCHING form are those of the last form in[_^M_][_$_]
-the first clause that satisfies the match test.[_^M_][_$_]
-[_^M_][_$_]
-If ERRORP is non-NIL then if none of the regular clauses matches, then[_^M_][_$_]
-an error of type UNIFICATION-NON-EXAUSTIVE is signalled, regardless of[_^M_][_$_]
-any default clause. Otherwise, the default clause behaves as a[_^M_][_$_]
-standard COND default clause. The default value of ERRORP is NIL.[_^M_][_$_]
-"[_^M_][_$_]
hunk ./match-block.lisp 211
-(defmacro match-case ((object &key errorp default-substitution named (match-case-named nil match-case-named-p))[_^M_][_$_]
- &body clauses)[_^M_][_$_]
- "MATCH-CASE sets up a CASE-like environment for multiple template matching clauses.[_^M_][_$_]
-[_^M_][_$_]
-The syntax of MATCH-CASE comprises a number of clauses of the form[_^M_][_$_]
+(%set-documentation[_^M_][_$_]
+ (match-cond matchf-cond matching)[_^M_][_$_]
+ "MATCH-COND, MATCHF-COND, and MATCHING set up a COND-like environment for[_^M_][_$_]
+multiple template matching clauses.[_^M_][_$_]
hunk ./match-block.lisp 216
+Their syntax comprises a number of clauses of the form[_^M_][_$_]
hunk ./match-block.lisp 218
- <regular-clause> ::= (<template> &body <forms>)[_^M_][_$_]
+ <regular-clause> ::= ((<template> <form>) &body <forms>)[_^M_][_$_]
hunk ./match-block.lisp 224
-The full syntax of MATCH-CASE is[_^M_][_$_]
-[_^M_][_$_]
- match-case <object> (&key errorp default-substitution) <clauses>[_^M_][_$_]
+The full syntax is[_^M_][_$_]
+ match-cond <clauses>[_^M_][_$_]
+ matchf-cond <clauses>[_^M_][_$_]
+ matching (&key errorp default-substitution named) <clauses>[_^M_][_$_]
hunk ./match-block.lisp 233
-The values returned by the MATCH-CASE form are those of the last form in[_^M_][_$_]
+The values returned by the macros are those of the last form in[_^M_][_$_]
hunk ./match-block.lisp 239
-standard CASE default clause. The default value of ERRORP is NIL.[_^M_][_$_]
-"[_^M_][_$_]
+standard COND default clause. The default value of ERRORP is NIL.[_^M_][_$_]
+")[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defmacro match-case ((object &key errorp default-substitution named (match-case-named nil match-case-named-p))[_^M_][_$_]
+ &body clauses)[_^M_][_$_]
hunk ./match-block.lisp 264
- "MATCHF-CASE sets up a CASE-like environment for multiple template matching clauses.[_^M_][_$_]
-[_^M_][_$_]
-The syntax of MATCHF-CASE comprises a number of clauses of the form[_^M_][_$_]
-[_^M_][_$_]
- <clause> ::= <regular-clause> | <default-clause>[_^M_][_$_]
- <regular-clause> ::= (<template> &body <forms>)[_^M_][_$_]
- <default-clause> ::= (t &body <forms>)[_^M_][_$_]
- | (otherwise &body <forms>)[_^M_][_$_]
-<form> and <forms> are regular Common Lisp forms.[_^M_][_$_]
-<template> is a unification template.[_^M_][_$_]
-[_^M_][_$_]
-The full syntax of MATCHF-CASE is[_^M_][_$_]
-[_^M_][_$_]
- matchf-case <object> (&key errorp default-substitution) <clauses>[_^M_][_$_]
-[_^M_][_$_]
-Each clause evaluates its forms in an environment where the variables[_^M_][_$_]
-present in the template are bound lexically. Note that both variable[_^M_][_$_]
-names '?FOO' and 'FOO' are bound for convenience.[_^M_][_$_]
-[_^M_][_$_]
-The values returned by the MATCH-CASE form are those of the last form in[_^M_][_$_]
-the first clause that satisfies the match test.[_^M_][_$_]
-[_^M_][_$_]
-If ERRORP is non-NIL then if none of the regular clauses matches, then[_^M_][_$_]
-an error of type UNIFICATION-NON-EXAUSTIVE is signalled, regardless of[_^M_][_$_]
-any default clause. Otherwise, the default clause behaves as a[_^M_][_$_]
-standard CASE default clause. The default value of ERRORP is NIL.[_^M_][_$_]
-[_^M_][_$_]
-MATCHF-CASE behaves like MATCH-CASE, but the patterns are not[_^M_][_$_]
-evaluated (i.e., it relies on MATCHF instead of MATCH to construct the[_^M_][_$_]
-macro expansion.[_^M_][_$_]
-"[_^M_][_$_]
hunk ./match-block.lisp 281
+(%set-documentation[_^M_][_$_]
+ (match-case match-ecase matchf-case matchf-ecase)[_^M_][_$_]
+ "MATCH-CASE, MATCH-ECASE, MATCHF-CASE, and MATCHF-ECASE set up a CASE-like[_^M_][_$_]
+environment for multiple template matching clauses.[_^M_][_$_]
+[_^M_][_$_]
+Their syntax comprises a number of clauses of the form[_^M_][_$_]
+ <clause> ::= <regular-clause> | <default-clause>[_^M_][_$_]
+ <regular-clause> ::= (<template> &body <forms>)[_^M_][_$_]
+ <default-clause> ::= (t &body <forms>)[_^M_][_$_]
+ | (otherwise &body <forms>)[_^M_][_$_]
+<form> and <forms> are regular Common Lisp forms.[_^M_][_$_]
+<template> is a unification template.[_^M_][_$_]
+[_^M_][_$_]
+The full syntax is[_^M_][_$_]
+ match-case (<object> &key default-substitution named errorp) <clauses>[_^M_][_$_]
+ match-ecase (<object> &key default-substitution named) <clauses>[_^M_][_$_]
+ matchf-case (<object> &key default-substitution named errorp) <clauses>[_^M_][_$_]
+ matchf-ecase (<object> &key default-substitution named) <clauses>[_^M_][_$_]
+[_^M_][_$_]
+Each clause evaluates its forms in an environment where the variables[_^M_][_$_]
+present in the template are bound lexically. Note that both variable[_^M_][_$_]
+names '?FOO' and 'FOO' are bound for convenience.[_^M_][_$_]
+[_^M_][_$_]
+The values returned by the macros are those of the last form in[_^M_][_$_]
+the first clause that satisfies the match test.[_^M_][_$_]
+[_^M_][_$_]
+MATCHF-ECASE and MATCHF-CASE behave like MATCH-ECASE and MATCH-CASE, but the[_^M_][_$_]
+patterns are not evaluated (i.e., they rely on MATCHF instead of MATCH to[_^M_][_$_]
+construct the macro expansion).[_^M_][_$_]
+")[_^M_][_$_]
+[_^M_][_$_]
Thu Feb 4 07:32:18 UTC 2010 pix@kepibu.org
* Merge all MATCH* macros into a single, unified expansion function
And, because it's now trivial, add MATCH-COND, MATCHF-COND, MATCH-ECASE, and
MATCHF-ECASE.
Still to do: Merge documentation of functions so there's less copy-pasta in the
documentation strings.
hunk ./match-block.lisp 13
-(defun %template-for-match (template)[_^M_][_$_]
- (if (variablep template)[_^M_][_$_]
- `',template ; Logical variables are special-cased.[_^M_][_$_]
- template))[_^M_][_$_]
+(defun %match-expander (template-munger clause-munger clauses[_^M_][_$_]
+ &key default named environment errorp error-form keyform)[_^M_][_$_]
+ "A rather hairy internal function which handles expansion for all the MATCH* macros.[_^M_][_$_]
hunk ./match-block.lisp 17
-(defun %wrap-var-bindings (template environment-var forms)[_^M_][_$_]
- (let* ((template-vars (collect-template-vars template))[_^M_][_$_]
- (bindings (loop for v in template-vars[_^M_][_$_]
- nconc (list `(,v (find-variable-value ',v[_^M_][_$_]
- ,environment-var))[_^M_][_$_]
- `(,(clean-unify-var-name v) ,v)))))[_^M_][_$_]
- `(let* ,bindings[_^M_][_$_]
- (declare (ignorable ,@(mapcar #'first bindings)))[_^M_][_$_]
- ,@forms)))[_^M_][_$_]
+template-munger should be either 'match or 'matchf, and will massage the[_^M_][_$_]
+template into the proper form for that macro set.[_^M_][_$_]
+[_^M_][_$_]
+clause-munger should be either 'cond, 'case, or 'nil. This affects the expected[_^M_][_$_]
+syntax of items in clauses as follows:[_^M_][_$_]
+ 'cond: { ((<template> <object>) &body) }+ default-clause[_^M_][_$_]
+ 'case: { (<template> &body) }+ default-clause[_^M_][_$_]
+ 'nil: { (<template> <object> &body) }+ default-clause[_^M_][_$_]
+ default-clause: [ (t &body) ][_^M_][_$_]
+[_^M_][_$_]
+clauses is a list of forms conforming to the syntax just described.[_^M_][_$_]
+[_^M_][_$_]
+default is a single form to be executed if no other forms match.[_^M_][_$_]
+named is the name for a surrounding block.[_^M_][_$_]
+[_^M_][_$_]
+environment is a base environment object which template matches should extend.[_^M_][_$_]
+The new environments created will share frames with this environment, though any[_^M_][_$_]
+additional bindings will be in a new, unshared frame. environment defaults to[_^M_][_$_]
+'(make-empty-environment).[_^M_][_$_]
+[_^M_][_$_]
+errorp is a single form which will be evaluated to determine if error-form is[_^M_][_$_]
+executed.[_^M_][_$_]
+[_^M_][_$_]
+error-form is a form which is expected to generate an error (e.g., `(error[_^M_][_$_]
+'unification-non-exhaustive)). It defaults to providing the error returned by[_^M_][_$_]
+the last form which failed unification.[_^M_][_$_]
+[_^M_][_$_]
+keyform should be used only for a clause-munger of 'case. It provides the form[_^M_][_$_]
+to evaluate to produce the object for unification in -case macros.[_^M_][_$_]
+[_^M_][_$_]
+*Interaction between default-clause, :errorp + :error-form, and :default[_^M_][_$_]
+[_^M_][_$_]
+This function produces a giant COND form which ends one or more of these[_^M_][_$_]
+assorted \"default\" clauses. They are produced in a very specific order:[_^M_][_$_]
+1. errorp + error-form are tried first. Thus, if errorp is 't, neither the[_^M_][_$_]
+ default-clause in clauses will be reached, nor the :default clause. This is[_^M_][_$_]
+ essentially a hook to produce a pre-user default clause. (e.g., for[_^M_][_$_]
+ MATCH's :errorp)[_^M_][_$_]
+2. The default-clause in clauses, if it exists, will be tried next. Because[_^M_][_$_]
+ clauses is expected to contain user-specified clauses, this is expected to be[_^M_][_$_]
+ the user-specified default clause.[_^M_][_$_]
+3. Finally, the :default clause, if specified, will be tried. This is[_^M_][_$_]
+ essentially a hook to produce a post-user default clause. (e.g., for[_^M_][_$_]
+ -ECASE's error form)[_^M_][_$_]
+"[_^M_][_$_]
+ (flet ((default-clause-p (clause) (member (first clause) '(t otherwise))))[_^M_][_$_]
+ (let ((match-environment (gensym "MATCH-ENV-"))[_^M_][_$_]
+ (base-environment (gensym "BASE-ENV-"))[_^M_][_$_]
+ (match-error (gensym "MATCH-ERR-"))[_^M_][_$_]
+ (case-keyform (gensym "KEYFORM-"))[_^M_][_$_]
+ (match-clauses (remove-if #'default-clause-p clauses))[_^M_][_$_]
+ (default-clauses (remove-if-not #'default-clause-p clauses)))[_^M_][_$_]
+ (when (or (and (< 1 (length default-clauses))[_^M_][_$_]
+ ;; whether the default clause is the last one[_^M_][_$_]
+ (every #'eq clauses (append match-clauses default-clauses)))[_^M_][_$_]
+ ;; :keyform only applies for 'case[_^M_][_$_]
+ (and keyform (not (eq clause-munger 'case))))[_^M_][_$_]
+ (error 'program-error))[_^M_][_$_]
+ (labels ((ensure-template (template)[_^M_][_$_]
+ (cond (;; Logical variables are special-cased.[_^M_][_$_]
+ (variablep template) `',template)[_^M_][_$_]
+ ;; Same for lists (under matchf)[_^M_][_$_]
+ ((and (eq 'matchf template-munger)[_^M_][_$_]
+ (listp template))[_^M_][_$_]
+ (make-instance 'list-template[_^M_][_$_]
+ :spec (cons 'list template)))[_^M_][_$_]
+ (t template)))[_^M_][_$_]
+ (bind-variable (v)[_^M_][_$_]
+ `((,v (find-variable-value ',v ,match-environment))[_^M_][_$_]
+ (,(clean-unify-var-name v) ,v)))[_^M_][_$_]
+ (expand-clause (clause)[_^M_][_$_]
+ (destructuring-bind (template object &rest body)[_^M_][_$_]
+ clause[_^M_][_$_]
+ (let* ((template (ensure-template template))[_^M_][_$_]
+ (variables (collect-template-vars template)))[_^M_][_$_]
+ `((setf (values ,match-environment ,match-error)[_^M_][_$_]
+ (unify* ,template ,object (make-expanded-environment ,base-environment)))[_^M_][_$_]
+ (let* ,(mapcan #'bind-variable variables)[_^M_][_$_]
+ (declare (ignorable ,@variables ,@(mapcar #'clean-unify-var-name variables)))[_^M_][_$_]
+ ,@body)))))[_^M_][_$_]
+ (munge-clause (clause)[_^M_][_$_]
+ (ecase clause-munger[_^M_][_$_]
+ (cond (destructuring-bind (head . tail) clause[_^M_][_$_]
+ (if (consp head)[_^M_][_$_]
+ (list* (car head) (cadr head) tail)[_^M_][_$_]
+ clause)))[_^M_][_$_]
+ (case (list* (car clause) case-keyform (cdr clause)))[_^M_][_$_]
+ ((nil) clause))))[_^M_][_$_]
+ `(block ,named[_^M_][_$_]
+ (let ((,match-environment nil)[_^M_][_$_]
+ (,match-error nil)[_^M_][_$_]
+ (,case-keyform ,keyform)[_^M_][_$_]
+ (,base-environment ,(if environment[_^M_][_$_]
+ `(make-shared-environment ,environment)[_^M_][_$_]
+ '(make-empty-environment))))[_^M_][_$_]
+ (declare (dynamic-extent ,match-environment ,base-environment)[_^M_][_$_]
+ (ignorable ,case-keyform))[_^M_][_$_]
+ (cond[_^M_][_$_]
+ ,@(mapcar (lambda (c) (expand-clause (munge-clause c))) match-clauses)[_^M_][_$_]
+ ,@(when errorp `((,errorp ,(or error-form `(error ,match-error)))))[_^M_][_$_]
+ ,@(when default-clauses `((t ,@(cdar default-clauses))))[_^M_][_$_]
+ ,@(when default `((t ,default))))))))))[_^M_][_$_]
hunk ./match-block.lisp 122
- (match-named nil)[_^M_][_$_]
- (substitution '(make-empty-environment))[_^M_][_$_]
+ (named nil)[_^M_][_$_]
+ (match-named nil match-named-p)[_^M_][_$_]
+ (substitution nil)[_^M_][_$_]
hunk ./match-block.lisp 147
- (let ((env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
- (template (%template-for-match template))[_^M_][_$_]
- )[_^M_][_$_]
- `(block ,match-named[_^M_][_$_]
- (handler-case[_^M_][_$_]
- (let* ((,env-var (unify ,template ,object ,substitution))[_^M_][_$_]
- )[_^M_][_$_]
- ,(%wrap-var-bindings template env-var forms))[_^M_][_$_]
- [_^M_][_$_]
- ;; Yes. The above is sligthly wasteful.[_^M_][_$_]
-[_^M_][_$_]
- (unification-failure (uf)[_^M_][_$_]
- (if ,errorp[_^M_][_$_]
- (error uf)[_^M_][_$_]
- ,error-value))[_^M_][_$_]
- ))))[_^M_][_$_]
-[_^M_][_$_]
+ (when match-named-p[_^M_][_$_]
+ (warn ":match-named is deprecated. Use :named instead."))[_^M_][_$_]
+ (%match-expander 'match[_^M_][_$_]
+ 'nil[_^M_][_$_]
+ `((,template ,object ,@forms))[_^M_][_$_]
+ :default error-value[_^M_][_$_]
+ :named (or named match-named)[_^M_][_$_]
+ :environment substitution[_^M_][_$_]
+ :errorp errorp))[_^M_][_$_]
hunk ./match-block.lisp 159
- (match-named nil)[_^M_][_$_]
- (substitution '(make-empty-environment))[_^M_][_$_]
+ (named nil)[_^M_][_$_]
+ (match-named nil match-named-p)[_^M_][_$_]
+ (substitution nil)[_^M_][_$_]
hunk ./match-block.lisp 187
- (let ((env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
- (template (cond ((variablep template)[_^M_][_$_]
- `',template) ; Logical variables are special-cased.[_^M_][_$_]
- ((listp template) ; Same for lists.[_^M_][_$_]
- (make-instance 'list-template[_^M_][_$_]
- :spec (cons 'list template)))[_^M_][_$_]
- ;`',template)[_^M_][_$_]
- (t[_^M_][_$_]
- template)))[_^M_][_$_]
- )[_^M_][_$_]
- ;; Logical variables and lists are special cased for convenience.[_^M_][_$_]
- ;; Lists are especially inteded as abbreviation for destructuring.[_^M_][_$_]
- `(block ,match-named[_^M_][_$_]
- (handler-case[_^M_][_$_]
- (let* ((,env-var (unify ,template ,object ,substitution))[_^M_][_$_]
- )[_^M_][_$_]
- ,(%wrap-var-bindings template env-var forms))[_^M_][_$_]
- [_^M_][_$_]
- ;; Yes. The above is sligthly wasteful.[_^M_][_$_]
-[_^M_][_$_]
- (unification-failure (uf)[_^M_][_$_]
- (if ,errorp[_^M_][_$_]
- (error uf)[_^M_][_$_]
- ,error-value))[_^M_][_$_]
- ))))[_^M_][_$_]
+ (when match-named-p[_^M_][_$_]
+ (warn ":match-named is deprecated. Use :named instead."))[_^M_][_$_]
+ (%match-expander 'matchf[_^M_][_$_]
+ 'nil[_^M_][_$_]
+ `((,template ,object ,@forms))[_^M_][_$_]
+ :default error-value[_^M_][_$_]
+ :named (or named match-named)[_^M_][_$_]
+ :environment substitution[_^M_][_$_]
+ :errorp errorp))[_^M_][_$_]
hunk ./match-block.lisp 200
- ())[_^M_][_$_]
+ ()[_^M_][_$_]
+ (:default-initargs[_^M_][_$_]
+ :format-control "Non exhaustive matching."))[_^M_][_$_]
+[_^M_][_$_]
hunk ./match-block.lisp 205
+(defmacro match-cond (&body clauses)[_^M_][_$_]
+ "A combination of COND and MATCH."[_^M_][_$_]
+ (%match-expander 'match 'cond clauses))[_^M_][_$_]
+[_^M_][_$_]
+(defmacro matchf-cond (&body clauses)[_^M_][_$_]
+ "A combination of COND and MATCHF."[_^M_][_$_]
+ (%match-expander 'matchf 'cond clauses))[_^M_][_$_]
hunk ./match-block.lisp 214
- (default-substitution[_^M_][_$_]
- (make-empty-environment))[_^M_][_$_]
- (matching-named nil))[_^M_][_$_]
+ default-substitution[_^M_][_$_]
+ (named nil)[_^M_][_$_]
+ (matching-named nil matching-named-p))[_^M_][_$_]
hunk ./match-block.lisp 245
- (declare (ignore default-substitution)) ; For the time being.[_^M_][_$_]
- (labels ((%%match%% (clause-var template object forms substitution)[_^M_][_$_]
- (let ((template (%template-for-match template))[_^M_][_$_]
- )[_^M_][_$_]
- `((setf ,clause-var[_^M_][_$_]
- (unify* ,template ,object ,substitution))[_^M_][_$_]
- ,(%wrap-var-bindings template clause-var forms))[_^M_][_$_]
- ))[_^M_][_$_]
-[_^M_][_$_]
- (build-match-clause (match-clause match-env-var)[_^M_][_$_]
- (destructuring-bind ((template object) &body forms)[_^M_][_$_]
- match-clause[_^M_][_$_]
- (%%match%% match-env-var[_^M_][_$_]
- template[_^M_][_$_]
- object[_^M_][_$_]
- forms[_^M_][_$_]
- '(make-empty-environment))))[_^M_][_$_]
- )[_^M_][_$_]
- (when (or (and (find t match-clauses :key #'first)[_^M_][_$_]
- (find 'otherwise match-clauses :key #'first))[_^M_][_$_]
- (> (count t match-clauses :key #'first) 1)[_^M_][_$_]
- (> (count 'otherwise match-clauses :key #'first) 1))[_^M_][_$_]
- (error 'program-error))[_^M_][_$_]
- (let* ((default-clause (or (find t match-clauses[_^M_][_$_]
- :key #'first)[_^M_][_$_]
- (find 'otherwise match-clauses[_^M_][_$_]
- :key #'first)))[_^M_][_$_]
- (match-clauses (delete default-clause match-clauses)) ; EQL[_^M_][_$_]
- ; test[_^M_][_$_]
- ; suffices.[_^M_][_$_]
- (env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
- )[_^M_][_$_]
+ (when matching-named-p[_^M_][_$_]
+ (warn ":matching-named is deprecated. Use :named instead."))[_^M_][_$_]
+ (%match-expander 'match 'cond match-clauses[_^M_][_$_]
+ :errorp errorp[_^M_][_$_]
+ :error-form `(error 'unification-non-exhaustive)[_^M_][_$_]
+ :named (or named matching-named)[_^M_][_$_]
+ :environment default-substitution))[_^M_][_$_]
hunk ./match-block.lisp 253
- `(block ,matching-named[_^M_][_$_]
- (let (,env-var)[_^M_][_$_]
- (declare (dynamic-extent ,env-var))[_^M_][_$_]
- (cond ,@(mapcar (lambda (match-clause)[_^M_][_$_]
- (build-match-clause match-clause[_^M_][_$_]
- env-var))[_^M_][_$_]
- match-clauses)[_^M_][_$_]
- (,errorp[_^M_][_$_]
- (error 'unification-non-exhaustive[_^M_][_$_]
- :format-control "Non exhaustive matching."))[_^M_][_$_]
- ,@(when default-clause `((t ,@(cdr default-clause))))))))[_^M_][_$_]
- ))[_^M_][_$_]
-[_^M_][_$_]
-[_^M_][_$_]
-(defmacro match-case ((object &key errorp default-substitution match-case-named)[_^M_][_$_]
+(defmacro match-case ((object &key errorp default-substitution named (match-case-named nil match-case-named-p))[_^M_][_$_]
hunk ./match-block.lisp 282
- (let ((object-var (gensym "OBJECT-VAR-")))[_^M_][_$_]
- `(let ((,object-var ,object))[_^M_][_$_]
- (matching (:errorp ,errorp :default-substitution ,default-substitution :matching-named ,match-case-named)[_^M_][_$_]
- ,@(mapcar[_^M_][_$_]
- (lambda (clause)[_^M_][_$_]
- `(,(if (member (first clause) '(t otherwise))[_^M_][_$_]
- (first clause)[_^M_][_$_]
- (list (first clause) object-var))[_^M_][_$_]
- ,@(rest clause)))[_^M_][_$_]
- clauses)))))[_^M_][_$_]
+ (when match-case-named-p[_^M_][_$_]
+ (warn ":match-case-named is deprecated. Use :named instead."))[_^M_][_$_]
+ (%match-expander 'match 'case clauses[_^M_][_$_]
+ :named (or named match-case-named)[_^M_][_$_]
+ :environment default-substitution[_^M_][_$_]
+ :errorp errorp[_^M_][_$_]
+ :error-form `(error 'unification-non-exhaustive)[_^M_][_$_]
+ :keyform object))[_^M_][_$_]
hunk ./match-block.lisp 291
+(defmacro match-ecase ((object &key default-substitution named)[_^M_][_$_]
+ &body clauses)[_^M_][_$_]
+ (%match-expander 'match 'case clauses[_^M_][_$_]
+ :named named[_^M_][_$_]
+ :environment default-substitution[_^M_][_$_]
+ :default `(error 'unification-non-exhaustive)[_^M_][_$_]
+ :keyform object))[_^M_][_$_]
hunk ./match-block.lisp 299
-(defmacro matchf-case ((object &key errorp default-substitution match-case-named)[_^M_][_$_]
- &body clauses)[_^M_][_$_]
+(defmacro matchf-case ((object &key errorp default-substitution named (match-case-named nil match-case-named-p))[_^M_][_$_]
+ &body clauses)[_^M_][_$_]
hunk ./match-block.lisp 332
- (declare (ignore default-substitution)) ; For the time being.[_^M_][_$_]
- (let* ((object-var (gensym "OBJECT-VAR-"))[_^M_][_$_]
- (otherwise-clause-present-p[_^M_][_$_]
- (member (caar (last clauses)) '(t otherwise)))[_^M_][_$_]
- (non-otherwise-clauses[_^M_][_$_]
- (if otherwise-clause-present-p[_^M_][_$_]
- (butlast clauses)[_^M_][_$_]
- clauses))[_^M_][_$_]
- (otherwise-clause[_^M_][_$_]
- (if otherwise-clause-present-p[_^M_][_$_]
- (first (last clauses))[_^M_][_$_]
- (when errorp[_^M_][_$_]
- `(t (error 'unification-non-exhaustive[_^M_][_$_]
- :format-control "Non exhaustive matching.")))))[_^M_][_$_]
- )[_^M_][_$_]
- (labels ((generate-matchers (clauses)[_^M_][_$_]
- (if (null clauses)[_^M_][_$_]
- `(progn ,@(rest otherwise-clause))[_^M_][_$_]
- (destructuring-bind (pattern &rest body)[_^M_][_$_]
- (car clauses)[_^M_][_$_]
- `(handler-case (matchf (,pattern ,object-var)[_^M_][_$_]
- ,@body)[_^M_][_$_]
- (unification-failure ()[_^M_][_$_]
- ,(generate-matchers (cdr clauses))))))))[_^M_][_$_]
- `(block ,match-case-named[_^M_][_$_]
- (let ((,object-var ,object))[_^M_][_$_]
- ,(generate-matchers non-otherwise-clauses))))))[_^M_][_$_]
+ (when match-case-named-p[_^M_][_$_]
+ (warn ":match-case-named is deprecated. Use :named instead."))[_^M_][_$_]
+ (%match-expander 'matchf 'case clauses[_^M_][_$_]
+ :named (or named match-case-named)[_^M_][_$_]
+ :environment default-substitution[_^M_][_$_]
+ :errorp errorp[_^M_][_$_]
+ :error-form `(error 'unification-non-exhaustive)[_^M_][_$_]
+ :keyform object))[_^M_][_$_]
+[_^M_][_$_]
+(defmacro matchf-ecase ((object &key default-substitution named)[_^M_][_$_]
+ &body clauses)[_^M_][_$_]
+ (%match-expander 'matchf 'case clauses[_^M_][_$_]
+ :named named[_^M_][_$_]
+ :environment default-substitution[_^M_][_$_]
+ :default `(error 'unification-non-exhaustive)[_^M_][_$_]
+ :keyform object))[_^M_][_$_]
+[_^M_][_$_]
hunk ./substitutions.lisp 121
+(defun make-expanded-environment (base-env)
+ (make-environment :frames (cons (make-frame) (environment-frames base-env))))
+
Thu Feb 4 07:31:47 UTC 2010 pix@kepibu.org
* Duplicate nested match-case tests for matchf-case.
hunk ./test/unification-tests.lisp 212
+(defun nested-matchf-cases (input)
+ (matchf-case (input)
+ ((:a ?a :b #T(list &rest ?bs))
+ (loop for b in ?bs
+ collect (matchf-case (b)
+ ((:c ?c) ?c)
+ ((:d ?d) ?d)
+ (otherwise (error 'inner-error)))))
+ (otherwise (error 'outer-error))))
+
hunk ./test/unification-tests.lisp 224
-
hunk ./test/unification-tests.lisp 225
-
hunk ./test/unification-tests.lisp 228
- (test-error (match ('(x) '(x) :errorp nil)
+ (test-error (nested-matchf-cases '(:a 42 :b 33)) :condition-type 'outer-error)
+ (test-error (nested-matchf-cases '(:a 42 :b (33 42))) :condition-type 'inner-error)
+ (test '(42 43 44) (nested-matchf-cases '(:a 42 :b ((:d 42) (:c 43) (:c 44))))
+ :test #'equal)
+
+ (test-error (match ('(x) '(xx) :errorp nil)
Thu Feb 4 07:20:04 UTC 2010 pix@kepibu.org
* Make "inner-error" and "outer-error" proper conditions.
hunk ./test/unification-tests.lisp 195
+(define-condition inner-unification-failure (unification-failure) ()
+ (:default-initargs :format-control "Inner unification-failure."))
+(define-condition inner-error (simple-error) ()
+ (:default-initargs :format-control "Inner error."))
+(define-condition outer-error (simple-error) ()
+ (:default-initargs :format-control "Outer error."))
hunk ./test/unification-tests.lisp 209
- (otherwise (error "error-inner")))))
- (otherwise (error "error-outer"))))
-
-(define-condition inner-error (unification-failure) ()
- (:default-initargs :format-control "Inner error."))
+ (otherwise (error 'inner-error)))))
+ (otherwise (error 'outer-error))))
hunk ./test/unification-tests.lisp 213
- (test-error (nested-match-cases '(:a 42 :b 33)) :announce t)
+ (test-error (nested-match-cases '(:a 42 :b 33)) :condition-type 'outer-error)
hunk ./test/unification-tests.lisp 215
- (test-error (nested-match-cases '(:a 42 :b (33 42))) :announce t)
+ (test-error (nested-match-cases '(:a 42 :b (33 42))) :condition-type 'inner-error)
hunk ./test/unification-tests.lisp 221
- (error 'inner-error))
- :condition-type 'inner-error)
+ (error 'inner-unification-failure))
+ :condition-type 'inner-unification-failure)
hunk ./test/unification-tests.lisp 225
- (error 'inner-error))
- :condition-type 'inner-error)
+ (error 'inner-unification-failure))
+ :condition-type 'inner-unification-failure)
hunk ./test/unification-tests.lisp 250
- (('x 'x) (error 'inner-error))
+ (('x 'x) (error 'inner-unification-failure))
hunk ./test/unification-tests.lisp 252
- :condition-type 'inner-error)
+ :condition-type 'inner-unification-failure)
hunk ./test/unification-tests.lisp 256
- ('(x) (error 'inner-error))
+ ('(x) (error 'inner-unification-failure))
hunk ./test/unification-tests.lisp 258
- :condition-type 'inner-error)
+ :condition-type 'inner-unification-failure)
hunk ./test/unification-tests.lisp 262
- ((x) (error 'inner-error))
+ ((x) (error 'inner-unification-failure))
hunk ./test/unification-tests.lisp 264
- :condition-type 'inner-error)
+ :condition-type 'inner-unification-failure)
Wed Feb 3 09:56:58 UTC 2010 pix@kepibu.org
* Make condition printable, for easier manually stepping through tests.
hunk ./test/unification-tests.lisp 206
-(define-condition inner-error (unification-failure) ())
+(define-condition inner-error (unification-failure) ()
+ (:default-initargs :format-control "Inner error."))
Wed Feb 3 09:53:59 UTC 2010 pix@kepibu.org
* These are no longer failures. Woo!
hunk ./test/unification-tests.lisp 218
- :condition-type 'inner-error
- :known-failure t)
+ :condition-type 'inner-error)
hunk ./test/unification-tests.lisp 222
- :condition-type 'inner-error
- :known-failure t)
+ :condition-type 'inner-error)
hunk ./test/unification-tests.lisp 254
- :condition-type 'inner-error
- :known-failure t)
+ :condition-type 'inner-error)
hunk ./test/unification-tests.lisp 260
- :condition-type 'inner-error
- :known-failure t)
+ :condition-type 'inner-error)
Mon Jan 25 07:38:54 UTC 2010 pix@kepibu.org
* Moar tests!
hunk ./test/unification-tests.lisp 206
+(define-condition inner-error (unification-failure) ())
+
hunk ./test/unification-tests.lisp 215
+
+ (test-error (match ('(x) '(x) :errorp nil)
+ (error 'inner-error))
+ :condition-type 'inner-error
+ :known-failure t)
+
+ (test-error (matchf ((x) '(x) :errorp nil)
+ (error 'inner-error))
+ :condition-type 'inner-error
+ :known-failure t)
+
+ (with-tests (:name "final t-or-otherwise")
+ (test :success (matching ()
+ (('x 'y) :fail)
+ (t :success)))
+ (test :success (matching ()
+ (('x 'y) :fail)
+ (otherwise :success)))
+ (test :success (match-case ('x)
+ ('y :fail)
+ (t :success)))
+ (test :success (match-case ('x)
+ ('y :fail)
+ (otherwise :success)))
+ (test :success (matchf-case ('(x))
+ ((y) :fail)
+ (t :success)))
+ (test :success (matchf-case ('(x))
+ ((y) :fail)
+ (otherwise :success))))
+
+ (test-error (matching ()
+ (('x 'y) :fail)
+ (('x 'x) (error 'inner-error))
+ (('?x 'x) x))
+ :condition-type 'inner-error)
+
+ (test-error (match-case ('(x))
+ ('(y) :fail)
+ ('(x) (error 'inner-error))
+ ('(?x) x))
+ :condition-type 'inner-error
+ :known-failure t)
+
+ (test-error (matchf-case ('(x))
+ ((y) :fail)
+ ((x) (error 'inner-error))
+ ((?x) x))
+ :condition-type 'inner-error
+ :known-failure t)
+
+ (test 'sym (match-case ('(sym))
+ ('(a) :fail)
+ ('(b) :fail)
+ ('(?x) x)))
+
+ (test 'sym (matchf-case ('(sym))
+ ((a) :fail)
+ ((b) :fail)
+ ((?x) x)))
Mon Jan 25 07:38:27 UTC 2010 pix@kepibu.org
* Consider unexpected errors as test failures
...why is this not default behavior?
hunk ./test/unification-tests.lisp 13
+;; nil seems like a lousy default for this
+(setf *error-protect-tests* t)
+
Mon Jan 25 07:03:27 UTC 2010 pix@kepibu.org
* (cond (a b) (c d) nil) isn't really valid
hunk ./match-block.lisp 208
- ,(when default-clause (cons t (cdr default-clause)))))))[_^M_][_$_]
+ ,@(when default-clause `((t ,@(cdr default-clause))))))))[_^M_][_$_]
Sat Jan 23 00:53:33 UTC 2010 pix@kepibu.org
* How did .clbuild-skip-update even get /in/ the repo?
rmfile ./.clbuild-skip-update
Sat Jan 23 00:31:24 UTC 2010 pix@kepibu.org
* Make tests file loadable
hunk ./test/unification-tests.lisp 4
-;;;; CL-UNIFICATION test suite. Requires Franz's util.test package.
+;;;; CL-UNIFICATION test suite. Requires Franz's util.test package on
+;;;; allegro or the ptester compatibility library on other lisps.
+#+allegro (require :tester)
+#-allegro (asdf:oos 'asdf:load-op :ptester)
hunk ./test/unification-tests.lisp 10
- (:use "CL" "UNIFY" "UTIL.TEST"))
+ (:use "CL" "UNIFY" #+allegro "UTIL.TEST" #-allegro "PTESTER"))
Sat Jan 23 00:19:32 UTC 2010 pix@kepibu.org
* DTRT when asdf-system-connections is available
hunk ./cl-unification.asd 13
+(when (asdf:find-system 'asdf-system-connections nil)
+ (asdf:oos 'asdf:load-op 'asdf-system-connections))
+
hunk ./cl-unification.asd 43
+#+asdf-system-connections
+(asdf:defsystem-connection cl-unification+cl-ppcre
+ :requires (:cl-ppcre :cl-unification)
+ :components ((:module "lib-dependent"
+ :components ((:file "cl-ppcre-template")))))
+
Thu Jan 21 01:56:47 UTC 2010 pix@kepibu.org
* Rather than a new UNIFY** function, make UNIFY* work that way
Let errors which are not UNIFICATION-FAILUREs find their way out of UNIFY*.
hunk ./match-block.lisp 170
- (unify** ,template ,object ,substitution))[_^M_][_$_]
+ (unify* ,template ,object ,substitution))[_^M_][_$_]
hunk ./unifier.lisp 860
- (ignore-errors (unify a b env)))
-
-(defun unify** (a b &optional (env (make-empty-environment)))
Wed Jan 20 08:28:50 UTC 2010 pix@kepibu.org
* Can't IN-PACKAGE without a previous DEFPACKAGE.
hunk ./test/unification-tests.lisp 6
+(cl:defpackage "UNIFY.TESTS"
+ (:use "CL" "UNIFY" "UTIL.TEST"))
hunk ./test/unification-tests.lisp 10
-(use-package "UNIFY")
-(use-package "UTIL.TEST")
-
Wed Jan 20 08:27:09 UTC 2010 pix@kepibu.org
* Handle :case-sensitive properly
If the first clause doesn't match due to mismatched case, it would
roll down to the second clause, causing case-differing strings to
erroneously match. By checking for case again, we can avoid this.
Note, however, that this does not fix the similar but unrelated
inconsistent usage of *unify-string-case-sensitive-p* and
*unify-string-case-insensitive-p* (the former being used in the code
and the latter appearing in documentation). That bug will remain
until the canonical form is decided upon.
hunk ./unifier.lisp 99
- ((char-equal a b)
+ ((and (not case-sensitive) (char-equal a b))
hunk ./unifier.lisp 121
- ((string-equal a b)
+ ((and (not case-sensitive) (string-equal a b))
Wed Jan 20 08:09:59 UTC 2010 pix@kepibu.org
* Fix typo (connot -> cannot)
hunk ./unifier.lisp 103
- :format-control "Connot unify two different characters: ~S ~S."
+ :format-control "Cannot unify two different characters: ~S ~S."
hunk ./unifier.lisp 125
- :format-control "Connot unify two different strings: ~S ~S."
+ :format-control "Cannot unify two different strings: ~S ~S."
Fri Jan 15 08:55:05 UTC 2010 pix@kepibu.org
* Redefine MATCH-CASE in terms of MATCHING
This both greatly simplifies the MATCH-CASE macro as well as its expansion.
HOWEVER, this version is *NOT* 100% compatible with the previous version.
Specifically, UNIFICATION-FAILUREs signalled from within clause-forms will /not/
cause the next unification clause to be attempted, but will instead propogate
outward as the -case name suggests they should.
That is,
(ignore-errors
(match-case ("foo")
("foo" (error 'unification-failure ...))
(t :default)))
=> :default ;; before patch
=> nil, #<unification-failure> ;; after patch
hunk ./match-block.lisp 212
-;;; match-case --[_^M_][_$_]
-;;; Implementation provided by Peter Scott.[_^M_][_$_]
-;;;[_^M_][_$_]
-;;; Notes:[_^M_][_$_]
-;;;[_^M_][_$_]
-;;; [MA 20071109][_^M_][_$_]
-;;; The construction of the inner MATCH clauses could be done[_^M_][_$_]
-;;; more intelligently by supplying :ERRORP NIL, thus avoiding the[_^M_][_$_]
-;;; HANDLER-CASEs, which are quite expensive. Any takers?[_^M_][_$_]
-[_^M_][_$_]
hunk ./match-block.lisp 241
- (declare (ignore default-substitution)) ; For the time being.[_^M_][_$_]
- (let* ((object-var (gensym "OBJECT-VAR-"))[_^M_][_$_]
- (otherwise-clause-present-p[_^M_][_$_]
- (member (caar (last clauses)) '(t otherwise)))[_^M_][_$_]
- (non-otherwise-clauses[_^M_][_$_]
- (if otherwise-clause-present-p[_^M_][_$_]
- (butlast clauses)[_^M_][_$_]
- clauses))[_^M_][_$_]
- (otherwise-clause[_^M_][_$_]
- (if otherwise-clause-present-p[_^M_][_$_]
- (first (last clauses))[_^M_][_$_]
- (when errorp[_^M_][_$_]
- `(t (error 'unification-non-exhaustive[_^M_][_$_]
- :format-control "Non exhaustive matching.")))))[_^M_][_$_]
- )[_^M_][_$_]
- (labels ((generate-matchers (clauses)[_^M_][_$_]
- (if (null clauses)[_^M_][_$_]
- `(progn ,@(rest otherwise-clause))[_^M_][_$_]
- (destructuring-bind (pattern &rest body)[_^M_][_$_]
- (car clauses)[_^M_][_$_]
- `(handler-case (match (,pattern ,object-var)[_^M_][_$_]
- ,@body)[_^M_][_$_]
- (unification-failure ()[_^M_][_$_]
- ,(generate-matchers (cdr clauses))))))))[_^M_][_$_]
- `(block ,match-case-named[_^M_][_$_]
- (let ((,object-var ,object))[_^M_][_$_]
- ,(generate-matchers non-otherwise-clauses))))))[_^M_][_$_]
+ (let ((object-var (gensym "OBJECT-VAR-")))[_^M_][_$_]
+ `(let ((,object-var ,object))[_^M_][_$_]
+ (matching (:errorp ,errorp :default-substitution ,default-substitution :matching-named ,match-case-named)[_^M_][_$_]
+ ,@(mapcar[_^M_][_$_]
+ (lambda (clause)[_^M_][_$_]
+ `(,(if (member (first clause) '(t otherwise))[_^M_][_$_]
+ (first clause)[_^M_][_$_]
+ (list (first clause) object-var))[_^M_][_$_]
+ ,@(rest clause)))[_^M_][_$_]
+ clauses)))))[_^M_][_$_]
Fri Jan 15 08:49:26 UTC 2010 pix@kepibu.org
* Only use one variable to store the unification environment in MATCHING
Because of the way MATCHING expands, and what UNIFY* returns, each
(setf #:env (unify* ...))
call will do one of two things: it will set #:env to NIL or it will set #:env to
an ENVIRONMENT structure.
If #:env is set to NIL--the same value it entered the (setf) with!--the COND
will continue on to the next clause.
If #:env is set to an ENVIRONMENT structure, none of the remaining (setf)
clauses will be evaluated.
Thus, because the variable will only ever be set to a non-nil value once, this
should be perfectly safe.
hunk ./match-block.lisp 195
- (match-clauses-env-vars (mapcar (lambda (mc)[_^M_][_$_]
- (declare (ignore mc))[_^M_][_$_]
- (gensym "UNIFICATION-ENV-")[_^M_][_$_]
- )[_^M_][_$_]
- match-clauses))[_^M_][_$_]
+ (env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
hunk ./match-block.lisp 199
- (let ,match-clauses-env-vars[_^M_][_$_]
- (declare (dynamic-extent ,@match-clauses-env-vars))[_^M_][_$_]
- (cond ,@(mapcar (lambda (match-clause match-clause-env-var)[_^M_][_$_]
+ (let (,env-var)[_^M_][_$_]
+ (declare (dynamic-extent ,env-var))[_^M_][_$_]
+ (cond ,@(mapcar (lambda (match-clause)[_^M_][_$_]
hunk ./match-block.lisp 203
- match-clause-env-var))[_^M_][_$_]
- match-clauses[_^M_][_$_]
- match-clauses-env-vars)[_^M_][_$_]
+ env-var))[_^M_][_$_]
+ match-clauses)[_^M_][_$_]
Fri Jan 15 07:59:02 UTC 2010 pix@kepibu.org
* Make MATCHING agree with MATCH[F][-CASE] about the conditions of failure
Rather than skipping to the next clause on any error, UNIFICATION-FAILUREs--and
/only/ UNIFICATION-FAILUREs--skip to the next clause.
hunk ./match-block.lisp 170
- (unify* ,template ,object ,substitution))[_^M_][_$_]
+ (unify** ,template ,object ,substitution))[_^M_][_$_]
hunk ./unifier.lisp 862
+(defun unify** (a b &optional (env (make-empty-environment)))
+ (handler-case
+ (unify a b env)
+ (unification-failure (c) (values nil c))))
+
Fri Jan 15 07:48:53 UTC 2010 pix@kepibu.org
* Use &body instead of &rest for (arguably) prettier auto-indentation
hunk ./match-block.lisp 137
- &rest match-clauses)[_^M_][_$_]
+ &body match-clauses)[_^M_][_$_]
hunk ./match-block.lisp 228
- &rest clauses)[_^M_][_$_]
+ &body clauses)[_^M_][_$_]
hunk ./match-block.lisp 286
- &rest clauses)[_^M_][_$_]
+ &body clauses)[_^M_][_$_]
Tue Jan 12 09:20:28 UTC 2010 pix@kepibu.org
* Fix (matching (otherwise ...))
(matching (otherwise ...)) expands into (cond (otherwise ...)), which
generates an unbound-variable error when executed, because COND does
not special-case OTHERWISE as CASE does.
hunk ./match-block.lisp 213
- ,@(when default-clause (list default-clause))))))[_^M_][_$_]
+ ,(when default-clause (cons t (cdr default-clause)))))))[_^M_][_$_]
Tue Jan 12 09:08:23 UTC 2010 pix@kepibu.org
* Extract the bits that wrap forms with bindings for template variables
In some cases, this patch swaps the order of execution of
%TEMPLATE-FOR-MATCH and COLLECT-TEMPLATE-VARS. I'm pretty sure this
doesn't have any noticable effect, but thorough testing is probably
wise.
hunk ./match-block.lisp 18
+(defun %wrap-var-bindings (template environment-var forms)[_^M_][_$_]
+ (let* ((template-vars (collect-template-vars template))[_^M_][_$_]
+ (bindings (loop for v in template-vars[_^M_][_$_]
+ nconc (list `(,v (find-variable-value ',v[_^M_][_$_]
+ ,environment-var))[_^M_][_$_]
+ `(,(clean-unify-var-name v) ,v)))))[_^M_][_$_]
+ `(let* ,bindings[_^M_][_$_]
+ (declare (ignorable ,@(mapcar #'first bindings)))[_^M_][_$_]
+ ,@forms)))[_^M_][_$_]
+[_^M_][_$_]
hunk ./match-block.lisp 54
- (let ((template-vars (collect-template-vars template))[_^M_][_$_]
- (env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
+ (let ((env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
hunk ./match-block.lisp 57
- (flet ((generate-var-bindings ()[_^M_][_$_]
- (loop for v in template-vars[_^M_][_$_]
- nconc (list `(,v (find-variable-value ',v[_^M_][_$_]
- ,env-var))[_^M_][_$_]
- `(,(clean-unify-var-name v) ,v))))[_^M_][_$_]
- )[_^M_][_$_]
- `(block ,match-named[_^M_][_$_]
- (handler-case[_^M_][_$_]
- (let* ((,env-var (unify ,template ,object ,substitution))[_^M_][_$_]
- ,@(generate-var-bindings)[_^M_][_$_]
- )[_^M_][_$_]
- (declare (ignorable ,@(mapcar #'first[_^M_][_$_]
- (generate-var-bindings))))[_^M_][_$_]
- ,@forms)[_^M_][_$_]
+ `(block ,match-named[_^M_][_$_]
+ (handler-case[_^M_][_$_]
+ (let* ((,env-var (unify ,template ,object ,substitution))[_^M_][_$_]
+ )[_^M_][_$_]
+ ,(%wrap-var-bindings template env-var forms))[_^M_][_$_]
hunk ./match-block.lisp 63
- ;; Yes. The above is sligthly wasteful.[_^M_][_$_]
+ ;; Yes. The above is sligthly wasteful.[_^M_][_$_]
hunk ./match-block.lisp 65
- (unification-failure (uf)[_^M_][_$_]
- (if ,errorp[_^M_][_$_]
- (error uf)[_^M_][_$_]
- ,error-value))[_^M_][_$_]
- )))))[_^M_][_$_]
+ (unification-failure (uf)[_^M_][_$_]
+ (if ,errorp[_^M_][_$_]
+ (error uf)[_^M_][_$_]
+ ,error-value))[_^M_][_$_]
+ ))))[_^M_][_$_]
hunk ./match-block.lisp 101
- (let ((template-vars (collect-template-vars template))[_^M_][_$_]
- (env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
+ (let ((env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
hunk ./match-block.lisp 113
- (flet ((generate-var-bindings ()[_^M_][_$_]
- (loop for v in template-vars[_^M_][_$_]
- nconc (list `(,v (find-variable-value ',v[_^M_][_$_]
- ,env-var))[_^M_][_$_]
- `(,(clean-unify-var-name v) ,v))))[_^M_][_$_]
- )[_^M_][_$_]
- `(block ,match-named[_^M_][_$_]
- (handler-case[_^M_][_$_]
- (let* ((,env-var (unify ,template ,object ,substitution))[_^M_][_$_]
- ,@(generate-var-bindings)[_^M_][_$_]
- )[_^M_][_$_]
- (declare (ignorable ,@(mapcar #'first[_^M_][_$_]
- (generate-var-bindings))))[_^M_][_$_]
- ,@forms)[_^M_][_$_]
+ `(block ,match-named[_^M_][_$_]
+ (handler-case[_^M_][_$_]
+ (let* ((,env-var (unify ,template ,object ,substitution))[_^M_][_$_]
+ )[_^M_][_$_]
+ ,(%wrap-var-bindings template env-var forms))[_^M_][_$_]
hunk ./match-block.lisp 119
- ;; Yes. The above is sligthly wasteful.[_^M_][_$_]
+ ;; Yes. The above is sligthly wasteful.[_^M_][_$_]
hunk ./match-block.lisp 121
- (unification-failure (uf)[_^M_][_$_]
- (if ,errorp[_^M_][_$_]
- (error uf)[_^M_][_$_]
- ,error-value))[_^M_][_$_]
- )))))[_^M_][_$_]
+ (unification-failure (uf)[_^M_][_$_]
+ (if ,errorp[_^M_][_$_]
+ (error uf)[_^M_][_$_]
+ ,error-value))[_^M_][_$_]
+ ))))[_^M_][_$_]
hunk ./match-block.lisp 167
- (let ((template-vars (collect-template-vars template))[_^M_][_$_]
- (template (%template-for-match template))[_^M_][_$_]
+ (let ((template (%template-for-match template))[_^M_][_$_]
hunk ./match-block.lisp 169
- (flet ((generate-var-bindings ()[_^M_][_$_]
- (loop for v in template-vars[_^M_][_$_]
- nconc (list `(,v (find-variable-value[_^M_][_$_]
- ',v[_^M_][_$_]
- ,clause-var))[_^M_][_$_]
- `(,(clean-unify-var-name v) ,v))))[_^M_][_$_]
- )[_^M_][_$_]
- `((setf ,clause-var[_^M_][_$_]
- (unify* ,template ,object ,substitution))[_^M_][_$_]
- (let* (,@(generate-var-bindings))[_^M_][_$_]
- ,@forms))[_^M_][_$_]
- )))[_^M_][_$_]
+ `((setf ,clause-var[_^M_][_$_]
+ (unify* ,template ,object ,substitution))[_^M_][_$_]
+ ,(%wrap-var-bindings template clause-var forms))[_^M_][_$_]
+ ))[_^M_][_$_]
Tue Jan 12 08:37:44 UTC 2010 pix@kepibu.org
* Use (unify* ...) rather than (ignore-errors (unify ...))
Same thing, so might as well use the convenience function.
hunk ./match-block.lisp 188
- (ignore-errors (unify ,template[_^M_][_$_]
- ,object[_^M_][_$_]
- ,substitution)))[_^M_][_$_]
+ (unify* ,template ,object ,substitution))[_^M_][_$_]
Tue Jan 12 08:03:54 UTC 2010 pix@kepibu.org
* Extract template handling of MATCH[ING] into %TEMPLATE-FOR-MATCH
hunk ./match-block.lisp 13
+(defun %template-for-match (template)[_^M_][_$_]
+ (if (variablep template)[_^M_][_$_]
+ `',template ; Logical variables are special-cased.[_^M_][_$_]
+ template))[_^M_][_$_]
hunk ./match-block.lisp 46
- (template (if (variablep template)[_^M_][_$_]
- `',template ; Logical variables are special-cased.[_^M_][_$_]
- template))[_^M_][_$_]
+ (template (%template-for-match template))[_^M_][_$_]
hunk ./match-block.lisp 178
- (template (if (variablep template)[_^M_][_$_]
- `',template ; Logical variables are[_^M_][_$_]
- ; special-cased.[_^M_][_$_]
- template)) [_^M_][_$_]
+ (template (%template-for-match template))[_^M_][_$_]
Thu Dec 17 17:02:42 UTC 2009 mantoniotti
* ChangeLog updated.
hunk ./ChangeLog 1
+2009-12-17 author <author@paniscia.local>
+
+ * lib-dependent/cl-ppcre-template.asd: Initial checkin.
+
+ * lib-dependent/cl-ppcre-template.lisp:
+ Patched to use Cl-PPCRE:SCAN-TO-STRINGS (thanks to Pixel // pinterface [a] gmail dot com).
+
+ * unifier.lisp: Minor cosmetic changes.
+
+ * unification-package.lisp: Exported MATCHF-CASE.
+
+ * templates-hierarchy.lisp:
+ Fixed a couple of problems with some accessors in the NUMBER,
+ STRUCTURE-OBJECT and STANDARD-OBJECT templates.
+
+ * match-block.lisp: Added MATCHF* macros.
+
+2009-04-18 author <author@paniscia.local>
+
+ * ChangeLog: ChangeLog updated.
+
+ * cl-unification.system, cl-unification.asd:
+ System definitions files (.asd and .system) modified in order to make
+ dependency form CL-PPCRE optional.
+
+ * lib-dependent/cl-ppcre-template.system: File added.
+
+ * lib-dependent/cl-ppcre-template.lisp:
+ Removed REQUIRE of CL-PPCRE. Too brittle.
+
+ * cl-unification-lib.asd: File added.
+
Thu Dec 17 16:57:45 UTC 2009 mantoniotti
* Patched to use Cl-PPCRE:SCAN-TO-STRINGS (thanks to Pixel // pinterface [a] gmail dot com).
hunk ./lib-dependent/cl-ppcre-template.lisp 123
- (multiple-value-bind (m-start m-end r-starts r-ends)
- (cl-ppcre:scan (scanner re-t) s :start start :end end)
- ;; Maybe SCAN-TO-STRINGS would be simpler to use...
hunk ./lib-dependent/cl-ppcre-template.lisp 124
- (declare (type (integer 0 #.most-positive-fixnum) m-start m-end)
- (type (vector (integer 0 #.most-positive-fixnum)) r-starts r-ends))
- (unless (and (= start m-start) (= m-end end))
+ (multiple-value-bind (matched-p strings)
+ (cl-ppcre:scan-to-strings (scanner re-t) s :start start :end end)
+ (unless matched-p
hunk ./lib-dependent/cl-ppcre-template.lisp 135
- (loop for r-start across r-starts
- for r-end across r-ends
- for r-string of-type string = (subseq s r-start r-end)
+ (loop for r-string of-type string across strings
Thu Dec 17 16:44:46 UTC 2009 mantoniotti
* Minor cosmetic changes.
hunk ./unifier.lisp 228
-(defmethod untyped-unify ((as list) (bs vector) &optional (env (make-empty-environment)))
+(defmethod untyped-unify ((as list) (bs vector)
+ &optional (env (make-empty-environment)))
hunk ./unifier.lisp 236
-(defmethod untyped-unify ((as vector) (bs list) &optional (env (make-empty-environment)))
+(defmethod untyped-unify ((as vector) (bs list)
+ &optional (env (make-empty-environment)))
hunk ./unifier.lisp 454
- (when keys (warn "Sorry mathcing of keywords ~S not yet implemented." keys))
+ (when keys (warn "Sorry matching of keywords ~S not yet implemented." keys))
Thu Dec 17 16:43:51 UTC 2009 mantoniotti
* Exported MATCHF-CASE.
hunk ./unification-package.lisp 44
- "MATCH-CASE")
+ "MATCH-CASE"
+ "MATCHF-CASE"
+ )
Thu Dec 17 16:43:12 UTC 2009 mantoniotti
* Fixed a couple of problems with some accessors in the NUMBER,
Fixed a couple of problems with some accessors in the NUMBER,
STRUCTURE-OBJECT and STANDARD-OBJECT templates.
hunk ./templates-hierarchy.lisp 410
+(defun number-template-numeric-type (x)
+ (declare (type number-template x))
+ (let ((n (number-template-number x)))
+ (if (numberp n)
+ (type-of n)
+ (first (template-spec x)))))
+
+(defun number-template-numeric-class (x)
+ (declare (type number-template x))
+ (let ((n (number-template-number x)))
+ (if (numberp n)
+ (class-of n)
+ (find-class (first (template-spec x))))))
+
+
+
+
hunk ./templates-hierarchy.lisp 513
+(defun structure-object-template-class (x)
+ (and (structure-object-template-p x)
+ (first (template-spec x))))
+
hunk ./templates-hierarchy.lisp 522
+(defun standard-object-template-class (x)
+ (and (standard-object-template-p x)
+ (first (template-spec x))))
+
Thu Dec 17 16:41:38 UTC 2009 mantoniotti
* Added MATCHF* macros.
hunk ./match-block.lisp 306
+[_^M_][_$_]
+(defmacro matchf-case ((object &key errorp default-substitution match-case-named)[_^M_][_$_]
+ &rest clauses)[_^M_][_$_]
+ "MATCHF-CASE sets up a CASE-like environment for multiple template matching clauses.[_^M_][_$_]
+[_^M_][_$_]
+The syntax of MATCHF-CASE comprises a number of clauses of the form[_^M_][_$_]
+[_^M_][_$_]
+ <clause> ::= <regular-clause> | <default-clause>[_^M_][_$_]
+ <regular-clause> ::= (<template> &body <forms>)[_^M_][_$_]
+ <default-clause> ::= (t &body <forms>)[_^M_][_$_]
+ | (otherwise &body <forms>)[_^M_][_$_]
+<form> and <forms> are regular Common Lisp forms.[_^M_][_$_]
+<template> is a unification template.[_^M_][_$_]
+[_^M_][_$_]
+The full syntax of MATCHF-CASE is[_^M_][_$_]
+[_^M_][_$_]
+ matchf-case <object> (&key errorp default-substitution) <clauses>[_^M_][_$_]
+[_^M_][_$_]
+Each clause evaluates its forms in an environment where the variables[_^M_][_$_]
+present in the template are bound lexically. Note that both variable[_^M_][_$_]
+names '?FOO' and 'FOO' are bound for convenience.[_^M_][_$_]
+[_^M_][_$_]
+The values returned by the MATCH-CASE form are those of the last form in[_^M_][_$_]
+the first clause that satisfies the match test.[_^M_][_$_]
+[_^M_][_$_]
+If ERRORP is non-NIL then if none of the regular clauses matches, then[_^M_][_$_]
+an error of type UNIFICATION-NON-EXAUSTIVE is signalled, regardless of[_^M_][_$_]
+any default clause. Otherwise, the default clause behaves as a[_^M_][_$_]
+standard CASE default clause. The default value of ERRORP is NIL.[_^M_][_$_]
+[_^M_][_$_]
+MATCHF-CASE behaves like MATCH-CASE, but the patterns are not[_^M_][_$_]
+evaluated (i.e., it relies on MATCHF instead of MATCH to construct the[_^M_][_$_]
+macro expansion.[_^M_][_$_]
+"[_^M_][_$_]
+ (declare (ignore default-substitution)) ; For the time being.[_^M_][_$_]
+ (let* ((object-var (gensym "OBJECT-VAR-"))[_^M_][_$_]
+ (otherwise-clause-present-p[_^M_][_$_]
+ (member (caar (last clauses)) '(t otherwise)))[_^M_][_$_]
+ (non-otherwise-clauses[_^M_][_$_]
+ (if otherwise-clause-present-p[_^M_][_$_]
+ (butlast clauses)[_^M_][_$_]
+ clauses))[_^M_][_$_]
+ (otherwise-clause[_^M_][_$_]
+ (if otherwise-clause-present-p[_^M_][_$_]
+ (first (last clauses))[_^M_][_$_]
+ (when errorp[_^M_][_$_]
+ `(t (error 'unification-non-exhaustive[_^M_][_$_]
+ :format-control "Non exhaustive matching.")))))[_^M_][_$_]
+ )[_^M_][_$_]
+ (labels ((generate-matchers (clauses)[_^M_][_$_]
+ (if (null clauses)[_^M_][_$_]
+ `(progn ,@(rest otherwise-clause))[_^M_][_$_]
+ (destructuring-bind (pattern &rest body)[_^M_][_$_]
+ (car clauses)[_^M_][_$_]
+ `(handler-case (matchf (,pattern ,object-var)[_^M_][_$_]
+ ,@body)[_^M_][_$_]
+ (unification-failure ()[_^M_][_$_]
+ ,(generate-matchers (cdr clauses))))))))[_^M_][_$_]
+ `(block ,match-case-named[_^M_][_$_]
+ (let ((,object-var ,object))[_^M_][_$_]
+ ,(generate-matchers non-otherwise-clauses))))))[_^M_][_$_]
+[_^M_][_$_]
Fri Apr 17 22:44:17 UTC 2009 mantoniotti
* ChangeLog updated.
hunk ./ChangeLog 1
+2009-04-18 author <author@Macintosh-9.local>
+
+ * cl-unification.system, cl-unification.asd:
+ System definitions files (.asd and .system) modified in order to make
+ dependency form CL-PPCRE optional.
+
+ * lib-dependent/cl-ppcre-template.system: File added.
+
+ * lib-dependent/cl-ppcre-template.lisp:
+ Removed REQUIRE of CL-PPCRE. Too brittle.
+
+ * cl-unification-lib.asd: File added.
+
+2009-04-17 author <author@Macintosh-9.local>
+
+ * unification-package.lisp:
+ Added a few exports and changed the actual package name (i.e., I put
+ my money where my mouth is; the "published" package name is now a
+ nickname).
+
+ * apply-substitution.lisp:
+ Fixed a couple of snags. APPLY-SUBSTITUTION was not applied
+ recursively and it was barfing on numbers.
+ Current version is still incomplete, but it serves as a template for
+ further development.
+
+2009-04-15 author <author@Macintosh-9.local>
+
+ * ChangeLog: ChangeLog updated.
+
+ * lib-dependent/cl-ppcre-template.lisp, test/unification-tests.lisp:
+ Modified Files:
+ test/unification-tests.lisp
+ Added Files:
+ lib-dependent/cl-ppcre-template.lisp
+
+ The cl-ppcre-template reuses E. Weitz's wonderful CL-PPCRE library
+ to provide a seamless (YMMV) reuse of regular expressions within
+ CL-UNIFICATION.
+
+ * templates-hierarchy.lisp: Added LAMBDA-TEMPLATE.
+
+ * substitutions.lisp:
+ Added some functionality to extract all variables and/or all values
+ from an environment or a frame.
+
+ * match-block.lisp:
+ Added MATCHF (whose name may change) to simplify the
+ 'destructuring-bind'-like syntax and behavior of the matching
+ facilities.
+
+ * COPYING: Dates updated.
+
+ * unifier.lisp:
+ Major API change to 'unify'. It now accepts keywords. Old code
+ shouls not be affected, but new code is now more flexible. Look the
+ the STRING and (new) CHARACTER methods to see how this change is
+ affecting the code.
+
+ * variables.lisp: Some 'diff' unfathomable change happened.
+
+ * unification-package.lisp: Added exports of a few symbols.
+
+ * cl-unification.system, cl-unification.asd:
+ Fixed a few snags and added "lib-dependent" module.
+
+ * apply-substitution.lisp: Added some functionality and comments.
+
Fri Apr 17 22:42:46 UTC 2009 mantoniotti
* System definitions files (.asd and .system) modified in order to make
System definitions files (.asd and .system) modified in order to make
dependency form CL-PPCRE optional.
hunk ./cl-unification.asd 6
-(asdf:defsystem cl-unification
- :author "Marco Antoniotti"
- :serial t
- :components ((:file "unification-package")
- (:file "variables")
- (:file "substitutions")
- (:file "lambda-list-parsing")
- (:file "templates-hierarchy")
- (:file "unifier")
- (:file "match-block")
- (:file "apply-substitution")
- (:module "lib-dependent"
- :depends-on ("templates-hierarchy" "unifier")
- :components (
- #+cl-ppcre
- (:file "cl-ppcre-template")
- ))))
+;;;;===========================================================================
+;;;; Simple stuff that should be built in ASDF.
+
+(defpackage "CL-UNIFICATION-SYSTEM" (:use "CL" "ASDF"))
+
+(in-package "CL-UNIFICATION-SYSTEM")
+
+(defclass asdf-system-definition-file (asdf:cl-source-file) ())
+(defmethod source-file-type ((c asdf-system-definition-file) (s module)) "asd")
+
+
+(asdf:defsystem :cl-unification
+ :author "Marco Antoniotti"
+ :serial t
+ :components ((:file "unification-package")
+ (:file "variables")
+ (:file "substitutions")
+ (:file "lambda-list-parsing")
+ (:file "templates-hierarchy")
+ (:file "unifier")
+ (:file "match-block")
+ (:file "apply-substitution")
+ #+asdf-with-optional-dependencies
+ (:module "lib-dependent"
+ :pathname "lib-dependent"
+ :depends-on ("templates-hierarchy" "unifier")
+ :components ((:file "cl-ppcre-template"
+ :depends-on (cl-ppcre))
+ ))
+ #-asdf-with-optional-dependencies
+ (asdf-system-definition-file
+ "cl-unification-lib")
+ ))
hunk ./cl-unification.system 7
- :source-extension "lisp"
- :components ("unification-package"
- "variables"
- "substitutions"
- "lambda-list-parsing"
- "templates-hierarchy"
- "unifier"
- "match-block"
- "apply-substitution"
- (:module "lib-dependent"
- :depends-on ("templates-hierarchy" "unifier")
- :components (
- #+cl-ppcre
- (:file "cl-ppcre-template")
- ))
- ))
+ :source-extension "lisp"
+ :components ("unification-package"
+ "variables"
+ "substitutions"
+ "lambda-list-parsing"
+ "templates-hierarchy"
+ "unifier"
+ "match-block"
+ "apply-substitution"
+ (:module "lib-dependent"
+ :depends-on ("templates-hierarchy" "unifier")
+ :components ((:subsystem "cl-ppcre-template"
+ :non-required-p t
+ )
+ ))
+ ))
Fri Apr 17 22:40:29 UTC 2009 mantoniotti
* Removed REQUIRE of CL-PPCRE. Too brittle.
hunk ./lib-dependent/cl-ppcre-template.lisp 8
-(require "CL-PPCRE")
-
Fri Apr 17 07:53:58 UTC 2009 mantoniotti
* Added a few exports and changed the actual package name (i.e., I put
Added a few exports and changed the actual package name (i.e., I put
my money where my mouth is; the "published" package name is now a
nickname).
hunk ./unification-package.lisp 1
-;;; -*- Mode: Lisp -*-
+;;;; -*- Mode: Lisp -*-
hunk ./unification-package.lisp 3
-(defpackage "CL.EXT.DACF.UNIFICATION" (:use "CL")
- (:nicknames "UNIFY")
+;;;; unification-package.lisp --
+;;;; Package definition for the CL-UNIFICATION library.
+;;;;
+;;;; Copyright (c) 2004-2009 Marco Antoniotti
+;;;; See file COPYING for licensing information.
+
+
+(defpackage "IT.UNIMIB.DISCO.MA.CL.EXT.DACF.UNIFICATION" (:use "CL")
+ (:nicknames "CL.EXT.DACF.UNIFICATION" "UNIFY" "unify")
hunk ./unification-package.lisp 50
+
+ #+cl-ppcre
+ (:export
+ "REGULAR-EXPRESSION"
+ "REGEXP")
hunk ./unification-package.lisp 57
-;;; end of file -- unification-package.lisp --
+;;;; end of file -- unification-package.lisp --
Fri Apr 17 07:52:25 UTC 2009 mantoniotti
* Fixed a couple of snags. APPLY-SUBSTITUTION was not applied
Fixed a couple of snags. APPLY-SUBSTITUTION was not applied
recursively and it was barfing on numbers.
Current version is still incomplete, but it serves as a template for
further development.
hunk ./apply-substitution.lisp 20
+(defmethod apply-substitution ((s environment) (n number) &optional exclude-vars)
+ (declare (ignore exclude-vars))
+ n)
+
+
hunk ./apply-substitution.lisp 34
- (cond (foundp val)
+ (cond (foundp (apply-substitution substitution val exclude-vars))
Wed Apr 15 14:33:35 UTC 2009 mantoniotti
* ChangeLog updated.
hunk ./ChangeLog 1
+2009-04-15 author <author@paniscia.pd.disco.unimib.it>
+
+ * lib-dependent/cl-ppcre-template.lisp, test/unification-tests.lisp:
+ Modified Files:
+ test/unification-tests.lisp
+ Added Files:
+ lib-dependent/cl-ppcre-template.lisp
+
+ The cl-ppcre-template reuses E. Weitz's wonderful CL-PPCRE library
+ to provide a seamless (YMMV) reuse of regular expressions within
+ CL-UNIFICATION.
+
+ * templates-hierarchy.lisp: Added LAMBDA-TEMPLATE.
+
+ * substitutions.lisp:
+ Added some functionality to extract all variables and/or all values
+ from an environment or a frame.
+
+ * match-block.lisp:
+ Added MATCHF (whose name may change) to simplify the
+ 'destructuring-bind'-like syntax and behavior of the matching
+ facilities.
+
+ * COPYING: Dates updated.
+
+ * unifier.lisp:
+ Major API change to 'unify'. It now accepts keywords. Old code
+ shouls not be affected, but new code is now more flexible. Look the
+ the STRING and (new) CHARACTER methods to see how this change is
+ affecting the code.
+
+ * variables.lisp: Some 'diff' unfathomable change happened.
+
+ * unification-package.lisp: Added exports of a few symbols.
+
+ * cl-unification.system, cl-unification.asd:
+ Fixed a few snags and added "lib-dependent" module.
+
+ * apply-substitution.lisp: Added some functionality and comments.
+
+2008-07-13 author <author@paniscia.pd.disco.unimib.it>
+
+ * ChangeLog: Changelog updated.
+
+ * ACKNOWLEDGEMENTS:
+ Added credits to a few people. Missing ones should bug the maintainer :)
+
+ * README: Copyright dates updated.
+
+ * unification.asd, unification.system: Cleaning up.
+ Committing in .
+
+ Removed Files:
+ unification.asd unification.system
+
+ * templates-hierarchy-saved.lisp: Clenaing up.
+ Committing in .
+
+ Removed Files:
+ templates-hierarchy-saved.lisp
+
+ * INSTALLATION: Instructions updated.
+
+ * COPYING: Copyright dates updated.
+
+ * test/unification-tests.lisp: Added file.
+
+ * substitutions.lisp, templates-hierarchy.lisp, unification-package.lisp, variables.lisp:
+ Some modification added. Exported symbols and reverted
+ reader macro #T to construct template instances at read time.
+ Added MAKE-LOAD-FORM method for templates which should fix problem with
+ SBCL.
+
+ Committing in .
+
+ Modified Files:
+ substitutions.lisp templates-hierarchy.lisp
+ unification-package.lisp variables.lisp
+
+ * cl-unification.system:
+ Added explicit :source-extension to accomodate Allegro CL.
+
Wed Apr 15 10:24:28 UTC 2009 mantoniotti
* Modified Files:
Modified Files:
test/unification-tests.lisp
Added Files:
lib-dependent/cl-ppcre-template.lisp
The cl-ppcre-template reuses E. Weitz's wonderful CL-PPCRE library
to provide a seamless (YMMV) reuse of regular expressions within
CL-UNIFICATION.
hunk ./lib-dependent/cl-ppcre-template.lisp 8
+(require "CL-PPCRE")
+
hunk ./lib-dependent/cl-ppcre-template.lisp 125
+ (multiple-value-bind (m-start m-end r-starts r-ends)
+ (cl-ppcre:scan (scanner re-t) s :start start :end end)
+ ;; Maybe SCAN-TO-STRINGS would be simpler to use...
hunk ./lib-dependent/cl-ppcre-template.lisp 129
- (multiple-value-bind (matched-p strings)
- (cl-ppcre:scan-to-strings (scanner re-t) s :start start :end end)
- (unless matched-p
+ (declare (type (integer 0 #.most-positive-fixnum) m-start m-end)
+ (type (vector (integer 0 #.most-positive-fixnum)) r-starts r-ends))
+ (unless (and (= start m-start) (= m-end end))
hunk ./lib-dependent/cl-ppcre-template.lisp 140
- (loop for r-string of-type string across strings
+ (loop for r-start across r-starts
+ for r-end across r-ends
+ for r-string of-type string = (subseq s r-start r-end)
hunk ./test/unification-tests.lisp 6
+(in-package "UNIFY.TESTS")
+
hunk ./test/unification-tests.lisp 113
+(defstruct s-root a)
+(defstruct (s-child (:include s-root)) b)
+
hunk ./test/unification-tests.lisp 122
- (test '(#\f T) (ignore-errors (v? '?x (unify "asdfasdfasdf" #T(elt 3 ?x))))
- :multiple-values t
- :known-failure t
- :fail-info "ELT templates must be fixed.")
+ (test '(#\Space T) (ignore-errors (v? '?x (unify "This is a string!" #T(elt 4 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (ignore-errors (v? '?x (unify '(0 1 42 3 4 5) #T(nth 2 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (ignore-errors (v? '?x (unify '(0 1 42 3 4 5) #T(elt 2 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (ignore-errors (v? '?x (unify #(0 1 42 3 4 5) #T(aref 2 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (ignore-errors (v? '?x (unify #(0 1 42 3 4 5) #T(elt 2 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (v? '?x (unify #2a((0 1 42 3 4 5)) #T(aref (0 2) ?x)))
+ :multiple-values t)
+
+ (test '(42 T) (v? '?x (unify #T(aref (0 2) 42) #2a((0 1 ?x 3 4 5))))
+ :multiple-values t)
+
+ (test '(42 T) (v? '?x (unify #2a((0 1 ?x 3 4 5)) #T(aref (0 2) 42)))
+ :multiple-values t)
+
+ (test-error (unify #(0 1 42 3 4 5) #T(nth 2 ?x))
+ :condition-type 'unification-failure
+ :announce t)
hunk ./test/unification-tests.lisp 150
- (test '(42 T) (ignore-errors (v? 'x (unify '(0 1 42 3 4 5) #T(nth 2 ?x))))
- :multiple-values t
- :known-failure t
- :fail-info "NTH templates must be fixed.")
+ (test '(foo (1) (2) (3)) (let ((result-env (unify '(0 1 #T(list foo _ &rest ?z) 42)
+ '(0 1 (?y bar (1) (2) (3)) 42)))
+ )
+ (cons (v? '?y result-env)
+ (v? '?z result-env)))
+ :test #'equal)
hunk ./test/unification-tests.lisp 158
- (make-instance 'test1 :a '(1 2 3) :b "woot")))
+ (make-instance 'test1 :a '(1 2 3) :b "woot")))
+ :multiple-values t)
+
+ (test-error (unify #T(s-root s-root-a '(1 ?x 3 4))
+ (make-s-root :a '(1 2 3 4)))
+ :condition-type 'unification-failure
+ :announce t
+ ;; #T reader non evaluating sub forms.
+ )
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a #T(list 1 ?x 3 4))
+ (make-s-root :a '(1 2 3 4))))
+ :multiple-values t)
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a (1 ?x 3 4))
+ (make-s-root :a '(1 2 3 4))))
+ :multiple-values t)
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a #T(list 1 ?x 3 &rest))
+ (make-s-root :a '(1 2 3 4))))
+ :multiple-values t)
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a #(1 ?x 3 4))
+ (make-s-root :a #(1 2 3 4))))
+ :multiple-values t)
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a #T(vector 1 ?x 3 &rest))
+ (make-s-root :a #(1 2 3 4))))
hunk ./test/unification-tests.lisp 199
- (otherwise "error-outer")))
+ (otherwise (error "error-outer"))))
hunk ./test/unification-tests.lisp 202
- (test "error-outer" (nested-match-cases '(:a 42 :b 33)) :test 'string=)
+ (test-error (nested-match-cases '(:a 42 :b 33)) :announce t)
+
+ (test-error (nested-match-cases '(:a 42 :b (33 42))) :announce t)
hunk ./test/unification-tests.lisp 206
+ (test '(42 43 44) (nested-match-cases '(:a 42 :b ((:d 42) (:c 43) (:c 44))))
+ :test #'equal)
Wed Apr 15 10:18:59 UTC 2009 mantoniotti
* Added LAMBDA-TEMPLATE.
hunk ./templates-hierarchy.lisp 1
-;;; -*- Mode: Lisp -*-
+;;;; -*- Mode: Lisp -*-
+
+;;;; templates-hierarchy.lisp --
hunk ./templates-hierarchy.lisp 126
+
+(defclass lambda-template (list-template expression-template) ())
+
+(defgeneric lambda-template-p (x)
+ (:method ((x lambda-template)) t)
+ (:method ((x t)) nil))
+
+
+
hunk ./templates-hierarchy.lisp 346
+(defmethod make-template ((kind (eql 'lambda)) (spec cons))
+ (make-instance 'lambda-template :spec spec))
+
Wed Apr 15 10:17:48 UTC 2009 mantoniotti
* Added some functionality to extract all variables and/or all values
Added some functionality to extract all variables and/or all values
from an environment or a frame.
hunk ./substitutions.lisp 42
+(defun bindings-values (bindings) (mapcar #'cdr bindings))
+
+(defun bindings-keys (bindings) (mapcar #'car bindings))
+
+
hunk ./substitutions.lisp 59
-(defstruct frame
+(defstruct (frame (:constructor make-frame (&optional bindings)))
hunk ./substitutions.lisp 80
+(defun frame-variables (frame)
+ (mapcar 'binding-variable (frame-bindings frame)))
+
+
+(defun frame-values (frame)
+ (mapcar 'binding-value (frame-bindings frame)))
+
hunk ./substitutions.lisp 121
-(defun empty-environment-p (env &aux (env-frames (environment-frames env)))
+(defun empty-environment-p (env)
hunk ./substitutions.lisp 123
- (and (= 1 (list-length env-frames))
- (empty-frame-p (first env-frames))))
+ (let ((env-frames (environment-frames env)))
+ (declare (type list env-frames))
+ (and (= 1 (list-length env-frames))
+ (empty-frame-p (first env-frames)))))
hunk ./substitutions.lisp 148
-(defun extend-environment (var pat env)
+(defun extend-environment (var pat &optional (env (make-empty-environment)))
hunk ./substitutions.lisp 155
+(defun fill-environment (vars pats &optional (env (make-empty-environment)))
+ (map nil (lambda (v p) (extend-environment v p env)) vars pats)
+ env)
+
+
+(defun fill-environment* (vars-pats &optional (env (make-empty-environment)))
+ (loop for (v . p) in vars-pats do (extend-environment v p env))
+ env)
+
+
+(declaim (inline v?))
+(declaim (ftype (function (symbol environment &optional boolean)
+ (values t boolean))
+ find-variable-value
+ v?))
+
hunk ./substitutions.lisp 176
- [_$_]
+
+
+(defun environment-variables (env)
+ (mapcan #'frame-variables (environment-frames env)))
+
+(defun environment-values (env)
+ (mapcan #'frame-values (environment-frames env)))
+
+
Wed Apr 15 10:16:24 UTC 2009 mantoniotti
* Added MATCHF (whose name may change) to simplify the
Added MATCHF (whose name may change) to simplify the
'destructuring-bind'-like syntax and behavior of the matching
facilities.
hunk ./match-block.lisp 16
+ (match-named nil)[_^M_][_$_]
hunk ./match-block.lisp 36
+[_^M_][_$_]
+If MATCH-NAMED is not NIL, then a surrounding BLOCK named MATCH-NAMED[_^M_][_$_]
+is set up around the matching code.[_^M_][_$_]
hunk ./match-block.lisp 52
- `(block nil[_^M_][_$_]
+ `(block ,match-named[_^M_][_$_]
+ (handler-case[_^M_][_$_]
+ (let* ((,env-var (unify ,template ,object ,substitution))[_^M_][_$_]
+ ,@(generate-var-bindings)[_^M_][_$_]
+ )[_^M_][_$_]
+ (declare (ignorable ,@(mapcar #'first[_^M_][_$_]
+ (generate-var-bindings))))[_^M_][_$_]
+ ,@forms)[_^M_][_$_]
+ [_^M_][_$_]
+ ;; Yes. The above is sligthly wasteful.[_^M_][_$_]
+[_^M_][_$_]
+ (unification-failure (uf)[_^M_][_$_]
+ (if ,errorp[_^M_][_$_]
+ (error uf)[_^M_][_$_]
+ ,error-value))[_^M_][_$_]
+ )))))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defmacro matchf ((template object[_^M_][_$_]
+ &key[_^M_][_$_]
+ (match-named nil)[_^M_][_$_]
+ (substitution '(make-empty-environment))[_^M_][_$_]
+ (errorp t)[_^M_][_$_]
+ (error-value nil))[_^M_][_$_]
+ &body forms)[_^M_][_$_]
+ "Sets up a lexical environment to evaluate FORMS after an unification.[_^M_][_$_]
+[_^M_][_$_]
+MATCHF unifies a TEMPLATE and an OBJECT and then sets up a lexical[_^M_][_$_]
+environment where the variables present in the template are bound[_^M_][_$_]
+lexically. Note that both variable names '?FOO' and 'FOO' are bound[_^M_][_$_]
+for convenience.[_^M_][_$_]
+[_^M_][_$_]
+MATCHF does not 'evaluate' TEMPLATE (note that using the #T syntax will[_^M_][_$_]
+generate a template at read-time).[_^M_][_$_]
+[_^M_][_$_]
+The MATCHF form returns the values returned by the evaluation of the[_^M_][_$_]
+last of the FORMS.[_^M_][_$_]
+[_^M_][_$_]
+If ERRORP is non-NIL (the default) then the form raises a[_^M_][_$_]
+UNIFICATION-FAILURE, otherwise the result of evaluating ERROR-VALUE,[_^M_][_$_]
+whose default is NIL is returned. (Note that UNIFICATION-FAILUREs[_^M_][_$_]
+raising from the evaluation of FORMS will also be caught and handled[_^M_][_$_]
+according to ERRORP settings.)[_^M_][_$_]
+[_^M_][_$_]
+If MATCH-NAMED is not NIL, then a surrounding BLOCK named MATCH-NAMED[_^M_][_$_]
+is set up around the matching code.[_^M_][_$_]
+"[_^M_][_$_]
+ (let ((template-vars (collect-template-vars template))[_^M_][_$_]
+ (env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
+ (template (cond ((variablep template)[_^M_][_$_]
+ `',template) ; Logical variables are special-cased.[_^M_][_$_]
+ ((listp template) ; Same for lists.[_^M_][_$_]
+ (make-instance 'list-template[_^M_][_$_]
+ :spec (cons 'list template)))[_^M_][_$_]
+ ;`',template)[_^M_][_$_]
+ (t[_^M_][_$_]
+ template)))[_^M_][_$_]
+ )[_^M_][_$_]
+ ;; Logical variables and lists are special cased for convenience.[_^M_][_$_]
+ ;; Lists are especially inteded as abbreviation for destructuring.[_^M_][_$_]
+ (flet ((generate-var-bindings ()[_^M_][_$_]
+ (loop for v in template-vars[_^M_][_$_]
+ nconc (list `(,v (find-variable-value ',v[_^M_][_$_]
+ ,env-var))[_^M_][_$_]
+ `(,(clean-unify-var-name v) ,v))))[_^M_][_$_]
+ )[_^M_][_$_]
+ `(block ,match-named[_^M_][_$_]
hunk ./match-block.lisp 143
- (make-empty-environment)))[_^M_][_$_]
+ (make-empty-environment))[_^M_][_$_]
+ (matching-named nil))[_^M_][_$_]
hunk ./match-block.lisp 224
- `(block matching[_^M_][_$_]
+ `(block ,matching-named[_^M_][_$_]
hunk ./match-block.lisp 245
-;;; When the construction of the inner MATCH clauses could be done[_^M_][_$_]
+;;; The construction of the inner MATCH clauses could be done[_^M_][_$_]
hunk ./match-block.lisp 249
-(defmacro match-case ((object &key errorp default-substitution)[_^M_][_$_]
+(defmacro match-case ((object &key errorp default-substitution match-case-named)[_^M_][_$_]
hunk ./match-block.lisp 301
- ,(generate-matchers (cdr clauses))))))))[_^M_][_$_]
- `(let ((,object-var ,object))[_^M_][_$_]
- ,(generate-matchers non-otherwise-clauses)))))[_^M_][_$_]
+ ,(generate-matchers (cdr clauses))))))))[_^M_][_$_]
+ `(block ,match-case-named[_^M_][_$_]
+ (let ((,object-var ,object))[_^M_][_$_]
+ ,(generate-matchers non-otherwise-clauses))))))[_^M_][_$_]
Wed Apr 15 10:14:59 UTC 2009 mantoniotti
* Dates updated.
hunk ./COPYING 1
-Copyright (c) 2004-2008 Marco Antoniotti[_^M_][_$_]
+Copyright (c) 2004-2009 Marco Antoniotti[_^M_][_$_]
Wed Apr 15 10:14:24 UTC 2009 mantoniotti
* Major API change to 'unify'. It now accepts keywords. Old code
Major API change to 'unify'. It now accepts keywords. Old code
shouls not be affected, but new code is now more flexible. Look the
the STRING and (new) CHARACTER methods to see how this change is
affecting the code.
hunk ./unifier.lisp 8
-(defgeneric unify (a b &optional env)
+(defgeneric unify (a b &optional env &key &allow-other-keys)
hunk ./unifier.lisp 25
-(defmethod unify ((a symbol) (b list) &optional (env (make-empty-environment)))
+(defmethod unify ((a symbol) (b list)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 40
-(defmethod unify ((b list) (a symbol) &optional (env (make-empty-environment)))
+(defmethod unify ((b list) (a symbol)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 55
-(defmethod unify ((a list) (b list) &optional (env (make-empty-environment)))
+(defmethod unify ((a list) (b list)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 67
-(defmethod unify ((a number) (b number) &optional (env (make-empty-environment)))
+(defmethod unify ((a number) (b number)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 83
-(defparameter *unify-string-case-insensitive-p* nil)
+(defparameter *unify-string-case-sensitive-p* t)
hunk ./unifier.lisp 85
-(defmethod unify ((a string) (b string) &optional (env (make-empty-environment)))
+(defmethod unify ((a character) (b character)
+ &optional (env (make-empty-environment))
+ &key
+ (case-sensitive *unify-string-case-sensitive-p*)
+ &allow-other-keys)
+ "Unifies two strings A and B.
+Two CHARACTERs A and B unify if and only if they satisfy either #'CHAR= or
+#'CHAR-EQUAL. The choice of which of test to perform (#'CHAR= or #'CHAR-EQUAL)
+is made according to the value of the variable
+*UNIFY-STRING-CASE-INSENSITIVE-P*, which defaults to NIL.
+If A and B unify then an unmodified environment ENV is returned,
+otherwise an error of type UNIFICATION-FAILURE is signaled."
+ (cond ((and case-sensitive (char= a b))
+ env)
+ ((char-equal a b)
+ env)
+ (t
+ (error 'unification-failure
+ :format-control "Connot unify two different characters: ~S ~S."
+ :format-arguments (list a b)))))
+
+
+(defmethod unify ((a string) (b string)
+ &optional (env (make-empty-environment))
+ &key
+ (case-sensitive *unify-string-case-sensitive-p*)
+ &allow-other-keys)
hunk ./unifier.lisp 119
- (cond ((and *unify-string-case-insensitive-p* (string-equal a b))
+ (cond ((and case-sensitive (string= a b))
hunk ./unifier.lisp 121
- ((string= a b)
+ ((string-equal a b)
hunk ./unifier.lisp 129
-(defmethod unify ((a symbol) (b string) &optional (env (make-empty-environment)))
+(defmethod unify ((a symbol) (b string)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 139
-(defmethod unify ((b string) (a symbol) &optional (env (make-empty-environment)))
+(defmethod unify ((b string) (a symbol)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 149
-(defmethod unify ((a symbol) (b symbol) &optional (env (make-empty-environment)))
+(defmethod unify ((a symbol) (b symbol)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 162
-(defmethod unify ((a symbol) (b t) &optional (env (make-empty-environment)))
+(defmethod unify ((a symbol) (b t)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 170
-(defmethod unify ((b t) (a symbol) &optional (env (make-empty-environment)))
+(defmethod unify ((b t) (a symbol)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 178
-(defmethod unify ((a symbol) (b array) &optional (env (make-empty-environment)))
+(defmethod unify ((a symbol) (b array)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 184
- :format-control "Cannot unify a symbol with an array or vector: ~S and ~S."
+ :format-control "Cannot unify a symbol with ~
+ an array or vector: ~S and ~S."
hunk ./unifier.lisp 189
-(defmethod unify ((b array) (a symbol) &optional (env (make-empty-environment)))
+(defmethod unify ((b array) (a symbol)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 199
-(defmethod unify ((as vector) (bs vector) &optional (env (make-empty-environment)))
+(defmethod unify ((as vector) (bs vector)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 212
-(defmethod unify ((s1 sequence) (s2 sequence) &optional (env (make-empty-environment)))
+(defmethod unify ((s1 sequence) (s2 sequence)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 242
-(defmethod unify ((as array) (bs array) &optional (env (make-empty-environment)))
+(defmethod unify ((as array) (bs array)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 258
-(defmethod unify ((a t) (b t) &optional (env (make-empty-environment)))
+(defmethod unify ((a t) (b t)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 289
-(defmethod unify ((x template) (y template) &optional (env (make-empty-environment)))
+(defmethod unify ((x template) (y template)
+ &optional (env)
+ &key &allow-other-keys)
hunk ./unifier.lisp 294
- :format-control "Unification of two templates of type ~A and ~A has not been yet implemented."
+ :format-control "Unification of two templates of type ~A and ~A ~
+ has not been yet implemented."
hunk ./unifier.lisp 304
- &optional (env (make-empty-environment)))
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 310
- &optional (env (make-empty-environment)))
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 316
- &optional (env (make-empty-environment)))
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 322
- &optional (env (make-empty-environment)))
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 330
-(defmethod unify ((a symbol) (b symbol-template) &optional (env (make-empty-environment)))
+(defmethod unify ((a symbol) (b symbol-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 338
-(defmethod unify ((b symbol-template) (a symbol) &optional (env (make-empty-environment)))
+(defmethod unify ((b symbol-template) (a symbol)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 344
-(defmethod unify ((a symbol) (b template) &optional (env (make-empty-environment)))
+(defmethod unify ((a symbol) (b template)
+ &optional (env)
+ &key &allow-other-keys)
hunk ./unifier.lisp 352
-(defmethod unify ((b template) (a symbol) &optional (env (make-empty-environment)))
+
+(defmethod unify ((b template) (a symbol)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 363
-(defmethod unify ((a number) (b number-template) &optional (env (make-empty-environment)))
+(defmethod unify ((a number) (b number-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 369
-(defmethod unify ((b number-template) (a number) &optional (env (make-empty-environment)))
+(defmethod unify ((b number-template) (a number)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 374
-(defmethod unify ((a number) (b template) &optional (env (make-empty-environment)))
+(defmethod unify ((a number) (b template)
+ &optional (env)
+ &key &allow-other-keys)
hunk ./unifier.lisp 382
-(defmethod unify ((b template) (a number) &optional (env (make-empty-environment)))
+(defmethod unify ((b template) (a number)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 391
-(defmethod unify ((a sequence) (b template) &optional (env (make-empty-environment)))
+(defmethod unify ((a sequence) (b template)
+ &optional (env)
+ &key &allow-other-keys)
hunk ./unifier.lisp 396
- :format-control "Cannot unify a sequence with a non sequence or non sequence access template: ~S ~S."
+ :format-control "Cannot unify a sequence with a non sequence ~
+ or non sequence access template: ~S and ~S."
hunk ./unifier.lisp 401
-(defmethod unify ((b template) (a sequence) &optional (env (make-empty-environment)))
+(defmethod unify ((b template) (a sequence)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 407
+#| Needs to be fixed.
+(defmethod unify ((a list) (b lambda-template) &optional (env (make-empty-environment)))
+ (unify a (template-spec b) env))
+
+
+(defmethod unify ((b lambda-template) (a list) &optional (env (make-empty-environment)))
+ (unify (template-spec b) a env))
+|#
+
+
hunk ./unifier.lisp 419
-(defmethod unify ((a list) (b template) &optional (env (make-empty-environment)))
+(defmethod unify ((a list) (b template)
+ &optional (env)
+ &key &allow-other-keys)
hunk ./unifier.lisp 428
-(defmethod unify ((a list) (b sequence-template) &optional (env (make-empty-environment)))
+(defmethod unify ((a list) (b sequence-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 458
-(defmethod unify ((b template) (a list) &optional (env (make-empty-environment)))
+(defmethod unify ((b template) (a list)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 468
-(defmethod unify ((a vector) (b template) &optional (env (make-empty-environment)))
+(defmethod unify ((a vector) (b template)
+ &optional (env)
+ &key &allow-other-keys)
hunk ./unifier.lisp 477
-(defmethod unify ((a vector) (b vector-template) &optional (env (make-empty-environment)))
+(defmethod unify ((a vector) (b vector-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 510
-(defmethod unify ((b template) (a vector) &optional (env (make-empty-environment)))
+(defmethod unify ((b template) (a vector)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 519
-(defmethod unify ((a array) (b template) &optional (env (make-empty-environment)))
+(defmethod unify ((a array) (b template)
+ &optional (env)
+ &key &allow-other-keys)
hunk ./unifier.lisp 524
- :format-control "Cannot unify an array with a non array or non array access template: ~S ~S."
+ :format-control "Cannot unify an array with a non array ~
+ or non array access template: ~S and ~S."
hunk ./unifier.lisp 528
-(defmethod unify ((b template) (a array) &optional (env (make-empty-environment)))
+(defmethod unify ((b template) (a array)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 541
- (apply #'array-row-major-index array (append indexes (list 0))))))
+ (apply #'array-row-major-index
+ array
+ (append indexes (list 0))))))
hunk ./unifier.lisp 563
-(defmethod unify ((a array) (b array-template) &optional (env (make-empty-environment)))
+(defmethod unify ((a array) (b array-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 589
-(defmethod unify ((a standard-object) (b template) &optional (env (make-empty-environment)))
+(defmethod unify ((a standard-object) (b template)
+ &optional (env)
+ &key &allow-other-keys)
hunk ./unifier.lisp 594
- :format-control "Cannot unify a standard object with a non standard object template: ~S ~S."
+ :format-control "Cannot unify a standard object with a ~
+ non standard object template: ~S and ~S."
hunk ./unifier.lisp 624
- &optional (env (make-empty-environment)))
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 648
-(defmethod unify ((b template) (a standard-object) &optional (env (make-empty-environment)))
+(defmethod unify ((b template) (a standard-object)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 657
-(defmethod unify ((a structure-object) (b template) &optional (env (make-empty-environment)))
+(defmethod unify ((a structure-object) (b template)
+ &optional (env)
+ &key &allow-other-keys)
hunk ./unifier.lisp 662
- :format-control "Cannot unify a structure object with a non structure object template: ~S ~S."
+ :format-control "Cannot unify a structure object with ~
+ a non structure object template: ~S and ~S."
hunk ./unifier.lisp 668
- &optional (env (make-empty-environment)))
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 674
- :format-control "Cannot unify an instance of ~S with a template for structure ~S."
+ :format-control "Cannot unify an instance of ~S with a ~
+ template for structure ~S."
hunk ./unifier.lisp 685
-(defmethod unify ((b template) (a structure-object) &optional (env (make-empty-environment)))
+(defmethod unify ((b template) (a structure-object)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 694
-(defmethod unify ((a sequence) (b subseq-template) &optional (env (make-empty-environment)))
+;;; SEQUENCE
+;;; For non LIST and non VECTOR possible SEQUENCE types.
+
+(defmethod unify ((a sequence) (b subseq-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 702
+ (declare (ignore subseq-kwd))
hunk ./unifier.lisp 704
- (seq-template-kind (if (symbolp seq-type) seq-type (first seq-type))) ; Stupid FTTB.
+ (seq-template-kind (if (symbolp seq-type)
+ seq-type
+ (first seq-type))) ; Stupid FTTB.
hunk ./unifier.lisp 708
+ (unify (subseq a from to)
+ (make-template seq-template-kind `(,seq-template-kind ,@spec))
+ env))))
+
+
+;;; LIST
+
+(defmethod unify ((a list) (b subseq-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (destructuring-bind (subseq-kwd from to &rest spec)
+ (template-spec b)
+ (declare (ignore subseq-kwd))
hunk ./unifier.lisp 722
- (make-template seq-template-kind `(,seq-template-kind ,@spec))
- env))))
+ (make-template 'list `(list ,@spec))
+ env)))
+
+
+;;; VECTOR
+
+(defmethod unify ((a vector) (b subseq-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (destructuring-bind (subseq-kwd from to &rest spec)
+ (template-spec b)
+ (declare (ignore subseq-kwd))
+ (let ((seq-type (type-of a)))
+ (unify (subseq a from to)
+ (make-template seq-type `(,seq-type ,@spec))
+ env))))
hunk ./unifier.lisp 740
-(defmethod unify ((b subseq-template) (a sequence) &optional (env (make-empty-environment)))
+(defmethod unify ((b subseq-template) (a sequence)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 747
-;;; Expression template AREF methods.
+;;; Expression templates
hunk ./unifier.lisp 749
-(defmethod unify ((a array) (b aref-template) &optional (env (make-empty-environment)))
+;;; AREF methods.
+
+(defmethod unify ((a array) (b aref-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
hunk ./unifier.lisp 763
+;;; Necessary due to standard method sorting.
+
+(defmethod unify ((a vector) (b aref-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (destructuring-bind (aref-kwd indexes value-template)
+ (template-spec b)
+ (declare (ignore aref-kwd))
+ ;; Missing check on index spec.
+ (when (and (consp indexes) (> (length indexes) 1))
+ (error 'unification-failure
+ :format-control "Cannot unify a vector with an element ~
+ too many dimensions down~@
+ (AREF #(...)~{ ~S~})."
+ :format-arguments (list indexes)
+ ))
+ (unless (consp indexes)
+ (setf indexes (list indexes)))
+ (unify (apply #'aref a indexes) value-template env)))
+
+
+(defmethod unify ((b aref-template) (a array)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (unify a b env))
+
+
+;;; ELT methods.
+;;; LIST and VECTOR methods must be specified separatedly because of
+;;; the UNIFY (VECTOR TEMPLATE) methods above. It is a snag, but a
+;;; relatively small one. Besides, they are more efficient.
+;;; The (SEQUENCE ELT-TEMPLATE) ELT-TEMPLATE method is left for those
+;;; sequences which, according to the ANSI spec may exist and not be
+;;; either VECTOR or LIST.
+
+(defmethod unify ((a sequence) (b elt-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (destructuring-bind (elt-kwd index value-template)
+ (template-spec b)
+ (declare (ignore elt-kwd)
+ (type fixnum index))
+ ;; Missing index check.
+ (unify (elt a index) value-template env)))
+
+
+(defmethod unify ((a vector) (b elt-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (destructuring-bind (elt-kwd index value-template)
+ (template-spec b)
+ (declare (ignore elt-kwd)
+ (type fixnum index))
+ ;; Missing index check.
+ (unify (aref a index) value-template env)))
+
+
+(defmethod unify ((a list) (b elt-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (destructuring-bind (elt-kwd index value-template)
+ (template-spec b)
+ (declare (ignore elt-kwd)
+ (type fixnum index))
+ ;; Missing index check.
+ (unify (nth index a) value-template env)))
+
+
+(defmethod unify ((b elt-template) (a sequence)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (unify a b env))
+
+
+;;; NTH methods.
+
+(defmethod unify ((a list) (b nth-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (destructuring-bind (nth-kwd index value-template)
+ (template-spec b)
+ (declare (ignore nth-kwd))
+ ;; Missing index check.
+ (unify (nth index a) value-template env)))
+
+(defmethod unify ((b nth-template) (a list)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (unify a b env))
+
+
+;;;---------------------------------------------------------------------------
+;;; Utilities.
+
+(defun unify* (a b &optional (env (make-empty-environment)))
+ (ignore-errors (unify a b env)))
+
+
+(defun unify-equations (eqns &optional (env (make-empty-environment)))
+ (loop for (a b) in eqns
+ for result-env = (unify a b env) then (unify a b result-env)
+ finally (return result-env)))
+
+
+(defun unify-equations* (lhss rhss &optional (env (make-empty-environment)))
+ (loop for a in lhss
+ for b in rhss
+ for result-env = (unify a b env) then (unify a b result-env)
+ finally (return result-env)))
+
+
hunk ./unifier.lisp 959
+(defmethod occurs-in-p ((var symbol) (pat character) env)
+ (declare (ignore env))
+ nil)
+
+
hunk ./unifier.lisp 966
- (warn "Occurrence test unimplemented for pattern ~S of type ~S; returning false."
+ (warn "Occurrence test unimplemented for pattern ~S of type ~S in variable ~S;~@
+ returning false."
hunk ./unifier.lisp 969
- (type-of pat))
+ (type-of pat)
+ var)
Wed Apr 15 10:12:22 UTC 2009 mantoniotti
* Some 'diff' unfathomable change happened.
hunk ./variables.lisp 6
-(defun make-var-name (&optional (s (gensym)) (package *package*))
+(defun make-var-name (&optional (s (gensym "UNIFVAR-")) (package *package*))
Wed Apr 15 10:10:25 UTC 2009 mantoniotti
* Added exports of a few symbols.
hunk ./unification-package.lisp 6
+
hunk ./unification-package.lisp 35
+ "MATCHF"
hunk ./unification-package.lisp 37
- "MATCH-CASE"))
+ "MATCH-CASE")
+
+ (:export
+ "UNIFY*"
+ "UNIFY-EQUATIONS"
+ "UNIFY-EQUATIONS*")
+ )
Wed Apr 15 10:06:40 UTC 2009 mantoniotti
* Fixed a few snags and added "lib-dependent" module.
hunk ./cl-unification.asd 16
- (:file "apply-substitution")))
+ (:file "apply-substitution")
+ (:module "lib-dependent"
+ :depends-on ("templates-hierarchy" "unifier")
+ :components (
+ #+cl-ppcre
+ (:file "cl-ppcre-template")
+ ))))
hunk ./cl-unification.system 15
- "apply-substitution"))
+ "apply-substitution"
+ (:module "lib-dependent"
+ :depends-on ("templates-hierarchy" "unifier")
+ :components (
+ #+cl-ppcre
+ (:file "cl-ppcre-template")
+ ))
+ ))
Wed Apr 15 10:05:58 UTC 2009 mantoniotti
* Added some functionality and comments.
hunk ./apply-substitution.lisp 12
-(defgeneric apply-substitution (substitution item))
+;;; apply-substitution --
+;;;
+;;; EXCLUDE-VARS are variables that will just pass through (a list for
+;;; the time being).
hunk ./apply-substitution.lisp 17
+(defgeneric apply-substitution (substitution item &optional exclude-vars))
hunk ./apply-substitution.lisp 19
-(defmethod apply-substitution ((substitution environment) (s symbol))
+
+(defmethod apply-substitution ((substitution environment) (s symbol)
+ &optional (exclude-vars ()))
+ (declare (type list exclude-vars))
hunk ./apply-substitution.lisp 25
- (multiple-value-bind (val foundp)
- (find-variable-value s substitution)
- (cond (foundp val)
- (t (warn "~S is a free variable in the current environment."
- s)
- s))))
+ (if (member s exclude-vars :test #'eq)
+ s
+ (multiple-value-bind (val foundp)
+ (find-variable-value s substitution)
+ (cond (foundp val)
+ (t (warn "~S is a free variable in the current environment."
+ s)
+ s))))
+ )
hunk ./apply-substitution.lisp 37
-(defmethod apply-substitution ((substitution environment) (l cons))
- (cons (apply-substitution substitution (first l))
- (apply-substitution substitution (rest l))))
+(defmethod apply-substitution ((substitution environment) (l cons)
+ &optional (exclude-vars ()))
+ (declare (type list exclude-vars))
+ (cons (apply-substitution substitution (first l) exclude-vars)
+ (apply-substitution substitution (rest l) exclude-vars)))
+
hunk ./apply-substitution.lisp 44
-(defmethod apply-substitution ((substitution environment) (l null))
+(defmethod apply-substitution ((substitution environment) (l null)
+ &optional exclude-vars)
+ (declare (ignore exclude-vars))
hunk ./apply-substitution.lisp 49
+
+;;; compose-substitions --
+;;; The definition is a direct translation of TPL's definition at page 318.
+;;; Usually these are done by directly composing and currying
+;;; functions in ML/Haskell derivatives, but that is just being "lazy".
+;;; The current definition may be too "eager", but the "correct"
+;;; semantics should be preserved.
+
+(defun compose-substitutions (env2 env1) ; note the order.
+ (declare (type environment env2 env1))
+
+ (loop for env1-frame in (environment-frames env1)
+ collect
+ (loop for (var . term) in (frame-bindings env1-frame)
+ collect (make-binding var (apply-substitution env2 term))
+ into result-bindings
+ finally (return (make-frame result-bindings)))
+ into frames
+ finally (return (make-environment :frames frames))))
+ [_$_]
+ [_$_]
+
+
+;;; ground-term --
+
Sun Jul 13 13:36:42 UTC 2008 mantoniotti
tagged rev-1_0-cleaned-up
Sun Jul 13 13:36:42 UTC 2008 mantoniotti
* Changelog updated.
hunk ./ChangeLog 1
-2007-11-09 author <author@papadopoulou-2.ydras.offices.aueb.gr>
+2008-07-13 author <author@Macintosh.local>
+
+ * ACKNOWLEDGEMENTS:
+ Added credits to a few people. Missing ones should bug the maintainer :)
+
+ * README: Copyright dates updated.
+
+ * unification.asd, unification.system: Cleaning up.
+ Committing in .
+
+ Removed Files:
+ unification.asd unification.system
+
+ * templates-hierarchy-saved.lisp: Cleaning up.
+ Committing in .
+
+ Removed Files:
+ templates-hierarchy-saved.lisp
+
+ * INSTALLATION: Instructions updated.
+
+ * COPYING: Copyright dates updated.
+
+ * test/unification-tests.lisp: Added file.
+
+ * substitutions.lisp, templates-hierarchy.lisp, unification-package.lisp, variables.lisp:
+ Some modification added. Exported symbols and reverted
+ reader macro #T to construct template instances at read time.
+ Added MAKE-LOAD-FORM method for templates which should fix problem with
+ SBCL.
+
+ Committing in .
+
+ Modified Files:
+ substitutions.lisp templates-hierarchy.lisp
+ unification-package.lisp variables.lisp
+
+ * cl-unification.system:
+ Added explicit :source-extension to accomodate Allegro CL.
+
+2008-07-10 author <author@Macintosh.local>
+
+ * apply-substitution.lisp:
+ Removed EXPORT of APPLY-SUBSTITUTION as it is already in the DEFPACKAGE.
+
+2007-11-09 author <author@Macintosh.local>
+
+ * docs/html/index.html: Changed the position of the disclaimer.
+
+ * ChangeLog: ChangeLog updated.
+
+ * match-block.lisp:
+ Made several changes to improve MATCH-CASE (following a note from Ivan
+ Boldyrev from a long time ago), MATCHING and MATCH.
+
+ Else-clauses are now handled correctly (AFAICT).
+
+ Single variable templates in MATCH, MATCH-CASE and MATCHING clauses do
+ not need to be quoted.
+
+ MATCHING was generating one gensym'ed variable per clause without
+ creating an appropriate enclosing LET. This is now fixed.
+
+ * substitutions.lisp:
+ Changed the top comment and added a (:copier nil) option to the
+ ENVIRONMENT defstruct, as COPY-ENVIRONMENT is defined later in the
+ file.
+
+ * cl-unification.system, cl-unification.asd:
+ Added the new system building files with more meaningful names
+ w.r.t. the name of the library.
+
+ * unification.asd, unification.system:
+ Marked the two system building files as 'obsolete', before removing
+ them from the repository. The new files are prefixed by 'cl-'.
+
+2007-11-09 author <author@papadopoulou-2.ydras.offices.>
hunk ./ChangeLog 104
-2007-05-21 author <author@papadopoulou-2.ydras.offices.aueb.gr>
+2007-05-21 author <author@papadopoulou-2.ydras.offices.>
Sun Jul 13 13:33:48 UTC 2008 mantoniotti
* Added credits to a few people. Missing ones should bug the maintainer :)
hunk ./ACKNOWLEDGEMENTS 1
-Many thanks to a lot of people are due.
+A lot of pleple deserved thanks for improving CL-UNIFICATION.
hunk ./ACKNOWLEDGEMENTS 9
+Boldyrev, Ivan
hunk ./ACKNOWLEDGEMENTS 12
+McManus, Russell
hunk ./ACKNOWLEDGEMENTS 15
-
-
Sun Jul 13 13:30:28 UTC 2008 mantoniotti
* Copyright dates updated.
hunk ./README 3
-Marco Antoniotti (c) 2004-2007
+Marco Antoniotti (c) 2004-2008
Sun Jul 13 13:28:48 UTC 2008 mantoniotti
* Cleaning up.
Cleaning up.
Committing in .
Removed Files:
unification.asd unification.system
hunk ./unification.asd 1
-;;; -*- Mode: Lisp -*-
-
-;;; unification.asd --
-;;; ASDF system file.
-;;;
-;;; Note:
-;;; [20071109 MA]
-;;; This file is OBSOLETE. Use 'cl-unification.asd' instead.
-
-(asdf:defsystem cl-unification
- :author "Marco Antoniotti"
- :serial t
- :components ((:file "unification-package")
- (:file "variables")
- (:file "substitutions")
- (:file "lambda-list-parsing")
- (:file "templates-hierarchy")
- (:file "unifier")
- (:file "match-block")
- (:file "apply-substitution")))
-
-;;; end of file -- unification.asd --
rmfile ./unification.asd
hunk ./unification.system 1
-;;; -*- Mode: Lisp -*-
-
-;;; unification.system --
-;;; MK:DEFSYSTEM system file.
-;;;
-;;; Note:
-;;; [20071109 MA]
-;;; This file is OBSOLETE. Use 'cl-unification.system' instead.
-
-(mk:defsystem "UNIFICATION"
- :components ("unification-package"
- "variables"
- "substitutions"
- "lambda-list-parsing"
- "templates-hierarchy"
- "unifier"
- "match-block"
- "apply-substitution"))
- [_$_]
-;;; end of file -- unification.system --
rmfile ./unification.system
Sun Jul 13 13:26:38 UTC 2008 mantoniotti
* Clenaing up.
Clenaing up.
Committing in .
Removed Files:
templates-hierarchy-saved.lisp
hunk ./templates-hierarchy-saved.lisp 1
-;;; -*- Mode: Lisp -*-
-
-(in-package "CL.EXT.DACF.UNIFICATION") ; DACF = Data And Control Flow.
-
-;;; Templates.
-;;; Essentially we extend the type specifier language.
-;;; The interesting thing is that we need to specify how a "match"
-;;; between a template and a CL object is performed.
-
-;;; A template is one of the following
-;;;
-;;; <template> ::= <logical variable>
-;;; | <structure template>
-;;; | <instance template>
-;;; | <destructuring template>
-;;; | <vector template>
-;;; | <sequence template>
-;;; | <array template>
-;;; | <type template>
-;;; | <lisp object>
-;;;
-
-;;; Destructuring Template Lambda List (as per standard CL terminology)
-;;;
-;;; <destructuring template lambda list> ::= <a "destructuring LL" with <template> in lieu of <var>>
-
-;;; Templates for Structures and Instances
-;;;
-;;; <structure template> ::= (<class designator> <structure-slot-spec>*)
-;;;
-;;; <instance template> ::= (<class designator> <slot-spec>*)
-;;;
-;;; where
-;;;
-;;; <structure-slot-spec> ::= (<reader-name> <template>)
-;;; <instance-slot-spec> ::= (slot-access <accessor-name> <template>)
-;;; | (slot-value <slot-name> <template>)
-
-;;; Template for Sequences
-;;;
-;;; <sequence template> ::= (<container type> . <destructuring template lambda list>)
-;;; | (subseq <from> <to> . <destructuring template lambda list>)
-;;; <container type> ::= list | cons | vector | array
-
-;;; Templates for Vectors and Arrays.
-;;;
-;;; <vector template> ::= (vector . <destructuring template lambda list>)
-;;;
-;;; <array template> ::= (array <shape template>)
-;;; | (aref <index template> <template>)
-;;; <shape template> ::= (<destructuring template lambda list>)
-;;; | <sequence template>
-;;; | (<shape template>)
-
-;;; Templates for LIST and CONS
-;;; <list template> ::= (list <destructuring template lambda list>)
-;;; <cons template> ::= (cons <template> <template>)
-
-;;; A regular list or cons acts as a list or cons template.
-
-(define-condition unification-template-error (simple-error)
- ())
-
-;;; Templates are introduced by the reader macro #T(...)
-
-(defclass template ()
- ((spec :accessor template-spec :type (or symbol cons) :initarg :spec))
- (:default-initargs :spec nil))
-
-(defgeneric template-p (x)
- (:method ((x template)) t)
- (:method ((x t)) nil))
-
-
-(defclass type-template (template) ())
-
-(defgeneric type-template-p (x)
- (:method ((x type-template)) t)
- (:method ((x t)) nil))
-
-
-(defgeneric type-template-type-spec (x)
- (:method ((x type-template))
- (let ((spec (template-spec x)))
- (if spec
- (first spec)
- 'null))))
-
-
-
-(defclass nil-template (type-template) ()) ; This is the point where we break the type hierarchy.
-
-(defgeneric nil-template-p (x)
- (:method ((x nil-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass expression-template (template) ())
-
-(defgeneric expression-template-p (x)
- (:method ((x expression-template)) t)
- (:method ((x t)) nil))
-
-
-(defmethod print-object ((template template) (stream stream))
- (format stream "#T~S" (template-spec template)))
-
-
-(defclass sequence-template (type-template) ())
-
-(defgeneric sequence-template-p (x)
- (:method ((x sequence-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass list-template (sequence-template) ())
-
-(defgeneric list-template-p (x)
- (:method ((x list-template)) t)
- (:method ((x t)) nil))
-
-(defclass array-template (type-template) ())
-
-(defgeneric array-template-p (x)
- (:method ((x array-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass vector-template (sequence-template array-template) ())
-
-(defgeneric vector-template-p (x)
- (:method ((x vector-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass string-template (vector-template) ())
-
-(defgeneric string-template-p (x)
- (:method ((x string-template)) t)
- (:method ((x t)) nil))
-
-
-
-
-(defclass symbol-template (type-template) ())
-
-(defgeneric symbol-template-p (x)
- (:method ((x symbol-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass number-template (type-template) ())
-
-(defgeneric number-template-p (x)
- (:method ((x number-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass structure-object-template (type-template) ())
-
-(defgeneric structure-object-template-p (x)
- (:method ((x structure-object-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass standard-object-template (type-template) ())
-
-(defgeneric standard-object-template-p (x)
- (:method ((x standard-object-template)) t)
- (:method ((x t)) nil))
-
-
-;;; Expression Templates.
-
-(defclass subseq-template (expression-template) ())
-
-(defgeneric subseq-template-p (x)
- (:method ((x subseq-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass elt-template (expression-template) ())
-
-(defgeneric elt-template-p (x)
- (:method ((x elt-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass aref-template (elt-template) ())
-
-(defgeneric aref-template-p (x)
- (:method ((x aref-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass nth-template (elt-template) ())
-
-(defgeneric nth-template-p (x)
- (:method ((x nth-template)) t)
- (:method ((x t)) nil))
-
-
-(defclass nthcdr-template (elt-template) ())
-
-(defgeneric nthcdr-template-p (x)
- (:method ((x nthcdr-template)) t)
- (:method ((x t)) nil))
-
-
-(defgeneric make-template (kind spec))
-
-;;; Setting up the reader macro.
-
-(defun |#T-reader| (stream subchar arg)
- (declare (ignore subchar arg))
- (let ((spec (read stream t nil t)))
- (typecase spec
- (null (make-template nil spec))
- (cons (make-template (first spec) spec))
- (t (make-template spec spec)))))
-
-
-(eval-when (:load-toplevel :execute)
- (set-dispatch-macro-character #\# #\T #'|#T-reader|))
-
-(defmethod make-template ((kind null) (spec symbol))
- (assert (null spec) (spec) "MAKE-TEMPLATE called erroneously with ~S and ~S." kind spec)
- (make-instance 'nil-template :spec spec))
-
-(defmethod make-template ((kind symbol) (spec symbol))
- (make-instance 'symbol-template :spec spec))
-
-(defmethod make-template ((kind (eql 'symbol)) (spec cons))
- (make-instance 'symbol-template :spec spec))
-
-(defmethod make-template ((kind symbol) (spec cons))
- (cond ((subtypep kind 'number)
- (make-instance 'number-template :spec spec))
- ((subtypep kind 'structure-object)
- (make-instance 'structure-object-template :spec spec))
- ((subtypep kind 'standard-object)
- (make-instance 'standard-object-template :spec spec))
- (t
- (error 'unification-template-error
- :format-control "Unknown template specifier ~S."
- :format-arguments (list kind)))
- ))
-
-(defmethod make-template ((kind cons) (spec cons))
- (cond ((subtypep kind 'number)
- (make-instance 'number-template :spec spec))
- ((subtypep kind 'string)
- (make-instance 'string-template :spec spec))
- ((subtypep kind 'vector)
- (make-instance 'vector-template :spec spec))
- ((subtypep kind 'array)
- (make-instance 'array-template :spec spec))
- (t
- (error 'unification-template-error
- :format-control "Unknown template specifier ~S."
- :format-arguments (list kind)))
- ))
-
-(defmethod make-template ((kind (eql 'sequence)) (spec cons))
- (make-instance 'sequence-template :spec spec))
-
-(defmethod make-template ((kind (eql 'list)) (spec cons))
- (make-instance 'list-template :spec spec))
-
-(defmethod make-template ((kind (eql 'vector)) (spec cons))
- (make-instance 'vector-template :spec spec))
-
-(defmethod make-template ((kind (eql 'string)) (spec cons))
- (make-instance 'stringvector-template :spec spec))
-
-(defmethod make-template ((kind (eql 'array)) (spec cons))
- (make-instance 'array-template :spec spec))
-
-
-(defmethod make-template ((kind (eql 'subseq)) (spec cons))
- (make-instance 'subseq-template :spec spec))
-
-(defmethod make-template ((kind (eql 'elt)) (spec cons))
- (make-instance 'elt-template :spec spec))
-
-(defmethod make-template ((kind (eql 'aref)) (spec cons))
- (make-instance 'aref-template :spec spec))
-
-(defmethod make-template ((kind (eql 'nth)) (spec cons))
- (make-instance 'nth-template :spec spec))
-
-(defmethod make-template ((kind (eql 'nthcdr)) (spec cons))
- (make-instance 'nthcdr-template :spec spec))
-
-
-
-
-;;; Implementation.
-
-;;; Symbol Templates.
-;;; Specification is
-;;;
-;;; (symbol <symbol>)
-
-(defun symbol-template-symbol (x)
- (declare (type symbol-template x))
- (assert (symbol-template-p x) (x) "Non symbol template ~S." x)
- (let ((spec (template-spec x)))
- (cond ((symbolp spec) spec)
- ((consp spec) (second spec)))))
-
-
-;;; Number template
-;;; Specification is
-;;;
-;;; (<number type> <number>)
-;;; or
-;;;
-;;; <number>
-
-(defun number-template-number (x)
- (declare (type number-template x))
- (assert (number-template-p x) (x) "Non number template ~S." x)
- (let ((spec (template-spec x)))
- (etypecase spec
- (symbol spec)
- (number spec)
- (consp (second spec)))))
-
-
-;;; Sequence Templates.
-;;; Specification is
-;;;
-;;; (<sequence subtype> . <destructuring template lambda list>)
-;;; or
-;;; (subseq <from> <to> . <destructuring template lambda list>)
-
-(defun sequence-template-lambda-list (x)
- (declare (type sequence-template x))
- (assert (sequence-template-p x) (x) "Non sequence template ~S." x)
- (rest (template-spec x)))
-
-
-;;; Array Templates.
-;;; Specification is
-;;;
-;;; (array (['*' | <element type>] [<dimension spec>]) <shape template>)
-;;; or
-;;; (<array type specifier> <shape template>)
-
-
-(defun array-template-shape-template (x)
- (declare (type array-template x))
- (assert (array-template-p x) (x) "Non array template ~S." x)
- (let ((spec (template-spec x)))
- (third spec)))
-
-
-(defun array-template-type-template (x)
- (declare (type array-template x))
- (assert (array-template-p x) (x) "Non array template ~S." x)
- (let ((spec (template-spec x)))
- (second spec)))
-
-
-(defun aref-template-indexes (x)
- (declare (type aref-template x))
- (assert (aref-template-p x) (x) "Non aref template ~S." x)
- (let ((spec (template-spec x)))
- (second spec)))
-
-
-(defun aref-template-element (x)
- (declare (type aref-template x))
- (assert (aref-template-p x) (x) "Non array template ~S." x)
- (let ((spec (template-spec x)))
- (third spec)))
-
-
-;;; Vector Templates.
-;;; Specification is
-;;;
-;;; (vector . <destructuring template lambda list>)
-
-;;; Structure and Standard Object Templates.
-
-(defun structure-object-template-slots (x)
- (and (structure-object-template-p x)
- (rest (template-spec x))))
-
-
-(defun standard-object-template-slots (x)
- (and (standard-object-template-p x)
- (rest (template-spec x))))
-
-
-;;;===========================================================================
-;;; Template variables.
-;;; Let's walk down a template.
-;;; Note that there is an asymmetry here: I admit some containers to have
-;;; variables inside, but I do not search instances of a class for variables.
-;;; This is an asymmetry that would be way too hard to fix without more
-;;; introspective power (which is available in the MOP, but not standard.)
-
-(defgeneric collect-template-vars (template))
-
-(defmethod collect-template-vars ((template template))
- (let ((spec (template-spec template)))
- (nconc (collect-template-vars (car spec))
- (collect-template-vars (cdr spec)))))
-
-(defmethod collect-template-vars ((template symbol-template))
- (let ((template (symbol-template-symbol template)))
- (when (and (variablep template) (not (variable-any-p template)))
- (list template))))
-
-
-(defmethod collect-template-vars ((template number-template))
- (let ((template (number-template-number template)))
- (etypecase template
- (number ())
- (symbol (cond ((variablep template) template)
- ((and (boundp template)
- (numberp (symbol-value template)))
- (symbol-value template))
- (t
- (error "Invalid number template ~S." template)))))))
-
-
-(defmethod collect-template-vars ((template symbol))
- (when (and (variablep template) (not (variable-any-p template)))
- (list template)))
-
-(defmethod collect-template-vars ((template null))
- ())
-
-(defmethod collect-template-vars ((template cons))
- (nconc (collect-template-vars (car template))
- (collect-template-vars (cdr template))))
-
-(defmethod collect-template-vars ((template string))
- ())
-
-
-(defmethod collect-template-vars ((template vector))
- (loop for e across template
- nconc (collect-template-vars e)))
-
-
-(defmethod collect-template-vars ((template array))
- (loop for i below (array-total-size template)
- nconc (collect-template-vars (row-major-aref template i))))
-
-
-(defmethod collect-template-vars ((template t))
- ())
-
-;;; end of file -- templates.lisp --
rmfile ./templates-hierarchy-saved.lisp
Sun Jul 13 13:20:01 UTC 2008 mantoniotti
* Instructions updated.
hunk ./INSTALLATION 8
- (mk:load-system "unification")
+ (mk:load-system "CL-UNIFICATION")
hunk ./INSTALLATION 12
- (mk:compile-system "unification")
+ (mk:compile-system "CL-UNIFICATION")
hunk ./INSTALLATION 18
+Issuing
+
+ (asdf:oos 'asdf:load-op "CL-UNIFICATION")
+
+should make the library available in your environment.
+
hunk ./INSTALLATION 27
- (asdf-install:install "unification")
+ (asdf-install:install "CL-UNIFICATION")
Sun Jul 13 13:17:29 UTC 2008 mantoniotti
* Copyright dates updated.
hunk ./COPYING 1
-Copyright (c) 2004-2007 Marco Antoniotti[_^M_][_$_]
+Copyright (c) 2004-2008 Marco Antoniotti[_^M_][_$_]
Sun Jul 13 13:14:56 UTC 2008 mantoniotti
* Added file.
hunk ./test/unification-tests.lisp 6
-(in-package "UNIFY.TESTS")
-
hunk ./test/unification-tests.lisp 111
-(defstruct s-root a)
-(defstruct (s-child (:include s-root)) b)
-
hunk ./test/unification-tests.lisp 117
- (test '(#\Space T) (ignore-errors (v? '?x (unify "This is a string!" #T(elt 4 ?x))))
- :multiple-values t)
-
- (test '(42 T) (ignore-errors (v? '?x (unify '(0 1 42 3 4 5) #T(nth 2 ?x))))
- :multiple-values t)
-
- (test '(42 T) (ignore-errors (v? '?x (unify '(0 1 42 3 4 5) #T(elt 2 ?x))))
- :multiple-values t)
-
- (test '(42 T) (ignore-errors (v? '?x (unify #(0 1 42 3 4 5) #T(aref 2 ?x))))
- :multiple-values t)
-
- (test '(42 T) (ignore-errors (v? '?x (unify #(0 1 42 3 4 5) #T(elt 2 ?x))))
- :multiple-values t)
-
- (test '(42 T) (v? '?x (unify #2a((0 1 42 3 4 5)) #T(aref (0 2) ?x)))
- :multiple-values t)
-
- (test '(42 T) (v? '?x (unify #T(aref (0 2) 42) #2a((0 1 ?x 3 4 5))))
- :multiple-values t)
-
- (test '(42 T) (v? '?x (unify #2a((0 1 ?x 3 4 5)) #T(aref (0 2) 42)))
- :multiple-values t)
-
- (test-error (unify #(0 1 42 3 4 5) #T(nth 2 ?x))
- :condition-type 'unification-failure
- :announce t)
+ (test '(#\f T) (ignore-errors (v? '?x (unify "asdfasdfasdf" #T(elt 3 ?x))))
+ :multiple-values t
+ :known-failure t
+ :fail-info "ELT templates must be fixed.")
hunk ./test/unification-tests.lisp 122
- (test '(foo (1) (2) (3)) (let ((result-env (unify '(0 1 #T(list foo _ &rest ?z) 42)
- '(0 1 (?y bar (1) (2) (3)) 42)))
- )
- (cons (v? '?y result-env)
- (v? '?z result-env)))
- :test #'equal)
+ (test '(42 T) (ignore-errors (v? 'x (unify '(0 1 42 3 4 5) #T(nth 2 ?x))))
+ :multiple-values t
+ :known-failure t
+ :fail-info "NTH templates must be fixed.")
hunk ./test/unification-tests.lisp 128
- (make-instance 'test1 :a '(1 2 3) :b "woot")))
- :multiple-values t)
-
- (test-error (unify #T(s-root s-root-a '(1 ?x 3 4))
- (make-s-root :a '(1 2 3 4)))
- :condition-type 'unification-failure
- :announce t
- ;; #T reader non evaluating sub forms.
- )
-
- (test '(2 T) (v? '?x (unify #T(s-root s-root-a #T(list 1 ?x 3 4))
- (make-s-root :a '(1 2 3 4))))
- :multiple-values t)
-
- (test '(2 T) (v? '?x (unify #T(s-root s-root-a (1 ?x 3 4))
- (make-s-root :a '(1 2 3 4))))
- :multiple-values t)
-
- (test '(2 T) (v? '?x (unify #T(s-root s-root-a #T(list 1 ?x 3 &rest))
- (make-s-root :a '(1 2 3 4))))
- :multiple-values t)
-
- (test '(2 T) (v? '?x (unify #T(s-root s-root-a #(1 ?x 3 4))
- (make-s-root :a #(1 2 3 4))))
- :multiple-values t)
-
- (test '(2 T) (v? '?x (unify #T(s-root s-root-a #T(vector 1 ?x 3 &rest))
- (make-s-root :a #(1 2 3 4))))
+ (make-instance 'test1 :a '(1 2 3) :b "woot")))
hunk ./test/unification-tests.lisp 142
- (otherwise (error "error-outer"))))
+ (otherwise "error-outer")))
hunk ./test/unification-tests.lisp 145
- (test-error (nested-match-cases '(:a 42 :b 33)) :announce t)
-
- (test-error (nested-match-cases '(:a 42 :b (33 42))) :announce t)
+ (test "error-outer" (nested-match-cases '(:a 42 :b 33)) :test 'string=)
hunk ./test/unification-tests.lisp 147
- (test '(42 43 44) (nested-match-cases '(:a 42 :b ((:d 42) (:c 43) (:c 44))))
- :test #'equal)
Sun Jul 13 13:10:48 UTC 2008 mantoniotti
* Some modification added. Exported symbols and reverted
Some modification added. Exported symbols and reverted
reader macro #T to construct template instances at read time.
Added MAKE-LOAD-FORM method for templates which should fix problem with
SBCL.
Committing in .
Modified Files:
substitutions.lisp templates-hierarchy.lisp
unification-package.lisp variables.lisp
hunk ./substitutions.lisp 141
+(defun v? (s env &optional (plain-symbol-p nil))
+ (find-variable-value (if plain-symbol-p
+ (make-var-name s)
+ s)
+ env))
+ [_$_]
+
+
hunk ./templates-hierarchy.lisp 222
+
hunk ./templates-hierarchy.lisp 225
-#||
+;;; 20080711 MA:
+;;; Reverted to the old version with MAKE-LOAD-FORM added. Template
+;;; objects are created at read-time.
+
hunk ./templates-hierarchy.lisp 236
-||#
hunk ./templates-hierarchy.lisp 237
+(defmethod make-load-form ((x template) &optional env)
+ (make-load-form-saving-slots x :environment env))
hunk ./templates-hierarchy.lisp 240
-;;; New version with more 'macro-like' behavior. The previous version
+
+#||
+;;; Version with more 'macro-like' behavior. The previous version
hunk ./templates-hierarchy.lisp 245
+;;;
+;;; 20080713 MA
+;;; Removed because it was not working well with nested templates.
+;;; Reverted to the original one plus MAKE-LOAD-FORM.
hunk ./templates-hierarchy.lisp 258
-
+||#
hunk ./templates-hierarchy.lisp 261
- (set-dispatch-macro-character #\# #\T #'|sharp-T-reader|))
+ (set-dispatch-macro-character #\# #\T '|sharp-T-reader|))
+
+
+#|| Useless with the read time templates and MAKE-LOAD-FORM.
+
+(defun rewrite-template-spec (spec)
+ "Rewrites a template specification.
+The rewriting simply makes sure that sub-templates are created as needed.
+The result is either the SPEC itself or an appropriate call to LIST."
+
+ (typecase spec
+ (atom `',spec)
+ (cons (destructuring-bind (head &rest tail)
+ spec
+ (case head
+ (quote spec)
+ (make-template `(make-template ,(first tail)
+ ,(rewrite-template-spec (second (second tail)))))
+ (t `(list ',head ,@(mapcar #'rewrite-template-spec tail)))
+ )))
+ (t `',spec)))
+
+||#
+ [_$_]
+
hunk ./templates-hierarchy.lisp 362
-
-;;; Implementation.
+;;;;===========================================================================
+;;;; Implementation.
hunk ./unification-package.lisp 9
+
hunk ./unification-package.lisp 14
+
hunk ./unification-package.lisp 19
+ "V?"
+
hunk ./unification-package.lisp 22
- "APPLY-SUBSTITUTION")
+ "APPLY-SUBSTITUTION"
+
+ "UNIFICATION-FAILURE"
+ "UNIFICATION-VARIABLE-UNBOUND"
+ )
+
+ (:export
+ "ENVIRONMENT"
+ "ENVIRONMENT-P")
+
hunk ./variables.lisp 5
+
+(defun make-var-name (&optional (s (gensym)) (package *package*))
+ (intern (concatenate 'string "?" (symbol-name s)) package))
+
+
Sun Jul 13 12:51:14 UTC 2008 mantoniotti
* Added explicit :source-extension to accomodate Allegro CL.
hunk ./cl-unification.system 7
- :components ("unification-package"
- "variables"
- "substitutions"
- "lambda-list-parsing"
- "templates-hierarchy"
- "unifier"
- "match-block"
- "apply-substitution"))
+ :source-extension "lisp"
+ :components ("unification-package"
+ "variables"
+ "substitutions"
+ "lambda-list-parsing"
+ "templates-hierarchy"
+ "unifier"
+ "match-block"
+ "apply-substitution"))
Thu Jul 10 17:39:16 UTC 2008 mantoniotti
* Removed EXPORT of APPLY-SUBSTITUTION as it is already in the DEFPACKAGE.
hunk ./apply-substitution.lisp 21
- (t (warn "~S is a free variable in the current environment." s)
+ (t (warn "~S is a free variable in the current environment."
+ s)
hunk ./apply-substitution.lisp 34
-(export '(apply-substitution))
-
-
Fri Nov 9 13:56:40 UTC 2007 mantoniotti
* Changed the position of the disclaimer.
hunk ./docs/html/index.html 37
-
- <hr>
- <em>
- <p>
- <b>DISCLAIMER:</b> The code associated to these documents is not
- completely tested and it is bound to contain errors and omissions.
- This documentation may contain errors and omissions as well.</p>
-
- <p>The file <tt>COPYING</tt> contains a Berkeley-style license. You
- are advised to use the code at your own risk. No warranty
- whatsoever is provided, the author will not be held responsible for
- any effect generated by your use of the library, and you can put
- here the scarier extra disclaimer you can think of.
- </p>
- </em>
- <hr>
-
hunk ./docs/html/index.html 289
+
+
+ <h1></h1>
+ <hr>
+ <em>
+ <p>
+ <b>DISCLAIMER:</b> The code associated to these documents is not
+ completely tested and it is bound to contain errors and omissions.
+ This documentation may contain errors and omissions as well.</p>
+
+ <p>The file <tt>COPYING</tt> contains a Berkeley-style license. You
+ are advised to use the code at your own risk. No warranty
+ whatsoever is provided, the author will not be held responsible for
+ any effect generated by your use of the library, and you can put
+ here the scarier extra disclaimer you can think of.
+ </p>
+ </em>
+ <hr>
+
hunk ./docs/html/index.html 352
+ <li><strong>2007-11-09</strong><br>
+ Updated.
Fri Nov 9 13:47:00 UTC 2007 mantoniotti
* ChangeLog updated.
hunk ./ChangeLog 1
+2007-11-09 author <author@papadopoulou-2.ydras.offices.aueb.gr>
+
+ * match-block.lisp:
+ Made several changes to improve MATCH-CASE (following a note from Ivan
+ Boldyrev from a long time ago), MATCHING and MATCH.
+
+ Else-clauses are now handled correctly (AFAICT).
+
+ Single variable templates in MATCH, MATCH-CASE and MATCHING clauses do
+ not need to be quoted.
+
+ MATCHING was generating one gensym'ed variable per clause without
+ creating an appropriate enclosing LET. This is now fixed.
+
+ * substitutions.lisp:
+ Changed the top comment and added a (:copier nil) option to the
+ ENVIRONMENT defstruct, as COPY-ENVIRONMENT is defined later in the
+ file.
+
+ * cl-unification.system, cl-unification.asd:
+ Added the new system building files with more meaningful names
+ w.r.t. the name of the library.
+
+ * unification.asd, unification.system:
+ Marked the two system building files as 'obsolete', before removing
+ them from the repository. The new files are prefixed by 'cl-'.
+
+2007-05-21 author <author@papadopoulou-2.ydras.offices.aueb.gr>
+
+ * ChangeLog: ChangeLog updated.
+
+ * README, ACKNOWLEDGEMENTS, COPYING, INSTALLATION:
+ Updated copyrights dates and changed a few instructions in the
+ INSTALLATION file.
+
+ * docs/html/index.html: Updated copyrights dates.
+
+ * ChangeLog: ChangeLog updated.
+
+ * unification-package.lisp, unification.asd, apply-substitution.lisp, match-block.lisp, substitutions.lisp:
+ See previous message.
+
+ * unification.system:
+ Added file 'apply-substitition.lisp' with a few new functions that are
+ a start for the variable substitition operation.
+
+ New fixes to the MATCH and MATCH-CASE macros. They should now work as
+ advertised.
+
+ Minor changes to other files: added exports to package file, fixed
+ .system and .asd files.
+
Fri Nov 9 13:43:20 UTC 2007 mantoniotti
* Made several changes to improve MATCH-CASE (following a note from Ivan
Made several changes to improve MATCH-CASE (following a note from Ivan
Boldyrev from a long time ago), MATCHING and MATCH.
Else-clauses are now handled correctly (AFAICT).
Single variable templates in MATCH, MATCH-CASE and MATCHING clauses do
not need to be quoted.
MATCHING was generating one gensym'ed variable per clause without
creating an appropriate enclosing LET. This is now fixed.
hunk ./match-block.lisp 1
-;;; -*- Mode: Lisp -*-[_^M_][_$_]
+;;;; -*- Mode: Lisp -*-[_^M_][_$_]
+[_^M_][_$_]
+;;;; match-block.lisp --[_^M_][_$_]
+;;;; Various macros built on top of the unifier: MATCH, MATCHING and MATCH-CASE.[_^M_][_$_]
hunk ./match-block.lisp 20
- "Sets up a lexical environment to evaluate FORMS after a unification operation.[_^M_][_$_]
+ "Sets up a lexical environment to evaluate FORMS after an unification.[_^M_][_$_]
+[_^M_][_$_]
hunk ./match-block.lisp 38
+ (template (if (variablep template)[_^M_][_$_]
+ `',template ; Logical variables are special-cased.[_^M_][_$_]
+ template))[_^M_][_$_]
hunk ./match-block.lisp 44
- nconc (list `(,v (find-variable-value ',v ,env-var))[_^M_][_$_]
+ nconc (list `(,v (find-variable-value ',v[_^M_][_$_]
+ ,env-var))[_^M_][_$_]
hunk ./match-block.lisp 53
- (declare (ignorable ,@(mapcar #'first (generate-var-bindings))))[_^M_][_$_]
+ (declare (ignorable ,@(mapcar #'first[_^M_][_$_]
+ (generate-var-bindings))))[_^M_][_$_]
hunk ./match-block.lisp 72
- (default-substitution (make-empty-environment)))[_^M_][_$_]
+ (default-substitution[_^M_][_$_]
+ (make-empty-environment)))[_^M_][_$_]
hunk ./match-block.lisp 76
+[_^M_][_$_]
hunk ./match-block.lisp 104
- (let ((template-vars (collect-template-vars template)))[_^M_][_$_]
+ (let ((template-vars (collect-template-vars template))[_^M_][_$_]
+ (template (if (variablep template)[_^M_][_$_]
+ `',template ; Logical variables are[_^M_][_$_]
+ ; special-cased.[_^M_][_$_]
+ template)) [_^M_][_$_]
+ )[_^M_][_$_]
hunk ./match-block.lisp 118
- (ignore-errors (unify ',template[_^M_][_$_]
+ (ignore-errors (unify ,template[_^M_][_$_]
hunk ./match-block.lisp 139
- (let* ((default-clause (or (find t match-clauses :key #'first)[_^M_][_$_]
- (find 'otherwise match-clauses :key #'first)))[_^M_][_$_]
- (match-clauses (delete default-clause match-clauses)) ; EQL test suffices.[_^M_][_$_]
+ (let* ((default-clause (or (find t match-clauses[_^M_][_$_]
+ :key #'first)[_^M_][_$_]
+ (find 'otherwise match-clauses[_^M_][_$_]
+ :key #'first)))[_^M_][_$_]
+ (match-clauses (delete default-clause match-clauses)) ; EQL[_^M_][_$_]
+ ; test[_^M_][_$_]
+ ; suffices.[_^M_][_$_]
+ (match-clauses-env-vars (mapcar (lambda (mc)[_^M_][_$_]
+ (declare (ignore mc))[_^M_][_$_]
+ (gensym "UNIFICATION-ENV-")[_^M_][_$_]
+ )[_^M_][_$_]
+ match-clauses))[_^M_][_$_]
hunk ./match-block.lisp 152
- `(block matching[_^M_][_$_]
- (cond ,@(mapcar (lambda (match-clause match-clause-env-var)[_^M_][_$_]
- (build-match-clause match-clause match-clause-env-var))[_^M_][_$_]
- match-clauses[_^M_][_$_]
- (mapcar (lambda (mc)[_^M_][_$_]
- (declare (ignore mc))[_^M_][_$_]
- (gensym "UNIFICATION-ENV-")[_^M_][_$_]
- )[_^M_][_$_]
- match-clauses))[_^M_][_$_]
- (,errorp[_^M_][_$_]
- (error 'unification-non-exhaustive[_^M_][_$_]
- :format-control "Non exhaustive matching."))[_^M_][_$_]
- ,@(when default-clause (list default-clause)))))[_^M_][_$_]
- ))[_^M_][_$_]
hunk ./match-block.lisp 153
+ `(block matching[_^M_][_$_]
+ (let ,match-clauses-env-vars[_^M_][_$_]
+ (declare (dynamic-extent ,@match-clauses-env-vars))[_^M_][_$_]
+ (cond ,@(mapcar (lambda (match-clause match-clause-env-var)[_^M_][_$_]
+ (build-match-clause match-clause[_^M_][_$_]
+ match-clause-env-var))[_^M_][_$_]
+ match-clauses[_^M_][_$_]
+ match-clauses-env-vars)[_^M_][_$_]
+ (,errorp[_^M_][_$_]
+ (error 'unification-non-exhaustive[_^M_][_$_]
+ :format-control "Non exhaustive matching."))[_^M_][_$_]
+ ,@(when default-clause (list default-clause))))))[_^M_][_$_]
+ ))[_^M_][_$_]
hunk ./match-block.lisp 170
+;;;[_^M_][_$_]
+;;; Notes:[_^M_][_$_]
+;;;[_^M_][_$_]
+;;; [MA 20071109][_^M_][_$_]
+;;; When the construction of the inner MATCH clauses could be done[_^M_][_$_]
+;;; more intelligently by supplying :ERRORP NIL, thus avoiding the[_^M_][_$_]
+;;; HANDLER-CASEs, which are quite expensive. Any takers?[_^M_][_$_]
hunk ./match-block.lisp 178
-(defmacro match-case ((object &key errorp default-substitution) &rest clauses)[_^M_][_$_]
+(defmacro match-case ((object &key errorp default-substitution)[_^M_][_$_]
+ &rest clauses)[_^M_][_$_]
hunk ./match-block.lisp 181
+[_^M_][_$_]
hunk ./match-block.lisp 219
- `(error 'unification-non-exhaustive[_^M_][_$_]
- :format-control "Non exhaustive matching."))))[_^M_][_$_]
+ `(t (error 'unification-non-exhaustive[_^M_][_$_]
+ :format-control "Non exhaustive matching.")))))[_^M_][_$_]
hunk ./match-block.lisp 234
+;;;;---------------------------------------------------------------------------[_^M_][_$_]
+;;;; Testing.[_^M_][_$_]
+[_^M_][_$_]
+#| Tests[_^M_][_$_]
+[_^M_][_$_]
+(let ((n 42))[_^M_][_$_]
+ (matching ()[_^M_][_$_]
+ ((0 n) 1)[_^M_][_$_]
+ ((?x n) (* x (1- x)))))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(let ((n 42))[_^M_][_$_]
+ (match-case (n)[_^M_][_$_]
+ (0 1)[_^M_][_$_]
+ (?x (* x (1- x)))))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(let ((n 42))[_^M_][_$_]
+ (match-case (n)[_^M_][_$_]
+ (0 1)[_^M_][_$_]
+ (otherwise (* n (1- n)))))[_^M_][_$_]
+[_^M_][_$_]
+(defun fatt (x)[_^M_][_$_]
+ (match-case (x :errorp t)[_^M_][_$_]
+ (0 1)[_^M_][_$_]
+ (#T(number ?n) (* ?n (fatt (1- n))))[_^M_][_$_]
+ ))[_^M_][_$_]
+[_^M_][_$_]
+|#[_^M_][_$_]
hunk ./match-block.lisp 264
-;;; end of file -- math-blocks.lisp --[_^M_][_$_]
+;;;; end of file -- math-blocks.lisp --[_^M_][_$_]
Fri Nov 9 13:35:55 UTC 2007 mantoniotti
* Changed the top comment and added a (:copier nil) option to the
Changed the top comment and added a (:copier nil) option to the
ENVIRONMENT defstruct, as COPY-ENVIRONMENT is defined later in the
file.
hunk ./substitutions.lisp 1
-;;; -*- Mode: Lisp -*-
+;;;; -*- Mode: Lisp -*-
hunk ./substitutions.lisp 3
-;;; substitutions.lisp
-;;; General CL structures unifier.
-;;; Substitution definitions.
+;;;; substitutions.lisp --
+;;;; General CL structures unifier.
+;;;; Substitution definitions. Mostly a rehash of the usual SICP stuff.
hunk ./substitutions.lisp 79
-(defstruct (environment (:print-object print-environment))
+(defstruct (environment (:print-object print-environment)
+ (:copier nil))
hunk ./substitutions.lisp 141
-;;; end of file -- substitutions.lisp --
+;;;; end of file -- substitutions.lisp --
Fri Nov 9 13:34:18 UTC 2007 mantoniotti
* Added the new system building files with more meaningful names
Added the new system building files with more meaningful names
w.r.t. the name of the library.
hunk ./cl-unification.asd 6
-;;;;===========================================================================
-;;;; Simple stuff that should be built in ASDF.
-
-(defpackage "CL-UNIFICATION-SYSTEM" (:use "CL" "ASDF"))
-
-(in-package "CL-UNIFICATION-SYSTEM")
-
-(defclass asdf-system-definition-file (asdf:cl-source-file) ())
-(defmethod source-file-type ((c asdf-system-definition-file) (s module)) "asd")
-
-
-(asdf:defsystem :cl-unification
- :author "Marco Antoniotti"
- :serial t
- :components ((:file "unification-package")
- (:file "variables")
- (:file "substitutions")
- (:file "lambda-list-parsing")
- (:file "templates-hierarchy")
- (:file "unifier")
- (:file "match-block")
- (:file "apply-substitution")
- #+asdf-with-optional-dependencies
- (:module "lib-dependent"
- :pathname "lib-dependent"
- :depends-on ("templates-hierarchy" "unifier")
- :components ((:file "cl-ppcre-template"
- :depends-on (cl-ppcre))
- ))
- #-asdf-with-optional-dependencies
- (asdf-system-definition-file
- "cl-unification-lib")
- ))
+(asdf:defsystem cl-unification
+ :author "Marco Antoniotti"
+ :serial t
+ :components ((:file "unification-package")
+ (:file "variables")
+ (:file "substitutions")
+ (:file "lambda-list-parsing")
+ (:file "templates-hierarchy")
+ (:file "unifier")
+ (:file "match-block")
+ (:file "apply-substitution")))
hunk ./cl-unification.system 7
- :source-extension "lisp"
hunk ./cl-unification.system 14
- "apply-substitution"
- (:module "lib-dependent"
- :depends-on ("templates-hierarchy" "unifier")
- :components ((:subsystem "cl-ppcre-template"
- :non-required-p t
- )
- ))
- ))
+ "apply-substitution"))
Fri Nov 9 13:30:53 UTC 2007 mantoniotti
* Marked the two system building files as 'obsolete', before removing
Marked the two system building files as 'obsolete', before removing
them from the repository. The new files are prefixed by 'cl-'.
hunk ./unification.asd 5
+;;;
+;;; Note:
+;;; [20071109 MA]
+;;; This file is OBSOLETE. Use 'cl-unification.asd' instead.
hunk ./unification.asd 10
-(asdf:defsystem unification
+(asdf:defsystem cl-unification
hunk ./unification.system 3
+;;; unification.system --
+;;; MK:DEFSYSTEM system file.
+;;;
+;;; Note:
+;;; [20071109 MA]
+;;; This file is OBSOLETE. Use 'cl-unification.system' instead.
+
Mon May 21 17:12:58 UTC 2007 mantoniotti
* ChangeLog updated.
hunk ./ChangeLog 1
+2007-05-21 author <author@Paniscia-di-Marco-Antoniotti.local>
+
+ * README, ACKNOWLEDGEMENTS, COPYING, INSTALLATION:
+ Updated copyrights dates and changed a few instructions in the
+ INSTALLATION file.
+
+ * docs/html/index.html: Updated copyrights dates.
+
+ * ChangeLog: ChangeLog updated.
+
+ * unification-package.lisp, unification.asd, apply-substitution.lisp, match-block.lisp, substitutions.lisp:
+ See previous message.
+
+ * unification.system:
+ Added file 'apply-substitition.lisp' with a few new functions that are
+ a start for the variable substitition operation.
+
+ New fixes to the MATCH and MATCH-CASE macros. They should now work as
+ advertised.
+
+ Minor changes to other files: added exports to package file, fixed
+ .system and .asd files.
+
Mon May 21 17:11:42 UTC 2007 mantoniotti
* Updated copyrights dates and changed a few instructions in the
Updated copyrights dates and changed a few instructions in the
INSTALLATION file.
hunk ./ACKNOWLEDGEMENTS 9
+Korablin, Vladimir V.
+Leuner, John
hunk ./ACKNOWLEDGEMENTS 13
+
+
hunk ./COPYING 1
-Copyright (c) 2004-2005 Marco Antoniotti[_^M_][_$_]
+Copyright (c) 2004-2007 Marco Antoniotti[_^M_][_$_]
hunk ./INSTALLATION 16
+There is also an ASDF system definition for those who use this system.
+
hunk ./README 3
-Marco Antoniotti 2004-2005
+Marco Antoniotti (c) 2004-2007
Mon May 21 17:10:26 UTC 2007 mantoniotti
* Updated copyrights dates.
hunk ./docs/html/index.html 371
- © 2003-2004, Marco Antoniotti, all rights reserved.
+ © 2004-2007, Marco Antoniotti, all rights reserved.
Mon May 21 16:55:57 UTC 2007 mantoniotti
* ChangeLog updated.
hunk ./ChangeLog 1
+2007-05-21 author <author@paniscia.disco.unimib.it>
+
+ * unification.system:
+ Added file 'apply-substitition.lisp' with a few new functions that are
+ a start for the variable substitition operation.
+
+ New fixes to the MATCH and MATCH-CASE macros. They should now work as
+ advertised.
+
+ Minor changes to other files: added exports to package file, fixed
+ .system and .asd files.
+
+2006-07-19 author <author@paniscia.disco.unimib.it>
+
+ * templates-hierarchy.lisp, unifier.lisp:
+ Fixed two problems with the unifier machinery.
+
+ The first one had to do with the matching of NIL against SYMBOL and LIST
+ in several places: essentially, the problem is incongruencies in the
+ results of COMPUTE-APPLICABLE-METHODS in these cases. I think I caught
+ most of them: unification of lists and the occur-check were the obvious
+ places where things went awry.
+
+ The second problem had to do with the reader macro #T. The original
+ code generated an object at read time, which is not such a good idea.
+ Now the code generates a call to MAKE-TEMPLATE with is evaluated later.
+ Incidentally, the reader macro function is now called |sharp-T-reader|, in
+ order to placate Emacs fontification.
+
+ Modified Files:
+ templates-hierarchy.lisp unifier.lisp
+
+ * unification-package.lisp: Added missing export.
+
+2005-10-25 author <author@paniscia.disco.unimib.it>
+
+ * unifier.lisp: Fixed problem with the unification of a list with a
+ SEQUENCE-TEMPLATE. The implementation was not checking that the
+ length of the list was compatible with the length of the required
+ elements in the template.
+
+ Apart from that, keyword matching is still unimplemented.
+
+ * match-block.lisp:
+ Fixed problem with checking the presence of T and OTHERWISE clauses in
+ MATCHING.
+
+2005-07-25 author <author@paniscia.disco.unimib.it>
+
+ * docs/html/downloads.html: Minor cleanup.
+
+2005-05-20 author <author@paniscia.disco.unimib.it>
+
+ * docs/html/links.html: Fixed typos.
+
+ * docs/html/nil-template-class.html: Fixed bug in documentation.
+
+ * docs/html/links.html: Page updated.
+
+ * docs/html/unification-dictionary.html: Incremental change to page.
+
+ * docs/html/number-template-class.html: Fixed a documentation bug.
+ Thanks to Norman Werner for spotting it.
+
+ * docs/html/index.html: Added link to "Mailing Lists" page.
+
+ * docs/html/mailing-lists.html: File added.
+
+ * unifier.lisp:
+ Fixed two major bugs reported by Norman Werver. Unification of
+ strings and symbols and of numers and symbols was not recurring on
+ VAR-UNIFY, as required; thus
+
+ (unify '(?x ?x) '("asd" "qweert"))
+ and
+ (unify '(foo ?x baz) '(foo 42 ?x))
+
+ would succed.
+ The two cases are now fixed.
+
+2005-05-19 author <author@paniscia.disco.unimib.it>
+
+ * README: Year updated.
+
+ * ACKNOWLEDGEMENTS: File added.
+
+ * ChangeLog: ChangeLog updated.
+
+ * COPYING: Updated copyright notice.
+
+ * docs/html/downloads.html, docs/html/index.html:
+ Changed the DISCLAIMER parts in the files, in order to clarify the licensing
+ of the code.
+
Mon May 21 12:33:05 UTC 2007 mantoniotti
* See previous message.
hunk ./apply-substitution.lisp 12
-;;; apply-substitution --
-;;;
-;;; EXCLUDE-VARS are variables that will just pass through (a list for
-;;; the time being).
+(defgeneric apply-substitution (substitution item))
hunk ./apply-substitution.lisp 14
-(defgeneric apply-substitution (substitution item &optional exclude-vars))
hunk ./apply-substitution.lisp 15
-
-(defmethod apply-substitution ((s environment) (n number) &optional exclude-vars)
- (declare (ignore exclude-vars))
- n)
-
-
-(defmethod apply-substitution ((substitution environment) (s symbol)
- &optional (exclude-vars ()))
- (declare (type list exclude-vars))
+(defmethod apply-substitution ((substitution environment) (s symbol))
hunk ./apply-substitution.lisp 18
- (if (member s exclude-vars :test #'eq)
- s
- (multiple-value-bind (val foundp)
- (find-variable-value s substitution)
- (cond (foundp (apply-substitution substitution val exclude-vars))
- (t (warn "~S is a free variable in the current environment."
- s)
- s))))
- )
+ (multiple-value-bind (val foundp)
+ (find-variable-value s substitution)
+ (cond (foundp val)
+ (t (warn "~S is a free variable in the current environment." s)
+ s))))
hunk ./apply-substitution.lisp 26
-(defmethod apply-substitution ((substitution environment) (l cons)
- &optional (exclude-vars ()))
- (declare (type list exclude-vars))
- (cons (apply-substitution substitution (first l) exclude-vars)
- (apply-substitution substitution (rest l) exclude-vars)))
-
+(defmethod apply-substitution ((substitution environment) (l cons))
+ (cons (apply-substitution substitution (first l))
+ (apply-substitution substitution (rest l))))
hunk ./apply-substitution.lisp 30
-(defmethod apply-substitution ((substitution environment) (l null)
- &optional exclude-vars)
- (declare (ignore exclude-vars))
+(defmethod apply-substitution ((substitution environment) (l null))
hunk ./apply-substitution.lisp 33
+(export '(apply-substitution))
hunk ./apply-substitution.lisp 35
-;;; compose-substitions --
-;;; The definition is a direct translation of TPL's definition at page 318.
-;;; Usually these are done by directly composing and currying
-;;; functions in ML/Haskell derivatives, but that is just being "lazy".
-;;; The current definition may be too "eager", but the "correct"
-;;; semantics should be preserved.
-
-(defun compose-substitutions (env2 env1) ; note the order.
- (declare (type environment env2 env1))
-
- (loop for env1-frame in (environment-frames env1)
- collect
- (loop for (var . term) in (frame-bindings env1-frame)
- collect (make-binding var (apply-substitution env2 term))
- into result-bindings
- finally (return (make-frame result-bindings)))
- into frames
- finally (return (make-environment :frames frames))))
- [_$_]
- [_$_]
-
-
-;;; ground-term --
hunk ./match-block.lisp 13
- (substitution (make-empty-environment))[_^M_][_$_]
+ (substitution '(make-empty-environment))[_^M_][_$_]
hunk ./match-block.lisp 42
- (let* ((,env-var (unify ',template ,object ,substitution))[_^M_][_$_]
+ (let* ((,env-var (unify ,template ,object ,substitution))[_^M_][_$_]
hunk ./match-block.lisp 52
- (signal uf)[_^M_][_$_]
+ (error uf)[_^M_][_$_]
hunk ./match-block.lisp 158
-The full syntax of MATCHING is[_^M_][_$_]
+The full syntax of MATCH-CASE is[_^M_][_$_]
hunk ./match-block.lisp 166
-The values returned by the MATCHING form are those of the last form in[_^M_][_$_]
+The values returned by the MATCH-CASE form are those of the last form in[_^M_][_$_]
hunk ./match-block.lisp 191
- otherwise-clause[_^M_][_$_]
+ `(progn ,@(rest otherwise-clause))[_^M_][_$_]
hunk ./substitutions.lisp 27
+(defun (setf binding-variable) (v b)
+ (declare (type binding b))
+ (setf (car b) v))
+
+
hunk ./substitutions.lisp 37
+(defun (setf binding-value) (v b)
+ (declare (type binding b))
+ (setf (cdr b) v))
+
+
+
hunk ./unification-package.lisp 17
- "MAKE-EMPTY-ENVIRONMENT")
+ "MAKE-EMPTY-ENVIRONMENT"
+ "APPLY-SUBSTITUTION")
hunk ./unification.asd 15
- (:file "match-block")))
+ (:file "match-block")
+ (:file "apply-substitution")))
Mon May 21 12:29:24 UTC 2007 mantoniotti
* Added file 'apply-substitition.lisp' with a few new functions that are
Added file 'apply-substitition.lisp' with a few new functions that are
a start for the variable substitition operation.
New fixes to the MATCH and MATCH-CASE macros. They should now work as
advertised.
Minor changes to other files: added exports to package file, fixed
.system and .asd files.
hunk ./unification.system 10
- "match-block"))
+ "match-block"
+ "apply-substitution"))
Wed Jul 19 21:52:34 UTC 2006 mantoniotti
* Fixed two problems with the unifier machinery.
Fixed two problems with the unifier machinery.
The first one had to do with the matching of NIL against SYMBOL and LIST
in several places: essentially, the problem is incongruencies in the
results of COMPUTE-APPLICABLE-METHODS in these cases. I think I caught
most of them: unification of lists and the occur-check were the obvious
places where things went awry.
The second problem had to do with the reader macro #T. The original
code generated an object at read time, which is not such a good idea.
Now the code generates a call to MAKE-TEMPLATE with is evaluated later.
Incidentally, the reader macro function is now called |sharp-T-reader|, in
order to placate Emacs fontification.
Modified Files:
templates-hierarchy.lisp unifier.lisp
hunk ./templates-hierarchy.lisp 224
-(defun |#T-reader| (stream subchar arg)
+#||
+(defun |sharp-T-reader| (stream subchar arg)
hunk ./templates-hierarchy.lisp 232
+||#
+
+
+;;; New version with more 'macro-like' behavior. The previous version
+;;; created an object at read-time, which may cause problems with
+;;; MAKE-LOAD-FORMs, constant-ness etc etc.
+
+(defun |sharp-T-reader| (stream subchar arg)
+ (declare (ignore subchar arg))
+ (let ((spec (read stream t nil t)))
+ (typecase spec
+ (null `(make-template nil ',spec))
+ (cons `(make-template ',(first spec) ',spec))
+ (t `(make-template ',spec ',spec)))
+ ))
hunk ./templates-hierarchy.lisp 250
- (set-dispatch-macro-character #\# #\T #'|#T-reader|))
+ (set-dispatch-macro-character #\# #\T #'|sharp-T-reader|))
hunk ./unifier.lisp 233
+ (declare (ignore env))
hunk ./unifier.lisp 243
-(defmethod unify ((x null) (nt nil-template) &optional (env (make-empty-environment)))
+(defmethod unify ((x null) (y null)
+ &optional (env (make-empty-environment)))
+ env)
+
+
+(defmethod unify ((x null) (nt nil-template)
+ &optional (env (make-empty-environment)))
hunk ./unifier.lisp 253
-(defmethod unify ((nt nil-template) (x null) &optional (env (make-empty-environment)))
+(defmethod unify ((nt nil-template) (x null)
+ &optional (env (make-empty-environment)))
hunk ./unifier.lisp 258
-(defmethod unify ((nt1 nil-template) (nt2 nil-template) &optional (env (make-empty-environment)))
+(defmethod unify ((nt1 nil-template) (nt2 nil-template)
+ &optional (env (make-empty-environment)))
hunk ./unifier.lisp 311
+ (declare (ignore env))
hunk ./unifier.lisp 367
+ (declare (ignore env))
hunk ./unifier.lisp 412
+ (declare (ignore env))
hunk ./unifier.lisp 462
- (declare (ignore array-kwd))
+ (declare (ignore array-kwd type-spec))
hunk ./unifier.lisp 473
+ (declare (ignore env))
hunk ./unifier.lisp 478
-#| Old version with heavy syntax
+#|| Old version with heavy syntax
hunk ./unifier.lisp 500
-|#
+||#
hunk ./unifier.lisp 535
+ (declare (ignore env))
hunk ./unifier.lisp 570
- (unify (subseq a from to) (make-template seq-template-kind `(,seq-template-kind ,@spec))))))
+ (unify (subseq a from to)
+ (make-template seq-template-kind `(,seq-template-kind ,@spec))
+ env))))
hunk ./unifier.lisp 616
-#|
+#||
hunk ./unifier.lisp 631
-|#
+||#
+
hunk ./unifier.lisp 643
+
hunk ./unifier.lisp 648
+
+(defmethod occurs-in-p ((var symbol) (pat null) env)
+ ;; This is needed because of different precedence rules among lisps
+ ;; in COMPUTE-APPLICABLE-METHODS when NIL has to matched against
+ ;; SYMBOL and LIST.
+ [_$_]
+ ;; We know (assume) that VAR is not NIL.
+ nil)
+
+
Wed Jul 19 20:28:49 UTC 2006 mantoniotti
* Added missing export.
hunk ./unification-package.lisp 20
- "MATCHING"))
+ "MATCHING"
+ "MATCH-CASE"))
Tue Oct 25 19:17:33 UTC 2005 mantoniotti
* Fixed problem with the unification of a list with a
Fixed problem with the unification of a list with a
SEQUENCE-TEMPLATE. The implementation was not checking that the
length of the list was compatible with the length of the required
elements in the template.
Apart from that, keyword matching is still unimplemented.
hunk ./unifier.lisp 334
- (env (unify (subseq a 0 (list-length vars)) vars env))
+ (env (unify (subseq a 0 (min ll (list-length vars)))
+ vars
+ env))
Tue Oct 25 19:08:15 UTC 2005 mantoniotti
* Fixed problem with checking the presence of T and OTHERWISE clauses in
Fixed problem with checking the presence of T and OTHERWISE clauses in
MATCHING.
hunk ./match-block.lisp 96
- nconc (list `(,v (find-variable-value ',v ,clause-var))[_^M_][_$_]
+ nconc (list `(,v (find-variable-value[_^M_][_$_]
+ ',v[_^M_][_$_]
+ ,clause-var))[_^M_][_$_]
hunk ./match-block.lisp 102
- (ignore-errors (unify ',template ,object ,substitution)))[_^M_][_$_]
+ (ignore-errors (unify ',template[_^M_][_$_]
+ ,object[_^M_][_$_]
+ ,substitution)))[_^M_][_$_]
hunk ./match-block.lisp 112
- (%%match%% match-env-var template object forms '(make-empty-environment))))[_^M_][_$_]
+ (%%match%% match-env-var[_^M_][_$_]
+ template[_^M_][_$_]
+ object[_^M_][_$_]
+ forms[_^M_][_$_]
+ '(make-empty-environment))))[_^M_][_$_]
hunk ./match-block.lisp 118
- (when (or (> 1 (count t match-clauses :key #'first))[_^M_][_$_]
- (> 1 (count 'otherwise match-clauses :key #'first)))[_^M_][_$_]
+ (when (or (and (find t match-clauses :key #'first)[_^M_][_$_]
+ (find 'otherwise match-clauses :key #'first))[_^M_][_$_]
+ (> (count t match-clauses :key #'first) 1)[_^M_][_$_]
+ (> (count 'otherwise match-clauses :key #'first) 1))[_^M_][_$_]
Mon Jul 25 15:15:08 UTC 2005 mantoniotti
* Minor cleanup.
hunk ./docs/html/downloads.html 18
- | <a href="links.html" class="navigation-link">Links</a>
+ | <a href="links.html" class="navigation-link">Links</a>
Fri May 20 16:41:16 UTC 2005 mantoniotti
* Fixed typos.
hunk ./docs/html/links.html 43
- <li><a href="http://mitpress.mit.edu/sicp">Structure and Interpretation of Computer Programs</a>: the SICP site, where inspiration for the unifief can be found.</li>
- <li><a href="http://www.norvig.com/paip.html">Paradigms of Artificial Intelligence Programming</a>: the PAIP site, where more inspiration for the unifief can be found.</li>
+ <li><a href="http://mitpress.mit.edu/sicp">Structure and Interpretation of Computer Programs</a>: the SICP site, where inspiration for the unifier can be found.</li>
+ <li><a href="http://www.norvig.com/paip.html">Paradigms of Artificial Intelligence Programming</a>: the PAIP site, where more inspiration for the unifier can be found.</li>
Fri May 20 16:38:06 UTC 2005 mantoniotti
* Fixed bug in documentation.
hunk ./docs/html/nil-template-class.html 64
- to unify against a VECTOR.</p>
+ to unify against NIL.</p>
Fri May 20 16:33:24 UTC 2005 mantoniotti
* Page updated.
hunk ./docs/html/links.html 39
- <p>...</p>
+ <p>
+ <ul>
+ <li><a href="http://common-lisp.net">common-lisp.net</a>: the host site.</li>
+ <li><a href="http://clocc.sourceforge.net">CLOCC</a>: the site hosting <strong>MK:DEFSYSTEM</strong>.</li>
+ <li><a href="http://mitpress.mit.edu/sicp">Structure and Interpretation of Computer Programs</a>: the SICP site, where inspiration for the unifief can be found.</li>
+ <li><a href="http://www.norvig.com/paip.html">Paradigms of Artificial Intelligence Programming</a>: the PAIP site, where more inspiration for the unifief can be found.</li>
+ </ul>
+ </p>
hunk ./docs/html/links.html 85
+ <li><strong>2005-05-20</strong><br>
+ Updated (but not completed) the page.
+ </li>
+
Fri May 20 16:27:05 UTC 2005 mantoniotti
* Incremental change to page.
hunk ./docs/html/unification-dictionary.html 46
- <li><a href="array-template-class.html"><i>Class</i> <b>ARRAY-TEMPLATE</b></a></li>
+ <li><a href="aref-template-class.html"><i>Class</i> <b>AREF-TEMPLATE</b></a></li>
hunk ./docs/html/unification-dictionary.html 52
+
+ <li><a href="array-template-class.html"><i>Class</i> <b>ARRAY-TEMPLATE</b></a></li>
+ <li><a href="nil-template-class.html"><i>Class</i> <b>NIL-TEMPLATE</b></a>
+ <li><a href="number-template-class.html"><i>Class</i> <b>NUMBER-TEMPLATE</b></a></li>
hunk ./docs/html/unification-dictionary.html 58
+ <li><a href="standard-object-template-class.html"><i>Class</i> <b>STANDARD-OBJECT-TEMPLATE</b></a></li>
+ <li><a href="structure-object-template-class.html"><i>Class</i> <b>STRUCTURE-OBJECT-TEMPLATE</b></a></li>
+
hunk ./docs/html/unification-dictionary.html 74
-;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;; Copyright (c) 2004-2005 Marco Antoniotti, All rigths reserved.
hunk ./docs/html/unification-dictionary.html 82
- <h2>Site Map</h2>
+<!-- <h2>Site Map</h2> -->
hunk ./docs/html/unification-dictionary.html 115
+ <li><strong>2005-05-20</strong><br>
+ Page updated.
hunk ./docs/html/unification-dictionary.html 118
- Started the site.
+ Started the page.
Fri May 20 16:18:33 UTC 2005 mantoniotti
* Fixed a documentation bug.
Fixed a documentation bug.
Thanks to Norman Werner for spotting it.
hunk ./docs/html/number-template-class.html 20
- | <a href="links.html" class="navigation-link">Links</a>
+ | <a href="links.html" class="navigation-link">Links</a>
hunk ./docs/html/number-template-class.html 64
- to unify against a VECTOR.</p>
+ to unify against a NUMBER.</p>
hunk ./docs/html/number-template-class.html 135
- <p>There is no COMPLEX-NUMBER-TEMPLATE class, although a case for it can be easily made..</p>
+ <p>There is no COMPLEX-NUMBER-TEMPLATE class, although a case for it can be easily made.</p>
Fri May 20 15:47:44 UTC 2005 mantoniotti
* Added link to "Mailing Lists" page.
hunk ./docs/html/index.html 18
- | <a href="links.html" class="navigation-link">Links</a>
+ | <a href="mailing-lists.html" class="navigation-link">Mailing Lists</a>
+ | <a href="links.html" class="navigation-link">Links</a>
Fri May 20 15:19:53 UTC 2005 mantoniotti
* Fixed two major bugs reported by Norman Werver. Unification of
Fixed two major bugs reported by Norman Werver. Unification of
strings and symbols and of numers and symbols was not recurring on
VAR-UNIFY, as required; thus
(unify '(?x ?x) '("asd" "qweert"))
and
(unify '(foo ?x baz) '(foo 42 ?x))
would succed.
The two cases are now fixed.
hunk ./unifier.lisp 97
- ((variablep a) (extend-environment a b env))
+ ((variablep a) (var-unify a b env))
hunk ./unifier.lisp 99
- :format-control "Cannot unify a symbol with a string: ~S ~S."
- :format-arguments (list a b)))))
+ :format-control "Cannot unify a symbol with a string: ~S ~S."
+ :format-arguments (list a b)))))
hunk ./unifier.lisp 105
- ((variablep a) (extend-environment a b env))
+ ((variablep a) (var-unify a b env))
hunk ./unifier.lisp 124
- ((variablep a) (extend-environment a b env))
+ ((variablep a) (var-unify a b env))
hunk ./unifier.lisp 130
- ((variablep a) (extend-environment a b env))
+ ((variablep a) (var-unify a b env))
Thu May 19 23:00:18 UTC 2005 mantoniotti
* Year updated.
hunk ./README 3
-Marco Antoniotti 2004
+Marco Antoniotti 2004-2005
Thu May 19 22:58:34 UTC 2005 mantoniotti
* File added.
hunk ./ACKNOWLEDGEMENTS 1
-A lot of pleple deserved thanks for improving CL-UNIFICATION.
+Many thanks to a lot of people are due.
hunk ./ACKNOWLEDGEMENTS 9
-Boldyrev, Ivan
-Korablin, Vladimir V.
-Leuner, John
-McManus, Russell
Thu May 19 22:54:27 UTC 2005 mantoniotti
* ChangeLog updated.
hunk ./ChangeLog 1
-2009-12-17 author <author@paniscia.local>
-
- * lib-dependent/cl-ppcre-template.asd: Initial checkin.
-
- * lib-dependent/cl-ppcre-template.lisp:
- Patched to use Cl-PPCRE:SCAN-TO-STRINGS (thanks to Pixel // pinterface [a] gmail dot com).
-
- * unifier.lisp: Minor cosmetic changes.
-
- * unification-package.lisp: Exported MATCHF-CASE.
-
- * templates-hierarchy.lisp:
- Fixed a couple of problems with some accessors in the NUMBER,
- STRUCTURE-OBJECT and STANDARD-OBJECT templates.
-
- * match-block.lisp: Added MATCHF* macros.
-
-2009-04-18 author <author@paniscia.local>
-
- * ChangeLog: ChangeLog updated.
-
- * cl-unification.system, cl-unification.asd:
- System definitions files (.asd and .system) modified in order to make
- dependency form CL-PPCRE optional.
-
- * lib-dependent/cl-ppcre-template.system: File added.
-
- * lib-dependent/cl-ppcre-template.lisp:
- Removed REQUIRE of CL-PPCRE. Too brittle.
-
- * cl-unification-lib.asd: File added.
-
-2009-04-18 author <author@Macintosh-9.local>
-
- * cl-unification.system, cl-unification.asd:
- System definitions files (.asd and .system) modified in order to make
- dependency form CL-PPCRE optional.
-
- * lib-dependent/cl-ppcre-template.system: File added.
-
- * lib-dependent/cl-ppcre-template.lisp:
- Removed REQUIRE of CL-PPCRE. Too brittle.
-
- * cl-unification-lib.asd: File added.
-
-2009-04-17 author <author@Macintosh-9.local>
-
- * unification-package.lisp:
- Added a few exports and changed the actual package name (i.e., I put
- my money where my mouth is; the "published" package name is now a
- nickname).
-
- * apply-substitution.lisp:
- Fixed a couple of snags. APPLY-SUBSTITUTION was not applied
- recursively and it was barfing on numbers.
- Current version is still incomplete, but it serves as a template for
- further development.
-
-2009-04-15 author <author@Macintosh-9.local>
-
- * ChangeLog: ChangeLog updated.
-
- * lib-dependent/cl-ppcre-template.lisp, test/unification-tests.lisp:
- Modified Files:
- test/unification-tests.lisp
- Added Files:
- lib-dependent/cl-ppcre-template.lisp
-
- The cl-ppcre-template reuses E. Weitz's wonderful CL-PPCRE library
- to provide a seamless (YMMV) reuse of regular expressions within
- CL-UNIFICATION.
-
- * templates-hierarchy.lisp: Added LAMBDA-TEMPLATE.
-
- * substitutions.lisp:
- Added some functionality to extract all variables and/or all values
- from an environment or a frame.
-
- * match-block.lisp:
- Added MATCHF (whose name may change) to simplify the
- 'destructuring-bind'-like syntax and behavior of the matching
- facilities.
-
- * COPYING: Dates updated.
-
- * unifier.lisp:
- Major API change to 'unify'. It now accepts keywords. Old code
- shouls not be affected, but new code is now more flexible. Look the
- the STRING and (new) CHARACTER methods to see how this change is
- affecting the code.
-
- * variables.lisp: Some 'diff' unfathomable change happened.
-
- * unification-package.lisp: Added exports of a few symbols.
-
- * cl-unification.system, cl-unification.asd:
- Fixed a few snags and added "lib-dependent" module.
-
- * apply-substitution.lisp: Added some functionality and comments.
-
-2009-04-15 author <author@paniscia.pd.disco.unimib.it>
-
- * lib-dependent/cl-ppcre-template.lisp, test/unification-tests.lisp:
- Modified Files:
- test/unification-tests.lisp
- Added Files:
- lib-dependent/cl-ppcre-template.lisp
-
- The cl-ppcre-template reuses E. Weitz's wonderful CL-PPCRE library
- to provide a seamless (YMMV) reuse of regular expressions within
- CL-UNIFICATION.
-
- * templates-hierarchy.lisp: Added LAMBDA-TEMPLATE.
-
- * substitutions.lisp:
- Added some functionality to extract all variables and/or all values
- from an environment or a frame.
-
- * match-block.lisp:
- Added MATCHF (whose name may change) to simplify the
- 'destructuring-bind'-like syntax and behavior of the matching
- facilities.
-
- * COPYING: Dates updated.
-
- * unifier.lisp:
- Major API change to 'unify'. It now accepts keywords. Old code
- shouls not be affected, but new code is now more flexible. Look the
- the STRING and (new) CHARACTER methods to see how this change is
- affecting the code.
-
- * variables.lisp: Some 'diff' unfathomable change happened.
-
- * unification-package.lisp: Added exports of a few symbols.
-
- * cl-unification.system, cl-unification.asd:
- Fixed a few snags and added "lib-dependent" module.
-
- * apply-substitution.lisp: Added some functionality and comments.
-
-2008-07-13 author <author@paniscia.pd.disco.unimib.it>
-
- * ChangeLog: Changelog updated.
-
- * ACKNOWLEDGEMENTS:
- Added credits to a few people. Missing ones should bug the maintainer :)
-
- * README: Copyright dates updated.
-
- * unification.asd, unification.system: Cleaning up.
- Committing in .
-
- Removed Files:
- unification.asd unification.system
-
- * templates-hierarchy-saved.lisp: Clenaing up.
- Committing in .
-
- Removed Files:
- templates-hierarchy-saved.lisp
-
- * INSTALLATION: Instructions updated.
-
- * COPYING: Copyright dates updated.
-
- * test/unification-tests.lisp: Added file.
-
- * substitutions.lisp, templates-hierarchy.lisp, unification-package.lisp, variables.lisp:
- Some modification added. Exported symbols and reverted
- reader macro #T to construct template instances at read time.
- Added MAKE-LOAD-FORM method for templates which should fix problem with
- SBCL.
-
- Committing in .
-
- Modified Files:
- substitutions.lisp templates-hierarchy.lisp
- unification-package.lisp variables.lisp
-
- * cl-unification.system:
- Added explicit :source-extension to accomodate Allegro CL.
-
-2008-07-13 author <author@Macintosh.local>
-
- * ACKNOWLEDGEMENTS:
- Added credits to a few people. Missing ones should bug the maintainer :)
-
- * README: Copyright dates updated.
-
- * unification.asd, unification.system: Cleaning up.
- Committing in .
-
- Removed Files:
- unification.asd unification.system
-
- * templates-hierarchy-saved.lisp: Cleaning up.
- Committing in .
-
- Removed Files:
- templates-hierarchy-saved.lisp
-
- * INSTALLATION: Instructions updated.
-
- * COPYING: Copyright dates updated.
-
- * test/unification-tests.lisp: Added file.
-
- * substitutions.lisp, templates-hierarchy.lisp, unification-package.lisp, variables.lisp:
- Some modification added. Exported symbols and reverted
- reader macro #T to construct template instances at read time.
- Added MAKE-LOAD-FORM method for templates which should fix problem with
- SBCL.
-
- Committing in .
-
- Modified Files:
- substitutions.lisp templates-hierarchy.lisp
- unification-package.lisp variables.lisp
-
- * cl-unification.system:
- Added explicit :source-extension to accomodate Allegro CL.
-
-2008-07-10 author <author@Macintosh.local>
-
- * apply-substitution.lisp:
- Removed EXPORT of APPLY-SUBSTITUTION as it is already in the DEFPACKAGE.
-
-2007-11-09 author <author@Macintosh.local>
-
- * docs/html/index.html: Changed the position of the disclaimer.
-
- * ChangeLog: ChangeLog updated.
-
- * match-block.lisp:
- Made several changes to improve MATCH-CASE (following a note from Ivan
- Boldyrev from a long time ago), MATCHING and MATCH.
-
- Else-clauses are now handled correctly (AFAICT).
-
- Single variable templates in MATCH, MATCH-CASE and MATCHING clauses do
- not need to be quoted.
-
- MATCHING was generating one gensym'ed variable per clause without
- creating an appropriate enclosing LET. This is now fixed.
-
- * substitutions.lisp:
- Changed the top comment and added a (:copier nil) option to the
- ENVIRONMENT defstruct, as COPY-ENVIRONMENT is defined later in the
- file.
-
- * cl-unification.system, cl-unification.asd:
- Added the new system building files with more meaningful names
- w.r.t. the name of the library.
-
- * unification.asd, unification.system:
- Marked the two system building files as 'obsolete', before removing
- them from the repository. The new files are prefixed by 'cl-'.
-
-2007-11-09 author <author@papadopoulou-2.ydras.offices.>
-
- * match-block.lisp:
- Made several changes to improve MATCH-CASE (following a note from Ivan
- Boldyrev from a long time ago), MATCHING and MATCH.
-
- Else-clauses are now handled correctly (AFAICT).
-
- Single variable templates in MATCH, MATCH-CASE and MATCHING clauses do
- not need to be quoted.
-
- MATCHING was generating one gensym'ed variable per clause without
- creating an appropriate enclosing LET. This is now fixed.
-
- * substitutions.lisp:
- Changed the top comment and added a (:copier nil) option to the
- ENVIRONMENT defstruct, as COPY-ENVIRONMENT is defined later in the
- file.
-
- * cl-unification.system, cl-unification.asd:
- Added the new system building files with more meaningful names
- w.r.t. the name of the library.
-
- * unification.asd, unification.system:
- Marked the two system building files as 'obsolete', before removing
- them from the repository. The new files are prefixed by 'cl-'.
-
-2007-05-21 author <author@papadopoulou-2.ydras.offices.>
-
- * ChangeLog: ChangeLog updated.
-
- * README, ACKNOWLEDGEMENTS, COPYING, INSTALLATION:
- Updated copyrights dates and changed a few instructions in the
- INSTALLATION file.
-
- * docs/html/index.html: Updated copyrights dates.
-
- * ChangeLog: ChangeLog updated.
-
- * unification-package.lisp, unification.asd, apply-substitution.lisp, match-block.lisp, substitutions.lisp:
- See previous message.
-
- * unification.system:
- Added file 'apply-substitition.lisp' with a few new functions that are
- a start for the variable substitition operation.
-
- New fixes to the MATCH and MATCH-CASE macros. They should now work as
- advertised.
-
- Minor changes to other files: added exports to package file, fixed
- .system and .asd files.
-
-2007-05-21 author <author@Paniscia-di-Marco-Antoniotti.local>
-
- * README, ACKNOWLEDGEMENTS, COPYING, INSTALLATION:
- Updated copyrights dates and changed a few instructions in the
- INSTALLATION file.
-
- * docs/html/index.html: Updated copyrights dates.
-
- * ChangeLog: ChangeLog updated.
-
- * unification-package.lisp, unification.asd, apply-substitution.lisp, match-block.lisp, substitutions.lisp:
- See previous message.
-
- * unification.system:
- Added file 'apply-substitition.lisp' with a few new functions that are
- a start for the variable substitition operation.
-
- New fixes to the MATCH and MATCH-CASE macros. They should now work as
- advertised.
-
- Minor changes to other files: added exports to package file, fixed
- .system and .asd files.
-
-2007-05-21 author <author@paniscia.disco.unimib.it>
-
- * unification.system:
- Added file 'apply-substitition.lisp' with a few new functions that are
- a start for the variable substitition operation.
-
- New fixes to the MATCH and MATCH-CASE macros. They should now work as
- advertised.
-
- Minor changes to other files: added exports to package file, fixed
- .system and .asd files.
-
-2006-07-19 author <author@paniscia.disco.unimib.it>
-
- * templates-hierarchy.lisp, unifier.lisp:
- Fixed two problems with the unifier machinery.
-
- The first one had to do with the matching of NIL against SYMBOL and LIST
- in several places: essentially, the problem is incongruencies in the
- results of COMPUTE-APPLICABLE-METHODS in these cases. I think I caught
- most of them: unification of lists and the occur-check were the obvious
- places where things went awry.
-
- The second problem had to do with the reader macro #T. The original
- code generated an object at read time, which is not such a good idea.
- Now the code generates a call to MAKE-TEMPLATE with is evaluated later.
- Incidentally, the reader macro function is now called |sharp-T-reader|, in
- order to placate Emacs fontification.
-
- Modified Files:
- templates-hierarchy.lisp unifier.lisp
-
- * unification-package.lisp: Added missing export.
-
-2005-10-25 author <author@paniscia.disco.unimib.it>
-
- * unifier.lisp: Fixed problem with the unification of a list with a
- SEQUENCE-TEMPLATE. The implementation was not checking that the
- length of the list was compatible with the length of the required
- elements in the template.
-
- Apart from that, keyword matching is still unimplemented.
-
- * match-block.lisp:
- Fixed problem with checking the presence of T and OTHERWISE clauses in
- MATCHING.
-
-2005-07-25 author <author@paniscia.disco.unimib.it>
-
- * docs/html/downloads.html: Minor cleanup.
-
-2005-05-20 author <author@paniscia.disco.unimib.it>
-
- * docs/html/links.html: Fixed typos.
-
- * docs/html/nil-template-class.html: Fixed bug in documentation.
-
- * docs/html/links.html: Page updated.
-
- * docs/html/unification-dictionary.html: Incremental change to page.
-
- * docs/html/number-template-class.html: Fixed a documentation bug.
- Thanks to Norman Werner for spotting it.
-
- * docs/html/index.html: Added link to "Mailing Lists" page.
-
- * docs/html/mailing-lists.html: File added.
-
- * unifier.lisp:
- Fixed two major bugs reported by Norman Werver. Unification of
- strings and symbols and of numers and symbols was not recurring on
- VAR-UNIFY, as required; thus
-
- (unify '(?x ?x) '("asd" "qweert"))
- and
- (unify '(foo ?x baz) '(foo 42 ?x))
-
- would succed.
- The two cases are now fixed.
-
-2005-05-19 author <author@paniscia.disco.unimib.it>
-
- * README: Year updated.
-
- * ACKNOWLEDGEMENTS: File added.
-
- * ChangeLog: ChangeLog updated.
-
- * COPYING: Updated copyright notice.
-
- * docs/html/downloads.html, docs/html/index.html:
- Changed the DISCLAIMER parts in the files, in order to clarify the licensing
- of the code.
-
Thu May 19 22:52:52 UTC 2005 mantoniotti
* Updated copyright notice.
hunk ./COPYING 1
-Copyright (c) 2004 Marco Antoniotti[_^M_][_$_]
+Copyright (c) 2004-2005 Marco Antoniotti[_^M_][_$_]
hunk ./COPYING 15
-THE AUTHOR(S) UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,[_^M_][_$_]
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF[_^M_][_$_]
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE[_^M_][_$_]
-PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE AUTHOR(S) HAVE NO[_^M_][_$_]
-OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR[_^M_][_$_]
-MODIFICATIONS.[_^M_][_$_]
+THE AUTHOR(S) UNIVERSITY, COMPANY AND/OR AFFILIATION SPECIFICALLY[_^M_][_$_]
+DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED[_^M_][_$_]
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR[_^M_][_$_]
+PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND[_^M_][_$_]
+THE AUTHOR(S) HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT,[_^M_][_$_]
+UPDATES, ENHANCEMENTS, OR MODIFICATIONS.[_^M_][_$_]
Thu May 19 22:49:59 UTC 2005 mantoniotti
* Changed the DISCLAIMER parts in the files, in order to clarify the licensing
Changed the DISCLAIMER parts in the files, in order to clarify the licensing
of the code.
hunk ./docs/html/downloads.html 44
- <p>Finally, the license under which the code is released is not
- settled yet, although the file <tt>COPYING</tt> contains a
- Berkeley-style license. For the time being you are advised to use
- the code at your own risk. No warranty whatsoever is provided, the
- author will not be held responsible for any effect generated by your
- use of the library, and you can put here the scarier extra
- disclaimer you can think of.
+ <p>The file <tt>COPYING</tt> contains a Berkeley-style license. You
+ are advised to use the code at your own risk. No warranty
+ whatsoever is provided, the author will not be held responsible for
+ any effect generated by your use of the library, and you can put
+ here the scarier extra disclaimer you can think of.
hunk ./docs/html/index.html 44
- <p>Finally, the license under which the code is released is not
- settled yet, although the file <tt>COPYING</tt> contains a
- Berkeley-style license. For the time being you are advised to use
- the code at your own risk. No warranty whatsoever is provided, the
- author will not be held responsible for any effect generated by your
- use of the library, and you can put here the scarier extra
- disclaimer you can think of.
+ <p>The file <tt>COPYING</tt> contains a Berkeley-style license. You
+ are advised to use the code at your own risk. No warranty
+ whatsoever is provided, the author will not be held responsible for
+ any effect generated by your use of the library, and you can put
+ here the scarier extra disclaimer you can think of.
Wed Apr 27 21:04:59 UTC 2005 mantoniotti
* Fixed factorial example.
hunk ./docs/html/control-flow.html 71
- (#T(number ?n) (factorial (1- ?n)))
+ (#T(number ?n) (* ?n (factorial (1- ?n))))
Wed Apr 27 21:04:36 UTC 2005 mantoniotti
* Added IGNORABLE declaration to MATCH macro expansion.
Added IGNORABLE declaration to MATCH macro expansion.
This is useful in quieting various compilers.
hunk ./match-block.lisp 45
+ (declare (ignorable ,@(mapcar #'first (generate-var-bindings))))[_^M_][_$_]
hunk ./match-block.lisp 47
+ [_^M_][_$_]
+ ;; Yes. The above is sligthly wasteful.[_^M_][_$_]
+[_^M_][_$_]
Wed Apr 27 20:54:05 UTC 2005 mantoniotti
* Added acknowledgement to Peter Scott.
hunk ./match-block.lisp 130
+;;; match-case --[_^M_][_$_]
+;;; Implementation provided by Peter Scott.[_^M_][_$_]
+[_^M_][_$_]
Wed Apr 27 20:52:09 UTC 2005 mantoniotti
* Fixed bug in condition signaling within MATCH-CASE.
hunk ./match-block.lisp 169
- `(error 'unification-not-exhaustive))))[_^M_][_$_]
+ `(error 'unification-non-exhaustive[_^M_][_$_]
+ :format-control "Non exhaustive matching."))))[_^M_][_$_]
Wed Apr 27 20:44:25 UTC 2005 mantoniotti
* Fixed bugs in COLLECT-TEMPLATE-VARS for NUMBER-TEMPLATEs.
Fixed bugs in COLLECT-TEMPLATE-VARS for NUMBER-TEMPLATEs.
If a variable was present, then the method was not returning a list.
The treatment of constants like PI was also incorrect, as the numeric
value was returned. Retunrning () seems the right thing to do
instead.
hunk ./templates-hierarchy.lisp 488
- (symbol (cond ((variablep template) template)
+ (symbol (cond ((and (variablep template) (not (variable-any-p template)))
+ (list template))
hunk ./templates-hierarchy.lisp 492
- (symbol-value template))
+ ;; This handles cases like #T(number pi)
+ ;; It may be too broad, but for the time being it seems ok.
+ nil)
Wed Apr 27 20:41:56 UTC 2005 mantoniotti
* Added MATCH-CASE macro. Slightly modified from the version provided
Added MATCH-CASE macro. Slightly modified from the version provided
by Peter Scott.
hunk ./match-block.lisp 129
+[_^M_][_$_]
+(defmacro match-case ((object &key errorp default-substitution) &rest clauses)[_^M_][_$_]
+ "MATCH-CASE sets up a CASE-like environment for multiple template matching clauses.[_^M_][_$_]
+The syntax of MATCH-CASE comprises a number of clauses of the form[_^M_][_$_]
+[_^M_][_$_]
+ <clause> ::= <regular-clause> | <default-clause>[_^M_][_$_]
+ <regular-clause> ::= (<template> &body <forms>)[_^M_][_$_]
+ <default-clause> ::= (t &body <forms>)[_^M_][_$_]
+ | (otherwise &body <forms>)[_^M_][_$_]
+<form> and <forms> are regular Common Lisp forms.[_^M_][_$_]
+<template> is a unification template.[_^M_][_$_]
+[_^M_][_$_]
+The full syntax of MATCHING is[_^M_][_$_]
+[_^M_][_$_]
+ match-case <object> (&key errorp default-substitution) <clauses>[_^M_][_$_]
+[_^M_][_$_]
+Each clause evaluates its forms in an environment where the variables[_^M_][_$_]
+present in the template are bound lexically. Note that both variable[_^M_][_$_]
+names '?FOO' and 'FOO' are bound for convenience.[_^M_][_$_]
+[_^M_][_$_]
+The values returned by the MATCHING form are those of the last form in[_^M_][_$_]
+the first clause that satisfies the match test.[_^M_][_$_]
+[_^M_][_$_]
+If ERRORP is non-NIL then if none of the regular clauses matches, then[_^M_][_$_]
+an error of type UNIFICATION-NON-EXAUSTIVE is signalled, regardless of[_^M_][_$_]
+any default clause. Otherwise, the default clause behaves as a[_^M_][_$_]
+standard CASE default clause. The default value of ERRORP is NIL.[_^M_][_$_]
+"[_^M_][_$_]
+ (declare (ignore default-substitution)) ; For the time being.[_^M_][_$_]
+ (let* ((object-var (gensym "OBJECT-VAR-"))[_^M_][_$_]
+ (otherwise-clause-present-p[_^M_][_$_]
+ (member (caar (last clauses)) '(t otherwise)))[_^M_][_$_]
+ (non-otherwise-clauses[_^M_][_$_]
+ (if otherwise-clause-present-p[_^M_][_$_]
+ (butlast clauses)[_^M_][_$_]
+ clauses))[_^M_][_$_]
+ (otherwise-clause[_^M_][_$_]
+ (if otherwise-clause-present-p[_^M_][_$_]
+ (first (last clauses))[_^M_][_$_]
+ (when errorp[_^M_][_$_]
+ `(error 'unification-not-exhaustive))))[_^M_][_$_]
+ )[_^M_][_$_]
+ (labels ((generate-matchers (clauses)[_^M_][_$_]
+ (if (null clauses)[_^M_][_$_]
+ otherwise-clause[_^M_][_$_]
+ (destructuring-bind (pattern &rest body)[_^M_][_$_]
+ (car clauses)[_^M_][_$_]
+ `(handler-case (match (,pattern ,object-var)[_^M_][_$_]
+ ,@body)[_^M_][_$_]
+ (unification-failure ()[_^M_][_$_]
+ ,(generate-matchers (cdr clauses))))))))[_^M_][_$_]
+ `(let ((,object-var ,object))[_^M_][_$_]
+ ,(generate-matchers non-otherwise-clauses)))))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
Wed Apr 27 19:31:18 UTC 2005 mantoniotti
* Added unification.asd file.
addfile ./unification.asd
hunk ./unification.asd 1
+;;; -*- Mode: Lisp -*-
+
+;;; unification.asd --
+;;; ASDF system file.
+
+(asdf:defsystem unification
+ :author "Marco Antoniotti"
+ :serial t
+ :components ((:file "unification-package")
+ (:file "variables")
+ (:file "substitutions")
+ (:file "lambda-list-parsing")
+ (:file "templates-hierarchy")
+ (:file "unifier")
+ (:file "match-block")))
+
+;;; end of file -- unification.asd --
Thu Apr 21 15:33:20 UTC 2005 mantoniotti
* Fixed, but not completed, the page.
hunk ./docs/html/links.html 3
- <title>CLRFI: COMMON LISP Requests for Improvements Links</title>
+ <title>CL Unification Links</title>
hunk ./docs/html/links.html 14
- <strong><i>CLRFI: Common Lisp Requests for Improvements Links</i><string>
+ <strong><i>CL Unification Links</i><string>
hunk ./docs/html/links.html 17
- | <a href="doc.html" class="navigation-link">Documents</a>
- | <a href="faq.html" class="navigation-link">FAQ</a>
- | <a href="clrfis.html" class="navigation-link">CLRFI listing</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
hunk ./docs/html/links.html 36
- <p>Here are some links which are pertinent to the CLRFI project.</p>
+ <p>Here are some links which are pertinent to the
+ <strong>CL-UNIFICATION</strong> project.</p>
hunk ./docs/html/links.html 39
- <ul>
- <li><a href="http://srfi.schemers.org">SRFI</a></li>
-
- <li>Local <strong>Common Lisp</strong> user communities
- <ul>
- <li><a href="http://www.lispnyc.org">LispNYC</a></li>
- <li><a href="http://www.jugtouch.com/~rss/lisp">CRACL</a></li>
- </ul>
- </li>
+ <p>...</p>
hunk ./docs/html/links.html 41
- <li>Software Repositories
- <ul>
- <li><a href="http://www.common-lisp.net">common-lisp.net</a></li>
- <li>...</li>
- </ul>
- </li>
- <li>...</li>
- </ul>
hunk ./docs/html/links.html 78
+ <li><strong>2005-04-20</strong><br>
+ Fixed (but not completed) the page.
+ </li>
+
Fri Jan 28 19:46:37 UTC 2005 mantoniotti
* Added file `downloads.html'.
hunk ./docs/html/downloads.html 18
- | <a href="links.html" class="navigation-link">Links</a>
+ | <a href="links.html" class="navigation-link">Links</a>
hunk ./docs/html/downloads.html 44
- <p>The file <tt>COPYING</tt> contains a Berkeley-style license. You
- are advised to use the code at your own risk. No warranty
- whatsoever is provided, the author will not be held responsible for
- any effect generated by your use of the library, and you can put
- here the scarier extra disclaimer you can think of.
+ <p>Finally, the license under which the code is released is not
+ settled yet, although the file <tt>COPYING</tt> contains a
+ Berkeley-style license. For the time being you are advised to use
+ the code at your own risk. No warranty whatsoever is provided, the
+ author will not be held responsible for any effect generated by your
+ use of the library, and you can put here the scarier extra
+ disclaimer you can think of.
Fri Jan 28 19:45:40 UTC 2005 mantoniotti
* Minor changes to text. Fixed `download.html' link.
hunk ./docs/html/index.html 37
+ <hr>
hunk ./docs/html/index.html 53
+ <hr>
Fri Jan 28 19:30:35 UTC 2005 mantoniotti
* Fixed minor problem in Lambda List parsing.
Fixed minor problem in Lambda List parsing.
Also VALID-TEMPLATE-P was expanded, and it looks like it should become
a generic function.
hunk ./lambda-list-parsing.lisp 54
+[_^M_][_$_]
hunk ./lambda-list-parsing.lisp 59
+ (:report (lambda (llpe stream)[_^M_][_$_]
+ (format stream "Error while parsing an extended lambda-list (at ~S.)"[_^M_][_$_]
+ (lambda-list-parsing-error-item llpe))))[_^M_][_$_]
hunk ./lambda-list-parsing.lisp 64
+[_^M_][_$_]
hunk ./unifier.lisp 217
+;;; This should probably become a generic function.
hunk ./unifier.lisp 223
+ (arrayp x)
+ (typep (class-of x) 'structure-class)
+ (typep (class-of x) 'standard-class)
+ (typep (class-of x) 'built-in-class)
Wed Nov 17 22:19:54 UTC 2004 mantoniotti
* Initial revision
addfile ./.clbuild-skip-update
addfile ./ACKNOWLEDGEMENTS
hunk ./ACKNOWLEDGEMENTS 1
+A lot of pleple deserved thanks for improving CL-UNIFICATION.
+
+The Lisp NYC group has endured presentations of this code and provided
+feedback.
+
+The following individuals have provided feedback and (precious) bug
+fixes.
+
+Boldyrev, Ivan
+Korablin, Vladimir V.
+Leuner, John
+McManus, Russell
+Scott, Peter
+Werner, Norman
addfile ./COPYING
hunk ./COPYING 1
+Copyright (c) 2004 Marco Antoniotti[_^M_][_$_]
+All rights reserved.[_^M_][_$_]
+ [_^M_][_$_]
+Permission is hereby granted, without written agreement and without[_^M_][_$_]
+license or royalty fees, to use, copy, modify, and distribute this[_^M_][_$_]
+software and its documentation for any purpose, provided that the[_^M_][_$_]
+above copyright notice and the following two paragraphs appear in all[_^M_][_$_]
+copies of this software.[_^M_][_$_]
+ [_^M_][_$_]
+IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE TO ANY PARTY FOR DIRECT,[_^M_][_$_]
+INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF[_^M_][_$_]
+THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHOR(S),[_^M_][_$_]
+HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.[_^M_][_$_]
+[_^M_][_$_]
+THE AUTHOR(S) UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,[_^M_][_$_]
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF[_^M_][_$_]
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE[_^M_][_$_]
+PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE AUTHOR(S) HAVE NO[_^M_][_$_]
+OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR[_^M_][_$_]
+MODIFICATIONS.[_^M_][_$_]
+[_^M_][_$_]
addfile ./ChangeLog
hunk ./ChangeLog 1
+2009-12-17 author <author@paniscia.local>
+
+ * lib-dependent/cl-ppcre-template.asd: Initial checkin.
+
+ * lib-dependent/cl-ppcre-template.lisp:
+ Patched to use Cl-PPCRE:SCAN-TO-STRINGS (thanks to Pixel // pinterface [a] gmail dot com).
+
+ * unifier.lisp: Minor cosmetic changes.
+
+ * unification-package.lisp: Exported MATCHF-CASE.
+
+ * templates-hierarchy.lisp:
+ Fixed a couple of problems with some accessors in the NUMBER,
+ STRUCTURE-OBJECT and STANDARD-OBJECT templates.
+
+ * match-block.lisp: Added MATCHF* macros.
+
+2009-04-18 author <author@paniscia.local>
+
+ * ChangeLog: ChangeLog updated.
+
+ * cl-unification.system, cl-unification.asd:
+ System definitions files (.asd and .system) modified in order to make
+ dependency form CL-PPCRE optional.
+
+ * lib-dependent/cl-ppcre-template.system: File added.
+
+ * lib-dependent/cl-ppcre-template.lisp:
+ Removed REQUIRE of CL-PPCRE. Too brittle.
+
+ * cl-unification-lib.asd: File added.
+
+2009-04-18 author <author@Macintosh-9.local>
+
+ * cl-unification.system, cl-unification.asd:
+ System definitions files (.asd and .system) modified in order to make
+ dependency form CL-PPCRE optional.
+
+ * lib-dependent/cl-ppcre-template.system: File added.
+
+ * lib-dependent/cl-ppcre-template.lisp:
+ Removed REQUIRE of CL-PPCRE. Too brittle.
+
+ * cl-unification-lib.asd: File added.
+
+2009-04-17 author <author@Macintosh-9.local>
+
+ * unification-package.lisp:
+ Added a few exports and changed the actual package name (i.e., I put
+ my money where my mouth is; the "published" package name is now a
+ nickname).
+
+ * apply-substitution.lisp:
+ Fixed a couple of snags. APPLY-SUBSTITUTION was not applied
+ recursively and it was barfing on numbers.
+ Current version is still incomplete, but it serves as a template for
+ further development.
+
+2009-04-15 author <author@Macintosh-9.local>
+
+ * ChangeLog: ChangeLog updated.
+
+ * lib-dependent/cl-ppcre-template.lisp, test/unification-tests.lisp:
+ Modified Files:
+ test/unification-tests.lisp
+ Added Files:
+ lib-dependent/cl-ppcre-template.lisp
+
+ The cl-ppcre-template reuses E. Weitz's wonderful CL-PPCRE library
+ to provide a seamless (YMMV) reuse of regular expressions within
+ CL-UNIFICATION.
+
+ * templates-hierarchy.lisp: Added LAMBDA-TEMPLATE.
+
+ * substitutions.lisp:
+ Added some functionality to extract all variables and/or all values
+ from an environment or a frame.
+
+ * match-block.lisp:
+ Added MATCHF (whose name may change) to simplify the
+ 'destructuring-bind'-like syntax and behavior of the matching
+ facilities.
+
+ * COPYING: Dates updated.
+
+ * unifier.lisp:
+ Major API change to 'unify'. It now accepts keywords. Old code
+ shouls not be affected, but new code is now more flexible. Look the
+ the STRING and (new) CHARACTER methods to see how this change is
+ affecting the code.
+
+ * variables.lisp: Some 'diff' unfathomable change happened.
+
+ * unification-package.lisp: Added exports of a few symbols.
+
+ * cl-unification.system, cl-unification.asd:
+ Fixed a few snags and added "lib-dependent" module.
+
+ * apply-substitution.lisp: Added some functionality and comments.
+
+2009-04-15 author <author@paniscia.pd.disco.unimib.it>
+
+ * lib-dependent/cl-ppcre-template.lisp, test/unification-tests.lisp:
+ Modified Files:
+ test/unification-tests.lisp
+ Added Files:
+ lib-dependent/cl-ppcre-template.lisp
+
+ The cl-ppcre-template reuses E. Weitz's wonderful CL-PPCRE library
+ to provide a seamless (YMMV) reuse of regular expressions within
+ CL-UNIFICATION.
+
+ * templates-hierarchy.lisp: Added LAMBDA-TEMPLATE.
+
+ * substitutions.lisp:
+ Added some functionality to extract all variables and/or all values
+ from an environment or a frame.
+
+ * match-block.lisp:
+ Added MATCHF (whose name may change) to simplify the
+ 'destructuring-bind'-like syntax and behavior of the matching
+ facilities.
+
+ * COPYING: Dates updated.
+
+ * unifier.lisp:
+ Major API change to 'unify'. It now accepts keywords. Old code
+ shouls not be affected, but new code is now more flexible. Look the
+ the STRING and (new) CHARACTER methods to see how this change is
+ affecting the code.
+
+ * variables.lisp: Some 'diff' unfathomable change happened.
+
+ * unification-package.lisp: Added exports of a few symbols.
+
+ * cl-unification.system, cl-unification.asd:
+ Fixed a few snags and added "lib-dependent" module.
+
+ * apply-substitution.lisp: Added some functionality and comments.
+
+2008-07-13 author <author@paniscia.pd.disco.unimib.it>
+
+ * ChangeLog: Changelog updated.
+
+ * ACKNOWLEDGEMENTS:
+ Added credits to a few people. Missing ones should bug the maintainer :)
+
+ * README: Copyright dates updated.
+
+ * unification.asd, unification.system: Cleaning up.
+ Committing in .
+
+ Removed Files:
+ unification.asd unification.system
+
+ * templates-hierarchy-saved.lisp: Clenaing up.
+ Committing in .
+
+ Removed Files:
+ templates-hierarchy-saved.lisp
+
+ * INSTALLATION: Instructions updated.
+
+ * COPYING: Copyright dates updated.
+
+ * test/unification-tests.lisp: Added file.
+
+ * substitutions.lisp, templates-hierarchy.lisp, unification-package.lisp, variables.lisp:
+ Some modification added. Exported symbols and reverted
+ reader macro #T to construct template instances at read time.
+ Added MAKE-LOAD-FORM method for templates which should fix problem with
+ SBCL.
+
+ Committing in .
+
+ Modified Files:
+ substitutions.lisp templates-hierarchy.lisp
+ unification-package.lisp variables.lisp
+
+ * cl-unification.system:
+ Added explicit :source-extension to accomodate Allegro CL.
+
+2008-07-13 author <author@Macintosh.local>
+
+ * ACKNOWLEDGEMENTS:
+ Added credits to a few people. Missing ones should bug the maintainer :)
+
+ * README: Copyright dates updated.
+
+ * unification.asd, unification.system: Cleaning up.
+ Committing in .
+
+ Removed Files:
+ unification.asd unification.system
+
+ * templates-hierarchy-saved.lisp: Cleaning up.
+ Committing in .
+
+ Removed Files:
+ templates-hierarchy-saved.lisp
+
+ * INSTALLATION: Instructions updated.
+
+ * COPYING: Copyright dates updated.
+
+ * test/unification-tests.lisp: Added file.
+
+ * substitutions.lisp, templates-hierarchy.lisp, unification-package.lisp, variables.lisp:
+ Some modification added. Exported symbols and reverted
+ reader macro #T to construct template instances at read time.
+ Added MAKE-LOAD-FORM method for templates which should fix problem with
+ SBCL.
+
+ Committing in .
+
+ Modified Files:
+ substitutions.lisp templates-hierarchy.lisp
+ unification-package.lisp variables.lisp
+
+ * cl-unification.system:
+ Added explicit :source-extension to accomodate Allegro CL.
+
+2008-07-10 author <author@Macintosh.local>
+
+ * apply-substitution.lisp:
+ Removed EXPORT of APPLY-SUBSTITUTION as it is already in the DEFPACKAGE.
+
+2007-11-09 author <author@Macintosh.local>
+
+ * docs/html/index.html: Changed the position of the disclaimer.
+
+ * ChangeLog: ChangeLog updated.
+
+ * match-block.lisp:
+ Made several changes to improve MATCH-CASE (following a note from Ivan
+ Boldyrev from a long time ago), MATCHING and MATCH.
+
+ Else-clauses are now handled correctly (AFAICT).
+
+ Single variable templates in MATCH, MATCH-CASE and MATCHING clauses do
+ not need to be quoted.
+
+ MATCHING was generating one gensym'ed variable per clause without
+ creating an appropriate enclosing LET. This is now fixed.
+
+ * substitutions.lisp:
+ Changed the top comment and added a (:copier nil) option to the
+ ENVIRONMENT defstruct, as COPY-ENVIRONMENT is defined later in the
+ file.
+
+ * cl-unification.system, cl-unification.asd:
+ Added the new system building files with more meaningful names
+ w.r.t. the name of the library.
+
+ * unification.asd, unification.system:
+ Marked the two system building files as 'obsolete', before removing
+ them from the repository. The new files are prefixed by 'cl-'.
+
+2007-11-09 author <author@papadopoulou-2.ydras.offices.>
+
+ * match-block.lisp:
+ Made several changes to improve MATCH-CASE (following a note from Ivan
+ Boldyrev from a long time ago), MATCHING and MATCH.
+
+ Else-clauses are now handled correctly (AFAICT).
+
+ Single variable templates in MATCH, MATCH-CASE and MATCHING clauses do
+ not need to be quoted.
+
+ MATCHING was generating one gensym'ed variable per clause without
+ creating an appropriate enclosing LET. This is now fixed.
+
+ * substitutions.lisp:
+ Changed the top comment and added a (:copier nil) option to the
+ ENVIRONMENT defstruct, as COPY-ENVIRONMENT is defined later in the
+ file.
+
+ * cl-unification.system, cl-unification.asd:
+ Added the new system building files with more meaningful names
+ w.r.t. the name of the library.
+
+ * unification.asd, unification.system:
+ Marked the two system building files as 'obsolete', before removing
+ them from the repository. The new files are prefixed by 'cl-'.
+
+2007-05-21 author <author@papadopoulou-2.ydras.offices.>
+
+ * ChangeLog: ChangeLog updated.
+
+ * README, ACKNOWLEDGEMENTS, COPYING, INSTALLATION:
+ Updated copyrights dates and changed a few instructions in the
+ INSTALLATION file.
+
+ * docs/html/index.html: Updated copyrights dates.
+
+ * ChangeLog: ChangeLog updated.
+
+ * unification-package.lisp, unification.asd, apply-substitution.lisp, match-block.lisp, substitutions.lisp:
+ See previous message.
+
+ * unification.system:
+ Added file 'apply-substitition.lisp' with a few new functions that are
+ a start for the variable substitition operation.
+
+ New fixes to the MATCH and MATCH-CASE macros. They should now work as
+ advertised.
+
+ Minor changes to other files: added exports to package file, fixed
+ .system and .asd files.
+
+2007-05-21 author <author@Paniscia-di-Marco-Antoniotti.local>
+
+ * README, ACKNOWLEDGEMENTS, COPYING, INSTALLATION:
+ Updated copyrights dates and changed a few instructions in the
+ INSTALLATION file.
+
+ * docs/html/index.html: Updated copyrights dates.
+
+ * ChangeLog: ChangeLog updated.
+
+ * unification-package.lisp, unification.asd, apply-substitution.lisp, match-block.lisp, substitutions.lisp:
+ See previous message.
+
+ * unification.system:
+ Added file 'apply-substitition.lisp' with a few new functions that are
+ a start for the variable substitition operation.
+
+ New fixes to the MATCH and MATCH-CASE macros. They should now work as
+ advertised.
+
+ Minor changes to other files: added exports to package file, fixed
+ .system and .asd files.
+
+2007-05-21 author <author@paniscia.disco.unimib.it>
+
+ * unification.system:
+ Added file 'apply-substitition.lisp' with a few new functions that are
+ a start for the variable substitition operation.
+
+ New fixes to the MATCH and MATCH-CASE macros. They should now work as
+ advertised.
+
+ Minor changes to other files: added exports to package file, fixed
+ .system and .asd files.
+
+2006-07-19 author <author@paniscia.disco.unimib.it>
+
+ * templates-hierarchy.lisp, unifier.lisp:
+ Fixed two problems with the unifier machinery.
+
+ The first one had to do with the matching of NIL against SYMBOL and LIST
+ in several places: essentially, the problem is incongruencies in the
+ results of COMPUTE-APPLICABLE-METHODS in these cases. I think I caught
+ most of them: unification of lists and the occur-check were the obvious
+ places where things went awry.
+
+ The second problem had to do with the reader macro #T. The original
+ code generated an object at read time, which is not such a good idea.
+ Now the code generates a call to MAKE-TEMPLATE with is evaluated later.
+ Incidentally, the reader macro function is now called |sharp-T-reader|, in
+ order to placate Emacs fontification.
+
+ Modified Files:
+ templates-hierarchy.lisp unifier.lisp
+
+ * unification-package.lisp: Added missing export.
+
+2005-10-25 author <author@paniscia.disco.unimib.it>
+
+ * unifier.lisp: Fixed problem with the unification of a list with a
+ SEQUENCE-TEMPLATE. The implementation was not checking that the
+ length of the list was compatible with the length of the required
+ elements in the template.
+
+ Apart from that, keyword matching is still unimplemented.
+
+ * match-block.lisp:
+ Fixed problem with checking the presence of T and OTHERWISE clauses in
+ MATCHING.
+
+2005-07-25 author <author@paniscia.disco.unimib.it>
+
+ * docs/html/downloads.html: Minor cleanup.
+
+2005-05-20 author <author@paniscia.disco.unimib.it>
+
+ * docs/html/links.html: Fixed typos.
+
+ * docs/html/nil-template-class.html: Fixed bug in documentation.
+
+ * docs/html/links.html: Page updated.
+
+ * docs/html/unification-dictionary.html: Incremental change to page.
+
+ * docs/html/number-template-class.html: Fixed a documentation bug.
+ Thanks to Norman Werner for spotting it.
+
+ * docs/html/index.html: Added link to "Mailing Lists" page.
+
+ * docs/html/mailing-lists.html: File added.
+
+ * unifier.lisp:
+ Fixed two major bugs reported by Norman Werver. Unification of
+ strings and symbols and of numers and symbols was not recurring on
+ VAR-UNIFY, as required; thus
+
+ (unify '(?x ?x) '("asd" "qweert"))
+ and
+ (unify '(foo ?x baz) '(foo 42 ?x))
+
+ would succed.
+ The two cases are now fixed.
+
+2005-05-19 author <author@paniscia.disco.unimib.it>
+
+ * README: Year updated.
+
+ * ACKNOWLEDGEMENTS: File added.
+
+ * ChangeLog: ChangeLog updated.
+
+ * COPYING: Updated copyright notice.
+
+ * docs/html/downloads.html, docs/html/index.html:
+ Changed the DISCLAIMER parts in the files, in order to clarify the licensing
+ of the code.
+
+2005-05-19 mantoniotti <mantoniotti@vault>
+
+ * COPYING: Updated copyright notice.
+
+ * docs/html/downloads.html, docs/html/index.html:
+ Changed the DISCLAIMER parts in the files, in order to clarify the licensing
+ of the code.
+
+2005-04-27 mantoniotti <mantoniotti@vault>
+
+ * docs/html/control-flow.html: Fixed factorial example.
+
+ * match-block.lisp:
+ Added IGNORABLE declaration to MATCH macro expansion.
+ This is useful in quieting various compilers.
+
+ * match-block.lisp: Added acknowledgement to Peter Scott.
+
+ * match-block.lisp: Fixed bug in condition signaling within MATCH-CASE.
+
+ * templates-hierarchy.lisp:
+ Fixed bugs in COLLECT-TEMPLATE-VARS for NUMBER-TEMPLATEs.
+ If a variable was present, then the method was not returning a list.
+ The treatment of constants like PI was also incorrect, as the numeric
+ value was returned. Retunrning () seems the right thing to do
+ instead.
+
+ * match-block.lisp:
+ Added MATCH-CASE macro. Slightly modified from the version provided
+ by Peter Scott.
+
+ * unification.asd: Added unification.asd file.
+
+2005-04-21 mantoniotti <mantoniotti@vault>
+
+ * docs/html/links.html: Fixed, but not completed, the page.
+
+2005-01-28 mantoniotti <mantoniotti@vault>
+
+ * docs/html/downloads.html: Added file `downloads.html'.
+
+ * docs/html/index.html:
+ Minor changes to text. Fixed `download.html' link.
+
+ * lambda-list-parsing.lisp, unifier.lisp:
+ Fixed minor problem in Lambda List parsing.
+ Also VALID-TEMPLATE-P was expanded, and it looks like it should become
+ a generic function.
+
+2004-11-17 mantoniotti <mantoniotti@vault>
+
+ * docs/html/images/unif-templ-hier.pcl, docs/html/images/unif-templ-hier.ps:
+ Initial import.
+
+ * docs/html/images/unif-templ-hier.pcl, docs/html/images/unif-templ-hier.ps:
+ New file.
+
+ * docs/html/images/Thumbs.db, docs/html/images/Thumbs.db:encryptable, docs/html/images/header_bg.gif, docs/html/images/header_bg_1.gif, docs/html/images/shim.gif, docs/html/images/unif-templ-hier.gif, docs/html/images/unif-templ-hier.pdf, docs/html/images/unif-templ-hier.sxd, docs/html/make-shared-environment-function.html, docs/html/match-case-macro.html, docs/html/standard-object-template-class.html, docs/html/string-template-class.html, docs/html/structure-object-template-class.html, docs/html/subseq-template-class.html:
+ Initial import.
+
+ * docs/html/images/Thumbs.db, docs/html/images/Thumbs.db:encryptable, docs/html/images/header_bg.gif, docs/html/images/header_bg_1.gif, docs/html/images/shim.gif, docs/html/images/unif-templ-hier.gif, docs/html/images/unif-templ-hier.pdf, docs/html/images/unif-templ-hier.sxd, docs/html/make-shared-environment-function.html, docs/html/match-case-macro.html, docs/html/standard-object-template-class.html, docs/html/string-template-class.html, docs/html/structure-object-template-class.html, docs/html/subseq-template-class.html:
+ New file.
+
+ * docs/html/.DS_Store, docs/html/aref-template-class.html, docs/html/array-template-class.html, docs/html/control-flow.html, docs/html/dictionary.html, docs/html/element-template-class.html, docs/html/elt-template-class.html, docs/html/expression-template-class.html, docs/html/find-variable-value-function.html, docs/html/hash-t-read-macro.html, docs/html/index.html, docs/html/links.html, docs/html/list-template-class.html, docs/html/main.css, docs/html/make-empty-environment-function.html, docs/html/match-macro.html, docs/html/matching-macro.html, docs/html/nil-template-class.html, docs/html/nth-template-class.html, docs/html/nthcdr-template-class.html, docs/html/number-template-class.html, docs/html/sequence-template-class.html, docs/html/symbol-template-class.html, docs/html/template-class.html, docs/html/template-p-function.html, docs/html/template-spec-accessor.html, docs/html/templates.html, docs/html/type-template-class.html, docs/html/unification-dictionary.html, docs/html/unify-function.html, docs/html/unify-package.html, docs/html/unifying-substitutions.html, docs/html/usci-variable.html, docs/html/vector-template-class.html, unification-package.lisp, unification.system, unifier.lisp, variables.lisp:
+ Initial import.
+
+ * docs/html/.DS_Store, docs/html/aref-template-class.html, docs/html/array-template-class.html, docs/html/control-flow.html, docs/html/dictionary.html, docs/html/element-template-class.html, docs/html/elt-template-class.html, docs/html/expression-template-class.html, docs/html/find-variable-value-function.html, docs/html/hash-t-read-macro.html, docs/html/index.html, docs/html/links.html, docs/html/list-template-class.html, docs/html/main.css, docs/html/make-empty-environment-function.html, docs/html/match-macro.html, docs/html/matching-macro.html, docs/html/nil-template-class.html, docs/html/nth-template-class.html, docs/html/nthcdr-template-class.html, docs/html/number-template-class.html, docs/html/sequence-template-class.html, docs/html/symbol-template-class.html, docs/html/template-class.html, docs/html/template-p-function.html, docs/html/template-spec-accessor.html, docs/html/templates.html, docs/html/type-template-class.html, docs/html/unification-dictionary.html, docs/html/unify-function.html, docs/html/unify-package.html, docs/html/unifying-substitutions.html, docs/html/usci-variable.html, docs/html/vector-template-class.html, unification-package.lisp, unification.system, unifier.lisp, variables.lisp:
+ New file.
+
+ * COPYING, INSTALLATION, README, lambda-list-parsing.lisp, match-block.lisp, substitutions.lisp, templates-hierarchy-saved.lisp, templates-hierarchy.lisp:
+ Initial import.
+
+ * COPYING, INSTALLATION, README, lambda-list-parsing.lisp, match-block.lisp, substitutions.lisp, templates-hierarchy-saved.lisp, templates-hierarchy.lisp:
+ New file.
+
addfile ./INSTALLATION
hunk ./INSTALLATION 1
+CL-UNIFICATION INSTALLATION
+
+The package comes with a MK:DEFSYSTEM definition:
+"unification.system".
+
+Issuing
+
+ (mk:load-system "unification")
+
+or
+
+ (mk:compile-system "unification")
+
+will make the UNIFY package available.
+
+If your CL implementation is ASDF-INSTALL aware, you should also be
+able to just say
+
+ (asdf-install:install "unification")
+
+provided that the package is unpacked in an ASDF-INSTALL known
+directory.
+
+Enjoy
addfile ./README
hunk ./README 1
+CL-UNIFICATION
+
+Marco Antoniotti 2004
+
+The directory containing this file you are reading should contain the
+code and the documentation of the CL-UNIFICATION package.
+
+The package is a full-blown library to "unify" arbitrary CL objects
+while constructing bindings for placeholders (unification variables)
+in a "template" sublanguage.
+
+Enjoy.
addfile ./apply-substitution.lisp
hunk ./apply-substitution.lisp 1
+;;; -*- Mode: Lisp -*-
+
+;;; substitutions.lisp
+;;; General CL structures unifier.
+;;; Substitution definitions.
+
+(in-package "CL.EXT.DACF.UNIFICATION") ; DACF = Data And Control Flow.
+
+;;;---------------------------------------------------------------------------
+;;; Substitution application.
+
+;;; apply-substitution --
+;;;
+;;; EXCLUDE-VARS are variables that will just pass through (a list for
+;;; the time being).
+
+(defgeneric apply-substitution (substitution item &optional exclude-vars))
+
+
+(defmethod apply-substitution ((s environment) (n number) &optional exclude-vars)
+ (declare (ignore exclude-vars))
+ n)
+
+
+(defmethod apply-substitution ((substitution environment) (s symbol)
+ &optional (exclude-vars ()))
+ (declare (type list exclude-vars))
+ (cond ((variable-any-p s) s)
+ ((variablep s)
+ (if (member s exclude-vars :test #'eq)
+ s
+ (multiple-value-bind (val foundp)
+ (find-variable-value s substitution)
+ (cond (foundp (apply-substitution substitution val exclude-vars))
+ (t (warn "~S is a free variable in the current environment."
+ s)
+ s))))
+ )
+ (t s)))
+
+
+(defmethod apply-substitution ((substitution environment) (l cons)
+ &optional (exclude-vars ()))
+ (declare (type list exclude-vars))
+ (cons (apply-substitution substitution (first l) exclude-vars)
+ (apply-substitution substitution (rest l) exclude-vars)))
+
+
+(defmethod apply-substitution ((substitution environment) (l null)
+ &optional exclude-vars)
+ (declare (ignore exclude-vars))
+ '())
+
+
+;;; compose-substitions --
+;;; The definition is a direct translation of TPL's definition at page 318.
+;;; Usually these are done by directly composing and currying
+;;; functions in ML/Haskell derivatives, but that is just being "lazy".
+;;; The current definition may be too "eager", but the "correct"
+;;; semantics should be preserved.
+
+(defun compose-substitutions (env2 env1) ; note the order.
+ (declare (type environment env2 env1))
+
+ (loop for env1-frame in (environment-frames env1)
+ collect
+ (loop for (var . term) in (frame-bindings env1-frame)
+ collect (make-binding var (apply-substitution env2 term))
+ into result-bindings
+ finally (return (make-frame result-bindings)))
+ into frames
+ finally (return (make-environment :frames frames))))
+ [_$_]
+ [_$_]
+
+
+;;; ground-term --
+
+(defun ground-term (term &optional (substitution (make-empty-environment)))
+ (apply-substitution substitution term))
+
+
+;;; end of file -- apply-substitutions.lisp --
addfile ./cl-unification-lib.asd
hunk ./cl-unification-lib.asd 1
+;;;; -*- Mode: Lisp -*-
+
+;;;; cl-unification-lib.asd --
+;;;; ASDF system file.
+
+(asdf:defsystem :cl-unification-lib
+ :author "Marco Antoniotti"
+ :components ((:module "lib-dependent"
+ :components ((:file "cl-ppcre-template"))))
+ :depends-on (cl-ppcre cl-unification))
+
+;;;; end of file -- cl-unification-lib.asd --
addfile ./cl-unification.asd
hunk ./cl-unification.asd 1
+;;;; -*- Mode: Lisp -*-
+
+;;;; cl-unification.asd --
+;;;; ASDF system file.
+
+;;;;===========================================================================
+;;;; Simple stuff that should be built in ASDF.
+
+(defpackage "CL-UNIFICATION-SYSTEM" (:use "CL" "ASDF"))
+
+(in-package "CL-UNIFICATION-SYSTEM")
+
+(defclass asdf-system-definition-file (asdf:cl-source-file) ())
+(defmethod source-file-type ((c asdf-system-definition-file) (s module)) "asd")
+
+
+(asdf:defsystem :cl-unification
+ :author "Marco Antoniotti"
+ :serial t
+ :components ((:file "unification-package")
+ (:file "variables")
+ (:file "substitutions")
+ (:file "lambda-list-parsing")
+ (:file "templates-hierarchy")
+ (:file "unifier")
+ (:file "match-block")
+ (:file "apply-substitution")
+ #+asdf-with-optional-dependencies
+ (:module "lib-dependent"
+ :pathname "lib-dependent"
+ :depends-on ("templates-hierarchy" "unifier")
+ :components ((:file "cl-ppcre-template"
+ :depends-on (cl-ppcre))
+ ))
+ #-asdf-with-optional-dependencies
+ (asdf-system-definition-file
+ "cl-unification-lib")
+ ))
+
+;;;; end of file -- cl-unification.asd --
addfile ./cl-unification.system
hunk ./cl-unification.system 1
+;;;; -*- Mode: Lisp -*-
+
+;;;; cl-unification.system --
+;;;; MK:DEFSYSTEM system file.
+
+(mk:defsystem "CL-UNIFICATION"
+ :source-extension "lisp"
+ :components ("unification-package"
+ "variables"
+ "substitutions"
+ "lambda-list-parsing"
+ "templates-hierarchy"
+ "unifier"
+ "match-block"
+ "apply-substitution"
+ (:module "lib-dependent"
+ :depends-on ("templates-hierarchy" "unifier")
+ :components ((:subsystem "cl-ppcre-template"
+ :non-required-p t
+ )
+ ))
+ ))
+ [_$_]
+;;; end of file -- cl-unification.system --
adddir ./docs
adddir ./docs/html
addfile ./docs/html/aref-template-class.html
hunk ./docs/html/aref-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class AREF-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class AREF-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>AREF-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ AREF-TEMPLATE, ELEMENT-TEMPLATE, EXPRESSION-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The AREF-TEMPLATE class denotes those object that are used
+ to unify against a particular element of an ARRAY.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>aref</b> (<i>index1</i> ... <i>indexN</i>) <i>item</i>)
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ #T(<b>aref</b> <i>index</i> <i>item</i>)
+ </pre>
+ </p>
+
+ <p>The AREF-TEMPLATE syntax denotes the <i>item</i> at
+ <i>index1</i> ... <i>indexN</i> of an ARRAY. An AREF-TEMPLATE must
+ be unified against a ARRAY object. <i>item</i> is <em>unified</em>
+ against the element extracted from the sequence object at
+ <i>index1</i> ... <i>indexN</i> by the standard function AREF.</p>
+
+ <p>The second form is a shorthand.</p>
+ <p>
+ <pre>
+ #T(<b>aref</b> <i>index</i> <i>item</i>) <==> #T(<b>aref</b> (<i>index</i>) <i>item</i>)
+ </pre>
+ </p>
+ [_$_]
+
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify #(0 1 42 3 4 5) #T(<b>aref</b> 2 ?x)))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ 42
+
+ cl-prompt> (setq e (unify #(0 1 42 3 4 5) #T(<b>aref</b> 42 ?x)))
+ --> Error: index 42 out of bounds.
+
+
+ cl-prompt> (setq e (unify 42 #T(<b>aref</b> 42 ?x)))
+ --> Error: UNIFICATION-FAILURE
+
+
+ cl-prompt> (setq e (unify "This is a string!" #T(<b>aref</b> 4 ?x)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ #\Space [_$_]
+
+
+ cl-prompt> (setq e (unify #2A((1 0) (foo bar)) #T(<b>aref</b> (1 1) ?x)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ BAR
+
+
+ cl-prompt> (setq e (unify #2A((1 0) (foo bar)) #T(<b>aref</b> (1 1) baz)))
+ --> Error: UNIFICATION-FAILURE
+
+
+ cl-prompt> (setq e (unify #2A((1 0) (foo ?x)) #T(<b>aref</b> (1 1) baz)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ BAZ
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an AREF-TEMPLATE against a non-ARRAY object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/array-template-class.html
hunk ./docs/html/array-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class ARRAY-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class ARRAY-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>ARRAY-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ ARRAY-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ VECTOR-TEMPLATE.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The ARRAY-TEMPLATE class denotes those object that are used
+ to unify against an ARRAY.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>array</b> <i><shape-template></i>)
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ #T(<i><<strong>CL</strong> array type specifier></i> <i><shape-template></i>)
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ #T(<b>array</b> ([* | <i><<strong>CL</strong> type specifier></i>] [<i><dimension sped></i>]) <i><shape-template></i>)
+ </pre>
+ </p>
+
+ <p>Where <i><shape-template></i> can be:</p>
+
+ <p>
+ <pre>
+ <i><shape-template></i> ::= <i><sequence-template></i>
+ | <i><destructuring template lambda list></i>
+ | (<i><shape-template></i>)
+ </pre>
+ </p>
+ [_$_]
+
+ <p>The ARRAY-TEMPLATE syntax denotes an ARRAY object. An
+ ARRAY-TEMPLATE must be unified against an ARRAY object. The elements
+ of the array must be unified against the
+ <i><shape-template></i>. Each row of the array is unified
+ recursively against each element of the <i><shape-template></i>.
+
+
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify #(0 1 42 3 4 5) #T(<b>array</b> (0 1 ?x 3 4 5))))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ 42
+
+ cl-prompt> (setq e (unify #(0 1 42 3 4 5) #T(<b>array</b> (0 1 "FOO" 3 4 5))))
+ --> Error: UNIFICATION-FAILURE
+
+ cl-prompt> (setq e (unify #2A((0 1 42) (3 4 5)) #T(<b>array</b> ((0 1 ?x) (3 4 5)))))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+
+ cl-prompt> (setq e (unify #2A(("foo" "bar" 42) (3 4 5)) #T(<b>array</b> ((_ _ ?x) (3 4 5)))))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+
+ cl-prompt> (setq e (unify #2A(("foo" "bar" 42) (3 4 5)) #T(<b>array</b> (#T(vector _ &rest ?x) (3 4 5)))))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ #("bar" 42)
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an ARRAY-TEMPLATE against a non-ARRAY object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <h3>Syntax Note</h3>
+
+ <p>The ARRAY-TEMPLATE syntax tries to be easy to use, at the cost of
+ being overloaded. There is no actual need to have the separate
+ forms <code>(<b>array</b> (fixnum) ...)</code> and
+ <code>((<b>array</b> fixnum) ...)</code>.</p>
+
+ <p>In a future release they may be conflated. For the time being
+ they are kept separate as it is unclear which would be better to
+ provide.</p>
+
+ <h3>Elements Unification</h3>
+
+ <p>It would be nice to have the possibility to unify against
+ <em>slices</em> of the array. Alas, this seems non trivial to get
+ right, and it is left as a future extension of the semantics of
+ <i><shape-template></i>.</p>
+
+ <h3>ARRAY Structural Properties</h3>
+
+ <p>There is no way to "unify" against structural properties of
+ vectors like fill pointers and displacements.</p>
+
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/control-flow.html
hunk ./docs/html/control-flow.html 1
+<html>
+ <head>
+ <title>CL Control Flow</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Extensions: CONTROL FLOW</i><string>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link-selected">Home</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>Control Flow</h1>
+
+ <p>In order to make the use of the UNIFICATION library easier, a few
+ utility macros are provided. The macros MATCH, MATCHING, and
+ MATCH-CASE can be used to unify two (or more) objects and then to
+ build a lexical environment where the variables present in the to
+ objects (or templates) are bound to the values resulting from the
+ application of UNIFY.</p>
+
+ <p>
+ <ul>
+ <li>MATCH is a "single shot" macro. It does one unification and
+ executes forms in an appropriate lexical environment.</li>
+
+ <li>MATCH-CASE is equivalent to CASE. It tries to match a single
+ object (or template) against a set of clauses. The forms associated
+ to the first clause for which there is a successful unification, are
+ then executed within an appropriate lexical environment.
+
+ <li>MATCHING is equivalent to COND. Each clause contains a
+ <em>head</em consisting of two objects to be unified. The first
+ clause whose head unifies sucessfully has its associated forms
+ executed within an appropriate lexical environment.
+ </ul>
+ </p>
+
+
+ <h1>Examples</h1>
+
+ <p>These macros allow the construction of interesting <em>pattern
+ matching</em> like code.</p>
+
+ <p>
+ <pre>
+ (defun factorial (x)
+ (<b>match-case</b> (x)
+ (0 1)
+ (#T(number ?n) (factorial (1- ?n)))
+ (otherwise (error "Incorrect match for ~S." x))))
+ </pre>
+ </p>
+
+ <p>Or consider the more interesting piece of code from a not-so
+ hypothetical Red-Black tree implementation (<em>cfr.</em> [<a
+ href="#O98">O98</a>].) The function BALANCE is the key part of the
+ rebalancing act played by Red-Black trees.</p>
+
+ <p>
+ <pre>
+ (defstruct (tree-node (:conc-name tn-)
+ (:constructor mk-tn (color left elem right)))
+ color
+ left
+ elem
+ right)
+
+ (defun balance (&rest balancing-arguments)
+ (<b>match-case</b> (balancing-arguments)
+ ((:black #T(tree-node tn-color :red
+ tn-left #T(tree-node tn-color :red
+ tn-left ?a
+ tn-elem ?x
+ tn-right ?b)
+ tn-elem ?y
+ tn-right ?c)
+ ?z
+ ?d)
+ (mk-tn :red (mk-tn :black ?a ?x ?b) ?y (mk-tn :black ?c ?z ?d)))
+ ((:black #T(tree-node tn-color :red
+ tn-left ?a
+ tn-elem ?x
+ tn-right #T(tree-node tn-color :red
+ tn-left ?b
+ tn-elem ?y
+ tn-right ?c))
+ ?z
+ ?d)
+ (mk-tn :red (mk-tn :black ?a ?x ?b) ?y (mk-tn :black ?c ?z ?d)))
+ ((:black ?a
+ ?x
+ #T(tree-node tn-color :red
+ tn-left #T(tree-node tn-color :red
+ tn-left ?b
+ tn-elem ?y
+ tn-right ?c)
+ tn-elem ?z
+ tn-right ?d))
+ (mk-tn :red (mk-tn :black ?a ?x ?b) ?y (mk-tn :black ?c ?z ?d)))
+ ((:black ?a
+ ?x
+ #T(tree-node tn-color :red
+ tn-left ?b
+ tn-elem ?y
+ tn-left #T(tree-node tn-color :red
+ tn-left ?c
+ tn-elem ?z
+ tn-right ?d)))
+ (mk-tn :red (mk-tn :black ?a ?x ?b) ?y (mk-tn :black ?c ?z ?d)))
+ ((?color ?left ?elem ?right)
+ (mk-tn ?color ?left ?elem ?right))))
+ </pre>
+ </p>
+
+ <p>This version of BALANCE is more verbose than the one given in [<a
+ href="#O98">O98</a>], but it preserves the general elegance of the
+ ML implementation.</p>
+
+
+
+ <h1>Control Flow Dictionary</h1>
+
+ <ul>
+ <li><a href="match-macro.html"><i>Macro</i> <b>MATCH</b></a>
+ <li><a href="matching-macro.html"><i>Macro</i> <b>MATCHING</b></a>
+ <li><a href="match-case-macro.html"><i>Macro</i> <b>MATCH-CASE</b></a>
+ </ul>
+ [_$_]
+
+
+ <h1>Notes</h1>
+
+ <h2>Other Forms</h2>
+
+ <p>It would be obvious to add the macros EMATCH-CASE and
+ CMATCH-CASE, for symmetry with ECASE and CCASE. Also, MATCHING
+ could be renamed to MATCH-COND.</p>
+
+
+ <h2>Current Implementation Details</h2>
+
+ <p>The current implementations of MATCHING and MATCH-CASE do not
+ handle user supplied environments yet.</p>
+
+
+ <h2>References</h2>
+
+ <p>
+ <a name="O98">[O98]</a> C. Okasaki, <i>Purely Functional Data
+ Structures</i>, Cambridge University Press, 1998.
+
+
+<!--
+;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;;
+;;; Permission to use, modify, and redistribute this code is hereby
+;;; granted.
+;;; The code is provided AS IS with NO warranty whatsoever. The author
+;;; will not be held liable etc etc etc etc etc.
+-->
+
+ <h2>Site Map</h2>
+
+
+ <p>Enjoy!</p>
+
+
+
+ <hr>
+ <p>Questions? Queries? Suggestions? Comments? Please direct them
+ at <a href="mailto:marcoxa_PROVA_A_SPAMMARME@alu.org">me</a>.
+ </p>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Document created
+ </li>
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/dictionary.html
hunk ./docs/html/dictionary.html 1
+<html>
+ <head>
+ <title>CL Unification Dictionary</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Extensions: UNIFICATION Dictionary</i><string>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="index.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>Common Lisp Extensions: UNIFICATION Dictionary</h1>
+
+ <p>The notion of <em>unification</em> originated in the field of
+ formal logic (e.g. Robinson, 1956) and has been used extensively in
+ Computer Science and Programming Languages. <strong>Prolog</strong>
+ obviously uses the full power of unification, however, unification
+ is also at the core of <em>type checking</em> algorithms in the
+ tradition of Milner's, and a limited form - <em>pattern
+ matching</em> - is available to the user in languages of the ML and
+ Haskell family.</p>
+
+ <p>The library presented in these pages provides a full blown
+ <em>unification framework</em> for <strong>Common Lisp</strong>.</p>
+
+ <p>Writing a pattern matcher or a an unifier in <strong>Common
+ Lisp</strong> is easy, as long as we limit ourselves to manipulate
+ only ATOMs and CONSes.</p>
+
+ <p>Alas, it would be much nicer if we could manipulated arbitrary
+ <strong>Common Lisp</strong> objects as the ML programmer can with
+ arbitrary ML objects.<p>
+
+ <p>The library presented here is the first one (to the best of the
+ author's knowledge) that is capable of manipulating arbitrary
+ <strong>Common Lisp</strong> objects.</p>
+
+ <p>The hope is that this library could be incorporated directly in
+ an implementation in order to provide better type checking.</p>
+
+ <p>This should not come as a surprise, as a compiler like CMUCL does
+ include a type inference engine, which does very similar things.</p>
+
+ <h2>Unification Basics</h2>
+ [_$_]
+ <p>The unification process makes sure that two <em>object
+ descriptions</em> containing some <em>holes</em>
+ - i.e. <em>variables</em> - can be made equal (almost in the EQUALP
+ sense) by assigning <em>consistent</em> values to the variables
+ involved.</p>
+
+ <p>Suppose we had a function U performing unification and returning
+ a set of <em>variable assignments</em>, often called a
+ <em>substitution</em>. A very simple [_$_]
+ example involving the unification of two numbers could be
+ <pre>
+ <b>U</b>(42, 42) ==> {}
+ </pre>
+ The two numbers are EQL, so no variable is involved and the empty
+ substitution is returned.
+ <pre>
+ <b>U</b>(42, 123) ==> <unification failure>
+ </pre>
+ The two numbers are not EQL, so the unification fails.
+ <pre>
+ <b>U</b>(42, x) ==> {x -> 42}
+ </pre>
+ The only way to make the unification process to succeed is to bind
+ the value 42 to the variable <code>x</code>.</p>
+
+ <p>The UNIFICATION library defines all the necessary functions and a
+ <em>unification sub-language</em> to handle most of <strong>Common
+ Lisp</strong>.</p>
+
+ <h2>UNIFICATION Library</h2>
+
+ <p>The UNIFICATION library has one main entry point, the generic function
+ UNIFY, and a sub-language definition that allows us to talk about
+ <strong>Common Lisp</strong> objects.</p>
+
+ <p>The UNIFY generic function has the following signature:
+ <pre>
+ <b>unify</b> <i>x</i> <i>y</i> &optional <i>substitution</i>
+ </pre>
+ Where <code><i>x</i></code> and <code><i>y</i></code> are either
+ arbitrary <strong>Common Lisp</strong> objects, <em>variables</em>,
+ or <em>object templates</em>. These items constitute the so-called
+ <em>extended terms</em> manipulated by the unification
+ machinery.</p>
+
+ <p><em>Variables</em> are symbols with a <code>#\?</code> as the
+ first character of the name. This is a rather traditional choice,
+ although a different one based on quoted symbols is possible.
+ Therefore, the following are examples of variables.
+ <pre>
+ ?A ?s ?qwe ?42z ?a-variable-with-a-very-long-name ?_
+ </pre>
+ There are two special variables, <code>?_</code> and <code>_</code>,
+ which are used as anonymous place holders, they match anything, but
+ never appear in a substitution.</p>
+
+ <p>Hence, the above examples result in the following
+ <pre>
+ cl-prompt> (<b>unify</b> 42 42)
+ <i>#<EMPTY ENVIRONMENT xxxxxx></i>
+ </pre>
+
+ <pre>
+ cl-prompt> (<b>unify</b> 42 123)
+ ==> error: unification failure
+ </pre>
+
+ <pre>
+ cl-prompt> (<b>unify</b> 42 ?x)
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?x *)
+ <i>42</i>
+ </pre>
+ </p>
+ Where FIND-VARIABLE-VALUE is the accessor used to find the value of
+ a variable in a substitution.</p>
+
+ <p>As a more complicated example, consider the usual CONS based
+ unification
+ <pre>
+ cl-prompt> (<b>unify</b> '(foo (bar frobboz) ?baz) '(foo ?gnao 42))
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?gnao *)
+ <i>(BAR FROBBOZ)</i>
+
+ cl-prompt> (<b>find-variable-value</b> '?baz **)
+ <i>42</i>
+ </pre>
+
+ <p>Of course note the following behavior
+ <pre>
+ cl-prompt> (<b>unify</b> '(foo ?x 42) '(foo 42 ?x))
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>unify</b> '(foo ?x 42) '(foo baz ?x))
+ ==> error: unification failure
+ </pre>
+ </p>
+ [_$_]
+
+ <p>UNIFY works also on arrays and vectors. Strings are treated as
+ atomic objects
+ <pre>
+ cl-prompt> (<b>unify</b> #(1 2 3) #(1 ?x ?y))
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?x *)
+ <i>2</i>
+ </pre>
+
+ <pre>
+ cl-prompt> (<b>unify</b> #2A((1 2 3) (a s ?z)) #2A((1 ?x ?y) (a s d)))
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?z *)
+ <i>D</i>
+ </pre>
+ </p>
+
+ <p>So far so good, but how can you unify two structures? First of
+ all there is no portable way (yet) to list all the slots of a given
+ structure. Secondly, by allowing the unification of arbitrary
+ CONSes, we have created a short-circuit in the unification
+ machinery.</p>
+
+ <p>Dealing with object instances raises similar problems.</p>
+
+ <p>Suppose we have the following definition
+ <pre>
+ (defstruct foo a s d)
+ </pre>
+ The straighforward
+ <pre>
+ (<b>unify</b> #S(FOO A 42 S NIL D NIL) (make-foo :a 42))
+ </pre>
+ cannot be built portably, besides, we do not even have the equivalent of the
+ <code>#S(...)</code> notation for regular CLOS objects. Moreover we want
+ to do other things with other data types.</p>
+
+ <p>A simple solution is to define a <em>template sub-language</em>
+ to express unifications between structure objects or standard
+ objects (and other data types as well.) Nevertheless, the
+ definition of such sub-language cannot be CONS based, because in
+ such case, we would conflate arbitrary CONSes and the expressions of
+ the sub-language.</p>
+
+ <p>To circumvent this problem we resort to the usual trick a ML
+ programmer uses to placate the type-checker: we introduce an
+ "intermediate" data type. Essentially the following
+ <pre>
+ (defclass <b>template</b> ()
+ ((spec :accessor template-spec :type (or cons symbol number) ...)))
+ </pre>
+ </p>
+
+ <p>The TEMPLATE class is accompanied by a reader macro
+ (<code>#T</code> for <em>template</em>, or <em>type</em>, with an
+ abuse of language) and an
+ appropriate PRINT-OBJECT method. The <code>#T</code> reader macro
+ expands as
+ <pre>
+ <b>#T</b><i>something</i> ==> (make-instance 'template :spec <i>something</i>)
+ </pre>
+ With this infrastructure we can
+ express the unification of the FOO instance as
+ <pre>
+ (<b>unify</b> #(FOO A 42 S NIL D NIL) <b>#T(foo foo-a 42)</b>)
+ </pre>
+ I.e. we use the actual structure accessor FOO-A to get to the the
+ value of the slot A in a FOO. This is an example of the template
+ language.</p>
+
+ <p>A more interesting example, which involves vectors is the
+ following
+ <pre>
+ cl-prompt> (<b>unify</b> #(1 2 3 4 5) <b>#T(vector 1 ?x &rest ?rest)</b>) ; You get the idea...
+ <i>#<ENVIRONMENT xxxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?rest *)
+ <i>#(3 4 5)</i>
+ </pre>
+ I.e. we have a DESTRUCTURING-BIND on steroids.<p>
+
+ <p>Note that separataing the templates is necessary if we want to do
+ something like
+ <pre>
+ cl-prompt> (<b>unify</b> '(1 2 3 4 5) <b>#T(list 1 ?x &rest ?rest)</b>)
+ <i>#<ENVIRONMENT xxxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?rest *)
+ <i>(3 4 5)</i>
+ </pre>
+ Without the template denoted by <code>#T(list ...)</code> the
+ unifier would have been utterly confused.</p>
+
+ <p>In the following the full extent of the UNIFICATION facility is
+ described in its main components.
+ </p>
+
+
+ <h2><a href="substitutions.html">Unifying Substitutions</a></h2>
+
+ <h2><a href="templates.html">The Template Sub-language</a></h2>
+
+ <h2><a href="templates.html">Control Flow</a></h2>
+
+ <h2><a href="unification-dictionary.html">The UNIFICATION Dictionary</a></h2>
+ [_$_]
+
+<!--
+;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;;
+;;; Permission to use, modify, and redistribute this code is hereby
+;;; granted.
+;;; The code is provided AS IS with NO warranty whatsoever. The author
+;;; will not be held liable etc etc etc etc etc.
+-->
+
+ <h2>Site Map</h2>
+
+
+ <p>Enjoy!</p>
+
+
+
+ <hr>
+ <p>Questions? Queries? Suggestions? Comments? Please direct them
+ at <a href="mailto:marcoxa_PROVA_A_SPAMMARME@alu.org">me</a>.
+ </p>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-05-05</strong><br>
+ Started the site.
+ </li>
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/downloads.html
hunk ./docs/html/downloads.html 1
+<html>
+ <head>
+ <title>CL Unification Download Page</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Extensions: UNIFICATION</i><string>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="downloads.html" class="navigation-link-selected">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> <div class="sidebar"></div></td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>CL-UNIFICATION Download Page</h1>
+
+
+ <hr>
+ <em>
+ <p>
+ <b>DISCLAIMER:</b> The code associated to these documents is not
+ completely tested and it is bound to contain errors and omissions.
+ This documentation may contain errors and omissions as well.</p>
+
+ <p>The file <tt>COPYING</tt> contains a Berkeley-style license. You
+ are advised to use the code at your own risk. No warranty
+ whatsoever is provided, the author will not be held responsible for
+ any effect generated by your use of the library, and you can put
+ here the scarier extra disclaimer you can think of.
+ </p>
+ </em>
+ <hr>
+
+
+ <h2>Download and CVS Repository</h2>
+
+ <p>The CVS repository is <a href="http://common-lisp.net/cgi-bin/viewcvs.cgi/cl-unification/?cvsroot=cl-unification">here</a>. You can download a tarball directly from there.</p>
+
+
+
+
+
+ [_$_]
+
+<!--
+;;; Copyright (c) 2004-2005 Marco Antoniotti, All rigths reserved.
+;;;
+;;; Permission to use, modify, and redistribute this code is hereby
+;;; granted.
+;;; The code is provided AS IS with NO warranty whatsoever. The author
+;;; will not be held liable etc etc etc etc etc.
+-->
+
+ <h2>Site Map</h2>
+
+
+ <p>Enjoy!</p>
+
+
+
+ <hr>
+ <p>Questions? Queries? Suggestions? Comments? Please direct them
+ at <a href="mailto:marcoxa_PROVA_A_SPAMMARME@alu.org">me</a>.
+ </p>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2005-01-28</strong><br>
+ Updated.
+ <li><strong>2004-05-05</strong><br>
+ Started the site.
+ </li>
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/element-template-class.html
hunk ./docs/html/element-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class ELEMENT-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class ELEMENT-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>ELEMENT-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ ELEMENT-TEMPLATE, EXPRESSION-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ AREF-TEMPLATE, ELT-TEMPLATE, NTH-TEMPLATE, NTHCDR-TEMPLATE
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The ELEMENT-TEMPLATE class denotes those object that are used
+ to unify against a particular element of an ARRAY or a SEQUENCE.</p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/elt-template-class.html
hunk ./docs/html/elt-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class ELT-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class ELT-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>ELT-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ ELT-TEMPLATE, ELEMENT-TEMPLATE, EXPRESSION-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The ELT-TEMPLATE class denotes those object that are used
+ to unify against a particular element of a SEQUENCE.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>elt</b> <i>index</i> <i>item</i>)
+ </pre>
+ </p>
+
+ <p>The ELT-TEMPLATE syntax denotes the element of <i>item</i> at
+ <i>index</i>. An ELT-TEMPLATE must be unified against a SEQUENCE
+ object. <i>item</i> is <em>unified</em> against the element
+ extracted from the sequence object at <i>index</i> by the standard
+ function ELT.<p>
+
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify #(0 1 42 3 4 5) #T(<b>elt</b> 2 ?x)))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ 42
+
+ cl-prompt> (setq e (unify #(0 1 42 3 4 5) #T(<b>elt</b> 42 ?x)))
+ --> Error: index 42 out of bounds.
+
+
+ cl-prompt> (setq e (unify 42 #T(<b>elt</b> 42 ?x)))
+ --> Error: UNIFICATION-FAILURE
+
+
+ cl-prompt> (setq e (unify "This is a string!" #T(<b>elt</b> 4 ?x)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ #\Space [_$_]
+ </pre>
+ </p>
+
+
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an ELT-TEMPLATE against a non-SEQUENCE object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/expression-template-class.html
hunk ./docs/html/expression-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class EXPRESSION-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class EXPRESSION-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>EXPRESSION-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ EXPRESSION-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ ELT-TEMPLATE, SUBSEQ-TEMPLATE.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The EXPRESSION-TEMPLATE class is the root of the <em>expression template</em> sub-hierarchy.</p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/find-variable-value-function.html
hunk ./docs/html/find-variable-value-function.html 1
+<html>
+ <head>
+ <title>CL Unification: Function FIND-VARIABLE-VALUE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Function FIND-VARIABLE-VALUE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Function</i> <strong>FIND-VARIABLE-VALUE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+ <p>
+ <pre>
+ <b>find-variable-value</b> <i>variable-name</i> &optional <i>env</i> <i>errorp</i>
+ => <i>value</i>, <i>found</i>
+ </pre>
+ </p>
+
+ <h3>Arguments and Values:</h3>
+
+ <p><i><code>variable-name</code></i>---a <i>symbol</i> denoting a <em>unification variable</em></p>
+ <p><i><code>env</code></i>---an <i>unification-environment</i></p>
+ <p><i><code>value</code></i>---an <i>object</i></p>
+ <p><i><code>found</code></i>---a <i>boolean</i></p>
+
+
+
+ <h2>Description:</h2>
+
+ <p>The function FIND-VARIABLE-VALUE searches the environment
+ <i>env</i> for the <i>value</i> associated to the unification variable
+ <i>variable-name</i>.<p>
+
+ <p>If there is a <i>value</i> associated to <i>variable-name</i> in
+ <i>env</i>, then it is returned; <i>found</i>, the second return
+ value, is T.
+
+ <p>If no value is associated to <i>variable-name</i> then
+ FIND-VARIABLE-NAME signals an error of type
+ UNIFICATION-VARIABLE-UNBOUND if <i>errorp</i> is non-NIL (the
+ default.) If <i>errorp</i> is NIL then FIND-VARIABLE-NAME returns
+ the values NIL and NIL.</p>
+
+ <p><i>env</i> defaults to *NULL-ENVIRONMENT*.
+ [_$_]
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY:ENVIRONMENT, BINDING, UNIFICATION-VARIABLE-UNBOUND, *NULL-ENVIRONMENT*</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-09</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/hash-t-read-macro.html
hunk ./docs/html/hash-t-read-macro.html 1
+<html>
+ <head>
+ <title>CL Unification: #T Reader Macro</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Standard Generic Function TEMPLATE-SPEC</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Reader Macro</i> <strong>#T</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+ <p>
+ <pre>
+ <b>#T</b><i>spec</i>
+ -> <i>template</i>
+ </pre>
+ </p>
+
+
+ <h2>Description:</h2>
+
+ <p><b>#T</b><i>spec</i> expands to <code>(make-template
+ <i>template-kind</i> <i>spec</i>)</code>.
+
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ <b>#T</b>foo ==> #<SYMBOL-TEMPLATE FOO xxxxxx>
+ </pre>
+ </p>
+
+
+ <p>
+ <pre>
+ <b>#T</b>(vector 1 2 &rest ?x) ==> #<VECTOR-TEMPLATE xxxxx>
+ </pre>
+ </p>
+ [_$_]
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>TEMPLATE, the "Template Sub-language" section.</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-09</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
adddir ./docs/html/images
addfile ./docs/html/images/Thumbs.db:encryptable
addfile ./docs/html/images/header_bg.gif
binary ./docs/html/images/header_bg.gif
addfile ./docs/html/images/header_bg_1.gif
binary ./docs/html/images/header_bg_1.gif
addfile ./docs/html/images/shim.gif
binary ./docs/html/images/shim.gif
addfile ./docs/html/images/unif-templ-hier.gif
binary ./docs/html/images/unif-templ-hier.gif
addfile ./docs/html/images/unif-templ-hier.pcl
hunk ./docs/html/images/unif-templ-hier.pcl 1
-
+[_^[_]%-12345X@PJL JOB
+@PJL SET HOLD=OFF
+@PJL SET RESOLUTION = 600
+@PJL SET BITSPERPIXEL = 2
+@PJL SET ECONOMODE = OFF
+@PJL ENTER LANGUAGE = POSTSCRIPT [_$_]
+%!PS-Adobe-3.0[_^M_][_$_]
+%%Title: Document[_^M_][_$_]
+%%Creator: PScript5.dll Version 5.2.2[_^M_][_$_]
+%%CreationDate: 10/10/2004 14:55:30[_^M_][_$_]
+%%BoundingBox: (atend)[_^M_][_$_]
+%%DocumentNeededResources: (atend)[_^M_][_$_]
+%%DocumentSuppliedResources: (atend)[_^M_][_$_]
+%%DocumentData: Clean7Bit[_^M_][_$_]
+%%TargetDevice: (HP LaserJet 8150 Series) (3010.107) 0[_^M_][_$_]
+%%LanguageLevel: 3[_^M_][_$_]
+%%EndComments[_^M_][_$_]
+[_^M_][_$_]
+%%BeginDefaults[_^M_][_$_]
+%%ViewingOrientation: 1 0 0 1[_^M_][_$_]
+%%EndDefaults[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+%%BeginProlog[_^M_][_$_]
+%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0[_^M_][_$_]
+/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false[_^M_][_$_]
+setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype[_^M_][_$_]
+ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch[_^M_][_$_]
+def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0[_^M_][_$_]
+rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def[_^M_][_$_]
+/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def[_^M_][_$_]
+typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72[_^M_][_$_]
+def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp[_^M_][_$_]
+exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def[_^M_][_$_]
+/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype[_^M_][_$_]
+{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint}[_^M_][_$_]
+readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop[_^M_][_$_]
+(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def[_^M_][_$_]
+/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- )[_^M_][_$_]
+tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup[_^M_][_$_]
+xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint[_^M_][_$_]
+tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck[_^M_][_$_]
+{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(])[_^M_][_$_]
+tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup[_^M_][_$_]
+rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}[_^M_][_$_]
+forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier[_^M_][_$_]
+/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin[_^M_][_$_]
+$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0[_^M_][_$_]
+ne{grestoreall}if errorname(VMerror)ne{showpage}if initgraphics courier setfont[_^M_][_$_]
+lmargin 720 moveto errorname(VMerror)eq{userdict/ehsave known{clear userdict[_^M_][_$_]
+/ehsave get restore 2 vmreclaim}if vmstatus exch pop exch pop PrtVMMsg}{[_^M_][_$_]
+(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt[_^M_][_$_]
+$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==}[_^M_][_$_]
+repeat}if}ifelse systemdict/showpage get exec(%%[ Error: )print errorname[_^M_][_$_]
+=print(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end[_^M_][_$_]
+end}dup 0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking[_^M_][_$_]
+where{pop/setpacking where{pop oldpack setpacking}if}if[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+userdict /Pscript_WinNT_Incr 230 dict dup begin put[_^M_][_$_]
+%%BeginResource: file Pscript_FatalError 5.0 0[_^M_][_$_]
+userdict begin/FatalErrorIf{{initgraphics findfont 1 index 0 eq{exch pop}{dup[_^M_][_$_]
+length dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding[_^M_][_$_]
+{ISOLatin1Encoding}stopped{StandardEncoding}if def currentdict end[_^M_][_$_]
+/ErrFont-Latin1 exch definefont}ifelse exch scalefont setfont counttomark 3 div[_^M_][_$_]
+cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def end[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+userdict begin/PrtVMMsg{vmstatus exch sub exch pop gt{[[_^M_][_$_]
+(This job requires more memory than is available in this printer.)100 500[_^M_][_$_]
+(Try one or more of the following, and then print again:)100 485[_^M_][_$_]
+(For the output format, choose Optimize For Portability.)115 470[_^M_][_$_]
+(In the Device Settings page, make sure the Available PostScript Memory is accurate.)[_^M_][_$_]
+115 455(Reduce the number of fonts in the document.)115 440[_^M_][_$_]
+(Print the document in parts.)115 425 12/Times-Roman showpage[_^M_][_$_]
+(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def end[_^M_][_$_]
+version cvi 2016 ge{/VM?{pop}bind def}{/VM? userdict/PrtVMMsg get def}ifelse[_^M_][_$_]
+105000 VM?[_^M_][_$_]
+%%BeginResource: file Pscript_Win_Basic 5.0 0[_^M_][_$_]
+/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^[_^M_][_$_]
+/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/-[_^M_][_$_]
+/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true ,[_^M_][_$_]
+d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C[_^M_][_$_]
+/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M[_^M_][_$_]
+/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d[_^M_][_$_]
+/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage[_^M_][_$_]
+, d/K/stroke , d/W/widthshow , d/R/rotate , d/L2? false/languagelevel where{pop[_^M_][_$_]
+languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d/yS/yshow , d/zS/xyshow ,[_^M_][_$_]
+d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, d}bd/bn/bind ld/lw/Lw ld[_^M_][_$_]
+/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx matrix[_^M_][_$_]
+currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit/UtilsInit[_^M_][_$_]
+counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;}b[_^M_][_$_]
+/initialize{`{/Pscript_Win_Data where{!}{U/Pscript_Win_Data & put}?/ADO_mxRot ~[_^M_][_$_]
+d/TextInitialised? F d reinitialize E}{U/Pscript_Win_Data 230 dict @ ` put[_^M_][_$_]
+/ADO_mxRot ~ d/TextInitialised? F d reinitialize}?}b/terminate{!{& self eq[_^M_][_$_]
+{exit}{E}?}loop E}b/suspend/terminate , d/resume{` Pscript_Win_Data `}b U `[_^M_][_$_]
+/lucas 21690 d/featurebegin{countdictstack lucas[}b/featurecleanup{stopped[_^M_][_$_]
+{cleartomark @ lucas eq{! exit}if}loop countdictstack ~ sub @ 0 gt{{E}repeat}[_^M_][_$_]
+{!}?}b E/snap{transform 0.25 sub round 0.25 add ~ 0.25 sub round 0.25 add ~[_^M_][_$_]
+itransform}b/dsnap{dtransform round ~ round ~ idtransform}b/nonzero_round{@ 0.5[_^M_][_$_]
+ge{round}{@ -0.5 lt{round}{0 ge{1}{-1}?}?}?}b/nonzero_dsnap{dtransform[_^M_][_$_]
+nonzero_round ~ nonzero_round ~ idtransform}b U<04>cvn{}put/rr{1 ^ 0 - 0 ~ -[_^M_][_$_]
+neg 0 - C}b/irp{4 -2 $ + +S fx 4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b/rp{4 2 $ M 1 ^ 0[_^M_][_$_]
+- 0 ~ - neg 0 -}b/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool[_^M_][_$_]
+2 ^ put}b/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e[_^M_][_$_]
+{DefIf_El !}b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b[_^M_][_$_]
+/freeVM{/Courier findfont[40 0 0 -40 0 0]makefont Ji 2 vmreclaim}b/hfRedefFont[_^M_][_$_]
+{findfont @ length dict `{1 ^/FID ne{d}{! !}?}forall & E @ ` ~{/CharStrings 1[_^M_][_$_]
+dict `/.notdef 0 d & E d}if/Encoding 256 array 0 1 255{1 ^ ~/.notdef put}for d[_^M_][_$_]
+E definefont !}bind d/hfMkCIDFont{/CIDFont findresource @ length 2 add dict `{1[_^M_][_$_]
+^ @/FID eq ~ @/XUID eq ~/UIDBase eq or or{! !}{d}?}forall/CDevProc ~ d/Metrics2[_^M_][_$_]
+16 dict d/CIDFontName 1 ^ d & E 1 ^ ~/CIDFont defineresource ![~]composefont !}[_^M_][_$_]
+bind d[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+%%BeginResource: file Pscript_Win_Utils_L2 5.0 0[_^M_][_$_]
+/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge[_^M_][_$_]
+{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $[_^M_][_$_]
+snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F[_^M_][_$_]
+setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d[_^M_][_$_]
+/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b[_^M_][_$_]
+/resourcestatus where{!/ColorRendering/ProcSet resourcestatus{! ! T}{F}?}{F}?[_^M_][_$_]
+not{/ColorRendering<</GetHalftoneName{currenthalftone @/HalftoneName known{[_^M_][_$_]
+/HalftoneName get}{!/none}?}bn/GetPageDeviceName{currentpagedevice @[_^M_][_$_]
+/PageDeviceName known{/PageDeviceName get @ null eq{!/none}if}{!/none}?}bn[_^M_][_$_]
+/GetSubstituteCRD{!/DefaultColorRendering/ColorRendering resourcestatus{! ![_^M_][_$_]
+/DefaultColorRendering}{(DefaultColorRendering*){cvn exit}127 string[_^M_][_$_]
+/ColorRendering resourceforall}?}bn>>/defineresource where{!/ProcSet[_^M_][_$_]
+defineresource !}{! !}?}if/buildcrdname{/ColorRendering/ProcSet findresource `[_^M_][_$_]
+mark GetHalftoneName @ type @/nametype ne ~/stringtype ne and{!/none}if(.)[_^M_][_$_]
+GetPageDeviceName @ type @/nametype ne ~/stringtype ne and{!/none}if(.)5 ^ 0 5[_^M_][_$_]
+-1 1{^ length add}for string 6 1 $ 5 ^ 5{~ 1 ^ cvs length 1 ^ length 1 ^ sub[_^M_][_$_]
+getinterval}repeat ! cvn 3 1 $ ! ! E}b/definecolorrendering{~ buildcrdname ~[_^M_][_$_]
+/ColorRendering defineresource !}b/findcolorrendering where{!}{[_^M_][_$_]
+/findcolorrendering{buildcrdname @/ColorRendering resourcestatus{! ! T}{[_^M_][_$_]
+/ColorRendering/ProcSet findresource ` GetSubstituteCRD E F}?}b}?[_^M_][_$_]
+/selectcolorrendering{findcolorrendering !/ColorRendering findresource[_^M_][_$_]
+setcolorrendering}b/G2UBegin{findresource/FontInfo get/GlyphNames2Unicode get[_^M_][_$_]
+`}bind d/G2CCBegin{findresource/FontInfo get/GlyphNames2HostCode get `}bind d[_^M_][_$_]
+/G2UEnd{E}bind d/AddFontInfoBegin{/FontInfo 8 dict @ `}bind d/AddFontInfo{[_^M_][_$_]
+/GlyphNames2Unicode 16 dict d/GlyphNames2HostCode 16 dict d}bind d[_^M_][_$_]
+/AddFontInfoEnd{E d}bind d/T0AddCFFMtx2{/CIDFont findresource/Metrics2 get ` d[_^M_][_$_]
+E}bind d[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+end[_^M_][_$_]
+%%EndProlog[_^M_][_$_]
+[_^M_][_$_]
+%%BeginSetup[_^M_][_$_]
+statusdict begin (%%[ ProductName: ) print product print ( ]%%)= flush end[_^M_][_$_]
+[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginNonPPDFeature: JobTimeout 0[_^M_][_$_]
+0 /languagelevel where{pop languagelevel}{1}ifelse 2 ge{1 dict dup/JobTimeout 4 -1 roll put setuserparams}{statusdict/setjobtimeout get exec}ifelse[_^M_][_$_]
+%%EndNonPPDFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginNonPPDFeature: WaitTimeout 120[_^M_][_$_]
+120 /languagelevel where{pop languagelevel}{1}ifelse 2 ge{1 dict dup/WaitTimeout 4 -1 roll put setuserparams}{statusdict/waittimeout 3 -1 roll put}ifelse[_^M_][_$_]
+%%EndNonPPDFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *HPEdgeToEdge True[_^M_][_$_]
+<</EdgeToEdge true>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *HPPaperPolicy PromptUser[_^M_][_$_]
+[_^M_][_$_]
+ <</DeferredMediaSelection true>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *HPHalftone PrinterDefault[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Collate True[_^M_][_$_]
+<</Collate true>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Smoothing True[_^M_][_$_]
+[_^M_][_$_]
+ << /PostRenderingEnhance true /PostRenderingEnhanceDetails << /REValue 2 /Type 8 >>[_^M_][_$_]
+ >> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *PageSize Letter[_^M_][_$_]
+[_^M_][_$_]
+ <</PageSize [612 792] /ImagingBBox null>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *StapleLocation 1parallel[_^M_][_$_]
+[_^M_][_$_]
+ userdict /HPStapleOption {(ONE)} put[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *MediaType None[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *OutputBin Upper[_^M_][_$_]
+<</Staple 0 /OutputType (TOP OUTPUT BIN)>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Duplex DuplexNoTumble[_^M_][_$_]
+[_^M_][_$_]
+ <</Duplex true /Tumble false>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *JRConstraints 0[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *JRHDInstalled JRHDStore[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *JRHDNotInstalled JRHDPrivate[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *HPPrinterModelName HP_LaserJet_8150_Series_PS[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option2 False[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option6 False[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option3 True[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option5 False[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option20 Standard[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option21 MailboxModeMailbox[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *InstalledMemory 32-39MB[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *PrinterHardDisk False[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *JobRetention True[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+1 setlinecap 1 setlinejoin[_^M_][_$_]
+/mysetup [ 72 600 V 0 0 -72 600 V 2.99905 785.99908 ] def [_^M_][_$_]
+%%EndSetup[_^M_][_$_]
+[_^M_][_$_]
+userdict begin /ehsave save def end[_^M_][_$_]
+%%EndPageComments[_^M_][_$_]
+%%BeginPageSetup[_^M_][_$_]
+/DeviceRGB dup setcolorspace /colspABC exch def[_^M_][_$_]
+mysetup concat colspRefresh[_^M_][_$_]
+%%EndPageSetup[_^M_][_$_]
+[_^M_][_$_]
+Pscript_WinNT_Incr begin[_^M_][_$_]
+%%BeginResource: file Pscript_Win_GdiObject 5.0 0[_^M_][_$_]
+/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore[_^M_][_$_]
+{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d[_^M_][_$_]
+/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps[_^M_][_$_]
+L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType[_^M_][_$_]
+1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d[_^M_][_$_]
+/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal[_^M_][_$_]
+{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep[_^M_][_$_]
+gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b[_^M_][_$_]
+/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M[_^M_][_$_]
+MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep[_^M_][_$_]
+M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8[_^M_][_$_]
++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d[_^M_][_$_]
+/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix[_^M_][_$_]
+GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0[_^M_][_$_]
+/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal[_^M_][_$_]
+makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5[_^M_][_$_]
+/HS_DiagCross makehatch}b/GDIBWPatternMx null d/pfprep{save 8 1 $[_^M_][_$_]
+/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d/yExt[_^M_][_$_]
+~ d/Width ~ d/BGnd ~ d/FGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 Height 0[_^M_][_$_]
+0]d E build_pattern ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill{O}{L}? restore}b[_^M_][_$_]
+/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot concat 0 0 snap +[_^M_][_$_]
+: 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ nonzero_dsnap YStep V ~[_^M_][_$_]
+XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 -0.24 +S[_^M_][_$_]
+GDIBWPatternDict ` Width Height E nonzero_dsnap +S/GDIBWPatternMx matrix[_^M_][_$_]
+currentmatrix readonly d ; ;}if}b[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+%%BeginResource: file Pscript_Win_GdiObject_L3 5.0 0[_^M_][_$_]
+/GDIBWPatternDict 25 dict @ `/PatternType 1 d/PaintType 1 d/RepsV 1 d/RepsH 1 d[_^M_][_$_]
+/BBox[0 0 RepsH 1]d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d[_^M_][_$_]
+/Width 8 d/mx[Width 0 0 Height neg 0 Height]d/FGnd null d/BGnd null d[_^M_][_$_]
+/SetBGndFGnd{BGnd null ne{BGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~[_^M_][_$_]
+rf}if FGnd null ne{FGnd aload ! scol}if}b/PaintProc{` SetBGndFGnd RepsH{Width[_^M_][_$_]
+Height F mx PaintData imagemask Width 0 +}repeat E}b E d/mp/makepattern , d[_^M_][_$_]
+/build_pattern{CTMsave GDIBWPatternMx setmatrix/nupangle where{! nupangle -90[_^M_][_$_]
+eq{nupangle R}if}if GDIBWPatternDict @ ` Width Height ne{Width Height gt{Width[_^M_][_$_]
+Height V 1}{1 Height Width V}? +S}if xOrg yOrg E matrix + mp CTMrestore}b/hbf[_^M_][_$_]
+{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O}{L}? ;}b/pbf{: ![_^M_][_$_]
+/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d/OutputBPP ~ d[_^M_][_$_]
+/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 d/BBox[0 0[_^M_][_$_]
+Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d 20 dict @ `[_^M_][_$_]
+/ImageType 1 d/Width Width d/Height Height d/ImageMatrix[1 0 0 1 0 0]d[_^M_][_$_]
+/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{[_^M_][_$_]
+/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict[_^M_][_$_]
+~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L}[_^M_][_$_]
+? ;}b/mask_pbf{:/fEOFill ~ d 20 dict `/yOrg ~ d/xOrg ~ d/PaintData ~ d/Height ~[_^M_][_$_]
+d/Width ~ d/PatternType 1 d/PaintType 2 d/TilingType 1 d/BBox[0 0 Width Height][_^M_][_$_]
+d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d/PaintProc{` Width Height[_^M_][_$_]
+T 1 1 dtransform abs ~ abs ~ 0 0 3 -1 $ 0 0 6 array astore{PaintData}imagemask[_^M_][_$_]
+E}b & mx makepattern setpattern E fEOFill{O}{L}? ;}b/grf4{4 dict `/ShadingType[_^M_][_$_]
+4 d/DataSource ~ d/ColorSpace ~ d & E shfill}b[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+end reinitialize[_^M_][_$_]
+/DeviceGray dup setcolorspace /colspABC exch def[_^M_][_$_]
+0 0 scol N 2950 725 M 3113 869 I K [_^M_][_$_]
+N 3113 869 M 3044 831 I 3069 806 I C [_^M_][_$_]
+ O N 2950 725 M 3113 775 I K [_^M_][_$_]
+N 3113 775 M 3038 769 I 3044 738 I C [_^M_][_$_]
+ O N 2950 725 M 3113 681 I K [_^M_][_$_]
+N 3113 681 M 3044 719 I 3038 681 I C [_^M_][_$_]
+ O N 2950 725 M 3113 588 I K [_^M_][_$_]
+N 3113 588 M 3069 650 I 3044 619 I C [_^M_][_$_]
+ O 55017 VM?[_^M_][_$_]
+Pscript_WinNT_Incr begin[_^M_][_$_]
+%%BeginResource: file Pscript_T42Hdr 5.0 0[_^M_][_$_]
+/asc42 0.0 d/sF42{/asc42 ~ d Ji}bind d/bS42{0 asc42 -M}bind d/eS42{0 asc42 neg[_^M_][_$_]
+-M}b/Is2015?{version cvi 2015 ge}bind d/AllocGlyphStorage{Is2015?{!}{{string}[_^M_][_$_]
+forall}?}bind d/Type42DictBegin{25 dict `/FontName ~ d/Encoding ~ d 4 array[_^M_][_$_]
+astore cvx/FontBBox ~ d/PaintType 0 d/FontType 42 d/FontMatrix[1 0 0 1 0 0]d[_^M_][_$_]
+/CharStrings 256 dict `/.notdef 0 d & E d/sfnts}bind d/Type42DictEnd{& @[_^M_][_$_]
+/FontName get ~ definefont ! E}bind d/RDS{string currentfile ~ readstring !}[_^M_][_$_]
+executeonly d/PrepFor2015{Is2015?{/GlyphDirectory 16 dict d sfnts 0 get @ 2 ^[_^M_][_$_]
+(glyx)putinterval 2 ^(locx)putinterval ! !}{! !}?}bind d/AddT42Char{Is2015?[_^M_][_$_]
+{findfont/GlyphDirectory get ` d E ! !}{findfont/sfnts get 4 ^ get 3 ^ 2 ^[_^M_][_$_]
+putinterval ! ! ! !}?}bind d/IDStrNull{1 add 2 mul @ string 0 1 3 ^ 1 sub{1 ^ ~[_^M_][_$_]
+0 put}for ~ !}bind d/IDStr{@ 1 add 2 mul string 0 1 3 ^{1 ^ ~ @ 2 mul ~ 3 copy[_^M_][_$_]
+256 idiv put ~ 1 add ~ 256 mod put}for ~ !}bind d/IDStr2{~ @ 1 add 2 mul string[_^M_][_$_]
+0 1 3 ^{1 ^ ~ @ 2 mul ~ 5 ^ add 3 copy 256 idiv put ~ 1 add ~ 256 mod put}for ~[_^M_][_$_]
+! ~ !}bind d/CIDT42Begin{25 dict `/CDevProc ~ d/CIDMap ~ d/CIDCount ~ d[_^M_][_$_]
+/CIDSystemInfo 3 dict @ ` 3 -1 $/Supplement ~ d 3 -1 $/Ordering ~ d 3 -1 $[_^M_][_$_]
+/Registry ~ d E d/CIDFontName ~ d/Encoding ~ d 4 array astore cvx/FontBBox ~ d[_^M_][_$_]
+/CharStrings 2 dict @ `/.notdef 0 d E d/GDBytes 2 d/CIDFontType 2 d/FontType 42[_^M_][_$_]
+d/PaintType 0 d/FontMatrix[1 0 0 1 0 0]d/Metrics2 16 dict d/sfnts}bind d[_^M_][_$_]
+/CIDT42End{CIDFontName & E/CIDFont defineresource !}bind d/T42CIDCP32K{/CIDFont[_^M_][_$_]
+findresource @ length dict copy @/FID undef `/CIDFontName ~ d/CIDMap ~ d[_^M_][_$_]
+/CIDCount ~ d/Metrics2 8 dict d CIDFontName & E/CIDFont defineresource !}bind d[_^M_][_$_]
+/T42CIDCPR{/CIDFont findresource @ length dict copy @/FID undef `/CIDFontName ~[_^M_][_$_]
+d &/CDevProc known{[/CDevProc , @ type/operatortype ne{/exec cvx}if/! cvx/! cvx[_^M_][_$_]
+/! cvx/! cvx 5/^ cvx 5/^ cvx 0.0 0.0]cvx}{{! ! ! ! ! 5 ^ 5 ^ 0.0 0.0}}? bind[_^M_][_$_]
+readonly/CDevProc ~ d CIDFontName & E/CIDFont defineresource !}bind d[_^M_][_$_]
+/T0AddT42Char{/CIDFont findresource/GlyphDirectory get ` d E ! !}bind d[_^M_][_$_]
+/T0AddT42Mtx2{/CIDFont findresource/Metrics2 get ` d E}bind d/UpdateCIDMap{[_^M_][_$_]
+/CIDFont findresource/CIDMap get 3 1 $ putinterval}d/AddXUID{version cvi 3011[_^M_][_$_]
+ge{/XUID ~ d}{!}?}bind d/hfDef42CID{/CIDFont findresource @ length dict copy @[_^M_][_$_]
+/FID undef `/CIDFontName 2 ^ d @ type @/booleantype ne{/arraytype eq{/CDevProc[_^M_][_$_]
+~ d}{matrix @ 4 4 -1 $ put/FontMatrix ~ d}?}{! !}? & E/CIDFont defineresource[_^M_][_$_]
+!}bind d/hfDefRT42CID{/CIDFont findresource @ length dict copy @/FID undef `[_^M_][_$_]
+/CIDFontName 1 ^ d &/CDevProc known{[/CDevProc , @ type/operatortype ne{/exec[_^M_][_$_]
+cvx}if/! cvx/! cvx/! cvx/! cvx 5/^ cvx 5/^ cvx 0.0 0.0]cvx}{{! ! ! ! ! 5 ^ 5 ^[_^M_][_$_]
+0.0 0.0}}? bind readonly/CDevProc ~ d & E/CIDFont defineresource !}bind d[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+end reinitialize[_^M_][_$_]
+-0.578 -0.207 1.387 0.922[_^M_][_$_]
+ 256 array 0 1 255 {1 index exch /.notdef put} for /TTE1CD9F20t00[_^M_][_$_]
+Type42DictBegin[_^M_][_$_]
+[<00010000000a000a000a000a6376742065146ccc000000ac000002746670[_^M_][_$_]
+676d2bc15a050000032000000768676c79661b44802b000058e80004e222[_^M_][_$_]
+68656164ce8b489100000a8800000036686865610dd60c5100000ac00000[_^M_][_$_]
+0024686d74785d72583900000ae4000023446c6f636116f62ad600002e28[_^M_][_$_]
+000023486d6178700dba0872000051700000002070726570877d61440000[_^M_][_$_]
+5190000007556764697200000000000000000000000005ba0019000005ba[_^M_][_$_]
+001900000000000000000000000000000000000000000425001900000000[_^M_][_$_]
+ffe700000000ffe70000000000000000fe68ffea00000000000000000000[_^M_][_$_]
+0000000002f5ffee05cd000002ddffee02f0000000000000000000000000[_^M_][_$_]
+000000000000000000000000000000000000000000000000000000000000[_^M_][_$_]
+000008000000080000000000000000000000000000000000000000000000[_^M_][_$_]
+00000000000000000000000000d2010e012c01130000000000c8010900c8[_^M_][_$_]
+000000000000000000000000000000890048001bff77ffb8ffe500a4005f[_^M_][_$_]
+000aff5cffa1fff6000000000000000afff6000000000000000000000059[_^M_][_$_]
+ffa700c9000000c3000000c2008300c3000000bd000000bd007900c3006c[_^M_][_$_]
+00bd009100af00000000026f00ae00a6009a0000009b0094008b00cc00ae[_^M_][_$_]
+00a600940000000000ff000001e300000000000000000000000000000000[_^M_][_$_]
+00000000000000000000000000cd00cd006801ee0060008c000000000000[_^M_][_$_]
+0000000000000000000000a800a800a800b900cd00a80052016a0049007d[_^M_][_$_]
+007d0083008a00000071009b00910078000001fc0071ff8f022a006d0094[_^M_][_$_]
+00a0029a030a00b800ae008b018b019101d10391008c00730268027d01b0[_^M_][_$_]
+01dd021c033302a3026b02730152024c0021004c05e704f20098ff6800ac[_^M_][_$_]
+00c500850085005c0054006000b401baff1ffe680000008300bc00940094[_^M_][_$_]
+ff85ffae00520029061400ae00460046fe580560008f076002f20025003e[_^M_][_$_]
+004700500058007300a80160006000950025003e004700500058007300a8[_^M_][_$_]
+01600000002d005000600081009300ba0108ffd3ffaeff9106520060005c[_^M_][_$_]
+00b0012b012b04ba013e018507600016000a004b403f545249483b393837[_^M_][_$_]
+363534333231302f2e2d2c2b2a292827262524232221201f1e1d1c1b1a19[_^M_][_$_]
+1817161514131211100f0e0d0c0b0a090807060504030201002c01b01843[_^M_][_$_]
+58456ab0194360b0462344231020b0464ef04d2fb000121b21231133592d[_^M_][_$_]
+2c01b0184358b0052bb000134bb0145058b100403859b0062b1b21231133[_^M_][_$_]
+592d2c01b01843584eb0032510f221b000124d1b2045b00425b00425234a[_^M_][_$_]
+6164b0285258212310d21bb0032510f221b0001259592d2cb01a43582121[_^M_][_$_]
+1bb00225b0022549b00325b003254a612064b01050582121211bb00325b0[_^M_][_$_]
+032549b0005058b0005058b8ffe238211bb0103821591bb0005258b01e38[_^M_][_$_]
+211bb8fff03821595959592d2c01b0184358b0052bb000134bb0145058b9[_^M_][_$_]
+0000ffc03859b0062b1b21231133592d2c4e018a10b146194344b00014b1[_^M_][_$_]
+0046e2b00015b90000fff03800b0003cb0282bb0022510b0003c2d2c0118[_^M_][_$_]
+b0002fb00114f2b00113b001154db000122d2c01b0184358b0052bb00013[_^M_][_$_]
+b90000ffe038b0062b1b21231133592d2c01b018435845646a23456469b0[_^M_][_$_]
+1943646060b0462344231020b046f02fb000121b2121208a208a52581133[_^M_][_$_]
+1b212159592d2c01b10b0a432343650a2d2c00b10a0b4323430b2d2c00b0[_^M_][_$_]
+462370b101463e01b0462370b10246453ab10200080d2d2cb0122bb00225[_^M_][_$_]
+45b00225456ab0408b60b0022523442121212d2cb0132bb0022545b00225[_^M_][_$_]
+456ab8ffc08c60b0022523442121212d2cb000b0122b2121212d2cb000b0[_^M_][_$_]
+132b2121212d2c01b00643b00743650a2d2c2069b04061b0008b20b12cc0[_^M_][_$_]
+8a8cb8100062602b0c642364615c58b00361592d2cb1000325456854b01c[_^M_][_$_]
+4b505a58b0032545b0032545606820b004252344b0042523441bb0032520[_^M_][_$_]
+4568208a2344b00325456860b003252344592d2cb00325204568208a2344[_^M_][_$_]
+b003254564686560b00425b0016023442d2cb00943588721c01bb0124358[_^M_][_$_]
+8745b0112bb0472344b0477ae41b038a45186920b04723448a8a8720b0a0[_^M_][_$_]
+5158b0112bb0472344b0477ae41b21b0477ae4595959182d2c208a452345[_^M_][_$_]
+6860442d2c456a422d2c01182f2d2c01b0184358b00425b0042549642345[_^M_][_$_]
+64696120b080626ab00225b00225618cb0194360b0462344218a10b046f6[_^M_][_$_]
+211b21212121592d2c01b0184358b0022545b002254564606ab00325456a[_^M_][_$_]
+6120b00425456a208a8b65b0042523448cb00325234421211b20456a4420[_^M_][_$_]
+456a44592d2c012045b00055b018435a584568234569b0408b6120b08062[_^M_][_$_]
+6a208a236120b003258b65b0042523448cb00325234421211b2121b0192b[_^M_][_$_]
+592d2c018a8a45642345646164422d2cb00425b00425b0192bb0184358b0[_^M_][_$_]
+0425b00425b00325b01b2b01b0022543b04054b0022543b000545a58b003[_^M_][_$_]
+252045b040614459b0022543b00054b0022543b040545a58b004252045b0[_^M_][_$_]
+4060445959212121212d2c014b525843b00225452361441b2121592d2c01[_^M_][_$_]
+4b525843b00225452360441b2121592d2c4b525845441b2121592d2c0120[_^M_][_$_]
+b003252349b04060b0206320b000525823b002253823b002256538008a63[_^M_][_$_]
+381b212121212159012d2c4b505845441b2121592d2c01b005251023208a[_^M_][_$_]
+f500b0016023edec2d2c01b005251023208af500b0016123edec2d2c01b0[_^M_][_$_]
+062510f500edec2d2c462346608a8a462320468a608a61b8ff8062232010[_^M_][_$_]
+238ab14b4b8a70456020b0005058b00161b8ffba8b1bb0468c59b0106068[_^M_][_$_]
+013a2d2c2045b00325465258b0022546206861b00325b003253f2321381b[_^M_][_$_]
+2111592d2c2045b00325465058b0022546206861b00325b003253f232138[_^M_][_$_]
+1b2111592d2c00b00743b006430b2d2c8a10ec2d2cb00c4358211b2046b0[_^M_][_$_]
+005258b8fff0381bb0103859592d2c20b0005558b8100063b003254564b0[_^M_][_$_]
+0325456461b0005358b0021bb04061b00359254569535845441b2121591b[_^M_][_$_]
+21b0022545b00225456164b028515845441b212159592d2c21210c642364[_^M_][_$_]
+8bb84000622d2c21b08051580c6423648bb82000621bb200402f2b59b002[_^M_][_$_]
+602d2c21b0c051580c6423648bb81555621bb200802f2b59b002602d2c0c[_^M_][_$_]
+6423648bb84000626023212d2c4b5358b00425b004254964234564696120[_^M_][_$_]
+b080626ab00225b00225618cb0462344218a10b046f6211b218a11231220[_^M_][_$_]
+392f592d2c2121212121212d2cb0134358031b02592d2cb0134358021b03[_^M_][_$_]
+592d2cb00a2b2310203cb0172b2d2cb00225b8fff038b0282b8a102320d0[_^M_][_$_]
+23b0102bb0054358c01b3c59201011b00012012d2c4b53234b515a58381b[_^M_][_$_]
+2121592d2c01b0022510d023c901b00113b0001410b0013cb001162d2c01[_^M_][_$_]
+b00013b001b0032549b0031738b001132d2c4b53234b515a5820458a6044[_^M_][_$_]
+1b2121592d2cb0024354584b53234b515a58381b2121591b21212121592d[_^M_][_$_]
+2c4b53234b515a58381b2121592d2c4b5458381b2121592d2c4b52587d1b[_^M_][_$_]
+7a592d2cb1020042b123018851b1400188535a58b910000020885458b202[_^M_][_$_]
+010243604259b12401885158b920000040885458b202020243604259b124[_^M_][_$_]
+01885458b2022002436042004b014b5258b2020802436042591bb9400000[_^M_][_$_]
+80885458b202040243604259b94000008063b80100885458b20208024360[_^M_][_$_]
+4259b94000010063b80200885458b2021002436042595959592d00010000[_^M_][_$_]
+00016148e1f6c9625f0f3cf5001b080000000000aff53caf00000000b8f4[_^M_][_$_]
+5fe9fb5cfe520b170760000000090001000100000000000100000760fe52[_^M_][_$_]
+00000ab3fb5cfa7a0b170001000000000000000000000000000008d10258[_^M_][_$_]
+0032000000000239000002200000023900b602d70054047300170473004e[_^M_][_$_]
+071d0081055600580187005c02aa007b02aa004a031d004204ac00710239[_^M_][_$_]
+00b602aa0042023900b6023900000473005c047300e30473003f0473005a[_^M_][_$_]
+0473001f047300560473005c047300620473005604730056023900b60239[_^M_][_$_]
+00b604ac007104ac007104ac00710473005e081f00730556fffe055600a4[_^M_][_$_]
+05c7006005c700a4055600a404e300a40639006005c700a4023900bc0400[_^M_][_$_]
+0037055600a4047300a406aa00a405c700a406390060055600a406390060[_^M_][_$_]
+05c700a40556005c04e3002d05c700a40556000c078d00190556000a0556[_^M_][_$_]
+000a04e300250239008b023900000239002103c1004a046afff402aa0056[_^M_][_$_]
+0473004e0473008b04000048047300480473004802390010047300480473[_^M_][_$_]
+008b01d3008b01d3ffb80400008b01d3008b06aa008b0473008b04730048[_^M_][_$_]
+0473008b0473004802aa008b0400003f02390023047300870400001b05c7[_^M_][_$_]
+000a0400000e0400001b0400002902ac0039021400bc02ac003104ac0058[_^M_][_$_]
+0556fffe0556fffe05c70060055600a405c700a40639006005c700a40473[_^M_][_$_]
+004e0473004e0473004e0473004e0473004e0473004e0400004804730048[_^M_][_$_]
+04730048047300480473004801d3007901d3ffec01d3ffac01d3ffd50473[_^M_][_$_]
+008b04730048047300480473004804730048047300480473008704730087[_^M_][_$_]
+0473008704730087047300500333008504730071047300310473005602cd[_^M_][_$_]
+0068044cfffe04e3008b05e5000005e500000578003202aa00e302aa003f[_^M_][_$_]
+04ac0071080000000639005004ac005c04ac007104ac007104ac00710473[_^M_][_$_]
+00020473008b03f4003305b4007b069600a4046400000231ffb202f6002b[_^M_][_$_]
+02ec002d06250071071d004e0473004804730062023900b604ac00710464[_^M_][_$_]
+001404730042046400330556fffe0473008d0473008d0486005b0556fffe[_^M_][_$_]
+0556fffe0639006008000060078d00480258fff404b0fff402aa005402aa[_^M_][_$_]
+005401c7007d01c7007d04ac007103f4002e0400001b0556000a0156fe54[_^M_][_$_]
+0473004c02aa005a02aa007f040000100400001004730050023900b60239[_^M_][_$_]
+00b603220090080000190556fffe055600a40556fffe055600a4055600a4[_^M_][_$_]
+023900ac0239ffdf023900080239001f06390060063900600639006005c7[_^M_][_$_]
+00a405c700a405c700a401d3008b02aa001702aa000602aa001d02aa002d[_^M_][_$_]
+02aa00f802aa00a202aa0085037a009d02aa00b602aa00170473000801d3[_^M_][_$_]
+000c0556005c0400003f04e3002504000029021400bc05c7000204730048[_^M_][_$_]
+0556000a0400001b055600a40473008b04ac007104ac00a602aa006a02aa[_^M_][_$_]
+001902aa002106ac007f06ac007f06ac003504e300000639006004730048[_^M_][_$_]
+023900bc0556005c0400003f05c700600400004805c70060040000480473[_^M_][_$_]
+00480400fff4023900b60556fffe0473004e0556fffe0473004e05c700a4[_^M_][_$_]
+0513004805c70002055600a404730048055600a404730048047300a401d3[_^M_][_$_]
+0047047300a40255008b047300a402f3004205c700a40473008b05c700a4[_^M_][_$_]
+0473008b063900600473004805c700a402aa008b05c700a402aa002b0556[_^M_][_$_]
+005c0400003f04e3002d0239002304e3002d02d0002305c700a404730087[_^M_][_$_]
+05c700a40473008704e300250400002904e300250400002904ae00a40639[_^M_][_$_]
+006006790060049c0048047300480400004804ae00480400002105310048[_^M_][_$_]
+0400fff4047200b602f6004c09e9008f063900bc03a6008b0568002102aa[_^M_][_$_]
+00e502aa0056071d00810296000f04d5009202d6008302d6008304d500b1[_^M_][_$_]
+02d600700556fffe0473004e05c700600400004805c70060040000480556[_^M_][_$_]
+00a404730048055600a404730048055600a4047300480639006004730048[_^M_][_$_]
+0639006004730048063900600473004805c700a40473008b05c700140473[_^M_][_$_]
+00000239ffce01d3ff9b0239ffe501d3ffb20239fff501d3ffc2023900bc[_^M_][_$_]
+01d3008b0400003701d3ffac056800a40400008b0400008b047300a401d3[_^M_][_$_]
+004205c700a40473008b05c700a40473008b063900600473004806390060[_^M_][_$_]
+0473004805c700a402aa005a0556005c0400003f04e3002d0239002305c7[_^M_][_$_]
+00a40473008705c700a40473008705c700a40473008705c700a404730087[_^M_][_$_]
+078d001905c7000a0556000a0400001b0200008b0556fffe0473004e0800[_^M_][_$_]
+0000071d004e0639005004730048023900b6078d001905c7000a078d0019[_^M_][_$_]
+05c7000a078d001905c7000a0556000a0400001b01c7007d0400fff40473[_^M_][_$_]
+00310473004806ac007f06ac003606ac003606ac006d02aa00fc02aa0085[_^M_][_$_]
+02aa00ee034800370556fffe0646003306b7003303290033069a00000631[_^M_][_$_]
+0000069a0000033300290556fffe055600a40575000c055600a404e30025[_^M_][_$_]
+05c700a4023900bc055600a40556fffe06aa00a405c700a4053f006d0639[_^M_][_$_]
+006005c700a4055600a404e5006004e3002d0556000a0556000a0679005e[_^M_][_$_]
+06390066023900080556000a049c0048040000480473008b01ec00790473[_^M_][_$_]
+00870481008b0452001b03e100480473008b0473005c01ec008b0400008b[_^M_][_$_]
+0400001b0473008b0400001b03e10048047300480491008b044800480473[_^M_][_$_]
+0087042d000e058500870585004802520008047300870473004804730087[_^M_][_$_]
+05850048055600a40666002d048900a405bc00600556005c023900bc0239[_^M_][_$_]
+00080400003707ae000a07ae00a40666002d055600a4051f000805c700a4[_^M_][_$_]
+0556fffe053d00a4055600a4048900a406330023055600a4073500060514[_^M_][_$_]
+005a05c700a405c700a4055600a405a4000a06aa00a405c700a406390060[_^M_][_$_]
+05c700a4055600a405c7006004e3002d051f000806cb00600556000a05fc[_^M_][_$_]
+00a40579007706e100a4071700a4063d0000071000a4053d00a405bc005e[_^M_][_$_]
+080c00a405c7005c0473004e0496005e043f008b0310008b04aa00000473[_^M_][_$_]
+004805aa0004040000230479008b0479008b0400008b0491000a05b6008b[_^M_][_$_]
+0473008b047300480473008b0473008b0400004803aa00250400001b0698[_^M_][_$_]
+00480400000e0498008b0444005e066a008b068f008b04f6000005bc008b[_^M_][_$_]
+042f008b0400001b05f4008b0456003504730048047300000310008b0400[_^M_][_$_]
+00480400003f01d3008b01d3ffd501d3ffb806e9000a0698008b04730000[_^M_][_$_]
+0400008b0400001b0473008b047300a403b8008b046afff407fc008f0473[_^M_][_$_]
+008b02aa002302aa002102aa006d02aa002101d3008b0556005c0400003f[_^M_][_$_]
+0473000001480060028f004e028f005e028f005e0148006001ec004e01ec[_^M_][_$_]
+005801ec007101ec005601480060028f004e014800600148007502140039[_^M_][_$_]
+01ec007101cf0091014800600148ff79023900b604cd0083048f003b035c[_^M_][_$_]
+00170429001404cd0098028f004c02cd001404cd009804cd003b028f004c[_^M_][_$_]
+0429003f0429005a0429004804cd005004cd003b02cd004a02cd003b04cd[_^M_][_$_]
+005004cd002d04cd00870466006f043d003b0466003b047b00980400002d[_^M_][_$_]
+0550009804cd005404cd003704cd003704cd003702000060037100600566[_^M_][_$_]
+0077028fffa20429003f0429003f0429ff790429ff7904cd002d05500098[_^M_][_$_]
+05500098055000980550009804cd008304cd008304cd0083048f003b035c[_^M_][_$_]
+00170429001404cd0098028f003d02cd001404cd003b028f003d0429003f[_^M_][_$_]
+0429005a0429004804cd003b02cd003b04cd005004cd00870466006f0466[_^M_][_$_]
+003b047b00980400002d0550009804cd0054028f004c048f003b0429005a[_^M_][_$_]
+0466006f04cd00290000ffdc0000ff250000ffdc0000fe51014800600639[_^M_][_$_]
+00600473004805c700a40473008702aa00cf02aa00f802aa005602aa00e3[_^M_][_$_]
+02aa001702aaff0c02aa001702aa000402aa002d02aa002d02aa002d02aa[_^M_][_$_]
+000402aa00cf02aa000402aa002d02aa002b02aa002b02aa001902aa0017[_^M_][_$_]
+0556fffe0473004e0556fffe0473004e0556fffe0473004e0556fffe0473[_^M_][_$_]
+fff20556fffe0473004e0556fffe0473004e0556fffe0473004e0556fffe[_^M_][_$_]
+0473004e0556fffe0473004e0556fffe0473004e0556fffe0473004e0556[_^M_][_$_]
+fffe0473004e055600a404730048055600a404730048055600a404730048[_^M_][_$_]
+055600a404730048055600770473fff1055600a404730048055600a40473[_^M_][_$_]
+0048055600a4047300480239009801d30098023900bc01d3008b06390060[_^M_][_$_]
+0473004806390060047300480639006004730048063900600473fff20639[_^M_][_$_]
+006004730048063900600473004806390060047300480639006004730048[_^M_][_$_]
+063900600473004806390060047300480639006004730048063900600473[_^M_][_$_]
+004805c700a40473008705c700a40473008705c700a40473008705c700a4[_^M_][_$_]
+0473008705c700a40473008705c700a40473008705c700a4047300870556[_^M_][_$_]
+000a0400001b0556000a0400001b0556000a0400001b0473004801df00b2[_^M_][_$_]
+01df007501df002b01df007501f4ff8501f4ff8501f4ff850458ff850458[_^M_][_$_]
+00560458ff85045800560458ff850458005604d7ff8504d7ff8506c3ff85[_^M_][_$_]
+045801310458013f0458005a0458003d0458007504580048045800480458[_^M_][_$_]
+002d0458002b0458005c06c3ff850458ff850323ff8503a000560458ff85[_^M_][_$_]
+0323ff8503a000560252ff85025eff85022500ac0252ff85025eff850327[_^M_][_$_]
+ff8501baff850323ff8501f4ff85039aff850323ff85030e004801f4ff85[_^M_][_$_]
+04bc001f030e004804bc001f026600cd01f4ff85045c000c04c3003501df[_^M_][_$_]
+000001df000001df0000045c000c04c30035045cfff604bc001f022500ac[_^M_][_$_]
+04c3001f026600cd04730062034c008901df002701df00710364000001df[_^M_][_$_]
+0071051f001f01df00ae05b80050027b003d05b8005005b8005004580056[_^M_][_$_]
+045800560458005602b8000a02b8000a03e1005203e100520698000a0698[_^M_][_$_]
+000a08b8000a08b8000a04a4ff8504a4ff85045c0052045c005201baff85[_^M_][_$_]
+0652005004a8002704cd00330414002902b8001f043d0033027b003d0364[_^M_][_$_]
+0000051f001f051f001f01ae000001df000001ae000001ae000001ae001b[_^M_][_$_]
+01ae000001df00000133000a045c000c04c3003501cb006801c7001f0266[_^M_][_$_]
+00e9026600620266005601f4ff850252ff85025eff8505b8005003df0093[_^M_][_$_]
+0000fb5c0000fb5c0000fb5c0000fb5c0000fe000000fd3b0000fc4c0000[_^M_][_$_]
+fd0a0000fd2d0000ff170000fdaa0000fda80000fe850000fe9605c3005e[_^M_][_$_]
+0000fbdf0000fd1b0000fbfa0000fe020000fdf00000fc4c0000fd7f0000[_^M_][_$_]
+fd2d045e005e047f002d04ac002d047f0056047f0056055c002d03640006[_^M_][_$_]
+03df0050051f0050047f002d04ac002d05c3005e05c3005e04ac005004ac[_^M_][_$_]
+005003df00930571002d062100560635005e047f0056047f0056045e005e[_^M_][_$_]
+049a00500404009304f6005004ac005004ac0050047f0081047f00810537[_^M_][_$_]
+00500537005004ac005004ac002f0400008103df0093045e005e03df0050[_^M_][_$_]
+04ac005003df0050047f0056051200500431005004db0050053700500431[_^M_][_$_]
+0050045e005e04000050039a004a0000fcfe035c001f035cfe620000fc73[_^M_][_$_]
+0000fc730000fc730000fc730000fee10000fe000000fee9031f00b604fe[_^M_][_$_]
+009a0248008b048f008b035c0010035cffc903df0000035c001f04830050[_^M_][_$_]
+0000fd100000ff190000fe5e0000fda80000fec10000fe960000fe620000[_^M_][_$_]
+fe680431006204bc006004bc005c04fe000e04fe007f04fe006004fe0060[_^M_][_$_]
+04bc001704fe003504fe006004fe004a0527005006d100350000fee10000[_^M_][_$_]
+fe000000fee901baff8505b8005001f4ff8504580056045800560458ff85[_^M_][_$_]
+03e1005204c100330327ff8504c100330327ff85051f001f04bc001f01f4[_^M_][_$_]
+ff85030e0048027b003d045801310458013f0458005a0458003d0458003d[_^M_][_$_]
+0458004a045800c90458002d0458002b0458005c04e3002d023900230556[_^M_][_$_]
+00a40473004805c700a40479008b04140029023900bc0400003701d3008b[_^M_][_$_]
+01d3ffb80489003a031000300786000605cf000405aa00a40447008b0556[_^M_][_$_]
+00a40400008b05fc00a4049a008b0556000a0400001b0556000a0400001b[_^M_][_$_]
+05a5000a043a000e057900770444005e057900a40473008b063900600473[_^M_][_$_]
+00480639006004730048080000000000ffdc0000ff160000ffdc0000ff20[_^M_][_$_]
+0000ffdc0000ff200197000005b8005001f4ff8502b8000a03e10052043d[_^M_][_$_]
+00330440006401f4ff8503fdff85044000640440006406d9001306d90013[_^M_][_$_]
+06d9001306d9001301ba00280493004a031d0042065200500252ff85025e[_^M_][_$_]
+ff8501df000001df000006750048027b003d0000ffdd0000fe870000fefd[_^M_][_$_]
+047300690568005c05c7006005c7006006aa008b05c70000098700a4078d[_^M_][_$_]
+00000556000004e3002d0800002901ae000501ae002a026600ea02660056[_^M_][_$_]
+0266006201ae002e04a8002701ae001001cb006801cb006801df000501df[_^M_][_$_]
+000501df002a01df002a01df002a01df002a028000ae028000b203640000[_^M_][_$_]
+03640000057e001f04bc001f05b8005001f4ff8505b8005001f4ff8505b8[_^M_][_$_]
+005001f4ff8505b8005001f4ff8505b8005001f4ff8505b8005001f4ff85[_^M_][_$_]
+04580056045800560458ff8504580056045800560458ff85045800560458[_^M_][_$_]
+00560458ff8504580056045800560458ff8504580056045800560458ff85[_^M_][_$_]
+04580056045800560458ff8502b8000a02b8000a02b8000a02b8000002b8[_^M_][_$_]
+000a02b8fffc02b8fffc02b8000803e1005203e1005203e1005203e10052[_^M_][_$_]
+03e1005203e1005203e100520698000a04d7ff850698000a04d7ff850698[_^M_][_$_]
+000a04d7ff8508b8000a06c3ff8508b8000a06c3ff8504a4ff85045c0052[_^M_][_$_]
+03a000560458ff850323ff8506520050065200500252ff85025eff850652[_^M_][_$_]
+00500252ff85025eff85065200500252ff85025eff85065200500252ff85[_^M_][_$_]
+025eff8504a8002704a8002706d9003306d9ff7904c100330327ff8504cd[_^M_][_$_]
+00330327ff8504cd00330327ff8504cd00330327ff8504c100330327ff85[_^M_][_$_]
+04c100330327ff8504c100330327ff8504c100330327ff8504c100330327[_^M_][_$_]
+ff660414002901baff850414002901baff850414002901baff8504140029[_^M_][_$_]
+01baff85043d003301f4ff85043d0033043d003301f4ff85043d003301f4[_^M_][_$_]
+ff8504580056045800560458ff8503640000036400000364000003640000[_^M_][_$_]
+0364000003640000036400000364000005f3000505900005051f001f04bc[_^M_][_$_]
+001f01f4ff8503640000051f001f04bc001f051f001f04bc001f0000fe46[_^M_][_$_]
+0000ff6e0000ff590000ffb70000fec308fc003208ad00320000ffb50000[_^M_][_$_]
+ffb60000ff410000ff920000fec30000ffbf0168003202cc00320000fea2[_^M_][_$_]
+0000ff5a04cd00320000ff580000ff580000ff920698000a04d7ff8508b8[_^M_][_$_]
+000a06c3ff85045c005203a000560458ff850323ff85034c008902b8001f[_^M_][_$_]
+02aa001d02aa001d02aa001d02aa001d02aa003f02aa003f02aa000402aa[_^M_][_$_]
+000402aa000402aa000402aa00ca02aa00e302aa001702aa001702aa001d[_^M_][_$_]
+02aa001d055600a4047300480556fffe0473004e055600a40473008b0556[_^M_][_$_]
+00a40473008b055600a40473008b05c700600400004805c700a404730048[_^M_][_$_]
+05c700a40473004805c700a40473004805c700a40473004805c700a40473[_^M_][_$_]
+0048055600a404730048055600a404730048055600a404730048055600a4[_^M_][_$_]
+04730048055600a40473004804e300a402390010063900600473004805c7[_^M_][_$_]
+00a40473008b05c700a40473008b05c700a40473008b05c7007104730053[_^M_][_$_]
+05c700a40473008b0239ffce01d3ff9b0239000701d3ffd3055600a40400[_^M_][_$_]
+008b055600a40400008b055600a40400008b047300a401d3008b047300a4[_^M_][_$_]
+01d3ffb1047300a401d3ffb1047300a401d3ffac06aa00a406aa008b06aa[_^M_][_$_]
+00a406aa008b06aa00a406aa008b05c700a40473008b05c700a40473008b[_^M_][_$_]
+05c700a40473008b05c700a40473008b0639006004730048063900600473[_^M_][_$_]
+004806390060047300480639006004730048055600a40473008b055600a4[_^M_][_$_]
+0473008b05c700a402aa008b05c700a402aa008b05c700a402aa006605c7[_^M_][_$_]
+00a402aa001d0556005c0400003f0556005c0400003f0556005c0400003f[_^M_][_$_]
+0556005c0400003f0556005c0400003f04e3002d0239002304e3002d0239[_^M_][_$_]
+002304e3002d0239ffed04e3002d0239001705c700a40473008705c700a4[_^M_][_$_]
+0473008705c700a40473008705c700a40473008705c700a4047300870556[_^M_][_$_]
+000c0400001b0556000c0400001b078d001905c7000a078d001905c7000a[_^M_][_$_]
+0556000a0400000e0556000a0400000e0556000a0400001b04e300250400[_^M_][_$_]
+002904e300250400002904e30025040000290473008b0239000d05c7000a[_^M_][_$_]
+0400001b0473004e0200008b049c0048049c0048049c0048049c0048049c[_^M_][_$_]
+0048049c0048049c0048049c00480556fffe0556fffe060a0000060a0000[_^M_][_$_]
+05e2000005e20000059c0000059c00000400004804000048040000480400[_^M_][_$_]
+0048040000480400004805eb000005eb0000073000000730000007300000[_^M_][_$_]
+073000000473008b0473008b0473008b0473008b0473008b0473008b0473[_^M_][_$_]
+008b0473008b065c0000065c000007a1000007a1000007a1000007a10000[_^M_][_$_]
+075900000759000001ec008b01ec008b01ecffdb01ecffdb01ec000301ec[_^M_][_$_]
+000301ecff9b01ecff9b02b6000002b6000003fb000003fb000003fb0000[_^M_][_$_]
+03fb000003b3000003b30000047300480473004804730048047300480473[_^M_][_$_]
+004804730048063900000639000007da000007da00000776000007760000[_^M_][_$_]
+047300870473008704730087047300870473008704730087047300870473[_^M_][_$_]
+0087064c00000778000007ca000007490000058500480585004805850048[_^M_][_$_]
+0585004805850048058500480585004805850048063900000639000007da[_^M_][_$_]
+000007da000007760000077600000736000007360000049c0048049c0048[_^M_][_$_]
+04000048040000480473008b0473008b01ecffeb01ec0078047300480473[_^M_][_$_]
+004804730087047300870585004805850048049c0048049c0048049c0048[_^M_][_$_]
+049c0048049c0048049c0048049c0048049c00480556fffe0556fffe060a[_^M_][_$_]
+0000060a000005e2000005e20000059c0000059c00000473008b0473008b[_^M_][_$_]
+0473008b0473008b0473008b0473008b0473008b0473008b065c0000065c[_^M_][_$_]
+000007a1000007a1000007a1000007a10000075900000759000005850048[_^M_][_$_]
+058500480585004805850048058500480585004805850048058500480639[_^M_][_$_]
+00000639000007da000007da000007760000077600000736000007360000[_^M_][_$_]
+049c0048049c0048049c0048049c0048049c0048049c0048049c00480556[_^M_][_$_]
+fffe0556fffe0556fffe0556fffe0556fffe02aa010302aa00f902aa0103[_^M_][_$_]
+02aa000602aa00060473008b0473008b0473008b0473008b0473008b065e[_^M_][_$_]
+0000064d000006cf000006be000005c700a402aa004602aa006e02aa0006[_^M_][_$_]
+01ecffc201ecffb201ecff7e01ecff7e01ecff9b01ecff9b0239fff60239[_^M_][_$_]
+ffe6032900000318000002aa004602aa006e02aa00060473008704730087[_^M_][_$_]
+04730087047300870491008b0491008b04730087047300870556000a0556[_^M_][_$_]
+000a06a6000006e7000005eb0000034800370348003702aa005605850048[_^M_][_$_]
+058500480585004805850048058500480708000006930000070800000693[_^M_][_$_]
+00000639006602aa00e302aa01030000fec30000fec80000fdf40000fed8[_^M_][_$_]
+0000ffa40000feea0000ff4c0000fe9e0000fec30000ffbf0000ff3d0000[_^M_][_$_]
+fe9e0000fed80000fed80000ffae0000ffae0000ffae000000640000ff47[_^M_][_$_]
+0000ff480000ff440000ff440000fe87000000000000ffa60000ff440000[_^M_][_$_]
+ff440000ff440000fec80000ff2d000000000000feeb0000ff4c0000ffae[_^M_][_$_]
+0000ff350000ff240000ffbf0000fe870000febb0000fec30000fec30000[_^M_][_$_]
+fed80000fed80000feb10000fec80000fdbf0000fdf40000feb10000fec8[_^M_][_$_]
+0000fdbf0000fe870000fee30000ffa60000fe870000ff440000feba0000[_^M_][_$_]
+ff230000ff9a0000fdf40000feb10000ffae0000fe940000ffa40000fe87[_^M_][_$_]
+0000fdf40000ff3d0000ff440000feb10000feb10000feb10000ff030000[_^M_][_$_]
+ff440000ff530000ff530000ff53045cffee04c30016045c000c04c30035[_^M_][_$_]
+045c000c04c30035045c000c04c30035045c000c04c30035045c000c04c3[_^M_][_$_]
+0035045c000c04c30035045800790458003c0473000a05fd0000053d00a4[_^M_][_$_]
+0473008b053d000d0473000305c7006905c700600400004805c70002066e[_^M_][_$_]
+0000053d005104730048047300480556006d0514006a04e3ffd106390060[_^M_][_$_]
+0556000c0724008b01d3008b02390014055600a40400008b01d300140400[_^M_][_$_]
+001b06aa008505c7ffd10473008b06390060070e006005a0004805fd0000[_^M_][_$_]
+0473008b055600a40556006a0400005004e50060035600000239002304f7[_^M_][_$_]
+00140239002304e3002d0625007105c700a4062c000a0400001b04e30025[_^M_][_$_]
+04000029046c001f046c006003c6004803c600330473003f0473002f03a9[_^M_][_$_]
+0020044e0023046c008b021400bc0214002605d200c1023900b60a5b00a4[_^M_][_$_]
+097800a4084c0048086000a4064a00a40363008b097800a4073e00a40607[_^M_][_$_]
+008b0556fffe0473004e0239ffdf01d3ffa9063900600473004805c700a4[_^M_][_$_]
+0473008705c700a40473008705c700a40473008705c700a40473008705c7[_^M_][_$_]
+00a404730087047300480556fffe0473004e0556fffe0473004e08000000[_^M_][_$_]
+071d004e06390060047300480639006004730048055600a40400008b0639[_^M_][_$_]
+0060047300480639006004730048046c001f03c6002b01d3ffac0a5b00a4[_^M_][_$_]
+097800a4084c00480639006004730048085b00a4046c008b05c700a40473[_^M_][_$_]
+008b0556fffe0473004e0556fffe0473004e055600a404730048055600a4[_^M_][_$_]
+047300480239ff6601d3ff3e0239fffa01d3ffc806390060047300480639[_^M_][_$_]
+00600473004805c700a402aa000605c700a402aa007c05c700a40473006a[_^M_][_$_]
+05c700a404730087040200420374002305c700a40473008b057900a404a8[_^M_][_$_]
+00420446003904e30025040000290556fffe0473004e0639006004730048[_^M_][_$_]
+0639006004730048063900600473004806390060047300480556000a0400[_^M_][_$_]
+001b02aa001d02aa001d02aa001702aa003f02aa00040473008c049c0048[_^M_][_$_]
+049c00480473008b0400001b0400000004730048047300480473004805db[_^M_][_$_]
+004804000048040000230552002304460048026200100473004804730048[_^M_][_$_]
+04ae004b0400001b04e0001d047300870473008b0473008b01d3000001ec[_^M_][_$_]
+008b01d3008b029e0000024e000001d3008b0486008b06aa008506aa0085[_^M_][_$_]
+06aa008b0473ffb80473008b0455008b0473004805c50048058500480473[_^M_][_$_]
+004802aafff802aafff802aafff802aa008b02aa008b0239008b0239fff8[_^M_][_$_]
+0447008b0447008b0400003f0231ffb2026200100231ffcf039900000239[_^M_][_$_]
+0012023900230473000004c50048043b00870400001b05c7000a0400001b[_^M_][_$_]
+03ce000004000029046e002903c6002b03c6002c0400001b040000480400[_^M_][_$_]
+001b0400004806390060043f008b0446004804ae004b0473008b02ff000a[_^M_][_$_]
+040000080364008b047300480400001b04000048078e00480718004807fc[_^M_][_$_]
+004805b6002303930023060c0023061900100568008b04f0008b03e2001e[_^M_][_$_]
+048200880481008b0473008705cd000a0767fffd05cd000a047300480585[_^M_][_$_]
+004804970014063900600473004805c700600400004804e300a403fc008b[_^M_][_$_]
+04ff0000043c0032060d000a049d000006aa008506aa0085057900770473[_^M_][_$_]
+0087057900a4044e000a0556006a0556006a04e0000504e0000505e50060[_^M_][_$_]
+0476004803c70014034f0028049700140496005e0400004801d3ffb80639[_^M_][_$_]
+006003b6004803b6001b095f006005e8001b0600000a04c0000a079800a4[_^M_][_$_]
+05c2008b054a000d03fe001b06f800a4057a008b0735000805aa000508f7[_^M_][_$_]
+00a4076c008b0514006d0400004a0679005e058500870639006004730048[_^M_][_$_]
+0604000c04a4001b0604000c04a4001b0ab3006008d300480711005f0568[_^M_][_$_]
+0048095f006008800048095f006005e8001b05c700600400004803f80014[_^M_][_$_]
+02aafffa02aa000002aa000002aa000007bd000a07bd002a05c700a40479[_^M_][_$_]
+008b053d000f042f0008055600a40473008b048900a40426008b0514005a[_^M_][_$_]
+040000230556001804000008069d000a04d1000a071200a40543008b0847[_^M_][_$_]
+00a406c6008b05c700600400004805c700600400004804e3002d03aa0025[_^M_][_$_]
+0744000a0563000a057900770444005e070b000a053b000a070b000a053b[_^M_][_$_]
+000a023900bc0735000605aa0004055600a40400008b05a4000a0491000a[_^M_][_$_]
+05c700a40473008b05c700a40473008b057900770444005e06aa00a405b6[_^M_][_$_]
+008b0556fffe0473004e0556fffe0473004e08000000071d004e055600a4[_^M_][_$_]
+0473004806390060047300480735000605aa00040514005a040000230443[_^M_][_$_]
+001f03c6002b05c700a40479008b05c700a40479008b0639006004730048[_^M_][_$_]
+063900600473004805bc005e0400001b051f00080400001b051f00080400[_^M_][_$_]
+001b051f00080400001b057900770444005e071000a405bc008b053d0051[_^M_][_$_]
+0473004807d100510724004807e2006d06f0004a0582006d0468004a0838[_^M_][_$_]
+000a073e000a085b00a4071f008b0639006004ae004b0609002d056b0025[_^M_][_$_]
+02aa001d02aa001702aa003f02aa001d02aa000402aaff8c04c1003304c1[_^M_][_$_]
+0033028f004c0000fed802fe000004cd0037045cffc904c3fff100000000[_^M_][_$_]
+000000280000002800000028000000380000009800000102000002a20000[_^M_][_$_]
+0412000005600000070e0000076a000007da0000084c000008f000000976[_^M_][_$_]
+000009ea00000a3600000a7200000ae400000b9400000bfe00000cc40000[_^M_][_$_]
+0dda00000e8000000f7400001064000010fe0000123a0000132e0000137c[_^M_][_$_]
+00001402000014b000001520000015d0000016b8000018e400001a1a0000[_^M_][_$_]
+1b4600001c6a00001d2600001db800001e3400001f8600002024000020a0[_^M_][_$_]
+0000215400002280000022da0000243a000024d8000025fe000026c80000[_^M_][_$_]
+28cc00002a1e00002bd200002c4200002ce200002dce00003086000031b8[_^M_][_$_]
+000032c60000335e000033bc0000342e00003484000035400000356a0000[_^M_][_$_]
+35c40000374c0000385e0000394c00003a4e00003b8a00003c5e00003de8[_^M_][_$_]
+00003e9200003ee800003fb2000040d00000411000004228000042da0000[_^M_][_$_]
+43ce000044ea0000460400004682000047e8000048ae0000496800004a68[_^M_][_$_]
+00004c5400004e0200004f7200005016000050fa0000515a000052380000[_^M_][_$_]
+52ec0000534c00005388000054f2000055320000558c000055da0000562c[_^M_][_$_]
+0000565a0000568a000056bc000056f60000572e000057660000589a0000[_^M_][_$_]
+58c8000058f4000059220000596c000059e400005a5000005a9400005b0a[_^M_][_$_]
+00005b2e00005b5a00005b8600005bb400005c0600005c3800005c660000[_^M_][_$_]
+5c9200005cb600005d0800005da200005e380000600e000061620000631a[_^M_][_$_]
+000063a40000642e000065680000670a0000689c000069f400006a500000[_^M_][_$_]
+6a9800006b7400006c6200006df200006eec00006f7c0000704600007112[_^M_][_$_]
+000072820000732c00007416000074c2000075120000757c000076060000[_^M_][_$_]
+7712000077ba000078a400007a6a00007b8a00007c9400007d0600007d84[_^M_][_$_]
+00007e1000007f0000007fda000080ce00008148000081c6000082500000[_^M_][_$_]
+8296000082f40000834e0000846c000085f20000864a000086aa00008770[_^M_][_$_]
+0000883a000088a200008918000089a400008a3e00008a7a00008ac60000[_^M_][_$_]
+8b3a00008c8200008cfe00008d7e00008e7e00008f6a000090300000907a[_^M_][_$_]
+000090f0000091ac00009390000093e00000942600009466000094b80000[_^M_][_$_]
+94fa0000953600009576000096180000965c000096a2000097080000974e[_^M_][_$_]
+00009796000097f00000983200009868000098d00000994c000099740000[_^M_][_$_]
+99fa00009a4a00009ad000009b4600009be800009c5800009ce600009dce[_^M_][_$_]
+00009e9e00009ee400009f1200009f5600009f7a00009ff80000a0e20000[_^M_][_$_]
+a21e0000a25e0000a28c0000a3700000a4840000a4d80000a5ca0000a62e[_^M_][_$_]
+0000a6fc0000a7dc0000a8700000a9080000a9a80000aa420000aa8a0000[_^M_][_$_]
+aab40000aaf00000aca60000ae180000ae5e0000ae8c0000aed40000aefe[_^M_][_$_]
+0000b0380000b0760000b0860000b0c60000b0f20000b2840000b4400000[_^M_][_$_]
+b4860000b4ca0000b4da0000b5c40000b7660000b7aa0000b7d40000b818[_^M_][_$_]
+0000b86c0000b91e0000b9ba0000b9d20000b9ea0000ba2c0000ba540000[_^M_][_$_]
+ba9e0000bace0000bb180000bb460000bb8a0000bbb80000bbfe0000bc3a[_^M_][_$_]
+0000bc7a0000bca20000bd7e0000bebc0000bf000000c01c0000c05a0000[_^M_][_$_]
+c0980000c0f00000c1240000c1680000c1940000c1ca0000c1ee0000c244[_^M_][_$_]
+0000c35c0000c4820000c5ce0000c6ec0000c7ee0000c8be0000c9640000[_^M_][_$_]
+ca740000caba0000cb060000cb860000cd5a0000cd8c0000cdb40000cdee[_^M_][_$_]
+0000ce200000ce820000cff40000d0ee0000d1440000d1780000d1c60000[_^M_][_$_]
+d2180000d2d00000d43e0000d47a0000d4be0000d4e20000d5180000d53c[_^M_][_$_]
+0000d6080000d7760000d7b80000d7dc0000d8a00000d8d20000d91e0000[_^M_][_$_]
+d94a0000d98c0000d9b00000db580000dd080000dd4c0000dd900000de72[_^M_][_$_]
+0000df6a0000dfe80000e0240000e0c20000e1080000e1860000e1c20000[_^M_][_$_]
+e2800000e32e0000e37c0000e44e0000e5e00000e7740000e8860000e95a[_^M_][_$_]
+0000ea2e0000ea5c0000ea8c0000eb660000ec4c0000ec920000eccc0000[_^M_][_$_]
+ed0c0000ed300000ed580000ee460000ee8c0000eeb40000ef500000f03e[_^M_][_$_]
+0000f07e0000f0a20000f0f20000f1280000f1680000f18c0000f28c0000[_^M_][_$_]
+f3bc0000f4000000f4240000f4680000f48c0000f4e80000f6b60000f8b8[_^M_][_$_]
+0000f8fa0000f9220000f9680000f9940000f9de0000fa200000fa440000[_^M_][_$_]
+fa7a0000faa20000fae60000fb160000fb560000fb7a0000fbe00000fc1e[_^M_][_$_]
+0000fd800000fe460000fefe0000ffb800010072000101240001018c0001[_^M_][_$_]
+02000001023a000102e000010336000103ba0001042c000104b600010512[_^M_][_$_]
+00010562000105ae00010624000107560001087c00010942000109d80001[_^M_][_$_]
+0a7200010b1000010b8e00010cc000010d8200010ed400010f6e00010ffc[_^M_][_$_]
+000110fe00011184000112520001131400011396000114a8000115dc0001[_^M_][_$_]
+16ae000117b2000118900001190a0001193600011976000119a6000119fe[_^M_][_$_]
+00011a4a00011b5400011c7800011d9200011e5a00011f3e00011fc40001[_^M_][_$_]
+20ec0001224c0001231c0001241c00012568000125780001264c0001272e[_^M_][_$_]
+000127be0001294600012a3600012b2200012b8c00012bd800012c060001[_^M_][_$_]
+2c4000012c9600012cf200012e1600012e5a00012f86000130f00001317c[_^M_][_$_]
+0001324000013250000133440001343a0001353000013590000135ea0001[_^M_][_$_]
+3688000137c200013882000139b400013a1600013ae200013b8600013ce6[_^M_][_$_]
+00013e1a00013ede00013f1c000140420001410c000142680001430c0001[_^M_][_$_]
+44040001448e0001456000014660000146d20001485c0001496c00014aa6[_^M_][_$_]
+00014b5400014c0a00014cc400014da800014e9600014f2600014fec0001[_^M_][_$_]
+513c0001528a000153ac0001552c0001562800015700000157740001584e[_^M_][_$_]
+0001598c00015b1400015c1c00015cda00015d2200015e2a00015eee0001[_^M_][_$_]
+600e000160b00001619c0001621e0001633e000164060001648600016658[_^M_][_$_]
+000167d20001693e000169e200016a9c00016b5600016c4400016d020001[_^M_][_$_]
+6d6400016dfa00016f2e0001702600017120000171740001728a000172b0[_^M_][_$_]
+000173c6000173d6000173e60001748000017490000175b8000176900001[_^M_][_$_]
+776a0001778e000177cc00017846000178d40001794a0001798000017abc[_^M_][_$_]
+00017b1200017baa00017c7400017cf800017de400017e2400017e480001[_^M_][_$_]
+7e6c00017fce00018070000181f6000182ec000183e600018450000184f6[_^M_][_$_]
+000185f20001864a000186b00001871c0001882600018890000188e20001[_^M_][_$_]
+892a0001897c000189d600018a4800018aae00018b1200018c7600018d0a[_^M_][_$_]
+00018dd000018e3a00018ee600018f6600018fda00019078000191760001[_^M_][_$_]
+91fc0001929000019320000193fe000194a8000195940001962a000196ae[_^M_][_$_]
+00019780000198440001990e000199ee00019af200019c3600019d4c0001[_^M_][_$_]
+9dc600019ec600019f7a00019fcc0001a0280001a0920001a0ce0001a132[_^M_][_$_]
+0001a2100001a2340001a2660001a2a40001a2ca0001a3060001a3dc0001[_^M_][_$_]
+a4000001a4220001a4680001a4ac0001a4d00001a4f40001a5400001a568[_^M_][_$_]
+0001a58e0001a5ba0001a5de0001a6020001a6340001a6580001a6840001[_^M_][_$_]
+a6ac0001a6d40001a6fc0001a7200001a7460001a76a0001a7c20001a810[_^M_][_$_]
+0001a8460001a87e0001a8a60001a8dc0001a9000001a9240001a94c0001[_^M_][_$_]
+a9740001a99c0001aaa00001aad00001ab800001abe00001ac420001acac[_^M_][_$_]
+0001ae020001af3c0001b0240001b10e0001b17a0001b1a20001b1fc0001[_^M_][_$_]
+b2580001b2e40001b3720001b44a0001b5160001b5a40001b6320001b700[_^M_][_$_]
+0001b7c20001b84e0001b91a0001b9c40001ba700001bb660001bc420001[_^M_][_$_]
+bd100001bd340001bd5c0001bd840001bdb20001be020001be3e0001be8e[_^M_][_$_]
+0001bec20001bf160001bf4c0001bf820001bfb60001c0140001c05a0001[_^M_][_$_]
+c0800001c0ae0001c0d40001c1020001c1280001c1560001c17c0001c1aa[_^M_][_$_]
+0001c1e00001c2200001c2440001c2680001c28c0001c2b00001c2f00001[_^M_][_$_]
+c3140001c3620001c39a0001c3e80001c41c0001c46e0001c4a20001c4e4[_^M_][_$_]
+0001c5140001c5700001c5ae0001c5e40001c61e0001c6400001c6620001[_^M_][_$_]
+c6860001c6aa0001c6d20001c6fa0001c7680001c7a00001c81e0001c84e[_^M_][_$_]
+0001c8c40001c8f00001c9180001c93e0001c9ba0001c9f80001ca3e0001[_^M_][_$_]
+ca6a0001caa60001cada0001cb020001cb320001cb6e0001cb940001cbb8[_^M_][_$_]
+0001cbdc0001cc000001cc240001cc4c0001cc700001ccae0001ccdc0001[_^M_][_$_]
+cd140001cd400001cd680001cd940001cdce0001cdfc0001ce200001ce44[_^M_][_$_]
+0001ce680001ce8c0001cec00001ceee0001cf240001cf4e0001d0800001[_^M_][_$_]
+d0ec0001d17e0001d2060001d2680001d2940001d2cc0001d3080001d33a[_^M_][_$_]
+0001d3700001d4440001d5640001d5a00001d5d60001d6ca0001d7180001[_^M_][_$_]
+d81c0001d8ee0001d99e0001da5c0001db380001dcb80001dd660001de14[_^M_][_$_]
+0001df000001dfd20001e0a60001e0f80001e1c60001e2b20001e40c0001[_^M_][_$_]
+e44e0001e4a20001e4ee0001e5240001e56e0001e6080001e6460001e696[_^M_][_$_]
+0001e7c60001e8320001e9120001e9440001ea800001eba80001ec560001[_^M_][_$_]
+ec820001ee520001eea20001efe00001f0780001f0dc0001f20e0001f2fe[_^M_][_$_]
+0001f3f00001f5a20001f6ae0001f7020001f75c0001f7b60001f7e80001[_^M_][_$_]
+f8820001f8cc0001f9a00001fad00001fb960001fbf40001fc900001fcca[_^M_][_$_]
+0001fd380001fd720001fdce0001fdfa0001fe4a0001fe820001febc0001[_^M_][_$_]
+feea0001ffe40002001c000200c60002010a00020190000201da000202fc[_^M_][_$_]
+0002034c00020496000204e2000205bc000205fc000207300002076c0002[_^M_][_$_]
+07ac000208b2000209cc00020af600020ba800020c8000020d5200020e32[_^M_][_$_]
+00020ee00002103a0002109a0002112600021250000212e0000213400002[_^M_][_$_]
+14160002147800021540000215e80002164c000216aa0002175c000217ee[_^M_][_$_]
+0002181a00021868000218d40002193400021a1800021b1e00021b940002[_^M_][_$_]
+1d5a00021dce00021e6400021f6a00022052000220940002219e00022328[_^M_][_$_]
+0002239400022476000224ba000225c400022734000227a0000228880002[_^M_][_$_]
+2a4200022b1600022bba00022d1a00022d5e00022e5200022f8c0002302c[_^M_][_$_]
+0002310c000231ec00023352000234ec00023640000237b8000239980002[_^M_][_$_]
+3a8000023bae00023d4400023f200002413200024338000245a6000247b2[_^M_][_$_]
+00024a0400024d2e00024f160002515a0002534a000254da0002566a0002[_^M_][_$_]
+57c00002590200025a2000025b9e00025ca400025dae00025ec600025fe2[_^M_][_$_]
+0002612000026262000263ac00026504000266340002676a000268ae0002[_^M_][_$_]
+6a3800026b8600026c8200026e600002704a0002722e000273bc000275aa[_^M_][_$_]
+00027716000278f000027a2600027bae00027c6e00027cec00027dfc0002[_^M_][_$_]
+7e6a00027efa00028006000280f2000281a400028288000282e60002834e[_^M_][_$_]
+000284680002853a0002868a000287ee0002896200028a6e00028aee0002[_^M_][_$_]
+8c4200028d9800028dd800028ed400029016000290ae0002919000029230[_^M_][_$_]
+000293460002947600029514000296760002982c000299c000029b3c0002[_^M_][_$_]
+9d2800029e980002a07a0002a23a0002a3c60002a52c0002a69a0002a75c[_^M_][_$_]
+0002a86a0002a8ca0002a8da0002a9d40002aab80002ac2c0002adec0002[_^M_][_$_]
+af440002af9c0002b0ec0002b0fc0002b2900002b4020002b4120002b422[_^M_][_$_]
+0002b44e0002b4900002b4e80002b4f80002b5080002b5180002b5280002[_^M_][_$_]
+b63c0002b6f00002b7ec0002b7fc0002b80c0002b81c0002b8400002b862[_^M_][_$_]
+0002b8a40002b8d00002b9100002b9340002b9440002b9540002b9640002[_^M_][_$_]
+b9740002b9840002ba1a0002bac60002bbe60002bd220002be1c0002bede[_^M_][_$_]
+0002c00e0002c1060002c1a40002c2480002c2580002c3060002c3dc0002[_^M_][_$_]
+c4b80002c5a00002c6820002c77a0002c87a0002c93a0002c94a0002ca48[_^M_][_$_]
+0002cb340002cc1c0002ccf20002d0fe0002d1440002d18e0002d1be0002[_^M_][_$_]
+d1f60002d2260002d26c0002d31c0002d34e0002d3a60002d3e60002d42c[_^M_][_$_]
+0002d4d40002d5760002d62a0002d78a0002d7d20002d8160002d8da0002[_^M_][_$_]
+d9640002d9980002d9ce0002d9fa0002daae0002db560002dca60002dcf4[_^M_][_$_]
+0002dd4a0002df5c0002e0b20002e2a40002e3840002e3ae0002e4b00002[_^M_][_$_]
+e5760002e6a20002e7b40002e9940002eaca0002ec2c0002edd20002edfa[_^M_][_$_]
+0002f0340002f1340002f27a0002f4ac0002f5900002f6780002f6f40002[_^M_][_$_]
+f7600002f80a0002f8700002f9400002f99c0002f9ae0002f9c00002fa38[_^M_][_$_]
+0002fab00002fb380002fbc00002fbf40002fc280002fc700002fd7a0002[_^M_][_$_]
+fdac0002fe040002fe3c0002fe820002feaa0002fee00002ff120002ff44[_^M_][_$_]
+0002ffa200030008000300420003007e000300c6000301120003014e0003[_^M_][_$_]
+018c000301d000030214000302560003028e000302c6000303080003033c[_^M_][_$_]
+00030390000303c200030402000304480003047a000304be000305020003[_^M_][_$_]
+05480003059000030794000307d400030810000308400003089e000308e2[_^M_][_$_]
+0003091800030966000309b400030a0600030a5800030aae00030ae20003[_^M_][_$_]
+0bca00030c2a00030c7e00030cda00030d3600030d9800030ddc00030e16[_^M_][_$_]
+00030e9200030f1000030f4c00030f8800030fe0000310380003107a0003[_^M_][_$_]
+10ca0003111e00031160000311b8000312a6000312d80003130800031338[_^M_][_$_]
+00031392000313e60003144c00031484000314ba000314f0000315440003[_^M_][_$_]
+1592000315e800031632000316820003178e00031884000318ec00031954[_^M_][_$_]
+00031984000319be000319fa00031a4400031a7a00031ab000031b1a0003[_^M_][_$_]
+1b8400031bbc00031bfc00031c2200031c4800031c7a00031cb000031d0c[_^M_][_$_]
+00031d9e00031dfe00031e5e00031eb000031f020003200c000320e20003[_^M_][_$_]
+21d800032210000322400003228a000322b0000322f40003235200032394[_^M_][_$_]
+000323d00003240a000324400003247c000324be000325ae000325e20003[_^M_][_$_]
+26240003265a0003268e000326d800032728000328c200032a1800032a58[_^M_][_$_]
+00032a9000032adc00032b1800032b5200032d6200032db000032fd60003[_^M_][_$_]
+3126000331bc000332b80003330a0003343000033676000339520003398a[_^M_][_$_]
+000339b600033a3400033ac200033aee00033b5800033c2800033cf60003[_^M_][_$_]
+3d0800033dac00033fbe00033fec0003405000034094000341000003417a[_^M_][_$_]
+000341da00034240000342a00003431600034384000343e80003450a0003[_^M_][_$_]
+45f8000346a000034712000347b000034820000348d60003496800034a50[_^M_][_$_]
+00034af200034bbe00034c6800034d1800034d9a00034e5200034ef00003[_^M_][_$_]
+4f860003500c00035110000352c800035310000353680003539e000353ce[_^M_][_$_]
+000353f2000354160003545400035492000354d8000355060003553c0003[_^M_][_$_]
+557200035598000355c0000355fc00035638000356600003568c000356c8[_^M_][_$_]
+00035708000357300003575800035780000357a8000357e4000358200003[_^M_][_$_]
+58560003588c000358c4000358e80003591e0003595200035990000359b6[_^M_][_$_]
+000359ec00035a1c00035a4200035a6800035aa200035adc00035bc80003[_^M_][_$_]
+5ccc00035d0400035d3c00035d7200035da800035dd000035df800035e52[_^M_][_$_]
+00035e9400035ebc00035ee400035f2200035f6e00035f9400035fb80003[_^M_][_$_]
+60000003604600036082000360c0000360fc000361380003617c000361a2[_^M_][_$_]
+000361d8000362060003622c0003625200036288000362b6000362dc0003[_^M_][_$_]
+63020003633e0003637a000363b6000363f20003641a000364420003646c[_^M_][_$_]
+00036496000364be000364e60003650e0003653600036578000365a40003[_^M_][_$_]
+65dc0003660a000366420003667000036698000366c60003671200036750[_^M_][_$_]
+00036796000367dc0003681200036840000368660003688c000368bc0003[_^M_][_$_]
+68e40003690c000369340003697c000369ba000369f000036a3800036a5e[_^M_][_$_]
+00036a8200036abe00036b0000036b3c00036b7a00036baa00036bda0003[_^M_][_$_]
+6c1000036c4600036c8200036cbe00036ce600036d0e00036d3800036d62[_^M_][_$_]
+00036da200036dc800036dee00036e1400036e4200036e6800036e8e0003[_^M_][_$_]
+6eb400036ee200036f0800036f3a00036f6200036f9000036fb400036fea[_^M_][_$_]
+0003700e000370340003705800037094000370d00003710c000371540003[_^M_][_$_]
+717c000371a40003734200037376000373ae000373e80003741a0003744c[_^M_][_$_]
+00037484000374bc000375040003754e00037596000375de000376360003[_^M_][_$_]
+768e000376e200037738000377a8000378180003784600037874000378a6[_^M_][_$_]
+000378d80003790e0003794000037996000379ee00037a5000037ab20003[_^M_][_$_]
+7b0a00037b6000037b8e00037bbc00037bee00037c2000037c5800037c90[_^M_][_$_]
+00037cce00037d0c00037d6000037db600037e1600037e7600037ed20003[_^M_][_$_]
+7f2c00037f9000037ff80003802c0003806000038094000380c8000380fe[_^M_][_$_]
+0003813400038174000381b40003820400038256000382b6000383160003[_^M_][_$_]
+8374000383d40003842c00038488000384b6000384e40003851600038548[_^M_][_$_]
+00038580000385b8000386020003864e000386a6000386fe000387500003[_^M_][_$_]
+87a4000387d2000388040003883600038868000388a6000388e400038922[_^M_][_$_]
+00038960000389ba00038a1a00038a8200038ae600038b1400038b420003[_^M_][_$_]
+8b7400038ba600038bde00038c1600038c5000038c8a00038cd400038d1e[_^M_][_$_]
+00038d8000038de200038e3a00038e9400038f0200038f7000038fa40003[_^M_][_$_]
+8fda0003900a0003903e00039072000390a4000390e40003911800039148[_^M_][_$_]
+00039176000391a6000391dc0003920a0003923a0003928c000392e00003[_^M_][_$_]
+932c00039378000393cc0003942000039484000394ea000395440003959e[_^M_][_$_]
+000396060003966e000396d20003973c000397b40003982c000398680003[_^M_][_$_]
+98a4000398e4000399240003996a000399b0000399fe00039a4c00039ab2[_^M_][_$_]
+00039b1a00039b8600039bf200039c5c00039cc400039d3c00039db40003[_^M_][_$_]
+9df200039e3000039e7200039eb400039efe00039f4800039f9400039fe0[_^M_][_$_]
+0003a0440003a0a80003a11e0003a1940003a1fa0003a2620003a2e00003[_^M_][_$_]
+a35e0003a3900003a3ba0003a40a0003a43a0003a48a0003a4b80003a500[_^M_][_$_]
+0003a5440003a57a0003a5d80003a62c0003a6500003a6ac0003a7120003[_^M_][_$_]
+a76e0003a7ea0003a8940003a8d80003a8fc0003a93c0003a96a0003a9a6[_^M_][_$_]
+0003a9fa0003aa500003aaa60003ab040003ab2a0003abdc0003ac9c0003[_^M_][_$_]
+ad7c0003adac0003add80003ae160003ae540003ae840003aec00003af08[_^M_][_$_]
+0003af3e0003af960003aff80003b0aa0003b1760003b2560003b2840003[_^M_][_$_]
+b2aa0003b2e00003b3160003b3440003b3720003b3a00003b3de0003b422[_^M_][_$_]
+0003b4580003b4c40003b5240003b57e0003b5fe0003b6860003b6da0003[_^M_][_$_]
+b7180003b73e0003b7800003b7ae0003b7ec0003b83e0003b8920003b8ea[_^M_][_$_]
+0003b93e0003b9700003b9c60003ba220003bab40003bade0003bb080003[_^M_][_$_]
+bb700003bb980003bbd60003bc3e0003bccc0003bd600003bd860003bdc2[_^M_][_$_]
+0003be4a0003becc0003bf3a0003bfc00003c04c0003c0d80003c1640003[_^M_][_$_]
+c1b00003c1fe0003c2340003c2680003c29a0003c3060003c3b20003c3e8[_^M_][_$_]
+0003c41e0003c4640003c48e0003c4ea0003c5460003c5840003c5f00003[_^M_][_$_]
+c67a0003c6f00003c7540003c77a0003c7b40003c82c0003c8be0003c950[_^M_][_$_]
+0003c9b80003ca260003caa80003cad20003cb000003cb480003cbcc0003[_^M_][_$_]
+cbf60003cc200003cc7c0003ccbe0003cd680003cda20003cdf20003ce72[_^M_][_$_]
+0003cee40003cf580003cf980003d01c0003d0a80003d12e0003d1940003[_^M_][_$_]
+d1ce0003d2160003d2520003d2800003d3140003d3960003d43c0003d48a[_^M_][_$_]
+0003d4da0003d5500003d5bc0003d5fc0003d62e0003d6600003d6980003[_^M_][_$_]
+d6d00003d6fc0003d7280003d7540003d7800003d7ac0003d7d80003d80c[_^M_][_$_]
+0003d8400003d8780003d8b00003d9740003d9c80003daac0003dba60003[_^M_][_$_]
+dbb60003dc7a0003dd180003dde60003debc0003dfd00003e0b20003e0c2[_^M_][_$_]
+0003e1640003e1fc0003e2ba0003e3a00003e3fe0003e4fa0003e5720003[_^M_][_$_]
+e6a00003e79c0003e8580003e8680003e8bc0003e9a00003ea6e0003eac8[_^M_][_$_]
+0003ebd20003ec7a0003ed280003ed380003ed480003ee140003eeca0003[_^M_][_$_]
+ef960003f06a0003f13c0003f2940003f3980003f3a80003f4440003f4fa[_^M_][_$_]
+0003f5620003f6120003f6780003f7740003f8240003f8d60003f9980003[_^M_][_$_]
+fa4e0003fb200003fc220003fd260003fe060003ff380004002c00040112[_^M_][_$_]
+000401d4000402ce0004037200040382000403aa00040428000404380004[_^M_][_$_]
+0476000404b4000404f2000405200004054c000405780004059e000405ca[_^M_][_$_]
+000405f6000406240004065200040680000406ac000406da000407080004[_^M_][_$_]
+0736000407640004079a000407d0000408060004083c00040872000408a8[_^M_][_$_]
+000408de00040914000409240004095a00040990000409c2000409f40004[_^M_][_$_]
+0a2200040a5000040b7400040c9600040cc400040cf200040d2000040d4e[_^M_][_$_]
+00040e8600040f7600040fa400040fd2000410000004102e000410c20004[_^M_][_$_]
+10e80004110e0004113400041162000411900004123e000412d800041306[_^M_][_$_]
+000413340004136600041398000413c6000413f400041426000414580004[_^M_][_$_]
+1486000414b4000414e6000415180004154600041574000415a6000415d8[_^M_][_$_]
+00041606000416340004166600041698000416c6000416f4000417260004[_^M_][_$_]
+175800041786000417b4000418aa00041990000419be000419ec00041a66[_^M_][_$_]
+00041b9400041cce00041d5800041df000041e1e00041e4c00041e820004[_^M_][_$_]
+1eb800041eea00041f1c00041f4a00041f7800041faa00041fdc0004200a[_^M_][_$_]
+0004203800042090000420ce00042168000421c80004223a000423080004[_^M_][_$_]
+231800042420000424e8000425bc000426ec000427c20004289000042962[_^M_][_$_]
+00042ad200042ae200042af200042c4e00042d2600042d9200042ea60004[_^M_][_$_]
+2eb600042f7c00043086000431f000043260000432e80004339a0004340a[_^M_][_$_]
+0004341a0004342a000434cc00043562000435b6000436ba000437600004[_^M_][_$_]
+3808000438da0004397e00043a2000043aae00043abe00043bcc00043cca[_^M_][_$_]
+00043d9400043df000043e4c00043ecc00043f2e00043fb20004400a0004[_^M_][_$_]
+40640004411c000441d80004435400044364000444060004449a000445b6[_^M_][_$_]
+0004462e000446a4000447520004483c000448d00004493c00044a1c0004[_^M_][_$_]
+4acc00044b5400044bec00044cd600044dd400044f660004500c000450b8[_^M_][_$_]
+0004516200045210000453180004532800045406000454fe0004550e0004[_^M_][_$_]
+55a000045642000456800004575000045810000458ca000459bc00045b28[_^M_][_$_]
+00045c8e00045dbc00045e92000460060004610c00046220000462920004[_^M_][_$_]
+641c000464860004656c0004666000046706000467380004676a0004677a[_^M_][_$_]
+000468500004698400046a8400046b5c00046c6400046d4e00046dae0004[_^M_][_$_]
+6e0a00046f1800046f94000470ba000471ce0004729200047356000473f4[_^M_][_$_]
+00047482000475180004767a0004768a000477d6000478e600047a2a0004[_^M_][_$_]
+7b2000047bee00047c9e00047d1e00047e1000047efc00047f0c00047f1c[_^M_][_$_]
+00047f2c00047fb2000480420004819e000482f2000483a20004843c0004[_^M_][_$_]
+85560004865400048712000487e40004890600048a3e00048b1400048c12[_^M_][_$_]
+00048d2c00048e7800049016000491a2000492540004930a0004944c0004[_^M_][_$_]
+957800049610000496b6000496e80004971a000498e200049a8c00049bb8[_^M_][_$_]
+00049cdc00049e660004a0120004a0400004a06e0004a12e0004a1ca0004[_^M_][_$_]
+a2cc0004a32c0004a39e0004a3da0004a4160004a5e00004a7f00004a8c8[_^M_][_$_]
+0004a9aa0004aa5c0004aae80004abec0004acfe0004adca0004ae920004[_^M_][_$_]
+afd20004b1000004b1c20004b2820004b32a0004b3dc0004b4440004b4ac[_^M_][_$_]
+0004b5880004b65c0004b79c0004b8cc0004b9ee0004bae40004bb3c0004[_^M_][_$_]
+bb960004bc020004bc720004bcf60004bd7c0004be8c0004bf800004c0d2[_^M_][_$_]
+0004c20a0004c21a0004c2480004c2760004c35e0004c4420004c4c80004[_^M_][_$_]
+c55e0004c5e00004c65e0004c6de0004c75e0004c7e00004c8620004c936[_^M_][_$_]
+0004ca2e0004ca5c0004ca8a0004cabc0004caee0004cafe0004cb0e0004[_^M_][_$_]
+cb3c0004cb6a0004cb9c0004cbce0004cc000004cc320004cc640004cc96[_^M_][_$_]
+0004cd620004cd720004cda00004cdce0004ce000004ce320004ce640004[_^M_][_$_]
+ce960004cec80004cefa0004cf2c0004cf5e0004cf8c0004cfba0004cfec[_^M_][_$_]
+0004d01e0004d0500004d0800004d0b20004d0e40004d16a0004d1d80004[_^M_][_$_]
+d26c0004d27c0004d3760004d4800004d5800004d66c0004d7360004d804[_^M_][_$_]
+0004d8b20004d9700004da220004dac40004dba80004dc600004dcea0004[_^M_][_$_]
+dd700004ddc60004de560004deb80004def40004df7e0004dfde0004e012[_^M_][_$_]
+0004e0460004e0860004e0ee0004e11a0004e19e0004e1e00004e2220001[_^M_][_$_]
+000008d1008c0010004c000700020010002f005500000469ffff00030001[_^M_][_$_]
+b15440b80135b31c22392f410c0135003f0135004f0135008f0135009f01[_^M_][_$_]
+3500050040012eb31c1f3930411201280001004001280080012800900128[_^M_][_$_]
+00a0012800b00128000500ef0126000100400125b31b1f3940410a012400[_^M_][_$_]
+01002f01050001004f010400010040010340aa090d392f652f662f672f68[_^M_][_$_]
+2f692f6a2f742f752f7b2f7c2fd12fd20c20fc30fc40fcd0fc04f1f2197f[_^M_][_$_]
+f2018ff2aff2e0f203d1d216171c7b7c161b7b7c19307c407c507c607c70[_^M_][_$_]
+7c05767716171c6d7016171c6c6f16171c6b6e161b0f6b7f6b8f6e9f6eaf[_^M_][_$_]
+6e056b6e7f721a747514151c676a14151ca96ab96ae96af96a0466691415[_^M_][_$_]
+1cc669016568141b0f651f6502af68bf68ef65ff6504656885711a197316[_^M_][_$_]
+7a431921794319217f413201340001007f01330080013300900133000300[_^M_][_$_]
+6f0132007f0132008f01320003007001210001002f0121003f0121004f01[_^M_][_$_]
+21005f0121000400a0011e00b0011e00c0011e00030020012d0030012d00[_^M_][_$_]
+60012d0070012d0080012d0090012d00060040010fb40b1f39092f411f01[_^M_][_$_]
+0e005f010e009f010e00af010e00bf010e00050090010e00bf010e00cf01[_^M_][_$_]
+0e00df010e00ef010e00050020010e006f010e00b0010e00d0010e00e001[_^M_][_$_]
+0eb205d10f4123010e003f010e00bf010e00cf010e0004000f010e005f01[_^M_][_$_]
+0e006f010e00a0010e00bf010e00cf010e00df010e0007003f010e004f01[_^M_][_$_]
+0e007f010e00af010e00ef010e00ff010eb2069f7f4123010e00af010e00[_^M_][_$_]
+e0010e00ff010e0004001f010e003f010e00af010e00df010e00ef010e00[_^M_][_$_]
+05000f010e001f010e002f010e007f010e008f010e00c0010e00df010e00[_^M_][_$_]
+ef010eb2086d9f411b010e00cf010e00ef010e00ff010e0004000f010e00[_^M_][_$_]
+ef010e0002000f010e002f010e003f010e004f010e00c0010e00df010e00[_^M_][_$_]
+ef010eb2073a70bd010e00df010e00020040010eb32b33395f411b010e00[_^M_][_$_]
+70010e008f010e009f010e00cf010e00df010e0006000f010e001f010e00[_^M_][_$_]
+3f010e0080010e00bf010e00ef010e00060040010eb3091b3970bb013600[_^M_][_$_]
+0100200108b30d113940b80102b20b1439b9ffc00107b31b22392f411801[_^M_][_$_]
+0c004f010c0002002f010c0001008f010b0001002f0107004f010700c001[_^M_][_$_]
+0700d001070004004f010700010040010040640b103940fe0b1139e0f601[_^M_][_$_]
+e0f60114f424f40274f40140df60df0220d830d840d80366c176c10299be[_^M_][_$_]
+0120b230b240b20360b070b0029b93002b9a92002b9991002b9493002b92[_^M_][_$_]
+93002b9193062b9395032b9885042b9796042b9695032b9995a995026f41[_^M_][_$_]
+0f0131007f0131008f01310003013001160032001f011901160015001f01[_^M_][_$_]
+16b285032bb9ffe0012fb30b143970410d01170001002f0117003f011700[_^M_][_$_]
+4f0117005f0117000401130114b22a1fa0bc011400b0011400c001144016[_^M_][_$_]
+0370fbf0fb022ffb6ffb7ffb0340fa50fa60faf0fa04b8ffc040fffa1115[_^M_][_$_]
+3950ec70ec0250ec70ec0240ec01bfeb0170ea0130ea0170e9015fe970e9[_^M_][_$_]
+f0e903a0e9015fe870e802efe8017fe8bfe8efe803f0e701f0e7012fe780[_^M_][_$_]
+e7a0e7f0e70450e6f0e60250e660e670e6c0e60450e50170e50180e4e0e4[_^M_][_$_]
+f0e40340dca0dc02309050900220a04fa05fa09fa0afa0efa006e0f501e0[_^M_][_$_]
+f501f3851e1f2fe20140dd019fd5afd5bfd5030fd340d302e0d0010fc470[_^M_][_$_]
+c4022fc43fc44fc45fc49fc4afc4efc4ffc40899bd99bf02dad9042bd685[_^M_][_$_]
+022bcccd062bcd85022bc9c8062bc885022b8d8b042b8c8b191f8b83c81f[_^M_][_$_]
+897d641f817f082b7d7f082b7f85072baf85042b8885012b8785002b8485[_^M_][_$_]
+042b8385002b2ffd4ffd027f40abef012df03bf04ff069f07ff0051b3715[_^M_][_$_]
+1836151535151234150f33150c3215093115063015032f15002e1526270f[_^M_][_$_]
+28270f26002a1f0f2a2f2a3f2a032f24bf24022a2b0f2c2b0f22230e2423[_^M_][_$_]
+0f1e1f0e201f0f2005010f10110c0c0d0e0c090a0b0c0607080c0304050c[_^M_][_$_]
+0001020c0003181f500f700f027f0f800fbf0f030f031f032f034f037f03[_^M_][_$_]
+bf03ef030704012c1f1b011d0d18071a0d1510170d1204140d701b01501b[_^M_][_$_]
+701bf01b03b8ffc0400b1b131839701b801b02503301b0124b004b5442b0[_^M_][_$_]
+13014b004b5342b0332b4bb8032052b0322b4bb009505b58b101018e59b0[_^M_][_$_]
+332bb00288b8010054b00488b8020054b012435a5b58b80119b101018e85[_^M_][_$_]
+1bb900040100b04b60858d592b1db0644b5358b0801d59b0324b5358b090[_^M_][_$_]
+1d5900732b74742b2b2b2b2b7373742b2b2b2b2b2b2b732b2b2b2b2b2b73[_^M_][_$_]
+732bb1282645b02a4561b02c4560442b2b2b2b2b2b2b2b2b2b2b2b73b0ef[_^M_][_$_]
+45b0f0456168b0f04560b0ef23447373012b2b2b2b2b2b2b2b2b2b2b2b2b[_^M_][_$_]
+2b2b2b2b2b73737473737373732b74737374737373747374737474737374[_^M_][_$_]
+7374747374737374742b747374742b73742b2b2b2b7300732b2b2b2b2b2b[_^M_][_$_]
+2b2b2b2b737373737373737473742b2b73737373732b2b2b742b73742b75[_^M_][_$_]
+5e7374755e7374755e7374755e7374755e2b73747374737373012b2bb018[_^M_][_$_]
+b0314b53422b2b73742b732b732b2b2b732b2b2b2b732b2b2b73742b7373[_^M_][_$_]
+2b7373732b7373742b732bb109322b4bb05052424bb03c524bb00f505bb0[_^M_][_$_]
+1a23424bb0c8524bb036505bb00c23422b00000000>[_^M_][_$_]
+[16105 16169 15785 16013 16241 16333 15745 15601 15869 15477 16269 15937 16109[_^M_][_$_]
+16361 16209 16209 16113 16321 16289 14899 ] AllocGlyphStorage[_^M_][_$_]
+]def [_^M_][_$_]
+108 44 [_^M_][_$_]
+PrepFor2015[_^M_][_$_]
+AddFontInfoBegin[_^M_][_$_]
+AddFontInfo[_^M_][_$_]
+/OrigFontType /TrueType def [_$_]
+/OrigFontName <4D6963726F736F66742053616E73205365726966> def
+/OrigFontStyle () def[_^M_][_$_]
+/FSType 8 def[_^M_][_$_]
+AddFontInfoEnd[_^M_][_$_]
+[16#2c 16#6e18af9b ] AddXUID[_^M_][_$_]
+Type42DictEnd[_^M_][_$_]
+1 9274 49 <000100a40000052305ba0009007140180702010281060714060607050304[_^M_][_$_]
+01077f000e0d0d063b00b8fffa40090b0b063b0006027f04b8fff8b40d0d[_^M_][_$_]
+063b04b8fff8401c0b0b063b04400b006e020a046b02770b01780b01480b[_^M_][_$_]
+e80bf80b03005f5d715d2b2b011a18102b2b4ded32102b2bed32002f3f31[_^M_][_$_]
+30872e2b877dc4212301112311330111330523c7fd00b8c60300b90485fb[_^M_][_$_]
+7b05bafb7b048500>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 11218 55 <0001002d000004b605ba00070049403101059106030300a00205a0027f03[_^M_][_$_]
+040d0d063b03400809037f3030e9090148099809b809f809040709170977[_^M_][_$_]
+09d70904005f5d5d5d2b011a18102b4dede610e6002f3fed323130012111[_^M_][_$_]
+231121352104b6fe1bc3fe1f0489050cfaf4050cae00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8070 43 <000100a40000052305ba000b006f4019039108400605089118300a060301[_^M_][_$_]
+0509017f000e0d0d063b00b8fffa40090b0b063b0008047f05b8fff8b40d[_^M_][_$_]
+0d063b05b8fff840170b0b063b05400d006e020c056b02570d01480d880d[_^M_][_$_]
+02005f5d712b2b011a18102b2b4ded32102b2bed32002f333f332b001a18[_^M_][_$_]
+104ded31302123112111231133112111330523c3fd06c2c202fac302b2fd[_^M_][_$_]
+4e05bafda6025a00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 6982 38 <00010060ffe7055e05d3001900c140341a182a183a18030511010a0f0115[_^M_][_$_]
+080103470901080901090d92060407178717020b00171392001307101710[_^M_][_$_]
+020d020a09167d17b8fff4b40d0d063b17b8fff040190b0b063b17051715[_^M_][_$_]
+17020f17400b1036107d030c0d0d063b03b8ffd6400c0b0b063b03400703[_^M_][_$_]
+01100303b8ffe2401d090b361b176f021a036c02b81b01571b01271b371b[_^M_][_$_]
+571b771ba71b05005f5d715d2b2b2b015f5e5d1a18102b2b4ded2b5e5d10[_^M_][_$_]
+2b2bed39395f5e5d003fedcd5f5e5d3fedcd5d5d31305f5d5d5d5d052000[_^M_][_$_]
+1110002132001723262623220011100033323637330600030afec9fe8d01[_^M_][_$_]
+730137ef015015c80cd9a5dffefc0102ddacd40ec815feba190199015d01[_^M_][_$_]
+5d0199fefed38ba4fecdfee3fee4fecca89ceaff0000>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 7274 39 <000200a40000056005ba0006000f007840180a0401050201090f91000307[_^M_][_$_]
+9106080b180b020d020b7d03b8fffcb40d0d063b03b8ffeab70b0b063b03[_^M_][_$_]
+077f06b8fff6b40d0d063b06b8fff8401c0b0b063b064011036f0210066b[_^M_][_$_]
+02571101a7110118114811881103005f5d5d712b2b011a18102b2b4ded10[_^M_][_$_]
+2b2bed5f5e5d002fed3fed31305e5d5d1321201110212137212012111002[_^M_][_$_]
+2121a401d102ebfd15fe2fc2010b013fe8e7fec0fef505bafd2bfd1bae01[_^M_][_$_]
+29010e0107012000>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 10444 53 <000200a40000056a05ba0014001c00f14017470c570c670c03024c035c03[_^M_][_$_]
+020302011c018100141400b8fff840320b0b063b0000148a14012c143c14[_^M_][_$_]
+0208141814020902050e150e250e350e0403197d070e170e270e370e040e[_^M_][_$_]
+040d0d063b0eb8fff4401a0b0b063b0e01020e1112140600080018007800[_^M_][_$_]
+030d0015077f08b8fff8b40d0d063b08b8fff8402f0b0b063b08401e006f[_^M_][_$_]
+021d086b028711010212110915919706010606081c9209030008481e0177[_^M_][_$_]
+1e01a71eb71e02005f5d715d002f333fed12392f5ded1239395f5d302b2b[_^M_][_$_]
+011a18102b2b4ded325f5e5d1117332f2b2b5ded5f5d5f5e5d5d5d872e2b[_^M_][_$_]
+2b0e4b52587d1b7a5910c431005f5d5f5d21230326262321112311213216[_^M_][_$_]
+16151406071516170121323635342121056ad28a25ac70fe99c20289aad8[_^M_][_$_]
+88b0999950fc8f01b1b5a3fec6fe3101876884fd8d05ba42d48598cc1f04[_^M_][_$_]
+31d80192728cfa00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 2538 16 <0001004201b80268026d0003003140208f0101012f024f025f0203025000[_^M_][_$_]
+6000027001012f01010005017005012005015d712f10c65d5d5d002f5dcd[_^M_][_$_]
+5d3130012135210268fdda022601b8b5>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 7462 40 <000100a4000004e905ba000b0062401f0991064002010691183005910203[_^M_][_$_]
+0a910107081708020a00080400060a7f01b8fffab40d0d063b01b8fffe40[_^M_][_$_]
+120b0b063b01400d006f020c016b02e80d01005f5d2b2b011a18102b2b4d[_^M_][_$_]
+ed3210c4c45f5e5d002fed3fed2b001a18104ded31302121112115211121[_^M_][_$_]
+1521112104e9fbbb0423fc9f0329fcd7038305baaefe40aefe10>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8922 48 <000100a40000060605ba000c0125b90003fff4400a0d0d063b0b48091036[_^M_][_$_]
+09b8ffb840960910368c0b9c0b0283099309020268040101480458047804[_^M_][_$_]
+0302670301014703570377030302180a0101050a150a250a0302880a980a[_^M_][_$_]
+a80a0300bc0adc0a0203c80a01011e052e0502037705a705b705c705d705[_^M_][_$_]
+05018505950502001e022e0202037702a702b702c702d702050185029502[_^M_][_$_]
+0205020a030479040108041804280438040409000b08030104070b027f00[_^M_][_$_]
+0a0d0d063b00b8fff640090b0b063b0009057f07b8fffc40200b0b063b07[_^M_][_$_]
+400e006e020d076b02770e01570e970e02080e180e380ee80e04005f5d5d[_^M_][_$_]
+712b2b011a18102b4ded32102b2bed32002f33333f335f5e5d5d12173931[_^M_][_$_]
+305d5f5d5f715f5d5f5d5f715f5d5f5d5f5d5f715f5d015f5d5f5d5f5d5f[_^M_][_$_]
+5d5f5d5d2b2b2b212311012301112311210101210606b8fe5eaefe5eb801[_^M_][_$_]
+23018d018f012304dffb2104dffb2105bafb3a04c600>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 9726 51 <000200a4000004fc05ba000b0015007d400d0c9109090b159100030b107d[_^M_][_$_]
+05b8ffeeb40d0d063b05b8ffda40190b0b063b053705010205051505020d[_^M_][_$_]
+0305400910360c0a7f0bb8fff8b40d0d063b0bb8fffc40170b0b063b0b40[_^M_][_$_]
+17056f02160b6b02e817017717a71702005f5d5d2b2b011a18102b2b4ded[_^M_][_$_]
+322b5f5e5d5f5d102b2bed002f3fed12392fed3130132132161615140421[_^M_][_$_]
+21112313213236353426262321a40223b4f38efee6fef5fe8fc2c20173bb[_^M_][_$_]
+9f58877ffe9105ba43df8adee6fdb602f88c84588824>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8832 47 <000100a40000042f05ba0005003b400f020304910100400f18360007047f[_^M_][_$_]
+01b8fffc40110b0b063b014006016b02a70701880701005f5d5d2b011a18[_^M_][_$_]
+102b4ded10c62b002fed3f3130212111331121042ffc75c202c905bafaf4[_^M_][_$_]
+>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 6372 36 <0002fffe0000055805ba0002000a00fd402ea809b8090257020103000504[_^M_][_$_]
+0401020607070101041c01020481030a1403030a01071c01000781080914[_^M_][_$_]
+08080908b8ffea40740919360316091936980aa80a02027a0a0103370a47[_^M_][_$_]
+0a570a670a0401070a170a270a03029809b80902037709013a094a095a09[_^M_][_$_]
+6a090418092809880903020a09010a0306934007021702020b0002400b0b[_^M_][_$_]
+063b020203080903080c0377020b087602370c670cf70c03580c780c0208[_^M_][_$_]
+0cb80c02005f5d715d2b2b00182f3f1239392f2b5f5e5d1a4ded3130015f[_^M_][_$_]
+5e5d5f5d5d5d5f5d5f5d5f5d5f5d5f5d2b2b872e2b084b52587d1b7a5910[_^M_][_$_]
+c487052e182b084b52587d1b7a5910c40705103c3c07103c3c015f5d5d01[_^M_][_$_]
+01030123032103230133039afefef603b6dbaafd9aa2cd0233d1025802a8[_^M_][_$_]
+fd58fda801befe4205ba>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 0 0 <0002003200000226060000030007000033112111252111213201f4fe7801[_^M_][_$_]
+1cfee40600fa006c0528>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/N 49 def[_^M_][_$_]
+/T 55 def[_^M_][_$_]
+/H 43 def[_^M_][_$_]
+/C 38 def[_^M_][_$_]
+/D 39 def[_^M_][_$_]
+/R 53 def[_^M_][_$_]
+/hyphen 16 def[_^M_][_$_]
+/E 40 def[_^M_][_$_]
+/M 48 def[_^M_][_$_]
+/P 51 def[_^M_][_$_]
+/L 47 def[_^M_][_$_]
+/A 36 def[_^M_][_$_]
+/.notdef 0 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 1 /N put[_^M_][_$_]
+dup 2 /T put[_^M_][_$_]
+dup 3 /H put[_^M_][_$_]
+dup 4 /C put[_^M_][_$_]
+dup 5 /D put[_^M_][_$_]
+dup 6 /R put[_^M_][_$_]
+dup 7 /hyphen put[_^M_][_$_]
+dup 8 /E put[_^M_][_$_]
+dup 9 /M put[_^M_][_$_]
+dup 10 /P put[_^M_][_$_]
+dup 11 /L put[_^M_][_$_]
+dup 12 /A put[_^M_][_$_]
+pop[_^M_][_$_]
+Pscript_WinNT_Incr begin[_^M_][_$_]
+%%BeginResource: file Pscript_Text 5.0 0[_^M_][_$_]
+/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d[_^M_][_$_]
+/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^[_^M_][_$_]
+length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets[_^M_][_$_]
+{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{&[_^M_][_$_]
+/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get}[_^M_][_$_]
+if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{[_^M_][_$_]
+{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get[_^M_][_$_]
+StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $[_^M_][_$_]
+! ! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ length array copy[_^M_][_$_]
+put pd_CoverFCRange}if}{!}? 2 ^ ~ definefont fM 5 4 -1 $ put fM 4 0 put fM[_^M_][_$_]
+makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M currentpoint snap M 0 - 0[_^M_][_$_]
+Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d/ySP null d/sW null d/sSU{N[_^M_][_$_]
+/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N/sW ~ d/ySP ~ d/xSP ~ d}b/sT[_^M_][_$_]
+{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix astore concat 0 0 M}b/eR/; , d[_^M_][_$_]
+/AddOrigFP{{&/FontInfo known{&/FontInfo get length 6 add}{6}? dict `[_^M_][_$_]
+/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d/OrigFontStyle ~ d[_^M_][_$_]
+/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS{makefont[_^M_][_$_]
+Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 copy ~ sub 1[_^M_][_$_]
+add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for & E[_^M_][_$_]
+/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}b/mF42{15 dict ` @ 4 1 $[_^M_][_$_]
+FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 add 255[_^M_][_$_]
+idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for/FDepVector[_^M_][_$_]
+Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 Encoding[_^M_][_$_]
+length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName length 2[_^M_][_$_]
+add string}{FontName length 3 add string}?}? @ 0 FontName @ length string cvs[_^M_][_$_]
+putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ putinterval cvn 1 ^[_^M_][_$_]
+256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 $ put}for & @ E[_^M_][_$_]
+/FontName get ~ definefont ! ! ! mF}b/mF_OTF_V{~ ! ~ ! 4 -1 $ ! findfont 2 ^ ~[_^M_][_$_]
+definefont fM @ @ 4 6 -1 $ neg put 5 0 put 90 matrix R matrix concatmatrix[_^M_][_$_]
+makefont Pscript_Windows_Font 3 1 $ put}b/mF_TTF_V{3{~ !}repeat 3 -1 $ ![_^M_][_$_]
+findfont 1 ^ ~ definefont Pscript_Windows_Font 3 1 $ put}b/UmF{L2?[_^M_][_$_]
+{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName[_^M_][_$_]
+get undefinefont}forall undefinefont}b[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+end reinitialize[_^M_][_$_]
+F /F0 0 /0 F /TTE1CD9F20t00 mF [_$_]
+/F0S47YFFFFFFBB F0 [71.031 0 0 -68.75 0 0 ] mFS
+F0S47YFFFFFFBB Ji [_$_]
+3125 894 M <010203040506070208090A0B0C0208>S [_$_]
+3125 800 M <010203070208090A0B0C0208>S [_$_]
+3125 706 M <080B02070208090A0B0C0208>S [_$_]
+: 3125 550 594 78 rc 317 VM?[_^M_][_$_]
+1 7608 41 <000100a40000048105ba0009004f40110591020207019108030704040002[_^M_][_$_]
+067f07b8fffe401c0d0d063b074000400b16360b006f020a076b02e80b01[_^M_][_$_]
+270b570b02005f5d5d2b2b2b011a18102b4ded3212392f002f3fed12392f[_^M_][_$_]
+ed3130012111211521112311210481fce502b1fd4fc203dd050cfe3aaefd[_^M_][_$_]
+6805ba00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/F 41 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 13 /F put[_^M_][_$_]
+pop[_^M_][_$_]
+3125 613 M <0C06080D070208090A0B0C0208>S [_$_]
+; N 3625 1056 M 3788 1056 I K [_^M_][_$_]
+N 3788 1056 M 3713 1075 I 3713 1038 I C [_^M_][_$_]
+ O 951 VM?[_^M_][_$_]
+1 10782 54 <0001005cffe704ec05d300230140b9001dfff4b40b0b063b1cb8fff44076[_^M_][_$_]
+0b0b063b5a220103681f0102571f0100071f0101351e451e0203781d0102[_^M_][_$_]
+131d231d531d0303381a481a020228173817481703007814010255140155[_^M_][_$_]
+100103680e780e02780d0101080d010a5a0c01580b010225093509020317[_^M_][_$_]
+05270537050300670201024a0201030a0f1b21040068150115189112b8ff[_^M_][_$_]
+fc40150d0d063b120407034703570367038703050b000307b8fff040200d[_^M_][_$_]
+0d063b07910013167f150c0b0b063b151b7f0f0c0b0b063b0f150f030a7f[_^M_][_$_]
+21b8ffe0b40b0b063b21b8fff4401a0d0d063b21047f034025216f022403[_^M_][_$_]
+6c02b825e82502a72501005f5d5d2b2b011a18104ded102b2bed1239392f[_^M_][_$_]
+2bed2f2bed003fed2bc45f5e5d3f2bedc45d12173931305f5d5f5d5f5d5f[_^M_][_$_]
+5d5f5d5d5e5d5f5d5d5f5d5d5f5d5f5d5f5d5f5d5f5d5f5d5f5d5f5d5f5d[_^M_][_$_]
+5f5d2b2b0520002733161633323635342624263534243332041723022122[_^M_][_$_]
+0615141604161615140402cdfecafecd08bb0ff3aca3c7cefe09db011dec[_^M_][_$_]
+f8013009bd1dfeb1a2b28f0187e6a4fed3190116daa49d8673796e6bbe9e[_^M_][_$_]
+b2e4e6d2010a7a655c5c5654b195bdfa>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8228 44 <000100bc0000017f05ba00030063400c020301007f01040d0d063b01b8ff[_^M_][_$_]
+fc400d0b0b063b01400405017f213005b8ffc0402a232836070517053705[_^M_][_$_]
+6705770587050647055705670587059705a705b705c705f7050998050178[_^M_][_$_]
+0501005f5d715d712b2b011a18102b2b4ded002f3f313021231133017fc3[_^M_][_$_]
+c305ba00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 7732 42 <00010060ffe705b605d3001d00e640521c100b0b063b2a1d3a1d7a1d0303[_^M_][_$_]
+671401022511012a0f010388080102350801039801010217911818002809[_^M_][_$_]
+01090d920604139200131a0a7d090c0d0d063b09100b0b063b0908184818[_^M_][_$_]
+020900181c167f1ab8ffd6401b0b0b063b1a351a0103371a01000710010d[_^M_][_$_]
+02107d030c0d0d063b03b8ffd6400f0b0b063b03402703010503010e0303[_^M_][_$_]
+b8ffe24018090b361f1a6f021e036c02781f01271fa71fb71ff71f04005f[_^M_][_$_]
+5d5d2b2b2b015f5e5d5d1a18102b2b4ded5f5e5d5f5d5f5d102bed32c45f[_^M_][_$_]
+5e5dd42b2bed002f3fed3fedcd5d12392fed31305f5d5f5d5f5d5f5d5d5f[_^M_][_$_]
+5d5f5d2b0520001110002120041723262623220011100033203735213521[_^M_][_$_]
+112327060325fec4fe770184013b0109015f15c90ce8bee3feeb0118e201[_^M_][_$_]
+3d9afe7d023f89339519019e01580159019dffd68ea1fecafee6fee7fec9[_^M_][_$_]
+d1dfaffd149ab300>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/S 54 def[_^M_][_$_]
+/I 44 def[_^M_][_$_]
+/G 42 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 14 /S put[_^M_][_$_]
+dup 15 /I put[_^M_][_$_]
+dup 16 /G put[_^M_][_$_]
+pop[_^M_][_$_]
+3800 1081 M <0E02060F0110070208090A0B0C0208>S [_$_]
+N 2744 1338 M 2906 1056 I K [_^M_][_$_]
+N 2906 1056 M 2888 1131 I 2850 1113 I C [_^M_][_$_]
+ O N 2744 1338 M 2906 1338 I K [_^M_][_$_]
+N 2906 1338 M 2831 1356 I 2831 1319 I C [_^M_][_$_]
+ O 2919 1363 M <0B0F0E02070208090A0B0C0208>S [_$_]
+N 2606 1056 M 2906 1056 I K [_^M_][_$_]
+N 2906 1056 M 2831 1075 I 2831 1038 I C [_^M_][_$_]
+ O 635 VM?[_^M_][_$_]
+1 11490 57 <0001000c0000054805ba000600c0b90003ffea405d091936001609193678[_^M_][_$_]
+019801c80103023501450155016501040307011701270167010477029702[_^M_][_$_]
+c70203023a024a025a026a0204030802180228026802040a020303020800[_^M_][_$_]
+700207036d0237086708f7080358087808020808b80802005f5d715d2b2b[_^M_][_$_]
+00182f3f3130015f5e5d5f5d5f5d5d5f5d5f5d2b2bb106024354581b401a[_^M_][_$_]
+05061c0504068100011400000105041c05060481030214030302872e4d2b[_^M_][_$_]
+084b52587d1b7a5910c487052e182b084b52587d1b7a5910c45901012301[_^M_][_$_]
+3301010548fdc6c8fdc6cf01cf01cf05bafa4605bafb1704e900>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 9432 50 <00020060ffe705db05d3000b001700bdb10602435458400a129200040c92[_^M_][_$_]
+06130f03b8ffeeb40d0d063b03b8ffe040100b0b063b0303191815090c0d[_^M_][_$_]
+0d063b09b8ffd6b70b0b063b090919181112392f2b2bcd1112392f2b2bcd[_^M_][_$_]
+003fed3fed31301b404a12920a001a002a000300040c9205061506250603[_^M_][_$_]
+0906130f7d03157d09406803010a031a033a034a03046709010509150935[_^M_][_$_]
+094509040a0319036f0218096c02e81901571901271901005f5d715d2b2b[_^M_][_$_]
+015f5e5d5d5d5d1a18104ded10ed003f5e5ded3f5ded3130590120001110[_^M_][_$_]
+00212000111000013200111000232200111000031f01340188fe78feccfe[_^M_][_$_]
+cbfe76018a0133dc0119fee8d9ddfee5011a05d3fe60feaafeaafe6001a1[_^M_][_$_]
+0155015601a0faba0138011801180138fec8fee8fee9fec7>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/V 57 def[_^M_][_$_]
+/O 50 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 17 /V put[_^M_][_$_]
+dup 18 /O put[_^M_][_$_]
+pop[_^M_][_$_]
+2919 1081 M <110804021206070208090A0B0C0208>S [_$_]
+N 3617 1058 M 3617 1047 3607 1037 3596 1037 -c 3584 1037 3574 1047 3574 1058 -c 3574 1069 3584 1079 3596 1079 -c 3607 1079 3617 1069 3617 1058 -c C [_^M_][_$_]
+ O N 1769 1338 M 1931 1619 I K [_^M_][_$_]
+N 1931 1619 M 1875 1563 I 1913 1544 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1525 I K [_^M_][_$_]
+N 1931 1525 M 1869 1481 I 1894 1456 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1431 I K [_^M_][_$_]
+N 1931 1431 M 1856 1413 I 1875 1375 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1338 I K [_^M_][_$_]
+N 1931 1338 M 1856 1356 I 1856 1319 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1244 I K [_^M_][_$_]
+N 1931 1244 M 1875 1300 I 1856 1263 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1150 I K [_^M_][_$_]
+N 1931 1150 M 1894 1219 I 1869 1194 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1056 I K [_^M_][_$_]
+N 1931 1056 M 1913 1131 I 1875 1113 I C [_^M_][_$_]
+ O 635 VM?[_^M_][_$_]
+1 12728 60 <0001000a0000054c05ba000800dc4018010704670401034804580402000a[_^M_][_$_]
+041a04020b0200040305b8ffe8b60a0f3605030305b8ffe1400c091b3600[_^M_][_$_]
+1f091b3607017f04b8fff8403b0b0b063b04400500047f30300a00700209[_^M_][_$_]
+056d02070a170a970ab70ad70af70a06070a370a670a870aa70a05480a68[_^M_][_$_]
+0a780a03c80ad80ae80a03005f5d715d712b2b2b011a18102b4ded392b2b[_^M_][_$_]
+002f3f2b1239395f5e5d5f5d5f5d1133333130b106024354581b401a0708[_^M_][_$_]
+19070608810001140000010706190708068105041405050487052e2b084b[_^M_][_$_]
+52587d1b7a5910c487052e182b084b52587d1b7a5910c459010111231101[_^M_][_$_]
+330101054cfdc0c2fdc0ec01b601b405bafcb3fd93026d034dfd5d02a300[_^M_][_$_]
+>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 6682 37 <000300a4000004ec05ba000d0016001e00c24043380d480d02080b010708[_^M_][_$_]
+0111020b1e910e4005040e91183016910503179104270001081a181a020d[_^M_][_$_]
+020b04127f0c091c09020f0309180d0d063b090c0b0b063b090904b8fffa[_^M_][_$_]
+b40d0d063b04b8fffcb70b0b063b041a7d00b8fff4b40d0d063b00b8ffea[_^M_][_$_]
+b60b0b063b000e17b8fffc40190d0d063b177f044020006f021f046b02a7[_^M_][_$_]
+20018820e82002005f5d5d2b2b011a18104ded2b32102b2bed122b2b392f[_^M_][_$_]
+2b2b5f5e5ded12395f5e5d5d002fed3fed2b001a18104ded3931305f5e5d[_^M_][_$_]
+5d5d01140421211121320415140716160121323635342623211121203534[_^M_][_$_]
+26232104ecfee8fef5fddb020aea010cd38e8dfc7a0146a19894b7fecc01[_^M_][_$_]
+61015ca1d4feb801aacedc05bac8aed46624c1012f67786c6dfba2fc8379[_^M_][_$_]
+>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/Y 60 def[_^M_][_$_]
+/B 37 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 19 /Y put[_^M_][_$_]
+dup 20 /B put[_^M_][_$_]
+pop[_^M_][_$_]
+1944 1644 M <0E130914120B070208090A0B0C0208>S [_$_]
+635 VM?[_^M_][_$_]
+1 11330 56 <000100a4ffe7052305ba00130059402077120103070a010b0800010c020e[_^M_][_$_]
+05030a9100130e7f0f0e0d0d063b0f067f05b8fff640150d0d063b054015[_^M_][_$_]
+0f6e0214056b02a71501481501005f5d5d2b2b011a18102b4ded102bed00[_^M_][_$_]
+3fed3f335f5e5d5e5d31305f5d0522260235113311101633323611113311[_^M_][_$_]
+10060402e3fffd43c2c2bbbbc2c37fff0019c6010cb10350fcb3fedfb6b6[_^M_][_$_]
+0121034dfcb0fef6fc7d>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8352 45 <00010037ffe7035c05ba000f007c401f550a01030e0308075807020b0007[_^M_][_$_]
+0a914803010203130e7f0f0e0d0d063b0fb8fff0401d0b0b063b0f087f40[_^M_][_$_]
+6707010807180728074807040d0007160d0d063b07b8ffe840120b0b063b[_^M_][_$_]
+07110f6e02b811012711a71102005f5d5d2b01182f2b2b5f5e5d5d1a4ded[_^M_][_$_]
+102b2bed003f5f5dedc45f5e5d3f5f5d3130011006232226353533103332[_^M_][_$_]
+36351133035cd0cbb6d4c3c76970c201d5fef3e1deb627fef476bf03ef00[_^M_][_$_]
+>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/U 56 def[_^M_][_$_]
+/J 45 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 21 /U put[_^M_][_$_]
+dup 22 /J put[_^M_][_$_]
+pop[_^M_][_$_]
+1944 1550 M <0E020615040215060807121416080402070208090A0B0C0208>S [_$_]
+1944 1456 M <0E020C01050C060507121416080402070208090A0B0C0208>S [_$_]
+317 VM?[_^M_][_$_]
+1 9928 52 <00020060ff8b05f405d3000f001f018c400d1d200b0b063b10200b0b063b[_^M_][_$_]
+1db8ffe0b40b0b063b10b8ffca40180b0b063b611e711e811e0303070017[_^M_][_$_]
+002700030088020111b8ffc040490f13368a1e01021a1e6a1e7a1e030137[_^M_][_$_]
+1167110202271101001010110f000f0e001f1d1d1c020203011e0101001f[_^M_][_$_]
+001f811e01141e1f1e1e011592020d0f03040a0a1a0a2a0a03030ab8ffe8[_^M_][_$_]
+404c0b0b063b0a041e0001181f281f681f781f041f1b9217016701770103[_^M_][_$_]
+003a014a015a01030105041504250403090304180b0b063b0413381e481e[_^M_][_$_]
+020000101b1d1e04121802040f0307127d0db8ffeeb40d0d063b0db8ffd6[_^M_][_$_]
+400e0b0b063b0d187d070c0d0d063b07b8ffd640320b0b063b0740680d01[_^M_][_$_]
+0a0d1a0d3a0d4a0d046707010507150735074507040a03210d6f0220076c[_^M_][_$_]
+02e82101572101272101005f5d715d2b2b015f5e5d5d5d5d1a18102b2b4d[_^M_][_$_]
+ed102b2bed12173911121739c65f5d003f2b5f5e5dc65d5f5dfdc45d1139[_^M_][_$_]
+393f2b5f5d121739ed313087082e2b87087dc407083c083c0708103c083c[_^M_][_$_]
+005f5d5f5d5f5d5f5d2b015d5f5d5f5d002b2b012b2b2507270623200011[_^M_][_$_]
+10002120001110072736111000232200111000333237273705f473f2a3cd[_^M_][_$_]
+fecbfe76018a013501340188be9287fee8d9ddfee5011ada746992731489[_^M_][_$_]
+bf6301a10155015601a0fe60feaafeb4d573a0010e01180138fec8fee8fe[_^M_][_$_]
+e9fec7317389>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/Q 52 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 23 /Q put[_^M_][_$_]
+pop[_^M_][_$_]
+1944 1363 M <0E08171508010408070208090A0B0C0208>S [_$_]
+N 2736 1340 M 2736 1328 2726 1318 2715 1318 -c 2703 1318 2693 1328 2693 1340 -c 2693 1351 2703 1361 2715 1361 -c 2726 1361 2736 1351 2736 1340 -c C [_^M_][_$_]
+ O 1944 1269 M <011509140806070208090A0B0C0208>S [_$_]
+1944 1175 M <010F0B070208090A0B0C0208>S [_$_]
+1944 1081 M <0C06060C13070208090A0B0C0208>S [_$_]
+N 2598 1058 M 2598 1047 2588 1037 2577 1037 -c 2565 1037 2555 1047 2555 1058 -c 2555 1069 2565 1079 2577 1079 -c 2588 1079 2598 1069 2598 1058 -c C [_^M_][_$_]
+ O N 2025 844 M 2188 963 I K [_^M_][_$_]
+N 2188 963 M 2119 931 I 2138 900 I C [_^M_][_$_]
+ O N 2025 844 M 2188 725 I K [_^M_][_$_]
+N 2188 725 M 2138 788 I 2119 756 I C [_^M_][_$_]
+ O 2200 988 M <0E15140E0817070208090A0B0C0208>S [_$_]
+2200 750 M <080B0809080102070208090A0B0C0208>S [_$_]
+N 2942 727 M 2942 715 2932 705 2921 705 -c 2909 705 2899 715 2899 727 -c 2899 738 2909 748 2921 748 -c 2932 748 2942 738 2942 727 -c C [_^M_][_$_]
+ O N 988 1088 M 1150 1338 I K [_^M_][_$_]
+N 1150 1338 M 1094 1288 I 1125 1263 I C [_^M_][_$_]
+ O N 988 1088 M 1150 844 I K [_^M_][_$_]
+N 1150 844 M 1125 919 I 1094 894 I C [_^M_][_$_]
+ O 1163 1363 M <02130A08070208090A0B0C0208>S [_$_]
+N 1761 1340 M 1761 1328 1751 1318 1740 1318 -c 1728 1318 1718 1328 1718 1340 -c 1718 1351 1728 1361 1740 1361 -c 1751 1361 1761 1351 1761 1340 -c C [_^M_][_$_]
+ O 317 VM?[_^M_][_$_]
+1 12422 59 <0001000a0000054c05ba000b00f6406c080b380b680b880b980b05070537[_^M_][_$_]
+05670597050409020504050203020106010809080b0a0b0007000201020b[_^M_][_$_]
+000b03030a050605080708040409070106018100071400000709030a0381[_^M_][_$_]
+040914040409070627066706770604080428046804780404010603040a40[_^M_][_$_]
+13163606b8ffc040381216360a0a2a0a020a002a00020506250602050425[_^M_][_$_]
+04020b030a060a0600040d0070020c046d02e90d01580d01a80db80df80d[_^M_][_$_]
+03470d01005f5d5d715d2b2b0111123939182f2f5f5e5d5d5d5d2b2b002f[_^M_][_$_]
+3f5f5d5d313087052e4d2b877dc4872e182b877dc4871008c008c0871008[_^M_][_$_]
+c008c0871008c008c0871008c008c0015f5e5d5d21230901230901330901[_^M_][_$_]
+3301054ceefe4efe4cee0233fe05ed017b017dedfe03026dfd93030402b6[_^M_][_$_]
+fde2021efd4a>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/X 59 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 24 /X put[_^M_][_$_]
+pop[_^M_][_$_]
+1163 869 M <08180A06080E0E0F1201070208090A0B0C0208>S [_$_]
+N 2017 846 M 2017 834 2007 824 1996 824 -c 1984 824 1974 834 1974 846 -c 1974 857 1984 867 1996 867 -c 2007 867 2017 857 2017 846 -c C [_^M_][_$_]
+ O 575 1113 M <0208090A0B0C0208>S [_$_]
+N 979 1090 M 979 1078 970 1068 958 1068 -c 947 1068 937 1078 937 1090 -c 937 1101 947 1111 958 1111 -c 970 1111 979 1101 979 1090 -c C [_^M_][_$_]
+ O LH[_^M_][_$_]
+(%%[Page: 1]%%) = [_^M_][_$_]
+%%PageTrailer[_^M_][_$_]
+[_^M_][_$_]
+%%Trailer[_^M_][_$_]
+%%DocumentNeededResources: [_^M_][_$_]
+%%DocumentSuppliedResources: [_^M_][_$_]
+%%+ procset Pscript_WinNT_ErrorHandler 5.0 0[_^M_][_$_]
+%%+ procset Pscript_FatalError 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Win_Basic 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Win_Utils_L2 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Win_GdiObject 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Win_GdiObject_L3 5.0 0[_^M_][_$_]
+%%+ procset Pscript_T42Hdr 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Text 5.0 0[_^M_][_$_]
+Pscript_WinNT_Incr dup /terminate get exec[_^M_][_$_]
+ehsave restore[_^M_][_$_]
+(%%[LastPage]%%) = [_^M_][_$_]
+%%EOF[_^M_][_$_]
+[_^D_][_^[_]%-12345X@PJL EOJ
+[_^[_]%-12345X
addfile ./docs/html/images/unif-templ-hier.pdf
binary ./docs/html/images/unif-templ-hier.pdf
addfile ./docs/html/images/unif-templ-hier.ps
hunk ./docs/html/images/unif-templ-hier.ps 1
+%!PS-Adobe-3.0[_^M_][_$_]
+%%Title: Document[_^M_][_$_]
+%%Creator: PScript5.dll Version 5.2.2[_^M_][_$_]
+%%CreationDate: 10/10/2004 14:55:30[_^M_][_$_]
+%%BoundingBox: (atend)[_^M_][_$_]
+%%DocumentNeededResources: (atend)[_^M_][_$_]
+%%DocumentSuppliedResources: (atend)[_^M_][_$_]
+%%DocumentData: Clean7Bit[_^M_][_$_]
+%%TargetDevice: (HP LaserJet 8150 Series) (3010.107) 0[_^M_][_$_]
+%%LanguageLevel: 3[_^M_][_$_]
+%%EndComments[_^M_][_$_]
+[_^M_][_$_]
+%%BeginDefaults[_^M_][_$_]
+%%ViewingOrientation: 1 0 0 1[_^M_][_$_]
+%%EndDefaults[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+%%BeginProlog[_^M_][_$_]
+%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0[_^M_][_$_]
+/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false[_^M_][_$_]
+setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype[_^M_][_$_]
+ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch[_^M_][_$_]
+def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0[_^M_][_$_]
+rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def[_^M_][_$_]
+/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def[_^M_][_$_]
+typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72[_^M_][_$_]
+def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp[_^M_][_$_]
+exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def[_^M_][_$_]
+/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype[_^M_][_$_]
+{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint}[_^M_][_$_]
+readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop[_^M_][_$_]
+(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def[_^M_][_$_]
+/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- )[_^M_][_$_]
+tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup[_^M_][_$_]
+xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint[_^M_][_$_]
+tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck[_^M_][_$_]
+{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(])[_^M_][_$_]
+tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup[_^M_][_$_]
+rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}[_^M_][_$_]
+forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier[_^M_][_$_]
+/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin[_^M_][_$_]
+$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0[_^M_][_$_]
+ne{grestoreall}if errorname(VMerror)ne{showpage}if initgraphics courier setfont[_^M_][_$_]
+lmargin 720 moveto errorname(VMerror)eq{userdict/ehsave known{clear userdict[_^M_][_$_]
+/ehsave get restore 2 vmreclaim}if vmstatus exch pop exch pop PrtVMMsg}{[_^M_][_$_]
+(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt[_^M_][_$_]
+$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==}[_^M_][_$_]
+repeat}if}ifelse systemdict/showpage get exec(%%[ Error: )print errorname[_^M_][_$_]
+=print(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end[_^M_][_$_]
+end}dup 0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking[_^M_][_$_]
+where{pop/setpacking where{pop oldpack setpacking}if}if[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+userdict /Pscript_WinNT_Incr 230 dict dup begin put[_^M_][_$_]
+%%BeginResource: file Pscript_FatalError 5.0 0[_^M_][_$_]
+userdict begin/FatalErrorIf{{initgraphics findfont 1 index 0 eq{exch pop}{dup[_^M_][_$_]
+length dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding[_^M_][_$_]
+{ISOLatin1Encoding}stopped{StandardEncoding}if def currentdict end[_^M_][_$_]
+/ErrFont-Latin1 exch definefont}ifelse exch scalefont setfont counttomark 3 div[_^M_][_$_]
+cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def end[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+userdict begin/PrtVMMsg{vmstatus exch sub exch pop gt{[[_^M_][_$_]
+(This job requires more memory than is available in this printer.)100 500[_^M_][_$_]
+(Try one or more of the following, and then print again:)100 485[_^M_][_$_]
+(For the output format, choose Optimize For Portability.)115 470[_^M_][_$_]
+(In the Device Settings page, make sure the Available PostScript Memory is accurate.)[_^M_][_$_]
+115 455(Reduce the number of fonts in the document.)115 440[_^M_][_$_]
+(Print the document in parts.)115 425 12/Times-Roman showpage[_^M_][_$_]
+(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def end[_^M_][_$_]
+version cvi 2016 ge{/VM?{pop}bind def}{/VM? userdict/PrtVMMsg get def}ifelse[_^M_][_$_]
+105000 VM?[_^M_][_$_]
+%%BeginResource: file Pscript_Win_Basic 5.0 0[_^M_][_$_]
+/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^[_^M_][_$_]
+/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/-[_^M_][_$_]
+/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true ,[_^M_][_$_]
+d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C[_^M_][_$_]
+/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M[_^M_][_$_]
+/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d[_^M_][_$_]
+/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage[_^M_][_$_]
+, d/K/stroke , d/W/widthshow , d/R/rotate , d/L2? false/languagelevel where{pop[_^M_][_$_]
+languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d/yS/yshow , d/zS/xyshow ,[_^M_][_$_]
+d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, d}bd/bn/bind ld/lw/Lw ld[_^M_][_$_]
+/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx matrix[_^M_][_$_]
+currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit/UtilsInit[_^M_][_$_]
+counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;}b[_^M_][_$_]
+/initialize{`{/Pscript_Win_Data where{!}{U/Pscript_Win_Data & put}?/ADO_mxRot ~[_^M_][_$_]
+d/TextInitialised? F d reinitialize E}{U/Pscript_Win_Data 230 dict @ ` put[_^M_][_$_]
+/ADO_mxRot ~ d/TextInitialised? F d reinitialize}?}b/terminate{!{& self eq[_^M_][_$_]
+{exit}{E}?}loop E}b/suspend/terminate , d/resume{` Pscript_Win_Data `}b U `[_^M_][_$_]
+/lucas 21690 d/featurebegin{countdictstack lucas[}b/featurecleanup{stopped[_^M_][_$_]
+{cleartomark @ lucas eq{! exit}if}loop countdictstack ~ sub @ 0 gt{{E}repeat}[_^M_][_$_]
+{!}?}b E/snap{transform 0.25 sub round 0.25 add ~ 0.25 sub round 0.25 add ~[_^M_][_$_]
+itransform}b/dsnap{dtransform round ~ round ~ idtransform}b/nonzero_round{@ 0.5[_^M_][_$_]
+ge{round}{@ -0.5 lt{round}{0 ge{1}{-1}?}?}?}b/nonzero_dsnap{dtransform[_^M_][_$_]
+nonzero_round ~ nonzero_round ~ idtransform}b U<04>cvn{}put/rr{1 ^ 0 - 0 ~ -[_^M_][_$_]
+neg 0 - C}b/irp{4 -2 $ + +S fx 4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b/rp{4 2 $ M 1 ^ 0[_^M_][_$_]
+- 0 ~ - neg 0 -}b/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool[_^M_][_$_]
+2 ^ put}b/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e[_^M_][_$_]
+{DefIf_El !}b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b[_^M_][_$_]
+/freeVM{/Courier findfont[40 0 0 -40 0 0]makefont Ji 2 vmreclaim}b/hfRedefFont[_^M_][_$_]
+{findfont @ length dict `{1 ^/FID ne{d}{! !}?}forall & E @ ` ~{/CharStrings 1[_^M_][_$_]
+dict `/.notdef 0 d & E d}if/Encoding 256 array 0 1 255{1 ^ ~/.notdef put}for d[_^M_][_$_]
+E definefont !}bind d/hfMkCIDFont{/CIDFont findresource @ length 2 add dict `{1[_^M_][_$_]
+^ @/FID eq ~ @/XUID eq ~/UIDBase eq or or{! !}{d}?}forall/CDevProc ~ d/Metrics2[_^M_][_$_]
+16 dict d/CIDFontName 1 ^ d & E 1 ^ ~/CIDFont defineresource ![~]composefont !}[_^M_][_$_]
+bind d[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+%%BeginResource: file Pscript_Win_Utils_L2 5.0 0[_^M_][_$_]
+/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge[_^M_][_$_]
+{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $[_^M_][_$_]
+snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F[_^M_][_$_]
+setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d[_^M_][_$_]
+/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b[_^M_][_$_]
+/resourcestatus where{!/ColorRendering/ProcSet resourcestatus{! ! T}{F}?}{F}?[_^M_][_$_]
+not{/ColorRendering<</GetHalftoneName{currenthalftone @/HalftoneName known{[_^M_][_$_]
+/HalftoneName get}{!/none}?}bn/GetPageDeviceName{currentpagedevice @[_^M_][_$_]
+/PageDeviceName known{/PageDeviceName get @ null eq{!/none}if}{!/none}?}bn[_^M_][_$_]
+/GetSubstituteCRD{!/DefaultColorRendering/ColorRendering resourcestatus{! ![_^M_][_$_]
+/DefaultColorRendering}{(DefaultColorRendering*){cvn exit}127 string[_^M_][_$_]
+/ColorRendering resourceforall}?}bn>>/defineresource where{!/ProcSet[_^M_][_$_]
+defineresource !}{! !}?}if/buildcrdname{/ColorRendering/ProcSet findresource `[_^M_][_$_]
+mark GetHalftoneName @ type @/nametype ne ~/stringtype ne and{!/none}if(.)[_^M_][_$_]
+GetPageDeviceName @ type @/nametype ne ~/stringtype ne and{!/none}if(.)5 ^ 0 5[_^M_][_$_]
+-1 1{^ length add}for string 6 1 $ 5 ^ 5{~ 1 ^ cvs length 1 ^ length 1 ^ sub[_^M_][_$_]
+getinterval}repeat ! cvn 3 1 $ ! ! E}b/definecolorrendering{~ buildcrdname ~[_^M_][_$_]
+/ColorRendering defineresource !}b/findcolorrendering where{!}{[_^M_][_$_]
+/findcolorrendering{buildcrdname @/ColorRendering resourcestatus{! ! T}{[_^M_][_$_]
+/ColorRendering/ProcSet findresource ` GetSubstituteCRD E F}?}b}?[_^M_][_$_]
+/selectcolorrendering{findcolorrendering !/ColorRendering findresource[_^M_][_$_]
+setcolorrendering}b/G2UBegin{findresource/FontInfo get/GlyphNames2Unicode get[_^M_][_$_]
+`}bind d/G2CCBegin{findresource/FontInfo get/GlyphNames2HostCode get `}bind d[_^M_][_$_]
+/G2UEnd{E}bind d/AddFontInfoBegin{/FontInfo 8 dict @ `}bind d/AddFontInfo{[_^M_][_$_]
+/GlyphNames2Unicode 16 dict d/GlyphNames2HostCode 16 dict d}bind d[_^M_][_$_]
+/AddFontInfoEnd{E d}bind d/T0AddCFFMtx2{/CIDFont findresource/Metrics2 get ` d[_^M_][_$_]
+E}bind d[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+end[_^M_][_$_]
+%%EndProlog[_^M_][_$_]
+[_^M_][_$_]
+%%BeginSetup[_^M_][_$_]
+statusdict begin (%%[ ProductName: ) print product print ( ]%%)= flush end[_^M_][_$_]
+[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginNonPPDFeature: JobTimeout 0[_^M_][_$_]
+0 /languagelevel where{pop languagelevel}{1}ifelse 2 ge{1 dict dup/JobTimeout 4 -1 roll put setuserparams}{statusdict/setjobtimeout get exec}ifelse[_^M_][_$_]
+%%EndNonPPDFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginNonPPDFeature: WaitTimeout 120[_^M_][_$_]
+120 /languagelevel where{pop languagelevel}{1}ifelse 2 ge{1 dict dup/WaitTimeout 4 -1 roll put setuserparams}{statusdict/waittimeout 3 -1 roll put}ifelse[_^M_][_$_]
+%%EndNonPPDFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *HPEdgeToEdge True[_^M_][_$_]
+<</EdgeToEdge true>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *HPPaperPolicy PromptUser[_^M_][_$_]
+[_^M_][_$_]
+ <</DeferredMediaSelection true>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *HPHalftone PrinterDefault[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Collate True[_^M_][_$_]
+<</Collate true>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Smoothing True[_^M_][_$_]
+[_^M_][_$_]
+ << /PostRenderingEnhance true /PostRenderingEnhanceDetails << /REValue 2 /Type 8 >>[_^M_][_$_]
+ >> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *PageSize Letter[_^M_][_$_]
+[_^M_][_$_]
+ <</PageSize [612 792] /ImagingBBox null>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *StapleLocation 1parallel[_^M_][_$_]
+[_^M_][_$_]
+ userdict /HPStapleOption {(ONE)} put[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *MediaType None[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *OutputBin Upper[_^M_][_$_]
+<</Staple 0 /OutputType (TOP OUTPUT BIN)>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Duplex DuplexNoTumble[_^M_][_$_]
+[_^M_][_$_]
+ <</Duplex true /Tumble false>> setpagedevice[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *JRConstraints 0[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *JRHDInstalled JRHDStore[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *JRHDNotInstalled JRHDPrivate[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *HPPrinterModelName HP_LaserJet_8150_Series_PS[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option2 False[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option6 False[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option3 True[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option5 False[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option20 Standard[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *Option21 MailboxModeMailbox[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *InstalledMemory 32-39MB[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *PrinterHardDisk False[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+featurebegin{[_^M_][_$_]
+%%BeginFeature: *JobRetention True[_^M_][_$_]
+[_^M_][_$_]
+%%EndFeature[_^M_][_$_]
+}featurecleanup[_^M_][_$_]
+1 setlinecap 1 setlinejoin[_^M_][_$_]
+/mysetup [ 72 600 V 0 0 -72 600 V 2.99905 785.99908 ] def [_^M_][_$_]
+%%EndSetup[_^M_][_$_]
+[_^M_][_$_]
+userdict begin /ehsave save def end[_^M_][_$_]
+%%EndPageComments[_^M_][_$_]
+%%BeginPageSetup[_^M_][_$_]
+/DeviceRGB dup setcolorspace /colspABC exch def[_^M_][_$_]
+mysetup concat colspRefresh[_^M_][_$_]
+%%EndPageSetup[_^M_][_$_]
+[_^M_][_$_]
+Pscript_WinNT_Incr begin[_^M_][_$_]
+%%BeginResource: file Pscript_Win_GdiObject 5.0 0[_^M_][_$_]
+/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore[_^M_][_$_]
+{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d[_^M_][_$_]
+/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps[_^M_][_$_]
+L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType[_^M_][_$_]
+1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d[_^M_][_$_]
+/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal[_^M_][_$_]
+{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep[_^M_][_$_]
+gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b[_^M_][_$_]
+/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M[_^M_][_$_]
+MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep[_^M_][_$_]
+M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8[_^M_][_$_]
++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d[_^M_][_$_]
+/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix[_^M_][_$_]
+GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0[_^M_][_$_]
+/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal[_^M_][_$_]
+makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5[_^M_][_$_]
+/HS_DiagCross makehatch}b/GDIBWPatternMx null d/pfprep{save 8 1 $[_^M_][_$_]
+/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d/yExt[_^M_][_$_]
+~ d/Width ~ d/BGnd ~ d/FGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 Height 0[_^M_][_$_]
+0]d E build_pattern ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill{O}{L}? restore}b[_^M_][_$_]
+/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot concat 0 0 snap +[_^M_][_$_]
+: 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ nonzero_dsnap YStep V ~[_^M_][_$_]
+XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 -0.24 +S[_^M_][_$_]
+GDIBWPatternDict ` Width Height E nonzero_dsnap +S/GDIBWPatternMx matrix[_^M_][_$_]
+currentmatrix readonly d ; ;}if}b[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+%%BeginResource: file Pscript_Win_GdiObject_L3 5.0 0[_^M_][_$_]
+/GDIBWPatternDict 25 dict @ `/PatternType 1 d/PaintType 1 d/RepsV 1 d/RepsH 1 d[_^M_][_$_]
+/BBox[0 0 RepsH 1]d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d[_^M_][_$_]
+/Width 8 d/mx[Width 0 0 Height neg 0 Height]d/FGnd null d/BGnd null d[_^M_][_$_]
+/SetBGndFGnd{BGnd null ne{BGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~[_^M_][_$_]
+rf}if FGnd null ne{FGnd aload ! scol}if}b/PaintProc{` SetBGndFGnd RepsH{Width[_^M_][_$_]
+Height F mx PaintData imagemask Width 0 +}repeat E}b E d/mp/makepattern , d[_^M_][_$_]
+/build_pattern{CTMsave GDIBWPatternMx setmatrix/nupangle where{! nupangle -90[_^M_][_$_]
+eq{nupangle R}if}if GDIBWPatternDict @ ` Width Height ne{Width Height gt{Width[_^M_][_$_]
+Height V 1}{1 Height Width V}? +S}if xOrg yOrg E matrix + mp CTMrestore}b/hbf[_^M_][_$_]
+{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O}{L}? ;}b/pbf{: ![_^M_][_$_]
+/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d/OutputBPP ~ d[_^M_][_$_]
+/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 d/BBox[0 0[_^M_][_$_]
+Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d 20 dict @ `[_^M_][_$_]
+/ImageType 1 d/Width Width d/Height Height d/ImageMatrix[1 0 0 1 0 0]d[_^M_][_$_]
+/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{[_^M_][_$_]
+/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict[_^M_][_$_]
+~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L}[_^M_][_$_]
+? ;}b/mask_pbf{:/fEOFill ~ d 20 dict `/yOrg ~ d/xOrg ~ d/PaintData ~ d/Height ~[_^M_][_$_]
+d/Width ~ d/PatternType 1 d/PaintType 2 d/TilingType 1 d/BBox[0 0 Width Height][_^M_][_$_]
+d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d/PaintProc{` Width Height[_^M_][_$_]
+T 1 1 dtransform abs ~ abs ~ 0 0 3 -1 $ 0 0 6 array astore{PaintData}imagemask[_^M_][_$_]
+E}b & mx makepattern setpattern E fEOFill{O}{L}? ;}b/grf4{4 dict `/ShadingType[_^M_][_$_]
+4 d/DataSource ~ d/ColorSpace ~ d & E shfill}b[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+end reinitialize[_^M_][_$_]
+/DeviceGray dup setcolorspace /colspABC exch def[_^M_][_$_]
+0 0 scol N 2950 725 M 3113 869 I K [_^M_][_$_]
+N 3113 869 M 3044 831 I 3069 806 I C [_^M_][_$_]
+ O N 2950 725 M 3113 775 I K [_^M_][_$_]
+N 3113 775 M 3038 769 I 3044 738 I C [_^M_][_$_]
+ O N 2950 725 M 3113 681 I K [_^M_][_$_]
+N 3113 681 M 3044 719 I 3038 681 I C [_^M_][_$_]
+ O N 2950 725 M 3113 588 I K [_^M_][_$_]
+N 3113 588 M 3069 650 I 3044 619 I C [_^M_][_$_]
+ O 55017 VM?[_^M_][_$_]
+Pscript_WinNT_Incr begin[_^M_][_$_]
+%%BeginResource: file Pscript_T42Hdr 5.0 0[_^M_][_$_]
+/asc42 0.0 d/sF42{/asc42 ~ d Ji}bind d/bS42{0 asc42 -M}bind d/eS42{0 asc42 neg[_^M_][_$_]
+-M}b/Is2015?{version cvi 2015 ge}bind d/AllocGlyphStorage{Is2015?{!}{{string}[_^M_][_$_]
+forall}?}bind d/Type42DictBegin{25 dict `/FontName ~ d/Encoding ~ d 4 array[_^M_][_$_]
+astore cvx/FontBBox ~ d/PaintType 0 d/FontType 42 d/FontMatrix[1 0 0 1 0 0]d[_^M_][_$_]
+/CharStrings 256 dict `/.notdef 0 d & E d/sfnts}bind d/Type42DictEnd{& @[_^M_][_$_]
+/FontName get ~ definefont ! E}bind d/RDS{string currentfile ~ readstring !}[_^M_][_$_]
+executeonly d/PrepFor2015{Is2015?{/GlyphDirectory 16 dict d sfnts 0 get @ 2 ^[_^M_][_$_]
+(glyx)putinterval 2 ^(locx)putinterval ! !}{! !}?}bind d/AddT42Char{Is2015?[_^M_][_$_]
+{findfont/GlyphDirectory get ` d E ! !}{findfont/sfnts get 4 ^ get 3 ^ 2 ^[_^M_][_$_]
+putinterval ! ! ! !}?}bind d/IDStrNull{1 add 2 mul @ string 0 1 3 ^ 1 sub{1 ^ ~[_^M_][_$_]
+0 put}for ~ !}bind d/IDStr{@ 1 add 2 mul string 0 1 3 ^{1 ^ ~ @ 2 mul ~ 3 copy[_^M_][_$_]
+256 idiv put ~ 1 add ~ 256 mod put}for ~ !}bind d/IDStr2{~ @ 1 add 2 mul string[_^M_][_$_]
+0 1 3 ^{1 ^ ~ @ 2 mul ~ 5 ^ add 3 copy 256 idiv put ~ 1 add ~ 256 mod put}for ~[_^M_][_$_]
+! ~ !}bind d/CIDT42Begin{25 dict `/CDevProc ~ d/CIDMap ~ d/CIDCount ~ d[_^M_][_$_]
+/CIDSystemInfo 3 dict @ ` 3 -1 $/Supplement ~ d 3 -1 $/Ordering ~ d 3 -1 $[_^M_][_$_]
+/Registry ~ d E d/CIDFontName ~ d/Encoding ~ d 4 array astore cvx/FontBBox ~ d[_^M_][_$_]
+/CharStrings 2 dict @ `/.notdef 0 d E d/GDBytes 2 d/CIDFontType 2 d/FontType 42[_^M_][_$_]
+d/PaintType 0 d/FontMatrix[1 0 0 1 0 0]d/Metrics2 16 dict d/sfnts}bind d[_^M_][_$_]
+/CIDT42End{CIDFontName & E/CIDFont defineresource !}bind d/T42CIDCP32K{/CIDFont[_^M_][_$_]
+findresource @ length dict copy @/FID undef `/CIDFontName ~ d/CIDMap ~ d[_^M_][_$_]
+/CIDCount ~ d/Metrics2 8 dict d CIDFontName & E/CIDFont defineresource !}bind d[_^M_][_$_]
+/T42CIDCPR{/CIDFont findresource @ length dict copy @/FID undef `/CIDFontName ~[_^M_][_$_]
+d &/CDevProc known{[/CDevProc , @ type/operatortype ne{/exec cvx}if/! cvx/! cvx[_^M_][_$_]
+/! cvx/! cvx 5/^ cvx 5/^ cvx 0.0 0.0]cvx}{{! ! ! ! ! 5 ^ 5 ^ 0.0 0.0}}? bind[_^M_][_$_]
+readonly/CDevProc ~ d CIDFontName & E/CIDFont defineresource !}bind d[_^M_][_$_]
+/T0AddT42Char{/CIDFont findresource/GlyphDirectory get ` d E ! !}bind d[_^M_][_$_]
+/T0AddT42Mtx2{/CIDFont findresource/Metrics2 get ` d E}bind d/UpdateCIDMap{[_^M_][_$_]
+/CIDFont findresource/CIDMap get 3 1 $ putinterval}d/AddXUID{version cvi 3011[_^M_][_$_]
+ge{/XUID ~ d}{!}?}bind d/hfDef42CID{/CIDFont findresource @ length dict copy @[_^M_][_$_]
+/FID undef `/CIDFontName 2 ^ d @ type @/booleantype ne{/arraytype eq{/CDevProc[_^M_][_$_]
+~ d}{matrix @ 4 4 -1 $ put/FontMatrix ~ d}?}{! !}? & E/CIDFont defineresource[_^M_][_$_]
+!}bind d/hfDefRT42CID{/CIDFont findresource @ length dict copy @/FID undef `[_^M_][_$_]
+/CIDFontName 1 ^ d &/CDevProc known{[/CDevProc , @ type/operatortype ne{/exec[_^M_][_$_]
+cvx}if/! cvx/! cvx/! cvx/! cvx 5/^ cvx 5/^ cvx 0.0 0.0]cvx}{{! ! ! ! ! 5 ^ 5 ^[_^M_][_$_]
+0.0 0.0}}? bind readonly/CDevProc ~ d & E/CIDFont defineresource !}bind d[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+end reinitialize[_^M_][_$_]
+-0.578 -0.207 1.387 0.922[_^M_][_$_]
+ 256 array 0 1 255 {1 index exch /.notdef put} for /TTE1CD9F20t00[_^M_][_$_]
+Type42DictBegin[_^M_][_$_]
+[<00010000000a000a000a000a6376742065146ccc000000ac000002746670[_^M_][_$_]
+676d2bc15a050000032000000768676c79661b44802b000058e80004e222[_^M_][_$_]
+68656164ce8b489100000a8800000036686865610dd60c5100000ac00000[_^M_][_$_]
+0024686d74785d72583900000ae4000023446c6f636116f62ad600002e28[_^M_][_$_]
+000023486d6178700dba0872000051700000002070726570877d61440000[_^M_][_$_]
+5190000007556764697200000000000000000000000005ba0019000005ba[_^M_][_$_]
+001900000000000000000000000000000000000000000425001900000000[_^M_][_$_]
+ffe700000000ffe70000000000000000fe68ffea00000000000000000000[_^M_][_$_]
+0000000002f5ffee05cd000002ddffee02f0000000000000000000000000[_^M_][_$_]
+000000000000000000000000000000000000000000000000000000000000[_^M_][_$_]
+000008000000080000000000000000000000000000000000000000000000[_^M_][_$_]
+00000000000000000000000000d2010e012c01130000000000c8010900c8[_^M_][_$_]
+000000000000000000000000000000890048001bff77ffb8ffe500a4005f[_^M_][_$_]
+000aff5cffa1fff6000000000000000afff6000000000000000000000059[_^M_][_$_]
+ffa700c9000000c3000000c2008300c3000000bd000000bd007900c3006c[_^M_][_$_]
+00bd009100af00000000026f00ae00a6009a0000009b0094008b00cc00ae[_^M_][_$_]
+00a600940000000000ff000001e300000000000000000000000000000000[_^M_][_$_]
+00000000000000000000000000cd00cd006801ee0060008c000000000000[_^M_][_$_]
+0000000000000000000000a800a800a800b900cd00a80052016a0049007d[_^M_][_$_]
+007d0083008a00000071009b00910078000001fc0071ff8f022a006d0094[_^M_][_$_]
+00a0029a030a00b800ae008b018b019101d10391008c00730268027d01b0[_^M_][_$_]
+01dd021c033302a3026b02730152024c0021004c05e704f20098ff6800ac[_^M_][_$_]
+00c500850085005c0054006000b401baff1ffe680000008300bc00940094[_^M_][_$_]
+ff85ffae00520029061400ae00460046fe580560008f076002f20025003e[_^M_][_$_]
+004700500058007300a80160006000950025003e004700500058007300a8[_^M_][_$_]
+01600000002d005000600081009300ba0108ffd3ffaeff9106520060005c[_^M_][_$_]
+00b0012b012b04ba013e018507600016000a004b403f545249483b393837[_^M_][_$_]
+363534333231302f2e2d2c2b2a292827262524232221201f1e1d1c1b1a19[_^M_][_$_]
+1817161514131211100f0e0d0c0b0a090807060504030201002c01b01843[_^M_][_$_]
+58456ab0194360b0462344231020b0464ef04d2fb000121b21231133592d[_^M_][_$_]
+2c01b0184358b0052bb000134bb0145058b100403859b0062b1b21231133[_^M_][_$_]
+592d2c01b01843584eb0032510f221b000124d1b2045b00425b00425234a[_^M_][_$_]
+6164b0285258212310d21bb0032510f221b0001259592d2cb01a43582121[_^M_][_$_]
+1bb00225b0022549b00325b003254a612064b01050582121211bb00325b0[_^M_][_$_]
+032549b0005058b0005058b8ffe238211bb0103821591bb0005258b01e38[_^M_][_$_]
+211bb8fff03821595959592d2c01b0184358b0052bb000134bb0145058b9[_^M_][_$_]
+0000ffc03859b0062b1b21231133592d2c4e018a10b146194344b00014b1[_^M_][_$_]
+0046e2b00015b90000fff03800b0003cb0282bb0022510b0003c2d2c0118[_^M_][_$_]
+b0002fb00114f2b00113b001154db000122d2c01b0184358b0052bb00013[_^M_][_$_]
+b90000ffe038b0062b1b21231133592d2c01b018435845646a23456469b0[_^M_][_$_]
+1943646060b0462344231020b046f02fb000121b2121208a208a52581133[_^M_][_$_]
+1b212159592d2c01b10b0a432343650a2d2c00b10a0b4323430b2d2c00b0[_^M_][_$_]
+462370b101463e01b0462370b10246453ab10200080d2d2cb0122bb00225[_^M_][_$_]
+45b00225456ab0408b60b0022523442121212d2cb0132bb0022545b00225[_^M_][_$_]
+456ab8ffc08c60b0022523442121212d2cb000b0122b2121212d2cb000b0[_^M_][_$_]
+132b2121212d2c01b00643b00743650a2d2c2069b04061b0008b20b12cc0[_^M_][_$_]
+8a8cb8100062602b0c642364615c58b00361592d2cb1000325456854b01c[_^M_][_$_]
+4b505a58b0032545b0032545606820b004252344b0042523441bb0032520[_^M_][_$_]
+4568208a2344b00325456860b003252344592d2cb00325204568208a2344[_^M_][_$_]
+b003254564686560b00425b0016023442d2cb00943588721c01bb0124358[_^M_][_$_]
+8745b0112bb0472344b0477ae41b038a45186920b04723448a8a8720b0a0[_^M_][_$_]
+5158b0112bb0472344b0477ae41b21b0477ae4595959182d2c208a452345[_^M_][_$_]
+6860442d2c456a422d2c01182f2d2c01b0184358b00425b0042549642345[_^M_][_$_]
+64696120b080626ab00225b00225618cb0194360b0462344218a10b046f6[_^M_][_$_]
+211b21212121592d2c01b0184358b0022545b002254564606ab00325456a[_^M_][_$_]
+6120b00425456a208a8b65b0042523448cb00325234421211b20456a4420[_^M_][_$_]
+456a44592d2c012045b00055b018435a584568234569b0408b6120b08062[_^M_][_$_]
+6a208a236120b003258b65b0042523448cb00325234421211b2121b0192b[_^M_][_$_]
+592d2c018a8a45642345646164422d2cb00425b00425b0192bb0184358b0[_^M_][_$_]
+0425b00425b00325b01b2b01b0022543b04054b0022543b000545a58b003[_^M_][_$_]
+252045b040614459b0022543b00054b0022543b040545a58b004252045b0[_^M_][_$_]
+4060445959212121212d2c014b525843b00225452361441b2121592d2c01[_^M_][_$_]
+4b525843b00225452360441b2121592d2c4b525845441b2121592d2c0120[_^M_][_$_]
+b003252349b04060b0206320b000525823b002253823b002256538008a63[_^M_][_$_]
+381b212121212159012d2c4b505845441b2121592d2c01b005251023208a[_^M_][_$_]
+f500b0016023edec2d2c01b005251023208af500b0016123edec2d2c01b0[_^M_][_$_]
+062510f500edec2d2c462346608a8a462320468a608a61b8ff8062232010[_^M_][_$_]
+238ab14b4b8a70456020b0005058b00161b8ffba8b1bb0468c59b0106068[_^M_][_$_]
+013a2d2c2045b00325465258b0022546206861b00325b003253f2321381b[_^M_][_$_]
+2111592d2c2045b00325465058b0022546206861b00325b003253f232138[_^M_][_$_]
+1b2111592d2c00b00743b006430b2d2c8a10ec2d2cb00c4358211b2046b0[_^M_][_$_]
+005258b8fff0381bb0103859592d2c20b0005558b8100063b003254564b0[_^M_][_$_]
+0325456461b0005358b0021bb04061b00359254569535845441b2121591b[_^M_][_$_]
+21b0022545b00225456164b028515845441b212159592d2c21210c642364[_^M_][_$_]
+8bb84000622d2c21b08051580c6423648bb82000621bb200402f2b59b002[_^M_][_$_]
+602d2c21b0c051580c6423648bb81555621bb200802f2b59b002602d2c0c[_^M_][_$_]
+6423648bb84000626023212d2c4b5358b00425b004254964234564696120[_^M_][_$_]
+b080626ab00225b00225618cb0462344218a10b046f6211b218a11231220[_^M_][_$_]
+392f592d2c2121212121212d2cb0134358031b02592d2cb0134358021b03[_^M_][_$_]
+592d2cb00a2b2310203cb0172b2d2cb00225b8fff038b0282b8a102320d0[_^M_][_$_]
+23b0102bb0054358c01b3c59201011b00012012d2c4b53234b515a58381b[_^M_][_$_]
+2121592d2c01b0022510d023c901b00113b0001410b0013cb001162d2c01[_^M_][_$_]
+b00013b001b0032549b0031738b001132d2c4b53234b515a5820458a6044[_^M_][_$_]
+1b2121592d2cb0024354584b53234b515a58381b2121591b21212121592d[_^M_][_$_]
+2c4b53234b515a58381b2121592d2c4b5458381b2121592d2c4b52587d1b[_^M_][_$_]
+7a592d2cb1020042b123018851b1400188535a58b910000020885458b202[_^M_][_$_]
+010243604259b12401885158b920000040885458b202020243604259b124[_^M_][_$_]
+01885458b2022002436042004b014b5258b2020802436042591bb9400000[_^M_][_$_]
+80885458b202040243604259b94000008063b80100885458b20208024360[_^M_][_$_]
+4259b94000010063b80200885458b2021002436042595959592d00010000[_^M_][_$_]
+00016148e1f6c9625f0f3cf5001b080000000000aff53caf00000000b8f4[_^M_][_$_]
+5fe9fb5cfe520b170760000000090001000100000000000100000760fe52[_^M_][_$_]
+00000ab3fb5cfa7a0b170001000000000000000000000000000008d10258[_^M_][_$_]
+0032000000000239000002200000023900b602d70054047300170473004e[_^M_][_$_]
+071d0081055600580187005c02aa007b02aa004a031d004204ac00710239[_^M_][_$_]
+00b602aa0042023900b6023900000473005c047300e30473003f0473005a[_^M_][_$_]
+0473001f047300560473005c047300620473005604730056023900b60239[_^M_][_$_]
+00b604ac007104ac007104ac00710473005e081f00730556fffe055600a4[_^M_][_$_]
+05c7006005c700a4055600a404e300a40639006005c700a4023900bc0400[_^M_][_$_]
+0037055600a4047300a406aa00a405c700a406390060055600a406390060[_^M_][_$_]
+05c700a40556005c04e3002d05c700a40556000c078d00190556000a0556[_^M_][_$_]
+000a04e300250239008b023900000239002103c1004a046afff402aa0056[_^M_][_$_]
+0473004e0473008b04000048047300480473004802390010047300480473[_^M_][_$_]
+008b01d3008b01d3ffb80400008b01d3008b06aa008b0473008b04730048[_^M_][_$_]
+0473008b0473004802aa008b0400003f02390023047300870400001b05c7[_^M_][_$_]
+000a0400000e0400001b0400002902ac0039021400bc02ac003104ac0058[_^M_][_$_]
+0556fffe0556fffe05c70060055600a405c700a40639006005c700a40473[_^M_][_$_]
+004e0473004e0473004e0473004e0473004e0473004e0400004804730048[_^M_][_$_]
+04730048047300480473004801d3007901d3ffec01d3ffac01d3ffd50473[_^M_][_$_]
+008b04730048047300480473004804730048047300480473008704730087[_^M_][_$_]
+0473008704730087047300500333008504730071047300310473005602cd[_^M_][_$_]
+0068044cfffe04e3008b05e5000005e500000578003202aa00e302aa003f[_^M_][_$_]
+04ac0071080000000639005004ac005c04ac007104ac007104ac00710473[_^M_][_$_]
+00020473008b03f4003305b4007b069600a4046400000231ffb202f6002b[_^M_][_$_]
+02ec002d06250071071d004e0473004804730062023900b604ac00710464[_^M_][_$_]
+001404730042046400330556fffe0473008d0473008d0486005b0556fffe[_^M_][_$_]
+0556fffe0639006008000060078d00480258fff404b0fff402aa005402aa[_^M_][_$_]
+005401c7007d01c7007d04ac007103f4002e0400001b0556000a0156fe54[_^M_][_$_]
+0473004c02aa005a02aa007f040000100400001004730050023900b60239[_^M_][_$_]
+00b603220090080000190556fffe055600a40556fffe055600a4055600a4[_^M_][_$_]
+023900ac0239ffdf023900080239001f06390060063900600639006005c7[_^M_][_$_]
+00a405c700a405c700a401d3008b02aa001702aa000602aa001d02aa002d[_^M_][_$_]
+02aa00f802aa00a202aa0085037a009d02aa00b602aa00170473000801d3[_^M_][_$_]
+000c0556005c0400003f04e3002504000029021400bc05c7000204730048[_^M_][_$_]
+0556000a0400001b055600a40473008b04ac007104ac00a602aa006a02aa[_^M_][_$_]
+001902aa002106ac007f06ac007f06ac003504e300000639006004730048[_^M_][_$_]
+023900bc0556005c0400003f05c700600400004805c70060040000480473[_^M_][_$_]
+00480400fff4023900b60556fffe0473004e0556fffe0473004e05c700a4[_^M_][_$_]
+0513004805c70002055600a404730048055600a404730048047300a401d3[_^M_][_$_]
+0047047300a40255008b047300a402f3004205c700a40473008b05c700a4[_^M_][_$_]
+0473008b063900600473004805c700a402aa008b05c700a402aa002b0556[_^M_][_$_]
+005c0400003f04e3002d0239002304e3002d02d0002305c700a404730087[_^M_][_$_]
+05c700a40473008704e300250400002904e300250400002904ae00a40639[_^M_][_$_]
+006006790060049c0048047300480400004804ae00480400002105310048[_^M_][_$_]
+0400fff4047200b602f6004c09e9008f063900bc03a6008b0568002102aa[_^M_][_$_]
+00e502aa0056071d00810296000f04d5009202d6008302d6008304d500b1[_^M_][_$_]
+02d600700556fffe0473004e05c700600400004805c70060040000480556[_^M_][_$_]
+00a404730048055600a404730048055600a4047300480639006004730048[_^M_][_$_]
+0639006004730048063900600473004805c700a40473008b05c700140473[_^M_][_$_]
+00000239ffce01d3ff9b0239ffe501d3ffb20239fff501d3ffc2023900bc[_^M_][_$_]
+01d3008b0400003701d3ffac056800a40400008b0400008b047300a401d3[_^M_][_$_]
+004205c700a40473008b05c700a40473008b063900600473004806390060[_^M_][_$_]
+0473004805c700a402aa005a0556005c0400003f04e3002d0239002305c7[_^M_][_$_]
+00a40473008705c700a40473008705c700a40473008705c700a404730087[_^M_][_$_]
+078d001905c7000a0556000a0400001b0200008b0556fffe0473004e0800[_^M_][_$_]
+0000071d004e0639005004730048023900b6078d001905c7000a078d0019[_^M_][_$_]
+05c7000a078d001905c7000a0556000a0400001b01c7007d0400fff40473[_^M_][_$_]
+00310473004806ac007f06ac003606ac003606ac006d02aa00fc02aa0085[_^M_][_$_]
+02aa00ee034800370556fffe0646003306b7003303290033069a00000631[_^M_][_$_]
+0000069a0000033300290556fffe055600a40575000c055600a404e30025[_^M_][_$_]
+05c700a4023900bc055600a40556fffe06aa00a405c700a4053f006d0639[_^M_][_$_]
+006005c700a4055600a404e5006004e3002d0556000a0556000a0679005e[_^M_][_$_]
+06390066023900080556000a049c0048040000480473008b01ec00790473[_^M_][_$_]
+00870481008b0452001b03e100480473008b0473005c01ec008b0400008b[_^M_][_$_]
+0400001b0473008b0400001b03e10048047300480491008b044800480473[_^M_][_$_]
+0087042d000e058500870585004802520008047300870473004804730087[_^M_][_$_]
+05850048055600a40666002d048900a405bc00600556005c023900bc0239[_^M_][_$_]
+00080400003707ae000a07ae00a40666002d055600a4051f000805c700a4[_^M_][_$_]
+0556fffe053d00a4055600a4048900a406330023055600a4073500060514[_^M_][_$_]
+005a05c700a405c700a4055600a405a4000a06aa00a405c700a406390060[_^M_][_$_]
+05c700a4055600a405c7006004e3002d051f000806cb00600556000a05fc[_^M_][_$_]
+00a40579007706e100a4071700a4063d0000071000a4053d00a405bc005e[_^M_][_$_]
+080c00a405c7005c0473004e0496005e043f008b0310008b04aa00000473[_^M_][_$_]
+004805aa0004040000230479008b0479008b0400008b0491000a05b6008b[_^M_][_$_]
+0473008b047300480473008b0473008b0400004803aa00250400001b0698[_^M_][_$_]
+00480400000e0498008b0444005e066a008b068f008b04f6000005bc008b[_^M_][_$_]
+042f008b0400001b05f4008b0456003504730048047300000310008b0400[_^M_][_$_]
+00480400003f01d3008b01d3ffd501d3ffb806e9000a0698008b04730000[_^M_][_$_]
+0400008b0400001b0473008b047300a403b8008b046afff407fc008f0473[_^M_][_$_]
+008b02aa002302aa002102aa006d02aa002101d3008b0556005c0400003f[_^M_][_$_]
+0473000001480060028f004e028f005e028f005e0148006001ec004e01ec[_^M_][_$_]
+005801ec007101ec005601480060028f004e014800600148007502140039[_^M_][_$_]
+01ec007101cf0091014800600148ff79023900b604cd0083048f003b035c[_^M_][_$_]
+00170429001404cd0098028f004c02cd001404cd009804cd003b028f004c[_^M_][_$_]
+0429003f0429005a0429004804cd005004cd003b02cd004a02cd003b04cd[_^M_][_$_]
+005004cd002d04cd00870466006f043d003b0466003b047b00980400002d[_^M_][_$_]
+0550009804cd005404cd003704cd003704cd003702000060037100600566[_^M_][_$_]
+0077028fffa20429003f0429003f0429ff790429ff7904cd002d05500098[_^M_][_$_]
+05500098055000980550009804cd008304cd008304cd0083048f003b035c[_^M_][_$_]
+00170429001404cd0098028f003d02cd001404cd003b028f003d0429003f[_^M_][_$_]
+0429005a0429004804cd003b02cd003b04cd005004cd00870466006f0466[_^M_][_$_]
+003b047b00980400002d0550009804cd0054028f004c048f003b0429005a[_^M_][_$_]
+0466006f04cd00290000ffdc0000ff250000ffdc0000fe51014800600639[_^M_][_$_]
+00600473004805c700a40473008702aa00cf02aa00f802aa005602aa00e3[_^M_][_$_]
+02aa001702aaff0c02aa001702aa000402aa002d02aa002d02aa002d02aa[_^M_][_$_]
+000402aa00cf02aa000402aa002d02aa002b02aa002b02aa001902aa0017[_^M_][_$_]
+0556fffe0473004e0556fffe0473004e0556fffe0473004e0556fffe0473[_^M_][_$_]
+fff20556fffe0473004e0556fffe0473004e0556fffe0473004e0556fffe[_^M_][_$_]
+0473004e0556fffe0473004e0556fffe0473004e0556fffe0473004e0556[_^M_][_$_]
+fffe0473004e055600a404730048055600a404730048055600a404730048[_^M_][_$_]
+055600a404730048055600770473fff1055600a404730048055600a40473[_^M_][_$_]
+0048055600a4047300480239009801d30098023900bc01d3008b06390060[_^M_][_$_]
+0473004806390060047300480639006004730048063900600473fff20639[_^M_][_$_]
+006004730048063900600473004806390060047300480639006004730048[_^M_][_$_]
+063900600473004806390060047300480639006004730048063900600473[_^M_][_$_]
+004805c700a40473008705c700a40473008705c700a40473008705c700a4[_^M_][_$_]
+0473008705c700a40473008705c700a40473008705c700a4047300870556[_^M_][_$_]
+000a0400001b0556000a0400001b0556000a0400001b0473004801df00b2[_^M_][_$_]
+01df007501df002b01df007501f4ff8501f4ff8501f4ff850458ff850458[_^M_][_$_]
+00560458ff85045800560458ff850458005604d7ff8504d7ff8506c3ff85[_^M_][_$_]
+045801310458013f0458005a0458003d0458007504580048045800480458[_^M_][_$_]
+002d0458002b0458005c06c3ff850458ff850323ff8503a000560458ff85[_^M_][_$_]
+0323ff8503a000560252ff85025eff85022500ac0252ff85025eff850327[_^M_][_$_]
+ff8501baff850323ff8501f4ff85039aff850323ff85030e004801f4ff85[_^M_][_$_]
+04bc001f030e004804bc001f026600cd01f4ff85045c000c04c3003501df[_^M_][_$_]
+000001df000001df0000045c000c04c30035045cfff604bc001f022500ac[_^M_][_$_]
+04c3001f026600cd04730062034c008901df002701df00710364000001df[_^M_][_$_]
+0071051f001f01df00ae05b80050027b003d05b8005005b8005004580056[_^M_][_$_]
+045800560458005602b8000a02b8000a03e1005203e100520698000a0698[_^M_][_$_]
+000a08b8000a08b8000a04a4ff8504a4ff85045c0052045c005201baff85[_^M_][_$_]
+0652005004a8002704cd00330414002902b8001f043d0033027b003d0364[_^M_][_$_]
+0000051f001f051f001f01ae000001df000001ae000001ae000001ae001b[_^M_][_$_]
+01ae000001df00000133000a045c000c04c3003501cb006801c7001f0266[_^M_][_$_]
+00e9026600620266005601f4ff850252ff85025eff8505b8005003df0093[_^M_][_$_]
+0000fb5c0000fb5c0000fb5c0000fb5c0000fe000000fd3b0000fc4c0000[_^M_][_$_]
+fd0a0000fd2d0000ff170000fdaa0000fda80000fe850000fe9605c3005e[_^M_][_$_]
+0000fbdf0000fd1b0000fbfa0000fe020000fdf00000fc4c0000fd7f0000[_^M_][_$_]
+fd2d045e005e047f002d04ac002d047f0056047f0056055c002d03640006[_^M_][_$_]
+03df0050051f0050047f002d04ac002d05c3005e05c3005e04ac005004ac[_^M_][_$_]
+005003df00930571002d062100560635005e047f0056047f0056045e005e[_^M_][_$_]
+049a00500404009304f6005004ac005004ac0050047f0081047f00810537[_^M_][_$_]
+00500537005004ac005004ac002f0400008103df0093045e005e03df0050[_^M_][_$_]
+04ac005003df0050047f0056051200500431005004db0050053700500431[_^M_][_$_]
+0050045e005e04000050039a004a0000fcfe035c001f035cfe620000fc73[_^M_][_$_]
+0000fc730000fc730000fc730000fee10000fe000000fee9031f00b604fe[_^M_][_$_]
+009a0248008b048f008b035c0010035cffc903df0000035c001f04830050[_^M_][_$_]
+0000fd100000ff190000fe5e0000fda80000fec10000fe960000fe620000[_^M_][_$_]
+fe680431006204bc006004bc005c04fe000e04fe007f04fe006004fe0060[_^M_][_$_]
+04bc001704fe003504fe006004fe004a0527005006d100350000fee10000[_^M_][_$_]
+fe000000fee901baff8505b8005001f4ff8504580056045800560458ff85[_^M_][_$_]
+03e1005204c100330327ff8504c100330327ff85051f001f04bc001f01f4[_^M_][_$_]
+ff85030e0048027b003d045801310458013f0458005a0458003d0458003d[_^M_][_$_]
+0458004a045800c90458002d0458002b0458005c04e3002d023900230556[_^M_][_$_]
+00a40473004805c700a40479008b04140029023900bc0400003701d3008b[_^M_][_$_]
+01d3ffb80489003a031000300786000605cf000405aa00a40447008b0556[_^M_][_$_]
+00a40400008b05fc00a4049a008b0556000a0400001b0556000a0400001b[_^M_][_$_]
+05a5000a043a000e057900770444005e057900a40473008b063900600473[_^M_][_$_]
+00480639006004730048080000000000ffdc0000ff160000ffdc0000ff20[_^M_][_$_]
+0000ffdc0000ff200197000005b8005001f4ff8502b8000a03e10052043d[_^M_][_$_]
+00330440006401f4ff8503fdff85044000640440006406d9001306d90013[_^M_][_$_]
+06d9001306d9001301ba00280493004a031d0042065200500252ff85025e[_^M_][_$_]
+ff8501df000001df000006750048027b003d0000ffdd0000fe870000fefd[_^M_][_$_]
+047300690568005c05c7006005c7006006aa008b05c70000098700a4078d[_^M_][_$_]
+00000556000004e3002d0800002901ae000501ae002a026600ea02660056[_^M_][_$_]
+0266006201ae002e04a8002701ae001001cb006801cb006801df000501df[_^M_][_$_]
+000501df002a01df002a01df002a01df002a028000ae028000b203640000[_^M_][_$_]
+03640000057e001f04bc001f05b8005001f4ff8505b8005001f4ff8505b8[_^M_][_$_]
+005001f4ff8505b8005001f4ff8505b8005001f4ff8505b8005001f4ff85[_^M_][_$_]
+04580056045800560458ff8504580056045800560458ff85045800560458[_^M_][_$_]
+00560458ff8504580056045800560458ff8504580056045800560458ff85[_^M_][_$_]
+04580056045800560458ff8502b8000a02b8000a02b8000a02b8000002b8[_^M_][_$_]
+000a02b8fffc02b8fffc02b8000803e1005203e1005203e1005203e10052[_^M_][_$_]
+03e1005203e1005203e100520698000a04d7ff850698000a04d7ff850698[_^M_][_$_]
+000a04d7ff8508b8000a06c3ff8508b8000a06c3ff8504a4ff85045c0052[_^M_][_$_]
+03a000560458ff850323ff8506520050065200500252ff85025eff850652[_^M_][_$_]
+00500252ff85025eff85065200500252ff85025eff85065200500252ff85[_^M_][_$_]
+025eff8504a8002704a8002706d9003306d9ff7904c100330327ff8504cd[_^M_][_$_]
+00330327ff8504cd00330327ff8504cd00330327ff8504c100330327ff85[_^M_][_$_]
+04c100330327ff8504c100330327ff8504c100330327ff8504c100330327[_^M_][_$_]
+ff660414002901baff850414002901baff850414002901baff8504140029[_^M_][_$_]
+01baff85043d003301f4ff85043d0033043d003301f4ff85043d003301f4[_^M_][_$_]
+ff8504580056045800560458ff8503640000036400000364000003640000[_^M_][_$_]
+0364000003640000036400000364000005f3000505900005051f001f04bc[_^M_][_$_]
+001f01f4ff8503640000051f001f04bc001f051f001f04bc001f0000fe46[_^M_][_$_]
+0000ff6e0000ff590000ffb70000fec308fc003208ad00320000ffb50000[_^M_][_$_]
+ffb60000ff410000ff920000fec30000ffbf0168003202cc00320000fea2[_^M_][_$_]
+0000ff5a04cd00320000ff580000ff580000ff920698000a04d7ff8508b8[_^M_][_$_]
+000a06c3ff85045c005203a000560458ff850323ff85034c008902b8001f[_^M_][_$_]
+02aa001d02aa001d02aa001d02aa001d02aa003f02aa003f02aa000402aa[_^M_][_$_]
+000402aa000402aa000402aa00ca02aa00e302aa001702aa001702aa001d[_^M_][_$_]
+02aa001d055600a4047300480556fffe0473004e055600a40473008b0556[_^M_][_$_]
+00a40473008b055600a40473008b05c700600400004805c700a404730048[_^M_][_$_]
+05c700a40473004805c700a40473004805c700a40473004805c700a40473[_^M_][_$_]
+0048055600a404730048055600a404730048055600a404730048055600a4[_^M_][_$_]
+04730048055600a40473004804e300a402390010063900600473004805c7[_^M_][_$_]
+00a40473008b05c700a40473008b05c700a40473008b05c7007104730053[_^M_][_$_]
+05c700a40473008b0239ffce01d3ff9b0239000701d3ffd3055600a40400[_^M_][_$_]
+008b055600a40400008b055600a40400008b047300a401d3008b047300a4[_^M_][_$_]
+01d3ffb1047300a401d3ffb1047300a401d3ffac06aa00a406aa008b06aa[_^M_][_$_]
+00a406aa008b06aa00a406aa008b05c700a40473008b05c700a40473008b[_^M_][_$_]
+05c700a40473008b05c700a40473008b0639006004730048063900600473[_^M_][_$_]
+004806390060047300480639006004730048055600a40473008b055600a4[_^M_][_$_]
+0473008b05c700a402aa008b05c700a402aa008b05c700a402aa006605c7[_^M_][_$_]
+00a402aa001d0556005c0400003f0556005c0400003f0556005c0400003f[_^M_][_$_]
+0556005c0400003f0556005c0400003f04e3002d0239002304e3002d0239[_^M_][_$_]
+002304e3002d0239ffed04e3002d0239001705c700a40473008705c700a4[_^M_][_$_]
+0473008705c700a40473008705c700a40473008705c700a4047300870556[_^M_][_$_]
+000c0400001b0556000c0400001b078d001905c7000a078d001905c7000a[_^M_][_$_]
+0556000a0400000e0556000a0400000e0556000a0400001b04e300250400[_^M_][_$_]
+002904e300250400002904e30025040000290473008b0239000d05c7000a[_^M_][_$_]
+0400001b0473004e0200008b049c0048049c0048049c0048049c0048049c[_^M_][_$_]
+0048049c0048049c0048049c00480556fffe0556fffe060a0000060a0000[_^M_][_$_]
+05e2000005e20000059c0000059c00000400004804000048040000480400[_^M_][_$_]
+0048040000480400004805eb000005eb0000073000000730000007300000[_^M_][_$_]
+073000000473008b0473008b0473008b0473008b0473008b0473008b0473[_^M_][_$_]
+008b0473008b065c0000065c000007a1000007a1000007a1000007a10000[_^M_][_$_]
+075900000759000001ec008b01ec008b01ecffdb01ecffdb01ec000301ec[_^M_][_$_]
+000301ecff9b01ecff9b02b6000002b6000003fb000003fb000003fb0000[_^M_][_$_]
+03fb000003b3000003b30000047300480473004804730048047300480473[_^M_][_$_]
+004804730048063900000639000007da000007da00000776000007760000[_^M_][_$_]
+047300870473008704730087047300870473008704730087047300870473[_^M_][_$_]
+0087064c00000778000007ca000007490000058500480585004805850048[_^M_][_$_]
+0585004805850048058500480585004805850048063900000639000007da[_^M_][_$_]
+000007da000007760000077600000736000007360000049c0048049c0048[_^M_][_$_]
+04000048040000480473008b0473008b01ecffeb01ec0078047300480473[_^M_][_$_]
+004804730087047300870585004805850048049c0048049c0048049c0048[_^M_][_$_]
+049c0048049c0048049c0048049c0048049c00480556fffe0556fffe060a[_^M_][_$_]
+0000060a000005e2000005e20000059c0000059c00000473008b0473008b[_^M_][_$_]
+0473008b0473008b0473008b0473008b0473008b0473008b065c0000065c[_^M_][_$_]
+000007a1000007a1000007a1000007a10000075900000759000005850048[_^M_][_$_]
+058500480585004805850048058500480585004805850048058500480639[_^M_][_$_]
+00000639000007da000007da000007760000077600000736000007360000[_^M_][_$_]
+049c0048049c0048049c0048049c0048049c0048049c0048049c00480556[_^M_][_$_]
+fffe0556fffe0556fffe0556fffe0556fffe02aa010302aa00f902aa0103[_^M_][_$_]
+02aa000602aa00060473008b0473008b0473008b0473008b0473008b065e[_^M_][_$_]
+0000064d000006cf000006be000005c700a402aa004602aa006e02aa0006[_^M_][_$_]
+01ecffc201ecffb201ecff7e01ecff7e01ecff9b01ecff9b0239fff60239[_^M_][_$_]
+ffe6032900000318000002aa004602aa006e02aa00060473008704730087[_^M_][_$_]
+04730087047300870491008b0491008b04730087047300870556000a0556[_^M_][_$_]
+000a06a6000006e7000005eb0000034800370348003702aa005605850048[_^M_][_$_]
+058500480585004805850048058500480708000006930000070800000693[_^M_][_$_]
+00000639006602aa00e302aa01030000fec30000fec80000fdf40000fed8[_^M_][_$_]
+0000ffa40000feea0000ff4c0000fe9e0000fec30000ffbf0000ff3d0000[_^M_][_$_]
+fe9e0000fed80000fed80000ffae0000ffae0000ffae000000640000ff47[_^M_][_$_]
+0000ff480000ff440000ff440000fe87000000000000ffa60000ff440000[_^M_][_$_]
+ff440000ff440000fec80000ff2d000000000000feeb0000ff4c0000ffae[_^M_][_$_]
+0000ff350000ff240000ffbf0000fe870000febb0000fec30000fec30000[_^M_][_$_]
+fed80000fed80000feb10000fec80000fdbf0000fdf40000feb10000fec8[_^M_][_$_]
+0000fdbf0000fe870000fee30000ffa60000fe870000ff440000feba0000[_^M_][_$_]
+ff230000ff9a0000fdf40000feb10000ffae0000fe940000ffa40000fe87[_^M_][_$_]
+0000fdf40000ff3d0000ff440000feb10000feb10000feb10000ff030000[_^M_][_$_]
+ff440000ff530000ff530000ff53045cffee04c30016045c000c04c30035[_^M_][_$_]
+045c000c04c30035045c000c04c30035045c000c04c30035045c000c04c3[_^M_][_$_]
+0035045c000c04c30035045800790458003c0473000a05fd0000053d00a4[_^M_][_$_]
+0473008b053d000d0473000305c7006905c700600400004805c70002066e[_^M_][_$_]
+0000053d005104730048047300480556006d0514006a04e3ffd106390060[_^M_][_$_]
+0556000c0724008b01d3008b02390014055600a40400008b01d300140400[_^M_][_$_]
+001b06aa008505c7ffd10473008b06390060070e006005a0004805fd0000[_^M_][_$_]
+0473008b055600a40556006a0400005004e50060035600000239002304f7[_^M_][_$_]
+00140239002304e3002d0625007105c700a4062c000a0400001b04e30025[_^M_][_$_]
+04000029046c001f046c006003c6004803c600330473003f0473002f03a9[_^M_][_$_]
+0020044e0023046c008b021400bc0214002605d200c1023900b60a5b00a4[_^M_][_$_]
+097800a4084c0048086000a4064a00a40363008b097800a4073e00a40607[_^M_][_$_]
+008b0556fffe0473004e0239ffdf01d3ffa9063900600473004805c700a4[_^M_][_$_]
+0473008705c700a40473008705c700a40473008705c700a40473008705c7[_^M_][_$_]
+00a404730087047300480556fffe0473004e0556fffe0473004e08000000[_^M_][_$_]
+071d004e06390060047300480639006004730048055600a40400008b0639[_^M_][_$_]
+0060047300480639006004730048046c001f03c6002b01d3ffac0a5b00a4[_^M_][_$_]
+097800a4084c00480639006004730048085b00a4046c008b05c700a40473[_^M_][_$_]
+008b0556fffe0473004e0556fffe0473004e055600a404730048055600a4[_^M_][_$_]
+047300480239ff6601d3ff3e0239fffa01d3ffc806390060047300480639[_^M_][_$_]
+00600473004805c700a402aa000605c700a402aa007c05c700a40473006a[_^M_][_$_]
+05c700a404730087040200420374002305c700a40473008b057900a404a8[_^M_][_$_]
+00420446003904e30025040000290556fffe0473004e0639006004730048[_^M_][_$_]
+0639006004730048063900600473004806390060047300480556000a0400[_^M_][_$_]
+001b02aa001d02aa001d02aa001702aa003f02aa00040473008c049c0048[_^M_][_$_]
+049c00480473008b0400001b0400000004730048047300480473004805db[_^M_][_$_]
+004804000048040000230552002304460048026200100473004804730048[_^M_][_$_]
+04ae004b0400001b04e0001d047300870473008b0473008b01d3000001ec[_^M_][_$_]
+008b01d3008b029e0000024e000001d3008b0486008b06aa008506aa0085[_^M_][_$_]
+06aa008b0473ffb80473008b0455008b0473004805c50048058500480473[_^M_][_$_]
+004802aafff802aafff802aafff802aa008b02aa008b0239008b0239fff8[_^M_][_$_]
+0447008b0447008b0400003f0231ffb2026200100231ffcf039900000239[_^M_][_$_]
+0012023900230473000004c50048043b00870400001b05c7000a0400001b[_^M_][_$_]
+03ce000004000029046e002903c6002b03c6002c0400001b040000480400[_^M_][_$_]
+001b0400004806390060043f008b0446004804ae004b0473008b02ff000a[_^M_][_$_]
+040000080364008b047300480400001b04000048078e00480718004807fc[_^M_][_$_]
+004805b6002303930023060c0023061900100568008b04f0008b03e2001e[_^M_][_$_]
+048200880481008b0473008705cd000a0767fffd05cd000a047300480585[_^M_][_$_]
+004804970014063900600473004805c700600400004804e300a403fc008b[_^M_][_$_]
+04ff0000043c0032060d000a049d000006aa008506aa0085057900770473[_^M_][_$_]
+0087057900a4044e000a0556006a0556006a04e0000504e0000505e50060[_^M_][_$_]
+0476004803c70014034f0028049700140496005e0400004801d3ffb80639[_^M_][_$_]
+006003b6004803b6001b095f006005e8001b0600000a04c0000a079800a4[_^M_][_$_]
+05c2008b054a000d03fe001b06f800a4057a008b0735000805aa000508f7[_^M_][_$_]
+00a4076c008b0514006d0400004a0679005e058500870639006004730048[_^M_][_$_]
+0604000c04a4001b0604000c04a4001b0ab3006008d300480711005f0568[_^M_][_$_]
+0048095f006008800048095f006005e8001b05c700600400004803f80014[_^M_][_$_]
+02aafffa02aa000002aa000002aa000007bd000a07bd002a05c700a40479[_^M_][_$_]
+008b053d000f042f0008055600a40473008b048900a40426008b0514005a[_^M_][_$_]
+040000230556001804000008069d000a04d1000a071200a40543008b0847[_^M_][_$_]
+00a406c6008b05c700600400004805c700600400004804e3002d03aa0025[_^M_][_$_]
+0744000a0563000a057900770444005e070b000a053b000a070b000a053b[_^M_][_$_]
+000a023900bc0735000605aa0004055600a40400008b05a4000a0491000a[_^M_][_$_]
+05c700a40473008b05c700a40473008b057900770444005e06aa00a405b6[_^M_][_$_]
+008b0556fffe0473004e0556fffe0473004e08000000071d004e055600a4[_^M_][_$_]
+0473004806390060047300480735000605aa00040514005a040000230443[_^M_][_$_]
+001f03c6002b05c700a40479008b05c700a40479008b0639006004730048[_^M_][_$_]
+063900600473004805bc005e0400001b051f00080400001b051f00080400[_^M_][_$_]
+001b051f00080400001b057900770444005e071000a405bc008b053d0051[_^M_][_$_]
+0473004807d100510724004807e2006d06f0004a0582006d0468004a0838[_^M_][_$_]
+000a073e000a085b00a4071f008b0639006004ae004b0609002d056b0025[_^M_][_$_]
+02aa001d02aa001702aa003f02aa001d02aa000402aaff8c04c1003304c1[_^M_][_$_]
+0033028f004c0000fed802fe000004cd0037045cffc904c3fff100000000[_^M_][_$_]
+000000280000002800000028000000380000009800000102000002a20000[_^M_][_$_]
+0412000005600000070e0000076a000007da0000084c000008f000000976[_^M_][_$_]
+000009ea00000a3600000a7200000ae400000b9400000bfe00000cc40000[_^M_][_$_]
+0dda00000e8000000f7400001064000010fe0000123a0000132e0000137c[_^M_][_$_]
+00001402000014b000001520000015d0000016b8000018e400001a1a0000[_^M_][_$_]
+1b4600001c6a00001d2600001db800001e3400001f8600002024000020a0[_^M_][_$_]
+0000215400002280000022da0000243a000024d8000025fe000026c80000[_^M_][_$_]
+28cc00002a1e00002bd200002c4200002ce200002dce00003086000031b8[_^M_][_$_]
+000032c60000335e000033bc0000342e00003484000035400000356a0000[_^M_][_$_]
+35c40000374c0000385e0000394c00003a4e00003b8a00003c5e00003de8[_^M_][_$_]
+00003e9200003ee800003fb2000040d00000411000004228000042da0000[_^M_][_$_]
+43ce000044ea0000460400004682000047e8000048ae0000496800004a68[_^M_][_$_]
+00004c5400004e0200004f7200005016000050fa0000515a000052380000[_^M_][_$_]
+52ec0000534c00005388000054f2000055320000558c000055da0000562c[_^M_][_$_]
+0000565a0000568a000056bc000056f60000572e000057660000589a0000[_^M_][_$_]
+58c8000058f4000059220000596c000059e400005a5000005a9400005b0a[_^M_][_$_]
+00005b2e00005b5a00005b8600005bb400005c0600005c3800005c660000[_^M_][_$_]
+5c9200005cb600005d0800005da200005e380000600e000061620000631a[_^M_][_$_]
+000063a40000642e000065680000670a0000689c000069f400006a500000[_^M_][_$_]
+6a9800006b7400006c6200006df200006eec00006f7c0000704600007112[_^M_][_$_]
+000072820000732c00007416000074c2000075120000757c000076060000[_^M_][_$_]
+7712000077ba000078a400007a6a00007b8a00007c9400007d0600007d84[_^M_][_$_]
+00007e1000007f0000007fda000080ce00008148000081c6000082500000[_^M_][_$_]
+8296000082f40000834e0000846c000085f20000864a000086aa00008770[_^M_][_$_]
+0000883a000088a200008918000089a400008a3e00008a7a00008ac60000[_^M_][_$_]
+8b3a00008c8200008cfe00008d7e00008e7e00008f6a000090300000907a[_^M_][_$_]
+000090f0000091ac00009390000093e00000942600009466000094b80000[_^M_][_$_]
+94fa0000953600009576000096180000965c000096a2000097080000974e[_^M_][_$_]
+00009796000097f00000983200009868000098d00000994c000099740000[_^M_][_$_]
+99fa00009a4a00009ad000009b4600009be800009c5800009ce600009dce[_^M_][_$_]
+00009e9e00009ee400009f1200009f5600009f7a00009ff80000a0e20000[_^M_][_$_]
+a21e0000a25e0000a28c0000a3700000a4840000a4d80000a5ca0000a62e[_^M_][_$_]
+0000a6fc0000a7dc0000a8700000a9080000a9a80000aa420000aa8a0000[_^M_][_$_]
+aab40000aaf00000aca60000ae180000ae5e0000ae8c0000aed40000aefe[_^M_][_$_]
+0000b0380000b0760000b0860000b0c60000b0f20000b2840000b4400000[_^M_][_$_]
+b4860000b4ca0000b4da0000b5c40000b7660000b7aa0000b7d40000b818[_^M_][_$_]
+0000b86c0000b91e0000b9ba0000b9d20000b9ea0000ba2c0000ba540000[_^M_][_$_]
+ba9e0000bace0000bb180000bb460000bb8a0000bbb80000bbfe0000bc3a[_^M_][_$_]
+0000bc7a0000bca20000bd7e0000bebc0000bf000000c01c0000c05a0000[_^M_][_$_]
+c0980000c0f00000c1240000c1680000c1940000c1ca0000c1ee0000c244[_^M_][_$_]
+0000c35c0000c4820000c5ce0000c6ec0000c7ee0000c8be0000c9640000[_^M_][_$_]
+ca740000caba0000cb060000cb860000cd5a0000cd8c0000cdb40000cdee[_^M_][_$_]
+0000ce200000ce820000cff40000d0ee0000d1440000d1780000d1c60000[_^M_][_$_]
+d2180000d2d00000d43e0000d47a0000d4be0000d4e20000d5180000d53c[_^M_][_$_]
+0000d6080000d7760000d7b80000d7dc0000d8a00000d8d20000d91e0000[_^M_][_$_]
+d94a0000d98c0000d9b00000db580000dd080000dd4c0000dd900000de72[_^M_][_$_]
+0000df6a0000dfe80000e0240000e0c20000e1080000e1860000e1c20000[_^M_][_$_]
+e2800000e32e0000e37c0000e44e0000e5e00000e7740000e8860000e95a[_^M_][_$_]
+0000ea2e0000ea5c0000ea8c0000eb660000ec4c0000ec920000eccc0000[_^M_][_$_]
+ed0c0000ed300000ed580000ee460000ee8c0000eeb40000ef500000f03e[_^M_][_$_]
+0000f07e0000f0a20000f0f20000f1280000f1680000f18c0000f28c0000[_^M_][_$_]
+f3bc0000f4000000f4240000f4680000f48c0000f4e80000f6b60000f8b8[_^M_][_$_]
+0000f8fa0000f9220000f9680000f9940000f9de0000fa200000fa440000[_^M_][_$_]
+fa7a0000faa20000fae60000fb160000fb560000fb7a0000fbe00000fc1e[_^M_][_$_]
+0000fd800000fe460000fefe0000ffb800010072000101240001018c0001[_^M_][_$_]
+02000001023a000102e000010336000103ba0001042c000104b600010512[_^M_][_$_]
+00010562000105ae00010624000107560001087c00010942000109d80001[_^M_][_$_]
+0a7200010b1000010b8e00010cc000010d8200010ed400010f6e00010ffc[_^M_][_$_]
+000110fe00011184000112520001131400011396000114a8000115dc0001[_^M_][_$_]
+16ae000117b2000118900001190a0001193600011976000119a6000119fe[_^M_][_$_]
+00011a4a00011b5400011c7800011d9200011e5a00011f3e00011fc40001[_^M_][_$_]
+20ec0001224c0001231c0001241c00012568000125780001264c0001272e[_^M_][_$_]
+000127be0001294600012a3600012b2200012b8c00012bd800012c060001[_^M_][_$_]
+2c4000012c9600012cf200012e1600012e5a00012f86000130f00001317c[_^M_][_$_]
+0001324000013250000133440001343a0001353000013590000135ea0001[_^M_][_$_]
+3688000137c200013882000139b400013a1600013ae200013b8600013ce6[_^M_][_$_]
+00013e1a00013ede00013f1c000140420001410c000142680001430c0001[_^M_][_$_]
+44040001448e0001456000014660000146d20001485c0001496c00014aa6[_^M_][_$_]
+00014b5400014c0a00014cc400014da800014e9600014f2600014fec0001[_^M_][_$_]
+513c0001528a000153ac0001552c0001562800015700000157740001584e[_^M_][_$_]
+0001598c00015b1400015c1c00015cda00015d2200015e2a00015eee0001[_^M_][_$_]
+600e000160b00001619c0001621e0001633e000164060001648600016658[_^M_][_$_]
+000167d20001693e000169e200016a9c00016b5600016c4400016d020001[_^M_][_$_]
+6d6400016dfa00016f2e0001702600017120000171740001728a000172b0[_^M_][_$_]
+000173c6000173d6000173e60001748000017490000175b8000176900001[_^M_][_$_]
+776a0001778e000177cc00017846000178d40001794a0001798000017abc[_^M_][_$_]
+00017b1200017baa00017c7400017cf800017de400017e2400017e480001[_^M_][_$_]
+7e6c00017fce00018070000181f6000182ec000183e600018450000184f6[_^M_][_$_]
+000185f20001864a000186b00001871c0001882600018890000188e20001[_^M_][_$_]
+892a0001897c000189d600018a4800018aae00018b1200018c7600018d0a[_^M_][_$_]
+00018dd000018e3a00018ee600018f6600018fda00019078000191760001[_^M_][_$_]
+91fc0001929000019320000193fe000194a8000195940001962a000196ae[_^M_][_$_]
+00019780000198440001990e000199ee00019af200019c3600019d4c0001[_^M_][_$_]
+9dc600019ec600019f7a00019fcc0001a0280001a0920001a0ce0001a132[_^M_][_$_]
+0001a2100001a2340001a2660001a2a40001a2ca0001a3060001a3dc0001[_^M_][_$_]
+a4000001a4220001a4680001a4ac0001a4d00001a4f40001a5400001a568[_^M_][_$_]
+0001a58e0001a5ba0001a5de0001a6020001a6340001a6580001a6840001[_^M_][_$_]
+a6ac0001a6d40001a6fc0001a7200001a7460001a76a0001a7c20001a810[_^M_][_$_]
+0001a8460001a87e0001a8a60001a8dc0001a9000001a9240001a94c0001[_^M_][_$_]
+a9740001a99c0001aaa00001aad00001ab800001abe00001ac420001acac[_^M_][_$_]
+0001ae020001af3c0001b0240001b10e0001b17a0001b1a20001b1fc0001[_^M_][_$_]
+b2580001b2e40001b3720001b44a0001b5160001b5a40001b6320001b700[_^M_][_$_]
+0001b7c20001b84e0001b91a0001b9c40001ba700001bb660001bc420001[_^M_][_$_]
+bd100001bd340001bd5c0001bd840001bdb20001be020001be3e0001be8e[_^M_][_$_]
+0001bec20001bf160001bf4c0001bf820001bfb60001c0140001c05a0001[_^M_][_$_]
+c0800001c0ae0001c0d40001c1020001c1280001c1560001c17c0001c1aa[_^M_][_$_]
+0001c1e00001c2200001c2440001c2680001c28c0001c2b00001c2f00001[_^M_][_$_]
+c3140001c3620001c39a0001c3e80001c41c0001c46e0001c4a20001c4e4[_^M_][_$_]
+0001c5140001c5700001c5ae0001c5e40001c61e0001c6400001c6620001[_^M_][_$_]
+c6860001c6aa0001c6d20001c6fa0001c7680001c7a00001c81e0001c84e[_^M_][_$_]
+0001c8c40001c8f00001c9180001c93e0001c9ba0001c9f80001ca3e0001[_^M_][_$_]
+ca6a0001caa60001cada0001cb020001cb320001cb6e0001cb940001cbb8[_^M_][_$_]
+0001cbdc0001cc000001cc240001cc4c0001cc700001ccae0001ccdc0001[_^M_][_$_]
+cd140001cd400001cd680001cd940001cdce0001cdfc0001ce200001ce44[_^M_][_$_]
+0001ce680001ce8c0001cec00001ceee0001cf240001cf4e0001d0800001[_^M_][_$_]
+d0ec0001d17e0001d2060001d2680001d2940001d2cc0001d3080001d33a[_^M_][_$_]
+0001d3700001d4440001d5640001d5a00001d5d60001d6ca0001d7180001[_^M_][_$_]
+d81c0001d8ee0001d99e0001da5c0001db380001dcb80001dd660001de14[_^M_][_$_]
+0001df000001dfd20001e0a60001e0f80001e1c60001e2b20001e40c0001[_^M_][_$_]
+e44e0001e4a20001e4ee0001e5240001e56e0001e6080001e6460001e696[_^M_][_$_]
+0001e7c60001e8320001e9120001e9440001ea800001eba80001ec560001[_^M_][_$_]
+ec820001ee520001eea20001efe00001f0780001f0dc0001f20e0001f2fe[_^M_][_$_]
+0001f3f00001f5a20001f6ae0001f7020001f75c0001f7b60001f7e80001[_^M_][_$_]
+f8820001f8cc0001f9a00001fad00001fb960001fbf40001fc900001fcca[_^M_][_$_]
+0001fd380001fd720001fdce0001fdfa0001fe4a0001fe820001febc0001[_^M_][_$_]
+feea0001ffe40002001c000200c60002010a00020190000201da000202fc[_^M_][_$_]
+0002034c00020496000204e2000205bc000205fc000207300002076c0002[_^M_][_$_]
+07ac000208b2000209cc00020af600020ba800020c8000020d5200020e32[_^M_][_$_]
+00020ee00002103a0002109a0002112600021250000212e0000213400002[_^M_][_$_]
+14160002147800021540000215e80002164c000216aa0002175c000217ee[_^M_][_$_]
+0002181a00021868000218d40002193400021a1800021b1e00021b940002[_^M_][_$_]
+1d5a00021dce00021e6400021f6a00022052000220940002219e00022328[_^M_][_$_]
+0002239400022476000224ba000225c400022734000227a0000228880002[_^M_][_$_]
+2a4200022b1600022bba00022d1a00022d5e00022e5200022f8c0002302c[_^M_][_$_]
+0002310c000231ec00023352000234ec00023640000237b8000239980002[_^M_][_$_]
+3a8000023bae00023d4400023f200002413200024338000245a6000247b2[_^M_][_$_]
+00024a0400024d2e00024f160002515a0002534a000254da0002566a0002[_^M_][_$_]
+57c00002590200025a2000025b9e00025ca400025dae00025ec600025fe2[_^M_][_$_]
+0002612000026262000263ac00026504000266340002676a000268ae0002[_^M_][_$_]
+6a3800026b8600026c8200026e600002704a0002722e000273bc000275aa[_^M_][_$_]
+00027716000278f000027a2600027bae00027c6e00027cec00027dfc0002[_^M_][_$_]
+7e6a00027efa00028006000280f2000281a400028288000282e60002834e[_^M_][_$_]
+000284680002853a0002868a000287ee0002896200028a6e00028aee0002[_^M_][_$_]
+8c4200028d9800028dd800028ed400029016000290ae0002919000029230[_^M_][_$_]
+000293460002947600029514000296760002982c000299c000029b3c0002[_^M_][_$_]
+9d2800029e980002a07a0002a23a0002a3c60002a52c0002a69a0002a75c[_^M_][_$_]
+0002a86a0002a8ca0002a8da0002a9d40002aab80002ac2c0002adec0002[_^M_][_$_]
+af440002af9c0002b0ec0002b0fc0002b2900002b4020002b4120002b422[_^M_][_$_]
+0002b44e0002b4900002b4e80002b4f80002b5080002b5180002b5280002[_^M_][_$_]
+b63c0002b6f00002b7ec0002b7fc0002b80c0002b81c0002b8400002b862[_^M_][_$_]
+0002b8a40002b8d00002b9100002b9340002b9440002b9540002b9640002[_^M_][_$_]
+b9740002b9840002ba1a0002bac60002bbe60002bd220002be1c0002bede[_^M_][_$_]
+0002c00e0002c1060002c1a40002c2480002c2580002c3060002c3dc0002[_^M_][_$_]
+c4b80002c5a00002c6820002c77a0002c87a0002c93a0002c94a0002ca48[_^M_][_$_]
+0002cb340002cc1c0002ccf20002d0fe0002d1440002d18e0002d1be0002[_^M_][_$_]
+d1f60002d2260002d26c0002d31c0002d34e0002d3a60002d3e60002d42c[_^M_][_$_]
+0002d4d40002d5760002d62a0002d78a0002d7d20002d8160002d8da0002[_^M_][_$_]
+d9640002d9980002d9ce0002d9fa0002daae0002db560002dca60002dcf4[_^M_][_$_]
+0002dd4a0002df5c0002e0b20002e2a40002e3840002e3ae0002e4b00002[_^M_][_$_]
+e5760002e6a20002e7b40002e9940002eaca0002ec2c0002edd20002edfa[_^M_][_$_]
+0002f0340002f1340002f27a0002f4ac0002f5900002f6780002f6f40002[_^M_][_$_]
+f7600002f80a0002f8700002f9400002f99c0002f9ae0002f9c00002fa38[_^M_][_$_]
+0002fab00002fb380002fbc00002fbf40002fc280002fc700002fd7a0002[_^M_][_$_]
+fdac0002fe040002fe3c0002fe820002feaa0002fee00002ff120002ff44[_^M_][_$_]
+0002ffa200030008000300420003007e000300c6000301120003014e0003[_^M_][_$_]
+018c000301d000030214000302560003028e000302c6000303080003033c[_^M_][_$_]
+00030390000303c200030402000304480003047a000304be000305020003[_^M_][_$_]
+05480003059000030794000307d400030810000308400003089e000308e2[_^M_][_$_]
+0003091800030966000309b400030a0600030a5800030aae00030ae20003[_^M_][_$_]
+0bca00030c2a00030c7e00030cda00030d3600030d9800030ddc00030e16[_^M_][_$_]
+00030e9200030f1000030f4c00030f8800030fe0000310380003107a0003[_^M_][_$_]
+10ca0003111e00031160000311b8000312a6000312d80003130800031338[_^M_][_$_]
+00031392000313e60003144c00031484000314ba000314f0000315440003[_^M_][_$_]
+1592000315e800031632000316820003178e00031884000318ec00031954[_^M_][_$_]
+00031984000319be000319fa00031a4400031a7a00031ab000031b1a0003[_^M_][_$_]
+1b8400031bbc00031bfc00031c2200031c4800031c7a00031cb000031d0c[_^M_][_$_]
+00031d9e00031dfe00031e5e00031eb000031f020003200c000320e20003[_^M_][_$_]
+21d800032210000322400003228a000322b0000322f40003235200032394[_^M_][_$_]
+000323d00003240a000324400003247c000324be000325ae000325e20003[_^M_][_$_]
+26240003265a0003268e000326d800032728000328c200032a1800032a58[_^M_][_$_]
+00032a9000032adc00032b1800032b5200032d6200032db000032fd60003[_^M_][_$_]
+3126000331bc000332b80003330a0003343000033676000339520003398a[_^M_][_$_]
+000339b600033a3400033ac200033aee00033b5800033c2800033cf60003[_^M_][_$_]
+3d0800033dac00033fbe00033fec0003405000034094000341000003417a[_^M_][_$_]
+000341da00034240000342a00003431600034384000343e80003450a0003[_^M_][_$_]
+45f8000346a000034712000347b000034820000348d60003496800034a50[_^M_][_$_]
+00034af200034bbe00034c6800034d1800034d9a00034e5200034ef00003[_^M_][_$_]
+4f860003500c00035110000352c800035310000353680003539e000353ce[_^M_][_$_]
+000353f2000354160003545400035492000354d8000355060003553c0003[_^M_][_$_]
+557200035598000355c0000355fc00035638000356600003568c000356c8[_^M_][_$_]
+00035708000357300003575800035780000357a8000357e4000358200003[_^M_][_$_]
+58560003588c000358c4000358e80003591e0003595200035990000359b6[_^M_][_$_]
+000359ec00035a1c00035a4200035a6800035aa200035adc00035bc80003[_^M_][_$_]
+5ccc00035d0400035d3c00035d7200035da800035dd000035df800035e52[_^M_][_$_]
+00035e9400035ebc00035ee400035f2200035f6e00035f9400035fb80003[_^M_][_$_]
+60000003604600036082000360c0000360fc000361380003617c000361a2[_^M_][_$_]
+000361d8000362060003622c0003625200036288000362b6000362dc0003[_^M_][_$_]
+63020003633e0003637a000363b6000363f20003641a000364420003646c[_^M_][_$_]
+00036496000364be000364e60003650e0003653600036578000365a40003[_^M_][_$_]
+65dc0003660a000366420003667000036698000366c60003671200036750[_^M_][_$_]
+00036796000367dc0003681200036840000368660003688c000368bc0003[_^M_][_$_]
+68e40003690c000369340003697c000369ba000369f000036a3800036a5e[_^M_][_$_]
+00036a8200036abe00036b0000036b3c00036b7a00036baa00036bda0003[_^M_][_$_]
+6c1000036c4600036c8200036cbe00036ce600036d0e00036d3800036d62[_^M_][_$_]
+00036da200036dc800036dee00036e1400036e4200036e6800036e8e0003[_^M_][_$_]
+6eb400036ee200036f0800036f3a00036f6200036f9000036fb400036fea[_^M_][_$_]
+0003700e000370340003705800037094000370d00003710c000371540003[_^M_][_$_]
+717c000371a40003734200037376000373ae000373e80003741a0003744c[_^M_][_$_]
+00037484000374bc000375040003754e00037596000375de000376360003[_^M_][_$_]
+768e000376e200037738000377a8000378180003784600037874000378a6[_^M_][_$_]
+000378d80003790e0003794000037996000379ee00037a5000037ab20003[_^M_][_$_]
+7b0a00037b6000037b8e00037bbc00037bee00037c2000037c5800037c90[_^M_][_$_]
+00037cce00037d0c00037d6000037db600037e1600037e7600037ed20003[_^M_][_$_]
+7f2c00037f9000037ff80003802c0003806000038094000380c8000380fe[_^M_][_$_]
+0003813400038174000381b40003820400038256000382b6000383160003[_^M_][_$_]
+8374000383d40003842c00038488000384b6000384e40003851600038548[_^M_][_$_]
+00038580000385b8000386020003864e000386a6000386fe000387500003[_^M_][_$_]
+87a4000387d2000388040003883600038868000388a6000388e400038922[_^M_][_$_]
+00038960000389ba00038a1a00038a8200038ae600038b1400038b420003[_^M_][_$_]
+8b7400038ba600038bde00038c1600038c5000038c8a00038cd400038d1e[_^M_][_$_]
+00038d8000038de200038e3a00038e9400038f0200038f7000038fa40003[_^M_][_$_]
+8fda0003900a0003903e00039072000390a4000390e40003911800039148[_^M_][_$_]
+00039176000391a6000391dc0003920a0003923a0003928c000392e00003[_^M_][_$_]
+932c00039378000393cc0003942000039484000394ea000395440003959e[_^M_][_$_]
+000396060003966e000396d20003973c000397b40003982c000398680003[_^M_][_$_]
+98a4000398e4000399240003996a000399b0000399fe00039a4c00039ab2[_^M_][_$_]
+00039b1a00039b8600039bf200039c5c00039cc400039d3c00039db40003[_^M_][_$_]
+9df200039e3000039e7200039eb400039efe00039f4800039f9400039fe0[_^M_][_$_]
+0003a0440003a0a80003a11e0003a1940003a1fa0003a2620003a2e00003[_^M_][_$_]
+a35e0003a3900003a3ba0003a40a0003a43a0003a48a0003a4b80003a500[_^M_][_$_]
+0003a5440003a57a0003a5d80003a62c0003a6500003a6ac0003a7120003[_^M_][_$_]
+a76e0003a7ea0003a8940003a8d80003a8fc0003a93c0003a96a0003a9a6[_^M_][_$_]
+0003a9fa0003aa500003aaa60003ab040003ab2a0003abdc0003ac9c0003[_^M_][_$_]
+ad7c0003adac0003add80003ae160003ae540003ae840003aec00003af08[_^M_][_$_]
+0003af3e0003af960003aff80003b0aa0003b1760003b2560003b2840003[_^M_][_$_]
+b2aa0003b2e00003b3160003b3440003b3720003b3a00003b3de0003b422[_^M_][_$_]
+0003b4580003b4c40003b5240003b57e0003b5fe0003b6860003b6da0003[_^M_][_$_]
+b7180003b73e0003b7800003b7ae0003b7ec0003b83e0003b8920003b8ea[_^M_][_$_]
+0003b93e0003b9700003b9c60003ba220003bab40003bade0003bb080003[_^M_][_$_]
+bb700003bb980003bbd60003bc3e0003bccc0003bd600003bd860003bdc2[_^M_][_$_]
+0003be4a0003becc0003bf3a0003bfc00003c04c0003c0d80003c1640003[_^M_][_$_]
+c1b00003c1fe0003c2340003c2680003c29a0003c3060003c3b20003c3e8[_^M_][_$_]
+0003c41e0003c4640003c48e0003c4ea0003c5460003c5840003c5f00003[_^M_][_$_]
+c67a0003c6f00003c7540003c77a0003c7b40003c82c0003c8be0003c950[_^M_][_$_]
+0003c9b80003ca260003caa80003cad20003cb000003cb480003cbcc0003[_^M_][_$_]
+cbf60003cc200003cc7c0003ccbe0003cd680003cda20003cdf20003ce72[_^M_][_$_]
+0003cee40003cf580003cf980003d01c0003d0a80003d12e0003d1940003[_^M_][_$_]
+d1ce0003d2160003d2520003d2800003d3140003d3960003d43c0003d48a[_^M_][_$_]
+0003d4da0003d5500003d5bc0003d5fc0003d62e0003d6600003d6980003[_^M_][_$_]
+d6d00003d6fc0003d7280003d7540003d7800003d7ac0003d7d80003d80c[_^M_][_$_]
+0003d8400003d8780003d8b00003d9740003d9c80003daac0003dba60003[_^M_][_$_]
+dbb60003dc7a0003dd180003dde60003debc0003dfd00003e0b20003e0c2[_^M_][_$_]
+0003e1640003e1fc0003e2ba0003e3a00003e3fe0003e4fa0003e5720003[_^M_][_$_]
+e6a00003e79c0003e8580003e8680003e8bc0003e9a00003ea6e0003eac8[_^M_][_$_]
+0003ebd20003ec7a0003ed280003ed380003ed480003ee140003eeca0003[_^M_][_$_]
+ef960003f06a0003f13c0003f2940003f3980003f3a80003f4440003f4fa[_^M_][_$_]
+0003f5620003f6120003f6780003f7740003f8240003f8d60003f9980003[_^M_][_$_]
+fa4e0003fb200003fc220003fd260003fe060003ff380004002c00040112[_^M_][_$_]
+000401d4000402ce0004037200040382000403aa00040428000404380004[_^M_][_$_]
+0476000404b4000404f2000405200004054c000405780004059e000405ca[_^M_][_$_]
+000405f6000406240004065200040680000406ac000406da000407080004[_^M_][_$_]
+0736000407640004079a000407d0000408060004083c00040872000408a8[_^M_][_$_]
+000408de00040914000409240004095a00040990000409c2000409f40004[_^M_][_$_]
+0a2200040a5000040b7400040c9600040cc400040cf200040d2000040d4e[_^M_][_$_]
+00040e8600040f7600040fa400040fd2000410000004102e000410c20004[_^M_][_$_]
+10e80004110e0004113400041162000411900004123e000412d800041306[_^M_][_$_]
+000413340004136600041398000413c6000413f400041426000414580004[_^M_][_$_]
+1486000414b4000414e6000415180004154600041574000415a6000415d8[_^M_][_$_]
+00041606000416340004166600041698000416c6000416f4000417260004[_^M_][_$_]
+175800041786000417b4000418aa00041990000419be000419ec00041a66[_^M_][_$_]
+00041b9400041cce00041d5800041df000041e1e00041e4c00041e820004[_^M_][_$_]
+1eb800041eea00041f1c00041f4a00041f7800041faa00041fdc0004200a[_^M_][_$_]
+0004203800042090000420ce00042168000421c80004223a000423080004[_^M_][_$_]
+231800042420000424e8000425bc000426ec000427c20004289000042962[_^M_][_$_]
+00042ad200042ae200042af200042c4e00042d2600042d9200042ea60004[_^M_][_$_]
+2eb600042f7c00043086000431f000043260000432e80004339a0004340a[_^M_][_$_]
+0004341a0004342a000434cc00043562000435b6000436ba000437600004[_^M_][_$_]
+3808000438da0004397e00043a2000043aae00043abe00043bcc00043cca[_^M_][_$_]
+00043d9400043df000043e4c00043ecc00043f2e00043fb20004400a0004[_^M_][_$_]
+40640004411c000441d80004435400044364000444060004449a000445b6[_^M_][_$_]
+0004462e000446a4000447520004483c000448d00004493c00044a1c0004[_^M_][_$_]
+4acc00044b5400044bec00044cd600044dd400044f660004500c000450b8[_^M_][_$_]
+0004516200045210000453180004532800045406000454fe0004550e0004[_^M_][_$_]
+55a000045642000456800004575000045810000458ca000459bc00045b28[_^M_][_$_]
+00045c8e00045dbc00045e92000460060004610c00046220000462920004[_^M_][_$_]
+641c000464860004656c0004666000046706000467380004676a0004677a[_^M_][_$_]
+000468500004698400046a8400046b5c00046c6400046d4e00046dae0004[_^M_][_$_]
+6e0a00046f1800046f94000470ba000471ce0004729200047356000473f4[_^M_][_$_]
+00047482000475180004767a0004768a000477d6000478e600047a2a0004[_^M_][_$_]
+7b2000047bee00047c9e00047d1e00047e1000047efc00047f0c00047f1c[_^M_][_$_]
+00047f2c00047fb2000480420004819e000482f2000483a20004843c0004[_^M_][_$_]
+85560004865400048712000487e40004890600048a3e00048b1400048c12[_^M_][_$_]
+00048d2c00048e7800049016000491a2000492540004930a0004944c0004[_^M_][_$_]
+957800049610000496b6000496e80004971a000498e200049a8c00049bb8[_^M_][_$_]
+00049cdc00049e660004a0120004a0400004a06e0004a12e0004a1ca0004[_^M_][_$_]
+a2cc0004a32c0004a39e0004a3da0004a4160004a5e00004a7f00004a8c8[_^M_][_$_]
+0004a9aa0004aa5c0004aae80004abec0004acfe0004adca0004ae920004[_^M_][_$_]
+afd20004b1000004b1c20004b2820004b32a0004b3dc0004b4440004b4ac[_^M_][_$_]
+0004b5880004b65c0004b79c0004b8cc0004b9ee0004bae40004bb3c0004[_^M_][_$_]
+bb960004bc020004bc720004bcf60004bd7c0004be8c0004bf800004c0d2[_^M_][_$_]
+0004c20a0004c21a0004c2480004c2760004c35e0004c4420004c4c80004[_^M_][_$_]
+c55e0004c5e00004c65e0004c6de0004c75e0004c7e00004c8620004c936[_^M_][_$_]
+0004ca2e0004ca5c0004ca8a0004cabc0004caee0004cafe0004cb0e0004[_^M_][_$_]
+cb3c0004cb6a0004cb9c0004cbce0004cc000004cc320004cc640004cc96[_^M_][_$_]
+0004cd620004cd720004cda00004cdce0004ce000004ce320004ce640004[_^M_][_$_]
+ce960004cec80004cefa0004cf2c0004cf5e0004cf8c0004cfba0004cfec[_^M_][_$_]
+0004d01e0004d0500004d0800004d0b20004d0e40004d16a0004d1d80004[_^M_][_$_]
+d26c0004d27c0004d3760004d4800004d5800004d66c0004d7360004d804[_^M_][_$_]
+0004d8b20004d9700004da220004dac40004dba80004dc600004dcea0004[_^M_][_$_]
+dd700004ddc60004de560004deb80004def40004df7e0004dfde0004e012[_^M_][_$_]
+0004e0460004e0860004e0ee0004e11a0004e19e0004e1e00004e2220001[_^M_][_$_]
+000008d1008c0010004c000700020010002f005500000469ffff00030001[_^M_][_$_]
+b15440b80135b31c22392f410c0135003f0135004f0135008f0135009f01[_^M_][_$_]
+3500050040012eb31c1f3930411201280001004001280080012800900128[_^M_][_$_]
+00a0012800b00128000500ef0126000100400125b31b1f3940410a012400[_^M_][_$_]
+01002f01050001004f010400010040010340aa090d392f652f662f672f68[_^M_][_$_]
+2f692f6a2f742f752f7b2f7c2fd12fd20c20fc30fc40fcd0fc04f1f2197f[_^M_][_$_]
+f2018ff2aff2e0f203d1d216171c7b7c161b7b7c19307c407c507c607c70[_^M_][_$_]
+7c05767716171c6d7016171c6c6f16171c6b6e161b0f6b7f6b8f6e9f6eaf[_^M_][_$_]
+6e056b6e7f721a747514151c676a14151ca96ab96ae96af96a0466691415[_^M_][_$_]
+1cc669016568141b0f651f6502af68bf68ef65ff6504656885711a197316[_^M_][_$_]
+7a431921794319217f413201340001007f01330080013300900133000300[_^M_][_$_]
+6f0132007f0132008f01320003007001210001002f0121003f0121004f01[_^M_][_$_]
+21005f0121000400a0011e00b0011e00c0011e00030020012d0030012d00[_^M_][_$_]
+60012d0070012d0080012d0090012d00060040010fb40b1f39092f411f01[_^M_][_$_]
+0e005f010e009f010e00af010e00bf010e00050090010e00bf010e00cf01[_^M_][_$_]
+0e00df010e00ef010e00050020010e006f010e00b0010e00d0010e00e001[_^M_][_$_]
+0eb205d10f4123010e003f010e00bf010e00cf010e0004000f010e005f01[_^M_][_$_]
+0e006f010e00a0010e00bf010e00cf010e00df010e0007003f010e004f01[_^M_][_$_]
+0e007f010e00af010e00ef010e00ff010eb2069f7f4123010e00af010e00[_^M_][_$_]
+e0010e00ff010e0004001f010e003f010e00af010e00df010e00ef010e00[_^M_][_$_]
+05000f010e001f010e002f010e007f010e008f010e00c0010e00df010e00[_^M_][_$_]
+ef010eb2086d9f411b010e00cf010e00ef010e00ff010e0004000f010e00[_^M_][_$_]
+ef010e0002000f010e002f010e003f010e004f010e00c0010e00df010e00[_^M_][_$_]
+ef010eb2073a70bd010e00df010e00020040010eb32b33395f411b010e00[_^M_][_$_]
+70010e008f010e009f010e00cf010e00df010e0006000f010e001f010e00[_^M_][_$_]
+3f010e0080010e00bf010e00ef010e00060040010eb3091b3970bb013600[_^M_][_$_]
+0100200108b30d113940b80102b20b1439b9ffc00107b31b22392f411801[_^M_][_$_]
+0c004f010c0002002f010c0001008f010b0001002f0107004f010700c001[_^M_][_$_]
+0700d001070004004f010700010040010040640b103940fe0b1139e0f601[_^M_][_$_]
+e0f60114f424f40274f40140df60df0220d830d840d80366c176c10299be[_^M_][_$_]
+0120b230b240b20360b070b0029b93002b9a92002b9991002b9493002b92[_^M_][_$_]
+93002b9193062b9395032b9885042b9796042b9695032b9995a995026f41[_^M_][_$_]
+0f0131007f0131008f01310003013001160032001f011901160015001f01[_^M_][_$_]
+16b285032bb9ffe0012fb30b143970410d01170001002f0117003f011700[_^M_][_$_]
+4f0117005f0117000401130114b22a1fa0bc011400b0011400c001144016[_^M_][_$_]
+0370fbf0fb022ffb6ffb7ffb0340fa50fa60faf0fa04b8ffc040fffa1115[_^M_][_$_]
+3950ec70ec0250ec70ec0240ec01bfeb0170ea0130ea0170e9015fe970e9[_^M_][_$_]
+f0e903a0e9015fe870e802efe8017fe8bfe8efe803f0e701f0e7012fe780[_^M_][_$_]
+e7a0e7f0e70450e6f0e60250e660e670e6c0e60450e50170e50180e4e0e4[_^M_][_$_]
+f0e40340dca0dc02309050900220a04fa05fa09fa0afa0efa006e0f501e0[_^M_][_$_]
+f501f3851e1f2fe20140dd019fd5afd5bfd5030fd340d302e0d0010fc470[_^M_][_$_]
+c4022fc43fc44fc45fc49fc4afc4efc4ffc40899bd99bf02dad9042bd685[_^M_][_$_]
+022bcccd062bcd85022bc9c8062bc885022b8d8b042b8c8b191f8b83c81f[_^M_][_$_]
+897d641f817f082b7d7f082b7f85072baf85042b8885012b8785002b8485[_^M_][_$_]
+042b8385002b2ffd4ffd027f40abef012df03bf04ff069f07ff0051b3715[_^M_][_$_]
+1836151535151234150f33150c3215093115063015032f15002e1526270f[_^M_][_$_]
+28270f26002a1f0f2a2f2a3f2a032f24bf24022a2b0f2c2b0f22230e2423[_^M_][_$_]
+0f1e1f0e201f0f2005010f10110c0c0d0e0c090a0b0c0607080c0304050c[_^M_][_$_]
+0001020c0003181f500f700f027f0f800fbf0f030f031f032f034f037f03[_^M_][_$_]
+bf03ef030704012c1f1b011d0d18071a0d1510170d1204140d701b01501b[_^M_][_$_]
+701bf01b03b8ffc0400b1b131839701b801b02503301b0124b004b5442b0[_^M_][_$_]
+13014b004b5342b0332b4bb8032052b0322b4bb009505b58b101018e59b0[_^M_][_$_]
+332bb00288b8010054b00488b8020054b012435a5b58b80119b101018e85[_^M_][_$_]
+1bb900040100b04b60858d592b1db0644b5358b0801d59b0324b5358b090[_^M_][_$_]
+1d5900732b74742b2b2b2b2b7373742b2b2b2b2b2b2b732b2b2b2b2b2b73[_^M_][_$_]
+732bb1282645b02a4561b02c4560442b2b2b2b2b2b2b2b2b2b2b2b73b0ef[_^M_][_$_]
+45b0f0456168b0f04560b0ef23447373012b2b2b2b2b2b2b2b2b2b2b2b2b[_^M_][_$_]
+2b2b2b2b2b73737473737373732b74737374737373747374737474737374[_^M_][_$_]
+7374747374737374742b747374742b73742b2b2b2b7300732b2b2b2b2b2b[_^M_][_$_]
+2b2b2b2b737373737373737473742b2b73737373732b2b2b742b73742b75[_^M_][_$_]
+5e7374755e7374755e7374755e7374755e2b73747374737373012b2bb018[_^M_][_$_]
+b0314b53422b2b73742b732b732b2b2b732b2b2b2b732b2b2b73742b7373[_^M_][_$_]
+2b7373732b7373742b732bb109322b4bb05052424bb03c524bb00f505bb0[_^M_][_$_]
+1a23424bb0c8524bb036505bb00c23422b00000000>[_^M_][_$_]
+[16105 16169 15785 16013 16241 16333 15745 15601 15869 15477 16269 15937 16109[_^M_][_$_]
+16361 16209 16209 16113 16321 16289 14899 ] AllocGlyphStorage[_^M_][_$_]
+]def [_^M_][_$_]
+108 44 [_^M_][_$_]
+PrepFor2015[_^M_][_$_]
+AddFontInfoBegin[_^M_][_$_]
+AddFontInfo[_^M_][_$_]
+/OrigFontType /TrueType def [_$_]
+/OrigFontName <4D6963726F736F66742053616E73205365726966> def
+/OrigFontStyle () def[_^M_][_$_]
+/FSType 8 def[_^M_][_$_]
+AddFontInfoEnd[_^M_][_$_]
+[16#2c 16#6e18af9b ] AddXUID[_^M_][_$_]
+Type42DictEnd[_^M_][_$_]
+1 9274 49 <000100a40000052305ba0009007140180702010281060714060607050304[_^M_][_$_]
+01077f000e0d0d063b00b8fffa40090b0b063b0006027f04b8fff8b40d0d[_^M_][_$_]
+063b04b8fff8401c0b0b063b04400b006e020a046b02770b01780b01480b[_^M_][_$_]
+e80bf80b03005f5d715d2b2b011a18102b2b4ded32102b2bed32002f3f31[_^M_][_$_]
+30872e2b877dc4212301112311330111330523c7fd00b8c60300b90485fb[_^M_][_$_]
+7b05bafb7b048500>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 11218 55 <0001002d000004b605ba00070049403101059106030300a00205a0027f03[_^M_][_$_]
+040d0d063b03400809037f3030e9090148099809b809f809040709170977[_^M_][_$_]
+09d70904005f5d5d5d2b011a18102b4dede610e6002f3fed323130012111[_^M_][_$_]
+231121352104b6fe1bc3fe1f0489050cfaf4050cae00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8070 43 <000100a40000052305ba000b006f4019039108400605089118300a060301[_^M_][_$_]
+0509017f000e0d0d063b00b8fffa40090b0b063b0008047f05b8fff8b40d[_^M_][_$_]
+0d063b05b8fff840170b0b063b05400d006e020c056b02570d01480d880d[_^M_][_$_]
+02005f5d712b2b011a18102b2b4ded32102b2bed32002f333f332b001a18[_^M_][_$_]
+104ded31302123112111231133112111330523c3fd06c2c202fac302b2fd[_^M_][_$_]
+4e05bafda6025a00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 6982 38 <00010060ffe7055e05d3001900c140341a182a183a18030511010a0f0115[_^M_][_$_]
+080103470901080901090d92060407178717020b00171392001307101710[_^M_][_$_]
+020d020a09167d17b8fff4b40d0d063b17b8fff040190b0b063b17051715[_^M_][_$_]
+17020f17400b1036107d030c0d0d063b03b8ffd6400c0b0b063b03400703[_^M_][_$_]
+01100303b8ffe2401d090b361b176f021a036c02b81b01571b01271b371b[_^M_][_$_]
+571b771ba71b05005f5d715d2b2b2b015f5e5d1a18102b2b4ded2b5e5d10[_^M_][_$_]
+2b2bed39395f5e5d003fedcd5f5e5d3fedcd5d5d31305f5d5d5d5d052000[_^M_][_$_]
+1110002132001723262623220011100033323637330600030afec9fe8d01[_^M_][_$_]
+730137ef015015c80cd9a5dffefc0102ddacd40ec815feba190199015d01[_^M_][_$_]
+5d0199fefed38ba4fecdfee3fee4fecca89ceaff0000>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 7274 39 <000200a40000056005ba0006000f007840180a0401050201090f91000307[_^M_][_$_]
+9106080b180b020d020b7d03b8fffcb40d0d063b03b8ffeab70b0b063b03[_^M_][_$_]
+077f06b8fff6b40d0d063b06b8fff8401c0b0b063b064011036f0210066b[_^M_][_$_]
+02571101a7110118114811881103005f5d5d712b2b011a18102b2b4ded10[_^M_][_$_]
+2b2bed5f5e5d002fed3fed31305e5d5d1321201110212137212012111002[_^M_][_$_]
+2121a401d102ebfd15fe2fc2010b013fe8e7fec0fef505bafd2bfd1bae01[_^M_][_$_]
+29010e0107012000>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 10444 53 <000200a40000056a05ba0014001c00f14017470c570c670c03024c035c03[_^M_][_$_]
+020302011c018100141400b8fff840320b0b063b0000148a14012c143c14[_^M_][_$_]
+0208141814020902050e150e250e350e0403197d070e170e270e370e040e[_^M_][_$_]
+040d0d063b0eb8fff4401a0b0b063b0e01020e1112140600080018007800[_^M_][_$_]
+030d0015077f08b8fff8b40d0d063b08b8fff8402f0b0b063b08401e006f[_^M_][_$_]
+021d086b028711010212110915919706010606081c9209030008481e0177[_^M_][_$_]
+1e01a71eb71e02005f5d715d002f333fed12392f5ded1239395f5d302b2b[_^M_][_$_]
+011a18102b2b4ded325f5e5d1117332f2b2b5ded5f5d5f5e5d5d5d872e2b[_^M_][_$_]
+2b0e4b52587d1b7a5910c431005f5d5f5d21230326262321112311213216[_^M_][_$_]
+16151406071516170121323635342121056ad28a25ac70fe99c20289aad8[_^M_][_$_]
+88b0999950fc8f01b1b5a3fec6fe3101876884fd8d05ba42d48598cc1f04[_^M_][_$_]
+31d80192728cfa00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 2538 16 <0001004201b80268026d0003003140208f0101012f024f025f0203025000[_^M_][_$_]
+6000027001012f01010005017005012005015d712f10c65d5d5d002f5dcd[_^M_][_$_]
+5d3130012135210268fdda022601b8b5>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 7462 40 <000100a4000004e905ba000b0062401f0991064002010691183005910203[_^M_][_$_]
+0a910107081708020a00080400060a7f01b8fffab40d0d063b01b8fffe40[_^M_][_$_]
+120b0b063b01400d006f020c016b02e80d01005f5d2b2b011a18102b2b4d[_^M_][_$_]
+ed3210c4c45f5e5d002fed3fed2b001a18104ded31302121112115211121[_^M_][_$_]
+1521112104e9fbbb0423fc9f0329fcd7038305baaefe40aefe10>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8922 48 <000100a40000060605ba000c0125b90003fff4400a0d0d063b0b48091036[_^M_][_$_]
+09b8ffb840960910368c0b9c0b0283099309020268040101480458047804[_^M_][_$_]
+0302670301014703570377030302180a0101050a150a250a0302880a980a[_^M_][_$_]
+a80a0300bc0adc0a0203c80a01011e052e0502037705a705b705c705d705[_^M_][_$_]
+05018505950502001e022e0202037702a702b702c702d702050185029502[_^M_][_$_]
+0205020a030479040108041804280438040409000b08030104070b027f00[_^M_][_$_]
+0a0d0d063b00b8fff640090b0b063b0009057f07b8fffc40200b0b063b07[_^M_][_$_]
+400e006e020d076b02770e01570e970e02080e180e380ee80e04005f5d5d[_^M_][_$_]
+712b2b011a18102b4ded32102b2bed32002f33333f335f5e5d5d12173931[_^M_][_$_]
+305d5f5d5f715f5d5f5d5f715f5d5f5d5f5d5f715f5d015f5d5f5d5f5d5f[_^M_][_$_]
+5d5f5d5d2b2b2b212311012301112311210101210606b8fe5eaefe5eb801[_^M_][_$_]
+23018d018f012304dffb2104dffb2105bafb3a04c600>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 9726 51 <000200a4000004fc05ba000b0015007d400d0c9109090b159100030b107d[_^M_][_$_]
+05b8ffeeb40d0d063b05b8ffda40190b0b063b053705010205051505020d[_^M_][_$_]
+0305400910360c0a7f0bb8fff8b40d0d063b0bb8fffc40170b0b063b0b40[_^M_][_$_]
+17056f02160b6b02e817017717a71702005f5d5d2b2b011a18102b2b4ded[_^M_][_$_]
+322b5f5e5d5f5d102b2bed002f3fed12392fed3130132132161615140421[_^M_][_$_]
+21112313213236353426262321a40223b4f38efee6fef5fe8fc2c20173bb[_^M_][_$_]
+9f58877ffe9105ba43df8adee6fdb602f88c84588824>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8832 47 <000100a40000042f05ba0005003b400f020304910100400f18360007047f[_^M_][_$_]
+01b8fffc40110b0b063b014006016b02a70701880701005f5d5d2b011a18[_^M_][_$_]
+102b4ded10c62b002fed3f3130212111331121042ffc75c202c905bafaf4[_^M_][_$_]
+>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 6372 36 <0002fffe0000055805ba0002000a00fd402ea809b8090257020103000504[_^M_][_$_]
+0401020607070101041c01020481030a1403030a01071c01000781080914[_^M_][_$_]
+08080908b8ffea40740919360316091936980aa80a02027a0a0103370a47[_^M_][_$_]
+0a570a670a0401070a170a270a03029809b80902037709013a094a095a09[_^M_][_$_]
+6a090418092809880903020a09010a0306934007021702020b0002400b0b[_^M_][_$_]
+063b020203080903080c0377020b087602370c670cf70c03580c780c0208[_^M_][_$_]
+0cb80c02005f5d715d2b2b00182f3f1239392f2b5f5e5d1a4ded3130015f[_^M_][_$_]
+5e5d5f5d5d5d5f5d5f5d5f5d5f5d5f5d2b2b872e2b084b52587d1b7a5910[_^M_][_$_]
+c487052e182b084b52587d1b7a5910c40705103c3c07103c3c015f5d5d01[_^M_][_$_]
+01030123032103230133039afefef603b6dbaafd9aa2cd0233d1025802a8[_^M_][_$_]
+fd58fda801befe4205ba>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 0 0 <0002003200000226060000030007000033112111252111213201f4fe7801[_^M_][_$_]
+1cfee40600fa006c0528>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/N 49 def[_^M_][_$_]
+/T 55 def[_^M_][_$_]
+/H 43 def[_^M_][_$_]
+/C 38 def[_^M_][_$_]
+/D 39 def[_^M_][_$_]
+/R 53 def[_^M_][_$_]
+/hyphen 16 def[_^M_][_$_]
+/E 40 def[_^M_][_$_]
+/M 48 def[_^M_][_$_]
+/P 51 def[_^M_][_$_]
+/L 47 def[_^M_][_$_]
+/A 36 def[_^M_][_$_]
+/.notdef 0 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 1 /N put[_^M_][_$_]
+dup 2 /T put[_^M_][_$_]
+dup 3 /H put[_^M_][_$_]
+dup 4 /C put[_^M_][_$_]
+dup 5 /D put[_^M_][_$_]
+dup 6 /R put[_^M_][_$_]
+dup 7 /hyphen put[_^M_][_$_]
+dup 8 /E put[_^M_][_$_]
+dup 9 /M put[_^M_][_$_]
+dup 10 /P put[_^M_][_$_]
+dup 11 /L put[_^M_][_$_]
+dup 12 /A put[_^M_][_$_]
+pop[_^M_][_$_]
+Pscript_WinNT_Incr begin[_^M_][_$_]
+%%BeginResource: file Pscript_Text 5.0 0[_^M_][_$_]
+/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d[_^M_][_$_]
+/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^[_^M_][_$_]
+length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets[_^M_][_$_]
+{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{&[_^M_][_$_]
+/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get}[_^M_][_$_]
+if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{[_^M_][_$_]
+{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get[_^M_][_$_]
+StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $[_^M_][_$_]
+! ! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ length array copy[_^M_][_$_]
+put pd_CoverFCRange}if}{!}? 2 ^ ~ definefont fM 5 4 -1 $ put fM 4 0 put fM[_^M_][_$_]
+makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M currentpoint snap M 0 - 0[_^M_][_$_]
+Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d/ySP null d/sW null d/sSU{N[_^M_][_$_]
+/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N/sW ~ d/ySP ~ d/xSP ~ d}b/sT[_^M_][_$_]
+{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix astore concat 0 0 M}b/eR/; , d[_^M_][_$_]
+/AddOrigFP{{&/FontInfo known{&/FontInfo get length 6 add}{6}? dict `[_^M_][_$_]
+/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d/OrigFontStyle ~ d[_^M_][_$_]
+/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS{makefont[_^M_][_$_]
+Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 copy ~ sub 1[_^M_][_$_]
+add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for & E[_^M_][_$_]
+/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}b/mF42{15 dict ` @ 4 1 $[_^M_][_$_]
+FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 add 255[_^M_][_$_]
+idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for/FDepVector[_^M_][_$_]
+Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 Encoding[_^M_][_$_]
+length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName length 2[_^M_][_$_]
+add string}{FontName length 3 add string}?}? @ 0 FontName @ length string cvs[_^M_][_$_]
+putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ putinterval cvn 1 ^[_^M_][_$_]
+256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 $ put}for & @ E[_^M_][_$_]
+/FontName get ~ definefont ! ! ! mF}b/mF_OTF_V{~ ! ~ ! 4 -1 $ ! findfont 2 ^ ~[_^M_][_$_]
+definefont fM @ @ 4 6 -1 $ neg put 5 0 put 90 matrix R matrix concatmatrix[_^M_][_$_]
+makefont Pscript_Windows_Font 3 1 $ put}b/mF_TTF_V{3{~ !}repeat 3 -1 $ ![_^M_][_$_]
+findfont 1 ^ ~ definefont Pscript_Windows_Font 3 1 $ put}b/UmF{L2?[_^M_][_$_]
+{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName[_^M_][_$_]
+get undefinefont}forall undefinefont}b[_^M_][_$_]
+%%EndResource[_^M_][_$_]
+end reinitialize[_^M_][_$_]
+F /F0 0 /0 F /TTE1CD9F20t00 mF [_$_]
+/F0S47YFFFFFFBB F0 [71.031 0 0 -68.75 0 0 ] mFS
+F0S47YFFFFFFBB Ji [_$_]
+3125 894 M <010203040506070208090A0B0C0208>S [_$_]
+3125 800 M <010203070208090A0B0C0208>S [_$_]
+3125 706 M <080B02070208090A0B0C0208>S [_$_]
+: 3125 550 594 78 rc 317 VM?[_^M_][_$_]
+1 7608 41 <000100a40000048105ba0009004f40110591020207019108030704040002[_^M_][_$_]
+067f07b8fffe401c0d0d063b074000400b16360b006f020a076b02e80b01[_^M_][_$_]
+270b570b02005f5d5d2b2b2b011a18102b4ded3212392f002f3fed12392f[_^M_][_$_]
+ed3130012111211521112311210481fce502b1fd4fc203dd050cfe3aaefd[_^M_][_$_]
+6805ba00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/F 41 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 13 /F put[_^M_][_$_]
+pop[_^M_][_$_]
+3125 613 M <0C06080D070208090A0B0C0208>S [_$_]
+; N 3625 1056 M 3788 1056 I K [_^M_][_$_]
+N 3788 1056 M 3713 1075 I 3713 1038 I C [_^M_][_$_]
+ O 951 VM?[_^M_][_$_]
+1 10782 54 <0001005cffe704ec05d300230140b9001dfff4b40b0b063b1cb8fff44076[_^M_][_$_]
+0b0b063b5a220103681f0102571f0100071f0101351e451e0203781d0102[_^M_][_$_]
+131d231d531d0303381a481a020228173817481703007814010255140155[_^M_][_$_]
+100103680e780e02780d0101080d010a5a0c01580b010225093509020317[_^M_][_$_]
+05270537050300670201024a0201030a0f1b21040068150115189112b8ff[_^M_][_$_]
+fc40150d0d063b120407034703570367038703050b000307b8fff040200d[_^M_][_$_]
+0d063b07910013167f150c0b0b063b151b7f0f0c0b0b063b0f150f030a7f[_^M_][_$_]
+21b8ffe0b40b0b063b21b8fff4401a0d0d063b21047f034025216f022403[_^M_][_$_]
+6c02b825e82502a72501005f5d5d2b2b011a18104ded102b2bed1239392f[_^M_][_$_]
+2bed2f2bed003fed2bc45f5e5d3f2bedc45d12173931305f5d5f5d5f5d5f[_^M_][_$_]
+5d5f5d5d5e5d5f5d5d5f5d5d5f5d5f5d5f5d5f5d5f5d5f5d5f5d5f5d5f5d[_^M_][_$_]
+5f5d2b2b0520002733161633323635342624263534243332041723022122[_^M_][_$_]
+0615141604161615140402cdfecafecd08bb0ff3aca3c7cefe09db011dec[_^M_][_$_]
+f8013009bd1dfeb1a2b28f0187e6a4fed3190116daa49d8673796e6bbe9e[_^M_][_$_]
+b2e4e6d2010a7a655c5c5654b195bdfa>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8228 44 <000100bc0000017f05ba00030063400c020301007f01040d0d063b01b8ff[_^M_][_$_]
+fc400d0b0b063b01400405017f213005b8ffc0402a232836070517053705[_^M_][_$_]
+6705770587050647055705670587059705a705b705c705f7050998050178[_^M_][_$_]
+0501005f5d715d712b2b011a18102b2b4ded002f3f313021231133017fc3[_^M_][_$_]
+c305ba00>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 7732 42 <00010060ffe705b605d3001d00e640521c100b0b063b2a1d3a1d7a1d0303[_^M_][_$_]
+671401022511012a0f010388080102350801039801010217911818002809[_^M_][_$_]
+01090d920604139200131a0a7d090c0d0d063b09100b0b063b0908184818[_^M_][_$_]
+020900181c167f1ab8ffd6401b0b0b063b1a351a0103371a01000710010d[_^M_][_$_]
+02107d030c0d0d063b03b8ffd6400f0b0b063b03402703010503010e0303[_^M_][_$_]
+b8ffe24018090b361f1a6f021e036c02781f01271fa71fb71ff71f04005f[_^M_][_$_]
+5d5d2b2b2b015f5e5d5d1a18102b2b4ded5f5e5d5f5d5f5d102bed32c45f[_^M_][_$_]
+5e5dd42b2bed002f3fed3fedcd5d12392fed31305f5d5f5d5f5d5f5d5d5f[_^M_][_$_]
+5d5f5d2b0520001110002120041723262623220011100033203735213521[_^M_][_$_]
+112327060325fec4fe770184013b0109015f15c90ce8bee3feeb0118e201[_^M_][_$_]
+3d9afe7d023f89339519019e01580159019dffd68ea1fecafee6fee7fec9[_^M_][_$_]
+d1dfaffd149ab300>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/S 54 def[_^M_][_$_]
+/I 44 def[_^M_][_$_]
+/G 42 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 14 /S put[_^M_][_$_]
+dup 15 /I put[_^M_][_$_]
+dup 16 /G put[_^M_][_$_]
+pop[_^M_][_$_]
+3800 1081 M <0E02060F0110070208090A0B0C0208>S [_$_]
+N 2744 1338 M 2906 1056 I K [_^M_][_$_]
+N 2906 1056 M 2888 1131 I 2850 1113 I C [_^M_][_$_]
+ O N 2744 1338 M 2906 1338 I K [_^M_][_$_]
+N 2906 1338 M 2831 1356 I 2831 1319 I C [_^M_][_$_]
+ O 2919 1363 M <0B0F0E02070208090A0B0C0208>S [_$_]
+N 2606 1056 M 2906 1056 I K [_^M_][_$_]
+N 2906 1056 M 2831 1075 I 2831 1038 I C [_^M_][_$_]
+ O 635 VM?[_^M_][_$_]
+1 11490 57 <0001000c0000054805ba000600c0b90003ffea405d091936001609193678[_^M_][_$_]
+019801c80103023501450155016501040307011701270167010477029702[_^M_][_$_]
+c70203023a024a025a026a0204030802180228026802040a020303020800[_^M_][_$_]
+700207036d0237086708f7080358087808020808b80802005f5d715d2b2b[_^M_][_$_]
+00182f3f3130015f5e5d5f5d5f5d5d5f5d5f5d2b2bb106024354581b401a[_^M_][_$_]
+05061c0504068100011400000105041c05060481030214030302872e4d2b[_^M_][_$_]
+084b52587d1b7a5910c487052e182b084b52587d1b7a5910c45901012301[_^M_][_$_]
+3301010548fdc6c8fdc6cf01cf01cf05bafa4605bafb1704e900>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 9432 50 <00020060ffe705db05d3000b001700bdb10602435458400a129200040c92[_^M_][_$_]
+06130f03b8ffeeb40d0d063b03b8ffe040100b0b063b0303191815090c0d[_^M_][_$_]
+0d063b09b8ffd6b70b0b063b090919181112392f2b2bcd1112392f2b2bcd[_^M_][_$_]
+003fed3fed31301b404a12920a001a002a000300040c9205061506250603[_^M_][_$_]
+0906130f7d03157d09406803010a031a033a034a03046709010509150935[_^M_][_$_]
+094509040a0319036f0218096c02e81901571901271901005f5d715d2b2b[_^M_][_$_]
+015f5e5d5d5d5d1a18104ded10ed003f5e5ded3f5ded3130590120001110[_^M_][_$_]
+00212000111000013200111000232200111000031f01340188fe78feccfe[_^M_][_$_]
+cbfe76018a0133dc0119fee8d9ddfee5011a05d3fe60feaafeaafe6001a1[_^M_][_$_]
+0155015601a0faba0138011801180138fec8fee8fee9fec7>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/V 57 def[_^M_][_$_]
+/O 50 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 17 /V put[_^M_][_$_]
+dup 18 /O put[_^M_][_$_]
+pop[_^M_][_$_]
+2919 1081 M <110804021206070208090A0B0C0208>S [_$_]
+N 3617 1058 M 3617 1047 3607 1037 3596 1037 -c 3584 1037 3574 1047 3574 1058 -c 3574 1069 3584 1079 3596 1079 -c 3607 1079 3617 1069 3617 1058 -c C [_^M_][_$_]
+ O N 1769 1338 M 1931 1619 I K [_^M_][_$_]
+N 1931 1619 M 1875 1563 I 1913 1544 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1525 I K [_^M_][_$_]
+N 1931 1525 M 1869 1481 I 1894 1456 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1431 I K [_^M_][_$_]
+N 1931 1431 M 1856 1413 I 1875 1375 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1338 I K [_^M_][_$_]
+N 1931 1338 M 1856 1356 I 1856 1319 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1244 I K [_^M_][_$_]
+N 1931 1244 M 1875 1300 I 1856 1263 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1150 I K [_^M_][_$_]
+N 1931 1150 M 1894 1219 I 1869 1194 I C [_^M_][_$_]
+ O N 1769 1338 M 1931 1056 I K [_^M_][_$_]
+N 1931 1056 M 1913 1131 I 1875 1113 I C [_^M_][_$_]
+ O 635 VM?[_^M_][_$_]
+1 12728 60 <0001000a0000054c05ba000800dc4018010704670401034804580402000a[_^M_][_$_]
+041a04020b0200040305b8ffe8b60a0f3605030305b8ffe1400c091b3600[_^M_][_$_]
+1f091b3607017f04b8fff8403b0b0b063b04400500047f30300a00700209[_^M_][_$_]
+056d02070a170a970ab70ad70af70a06070a370a670a870aa70a05480a68[_^M_][_$_]
+0a780a03c80ad80ae80a03005f5d715d712b2b2b011a18102b4ded392b2b[_^M_][_$_]
+002f3f2b1239395f5e5d5f5d5f5d1133333130b106024354581b401a0708[_^M_][_$_]
+19070608810001140000010706190708068105041405050487052e2b084b[_^M_][_$_]
+52587d1b7a5910c487052e182b084b52587d1b7a5910c459010111231101[_^M_][_$_]
+330101054cfdc0c2fdc0ec01b601b405bafcb3fd93026d034dfd5d02a300[_^M_][_$_]
+>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 6682 37 <000300a4000004ec05ba000d0016001e00c24043380d480d02080b010708[_^M_][_$_]
+0111020b1e910e4005040e91183016910503179104270001081a181a020d[_^M_][_$_]
+020b04127f0c091c09020f0309180d0d063b090c0b0b063b090904b8fffa[_^M_][_$_]
+b40d0d063b04b8fffcb70b0b063b041a7d00b8fff4b40d0d063b00b8ffea[_^M_][_$_]
+b60b0b063b000e17b8fffc40190d0d063b177f044020006f021f046b02a7[_^M_][_$_]
+20018820e82002005f5d5d2b2b011a18104ded2b32102b2bed122b2b392f[_^M_][_$_]
+2b2b5f5e5ded12395f5e5d5d002fed3fed2b001a18104ded3931305f5e5d[_^M_][_$_]
+5d5d01140421211121320415140716160121323635342623211121203534[_^M_][_$_]
+26232104ecfee8fef5fddb020aea010cd38e8dfc7a0146a19894b7fecc01[_^M_][_$_]
+61015ca1d4feb801aacedc05bac8aed46624c1012f67786c6dfba2fc8379[_^M_][_$_]
+>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/Y 60 def[_^M_][_$_]
+/B 37 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 19 /Y put[_^M_][_$_]
+dup 20 /B put[_^M_][_$_]
+pop[_^M_][_$_]
+1944 1644 M <0E130914120B070208090A0B0C0208>S [_$_]
+635 VM?[_^M_][_$_]
+1 11330 56 <000100a4ffe7052305ba00130059402077120103070a010b0800010c020e[_^M_][_$_]
+05030a9100130e7f0f0e0d0d063b0f067f05b8fff640150d0d063b054015[_^M_][_$_]
+0f6e0214056b02a71501481501005f5d5d2b2b011a18102b4ded102bed00[_^M_][_$_]
+3fed3f335f5e5d5e5d31305f5d0522260235113311101633323611113311[_^M_][_$_]
+10060402e3fffd43c2c2bbbbc2c37fff0019c6010cb10350fcb3fedfb6b6[_^M_][_$_]
+0121034dfcb0fef6fc7d>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+1 8352 45 <00010037ffe7035c05ba000f007c401f550a01030e0308075807020b0007[_^M_][_$_]
+0a914803010203130e7f0f0e0d0d063b0fb8fff0401d0b0b063b0f087f40[_^M_][_$_]
+6707010807180728074807040d0007160d0d063b07b8ffe840120b0b063b[_^M_][_$_]
+07110f6e02b811012711a71102005f5d5d2b01182f2b2b5f5e5d5d1a4ded[_^M_][_$_]
+102b2bed003f5f5dedc45f5e5d3f5f5d3130011006232226353533103332[_^M_][_$_]
+36351133035cd0cbb6d4c3c76970c201d5fef3e1deb627fef476bf03ef00[_^M_][_$_]
+>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/U 56 def[_^M_][_$_]
+/J 45 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 21 /U put[_^M_][_$_]
+dup 22 /J put[_^M_][_$_]
+pop[_^M_][_$_]
+1944 1550 M <0E020615040215060807121416080402070208090A0B0C0208>S [_$_]
+1944 1456 M <0E020C01050C060507121416080402070208090A0B0C0208>S [_$_]
+317 VM?[_^M_][_$_]
+1 9928 52 <00020060ff8b05f405d3000f001f018c400d1d200b0b063b10200b0b063b[_^M_][_$_]
+1db8ffe0b40b0b063b10b8ffca40180b0b063b611e711e811e0303070017[_^M_][_$_]
+002700030088020111b8ffc040490f13368a1e01021a1e6a1e7a1e030137[_^M_][_$_]
+1167110202271101001010110f000f0e001f1d1d1c020203011e0101001f[_^M_][_$_]
+001f811e01141e1f1e1e011592020d0f03040a0a1a0a2a0a03030ab8ffe8[_^M_][_$_]
+404c0b0b063b0a041e0001181f281f681f781f041f1b9217016701770103[_^M_][_$_]
+003a014a015a01030105041504250403090304180b0b063b0413381e481e[_^M_][_$_]
+020000101b1d1e04121802040f0307127d0db8ffeeb40d0d063b0db8ffd6[_^M_][_$_]
+400e0b0b063b0d187d070c0d0d063b07b8ffd640320b0b063b0740680d01[_^M_][_$_]
+0a0d1a0d3a0d4a0d046707010507150735074507040a03210d6f0220076c[_^M_][_$_]
+02e82101572101272101005f5d715d2b2b015f5e5d5d5d5d1a18102b2b4d[_^M_][_$_]
+ed102b2bed12173911121739c65f5d003f2b5f5e5dc65d5f5dfdc45d1139[_^M_][_$_]
+393f2b5f5d121739ed313087082e2b87087dc407083c083c0708103c083c[_^M_][_$_]
+005f5d5f5d5f5d5f5d2b015d5f5d5f5d002b2b012b2b2507270623200011[_^M_][_$_]
+10002120001110072736111000232200111000333237273705f473f2a3cd[_^M_][_$_]
+fecbfe76018a013501340188be9287fee8d9ddfee5011ada746992731489[_^M_][_$_]
+bf6301a10155015601a0fe60feaafeb4d573a0010e01180138fec8fee8fe[_^M_][_$_]
+e9fec7317389>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/Q 52 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 23 /Q put[_^M_][_$_]
+pop[_^M_][_$_]
+1944 1363 M <0E08171508010408070208090A0B0C0208>S [_$_]
+N 2736 1340 M 2736 1328 2726 1318 2715 1318 -c 2703 1318 2693 1328 2693 1340 -c 2693 1351 2703 1361 2715 1361 -c 2726 1361 2736 1351 2736 1340 -c C [_^M_][_$_]
+ O 1944 1269 M <011509140806070208090A0B0C0208>S [_$_]
+1944 1175 M <010F0B070208090A0B0C0208>S [_$_]
+1944 1081 M <0C06060C13070208090A0B0C0208>S [_$_]
+N 2598 1058 M 2598 1047 2588 1037 2577 1037 -c 2565 1037 2555 1047 2555 1058 -c 2555 1069 2565 1079 2577 1079 -c 2588 1079 2598 1069 2598 1058 -c C [_^M_][_$_]
+ O N 2025 844 M 2188 963 I K [_^M_][_$_]
+N 2188 963 M 2119 931 I 2138 900 I C [_^M_][_$_]
+ O N 2025 844 M 2188 725 I K [_^M_][_$_]
+N 2188 725 M 2138 788 I 2119 756 I C [_^M_][_$_]
+ O 2200 988 M <0E15140E0817070208090A0B0C0208>S [_$_]
+2200 750 M <080B0809080102070208090A0B0C0208>S [_$_]
+N 2942 727 M 2942 715 2932 705 2921 705 -c 2909 705 2899 715 2899 727 -c 2899 738 2909 748 2921 748 -c 2932 748 2942 738 2942 727 -c C [_^M_][_$_]
+ O N 988 1088 M 1150 1338 I K [_^M_][_$_]
+N 1150 1338 M 1094 1288 I 1125 1263 I C [_^M_][_$_]
+ O N 988 1088 M 1150 844 I K [_^M_][_$_]
+N 1150 844 M 1125 919 I 1094 894 I C [_^M_][_$_]
+ O 1163 1363 M <02130A08070208090A0B0C0208>S [_$_]
+N 1761 1340 M 1761 1328 1751 1318 1740 1318 -c 1728 1318 1718 1328 1718 1340 -c 1718 1351 1728 1361 1740 1361 -c 1751 1361 1761 1351 1761 1340 -c C [_^M_][_$_]
+ O 317 VM?[_^M_][_$_]
+1 12422 59 <0001000a0000054c05ba000b00f6406c080b380b680b880b980b05070537[_^M_][_$_]
+05670597050409020504050203020106010809080b0a0b0007000201020b[_^M_][_$_]
+000b03030a050605080708040409070106018100071400000709030a0381[_^M_][_$_]
+040914040409070627066706770604080428046804780404010603040a40[_^M_][_$_]
+13163606b8ffc040381216360a0a2a0a020a002a00020506250602050425[_^M_][_$_]
+04020b030a060a0600040d0070020c046d02e90d01580d01a80db80df80d[_^M_][_$_]
+03470d01005f5d5d715d2b2b0111123939182f2f5f5e5d5d5d5d2b2b002f[_^M_][_$_]
+3f5f5d5d313087052e4d2b877dc4872e182b877dc4871008c008c0871008[_^M_][_$_]
+c008c0871008c008c0871008c008c0015f5e5d5d21230901230901330901[_^M_][_$_]
+3301054ceefe4efe4cee0233fe05ed017b017dedfe03026dfd93030402b6[_^M_][_$_]
+fde2021efd4a>/TTE1CD9F20t00 AddT42Char [_^M_][_$_]
+/TTE1CD9F20t00 findfont /CharStrings get begin[_^M_][_$_]
+/X 59 def[_^M_][_$_]
+end[_^M_][_$_]
+/TTE1CD9F20t00 findfont /Encoding get[_^M_][_$_]
+dup 24 /X put[_^M_][_$_]
+pop[_^M_][_$_]
+1163 869 M <08180A06080E0E0F1201070208090A0B0C0208>S [_$_]
+N 2017 846 M 2017 834 2007 824 1996 824 -c 1984 824 1974 834 1974 846 -c 1974 857 1984 867 1996 867 -c 2007 867 2017 857 2017 846 -c C [_^M_][_$_]
+ O 575 1113 M <0208090A0B0C0208>S [_$_]
+N 979 1090 M 979 1078 970 1068 958 1068 -c 947 1068 937 1078 937 1090 -c 937 1101 947 1111 958 1111 -c 970 1111 979 1101 979 1090 -c C [_^M_][_$_]
+ O LH[_^M_][_$_]
+(%%[Page: 1]%%) = [_^M_][_$_]
+%%PageTrailer[_^M_][_$_]
+[_^M_][_$_]
+%%Trailer[_^M_][_$_]
+%%DocumentNeededResources: [_^M_][_$_]
+%%DocumentSuppliedResources: [_^M_][_$_]
+%%+ procset Pscript_WinNT_ErrorHandler 5.0 0[_^M_][_$_]
+%%+ procset Pscript_FatalError 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Win_Basic 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Win_Utils_L2 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Win_GdiObject 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Win_GdiObject_L3 5.0 0[_^M_][_$_]
+%%+ procset Pscript_T42Hdr 5.0 0[_^M_][_$_]
+%%+ procset Pscript_Text 5.0 0[_^M_][_$_]
+Pscript_WinNT_Incr dup /terminate get exec[_^M_][_$_]
+ehsave restore[_^M_][_$_]
+(%%[LastPage]%%) = [_^M_][_$_]
+%%EOF[_^M_][_$_]
addfile ./docs/html/images/unif-templ-hier.sxd
binary ./docs/html/images/unif-templ-hier.sxd
addfile ./docs/html/index.html
hunk ./docs/html/index.html 1
+<html>
+ <head>
+ <title>CL Unification</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Extensions: UNIFICATION</i><string>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link-selected">Home</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> <div class="sidebar"></div></td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>Common Lisp Extensions: UNIFICATION</h1>
+
+
+ <em>
+ <p>
+ <b>DISCLAIMER:</b> The code associated to these documents is not
+ completely tested and it is bound to contain errors and omissions.
+ This documentation may contain errors and omissions as well.</p>
+
+ <p>Finally, the license under which the code is released is not
+ settled yet, although the file <tt>COPYING</tt> contains a
+ Berkeley-style license. For the time being you are advised to use
+ the code at your own risk. No warranty whatsoever is provided, the
+ author will not be held responsible for any effect generated by your
+ use of the library, and you can put here the scarier extra
+ disclaimer you can think of.
+ </p>
+ </em>
+
+ <p>The notion of <em>unification</em> originated in the field of
+ formal logic (e.g. <a href="#R65">[R65]</a>,) and has been used
+ extensively in Computer Science and Programming Languages. Most
+ notably, <strong>Prolog</strong> uses the full power of
+ unification.</p>
+
+ <p>
+ Unification is also at the core of <em>type checking</em> algorithms
+ in the tradition of Milner's, and a limited form - <em>pattern
+ matching</em> - is available to the user in languages of the ML and
+ Haskell family.</p>
+
+ <p>The library presented in these pages provides a full blown
+ <em>unification framework</em> for <strong>Common Lisp</strong>.</p>
+
+ <p>Writing a pattern matcher or a an unifier in <strong>Common
+ Lisp</strong> is easy, as long as we limit ourselves to manipulate
+ only ATOMs and CONSes.</p>
+
+ <p>Alas, it would be much nicer if we could manipulate arbitrary
+ <strong>Common Lisp</strong> objects as the ML programmer can with
+ arbitrary ML objects.<p>
+
+ <p>The library presented here is the first one (to the best of the
+ author's knowledge) that is capable of manipulating arbitrary
+ <strong>Common Lisp</strong> objects.</p>
+
+ <p>The hope is that this library could be incorporated directly in
+ an implementation in order to provide better type checking.</p>
+
+ <p>This should not come as a surprise, as a compiler like CMUCL does
+ include a type inference engine, which does very similar things.</p>
+
+ <h2>Unification Basics</h2>
+ [_$_]
+ <p>The unification process makes sure that two <em>object
+ descriptions</em> containing some <em>holes</em>
+ - i.e. <em>variables</em> - can be made equal (almost in the EQUALP
+ sense) by assigning <em>consistent</em> values to the variables
+ involved.</p>
+
+ <p>Suppose we had a function U performing unification and returning
+ a set of <em>variable assignments</em>, often called a
+ <em>substitution</em>. A very simple [_$_]
+ example involving the unification of two numbers could be
+ <pre>
+ <b>U</b>(42, 42) ==> {}
+ </pre>
+ The two numbers are EQL, so no variable is involved and the empty
+ substitution is returned.
+ <pre>
+ <b>U</b>(42, 123) ==> <unification failure>
+ </pre>
+ The two numbers are not EQL, so the unification fails.
+ <pre>
+ <b>U</b>(42, x) ==> {x -> 42}
+ </pre>
+ The only way to make the unification process to succeed is to bind
+ the value 42 to the variable <code>x</code>.</p>
+
+ <p>The UNIFICATION library defines all the necessary functions and a
+ <em>unification sub-language</em> to handle most of <strong>Common
+ Lisp</strong>.</p>
+
+ <h2>UNIFICATION Library</h2>
+
+ <p>The UNIFICATION library has one main entry point, the generic function
+ UNIFY, and a sub-language definition that allows us to talk about
+ <strong>Common Lisp</strong> objects.</p>
+
+ <p>The UNIFY generic function has the following signature:
+ <pre>
+ <b>unify</b> <i>x</i> <i>y</i> &optional <i>substitution</i>
+ </pre>
+ Where <code><i>x</i></code> and <code><i>y</i></code> are either
+ arbitrary <strong>Common Lisp</strong> objects, <em>variables</em>,
+ or <em>object templates</em>. These items constitute the so-called
+ <em>extended terms</em> manipulated by the unification
+ machinery.</p>
+
+ <p><em>Variables</em> are symbols with a <code>#\?</code> as the
+ first character of the name. This is a rather traditional choice,
+ although a different one based on quoted symbols is possible.
+ Therefore, the following are examples of variables.
+ <pre>
+ ?A ?s ?qwe ?42z ?a-variable-with-a-very-long-name ?_
+ </pre>
+ There are two special variables, <code>?_</code> and <code>_</code>,
+ which are used as anonymous place holders, they match anything, but
+ never appear in a substitution.</p>
+
+ <p>Hence, the above examples result in the following
+ <pre>
+ cl-prompt> (<b>unify</b> 42 42)
+ <i>#<EMPTY ENVIRONMENT xxxxxx></i>
+ </pre>
+
+ <pre>
+ cl-prompt> (<b>unify</b> 42 123)
+ ==> error: unification failure
+ </pre>
+
+ <pre>
+ cl-prompt> (<b>unify</b> 42 ?x)
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?x *)
+ <i>42</i>
+ </pre>
+ </p>
+ Where FIND-VARIABLE-VALUE is the accessor used to find the value of
+ a variable in a substitution.</p>
+
+ <p>As a more complicated example, consider the usual CONS based
+ unification
+ <pre>
+ cl-prompt> (<b>unify</b> '(foo (bar frobboz) ?baz) '(foo ?gnao 42))
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?gnao *)
+ <i>(BAR FROBBOZ)</i>
+
+ cl-prompt> (<b>find-variable-value</b> '?baz **)
+ <i>42</i>
+ </pre>
+
+ <p>Of course note the following behavior
+ <pre>
+ cl-prompt> (<b>unify</b> '(foo ?x 42) '(foo 42 ?x))
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>unify</b> '(foo ?x 42) '(foo baz ?x))
+ ==> error: unification failure
+ </pre>
+ </p>
+ [_$_]
+
+ <p>UNIFY works also on arrays and vectors. Strings are treated as
+ atomic objects
+ <pre>
+ cl-prompt> (<b>unify</b> #(1 2 3) #(1 ?x ?y))
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?x *)
+ <i>2</i>
+ </pre>
+
+ <pre>
+ cl-prompt> (<b>unify</b> #2A((1 2 3) (a s ?z)) #2A((1 ?x ?y) (a s d)))
+ <i>#<ENVIRONMENT xxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?z *)
+ <i>D</i>
+ </pre>
+ </p>
+
+ <p>So far so good, but how can you unify two structures? First of
+ all there is no portable way (yet) to list all the slots of a given
+ structure. Secondly, by allowing the unification of arbitrary
+ CONSes, we have created a short-circuit in the unification
+ machinery.</p>
+
+ <p>Dealing with object instances raises similar problems.</p>
+
+ <p>Suppose we have the following definition
+ <pre>
+ (defstruct foo a s d)
+ </pre>
+ The straightforward
+ <pre>
+ (<b>unify</b> #S(FOO A 42 S NIL D NIL) (make-foo :a 42))
+ </pre>
+ cannot be built portably, besides, we do not even have the equivalent of the
+ <code>#S(...)</code> notation for regular CLOS objects. Moreover we want
+ to do other things with other data types.</p>
+
+ <p>A simple solution is to define a <em>template sub-language</em>
+ to express unifications between structure objects or standard
+ objects (and other data types as well.) Nevertheless, the
+ definition of such sub-language cannot be CONS based, because in
+ such case, we would conflate arbitrary CONSes and the expressions of
+ the sub-language.</p>
+
+ <p>To circumvent this problem we resort to the usual trick a ML
+ programmer uses to placate the type-checker: we introduce an
+ "intermediate" data type. Essentially the following
+ <pre>
+ (defclass <b>template</b> ()
+ ((spec :accessor template-spec :type (or cons symbol number) ...)))
+ </pre>
+ </p>
+
+ <p>The TEMPLATE class is accompanied by a reader macro
+ (<code>#T</code> for <em>template</em>, or <em>type</em>, with an
+ abuse of language) and an
+ appropriate PRINT-OBJECT method. The <code>#T</code> reader macro
+ expands as
+ <pre>
+ <b>#T</b><i>something</i> ==> (make-instance 'template :spec <i>something</i>)
+ </pre>
+ With this infrastructure we can
+ express the unification of the FOO instance as
+ <pre>
+ (<b>unify</b> #S(FOO A 42 S NIL D NIL) <b>#T(foo foo-a 42)</b>)
+ </pre>
+ I.e. we use the actual structure accessor FOO-A to get to the the
+ value of the slot A in a FOO. This is an example of the template
+ language.</p>
+
+ <p>A more interesting example, which involves vectors is the
+ following
+ <pre>
+ cl-prompt> (<b>unify</b> #(1 2 3 4 5) <b>#T(vector 1 ?x &rest ?rest)</b>) ; You get the idea...
+ <i>#<ENVIRONMENT xxxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?rest *)
+ <i>#(3 4 5)</i>
+ </pre>
+ I.e. we have a DESTRUCTURING-BIND on steroids.<p>
+
+ <p>Note that separating the templates is necessary if we want to do
+ something like
+ <pre>
+ cl-prompt> (<b>unify</b> '(1 2 3 4 5) <b>#T(list 1 ?x &rest ?rest)</b>)
+ <i>#<ENVIRONMENT xxxxxxx></i>
+
+ cl-prompt> (<b>find-variable-value</b> '?rest *)
+ <i>(3 4 5)</i>
+ </pre>
+ Without the template denoted by <code>#T(list ...)</code> the
+ unifier would have been utterly confused.</p>
+
+ <p>In the following the full extent of the UNIFICATION facility is
+ described in its main components.
+ </p>
+
+
+ <h2><a href="unifying-substitutions.html">Unifying Substitutions</a></h2>
+
+ <h2><a href="templates.html">The Template Sub-language</a></h2>
+
+ <h2><a href="control-flow.html">Control Flow</a></h2>
+
+ <h2><a href="unification-dictionary.html">The UNIFICATION
+ Dictionary</a></h2>
+
+ <h2>References</h2>
+
+ <p>
+ <a name="R65">[R56]</a> J. A. Robinson, <i>A machine-oriented logic based on the
+ resolution principle</i>, Journal of the ACM, Vol. 12, No. 1,
+ January 1965, Pages 23--49.</p>
+ [_$_]
+
+<!--
+;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;;
+;;; Permission to use, modify, and redistribute this code is hereby
+;;; granted.
+;;; The code is provided AS IS with NO warranty whatsoever. The author
+;;; will not be held liable etc etc etc etc etc.
+-->
+
+ <h2>Site Map</h2>
+
+
+ <p>Enjoy!</p>
+
+
+
+ <hr>
+ <p>Questions? Queries? Suggestions? Comments? Please direct them
+ at <a href="mailto:marcoxa_PROVA_A_SPAMMARME@alu.org">me</a>.
+ </p>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-11-04</strong><br>
+ Updated.
+ <li><strong>2004-05-05</strong><br>
+ Started the site.
+ </li>
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/links.html
hunk ./docs/html/links.html 1
+<html>
+ <head>
+ <title>CLRFI: COMMON LISP Requests for Improvements Links</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CLRFI: Common Lisp Requests for Improvements Links</i><string>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="doc.html" class="navigation-link">Documents</a>
+ | <a href="faq.html" class="navigation-link">FAQ</a>
+ | <a href="clrfis.html" class="navigation-link">CLRFI listing</a>
+ | <a href="links.html" class="navigation-link-selected">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>Links</h1>
+
+ <p>Here are some links which are pertinent to the CLRFI project.</p>
+
+ <ul>
+ <li><a href="http://srfi.schemers.org">SRFI</a></li>
+
+ <li>Local <strong>Common Lisp</strong> user communities
+ <ul>
+ <li><a href="http://www.lispnyc.org">LispNYC</a></li>
+ <li><a href="http://www.jugtouch.com/~rss/lisp">CRACL</a></li>
+ </ul>
+ </li>
+
+ <li>Software Repositories
+ <ul>
+ <li><a href="http://www.common-lisp.net">common-lisp.net</a></li>
+ <li>...</li>
+ </ul>
+ </li>
+ <li>...</li>
+ </ul>
+
+<!--
+;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;;
+;;; Permission to use, modify, and redistribute this code is hereby
+;;; granted.
+;;; The code is provided AS IS with NO warranty whatsoever. The author
+;;; will not be held liable etc etc etc etc etc.
+-->
+
+
+ <hr>
+ <p>Questions? Queries? Suggestions? Comments? Please direct them
+ at <a href="mailto:marcoxa_PROVA_A_SPAMMARME@alu.org">me</a>.
+ </p>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-04-12</strong><br>
+ Started the site.
+ </li>
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/list-template-class.html
hunk ./docs/html/list-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class LIST-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class LIST-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>LIST-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ LIST-TEMPLATE, SEQUENCE-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The LIST-TEMPLATE class denotes those object that are used
+ to unify against a LIST.</p>
+
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>list</b> . <i><destructuring template lambda list></i>)
+ </pre>
+ </p>
+
+ <p>The LIST-TEMPLATE syntax denotes a LIST object. A
+ LIST-TEMPLATE must be unified against a LIST object. The elements
+ of the list must be unified against the
+ <i><destructuring template lambda list></i>
+ [_$_]
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify '(0 1 42 3 4 5) #T(<b>list</b> 0 1 ?x 3 4 5)))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setq e (unify '(0 1 42 3 4 5) #T(<b>list</b> 0 1 "FOO" 3 4 5)))
+ --> Error: UNIFICATION-FAILURE
+
+ cl-prompt> (setq e (unify '("foo" "bar" 42)) #T(<b>list</b> _ _ ?x))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setq e (unify #(1 2 3) #T(<b>list</b> _ &rest ?x)))
+ --> Error: UNIFICATION-FAILURE
+
+ cl-prompt> (setq e (unify (list "foo" '?foo 42)) #T(<b>list</b> _ 33 ?x))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (find-variable-value '?foo e)
+ 33
+ T
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying a LIST-TEMPLATE against a non-LIST object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>Unifying a LIST-TEMPLATE against a non-proper or circular list has undefined behavior.</p>
+
+ <p>The LIST-TEMPLATE class is the only one that is really needed in
+ order not to implode the overall unification machinery. But, since
+ it is needed, then it is worthwhile to build the whole template
+ hierarchy.</p>
+
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/mailing-lists.html
hunk ./docs/html/mailing-lists.html 1
+<html>
+ <head>
+ <title>CL Unification Mailing Lists Page</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Extensions: UNIFICATION</i><string>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="downloads.html" class="navigation-link-selected">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> <div class="sidebar"></div></td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>CL-UNIFICATION Mailing Lists</h1>
+
+
+ <p>There are three mailing lists set up at
+ <a href="http://common-lisp.net">common-lisp.net</a>.
+ <ul>
+ <li><a
+ href="http://common-lisp.net/cgi-bin/mailman/listinfo/cl-unification-announce">cl-unification-announce</a>:
+ low traffic mailing list for announcements about the library.</li>
+ <li><a
+ href="http://common-lisp.net/cgi-bin/mailman/listinfo/cl-unification-devel">cl-unification-devel</a>:
+ mailing list to discuss the development of the library.</li>
+ <li><a
+ href="http://common-lisp.net/cgi-bin/mailman/listinfo/cl-unification-cvs">cl-unification-cvs</a>:
+ CVS notifications.</li>
+ </ul>
+
+
+
+
+
+ [_$_]
+
+<!--
+;;; Copyright (c) 2004-2005 Marco Antoniotti, All rigths reserved.
+;;;
+;;; Permission to use, modify, and redistribute this code is hereby
+;;; granted.
+;;; The code is provided AS IS with NO warranty whatsoever. The author
+;;; will not be held liable etc etc etc etc etc.
+-->
+
+<!-- <h2>Site Map</h2> -->
+
+
+ <p>Enjoy!</p>
+
+
+
+ <hr>
+ <p>Questions? Queries? Suggestions? Comments? Please direct them
+ at <a href="mailto:marcoxa_PROVA_A_SPAMMARME@alu.org">me</a>.
+ </p>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2005-01-28</strong><br>
+ Updated.
+ <li><strong>2004-05-05</strong><br>
+ Started the site.
+ </li>
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/main.css
hunk ./docs/html/main.css 1
+/*[_^M_][_$_]
+ * NYU Bioinformatics - Microarray group development[_^M_][_$_]
+ *[_^M_][_$_]
+ * Inspired by www.rhythmbox.org, (c) rhythmbox 2002[_^M_][_$_]
+ *[_^M_][_$_]
+ * New code, modifications[_^M_][_$_]
+ * (c) Idan Gazit 2002, and[_^M_][_$_]
+ * (c) Marco Antoniotti, 2003-2004[_^M_][_$_]
+ * NYU Bioinformatics[_^M_][_$_]
+ *[_^M_][_$_]
+ * Permission is hereby granted to use this style, etc etc etc.[_^M_][_$_]
+ */[_^M_][_$_]
+[_^M_][_$_]
+body[_^M_][_$_]
+{[_^M_][_$_]
+ margin: 0;[_^M_][_$_]
+ background: #ffffff;[_^M_][_$_]
+ font-family: Verdana, Arial, Helvetica;[_^M_][_$_]
+ /*font-size:12px;*/[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+ color:black;[_^M_][_$_]
+[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+a.navigation-link-selected[_^M_][_$_]
+{[_^M_][_$_]
+ text-decoration: none;[_^M_][_$_]
+ color: #ffffff;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+ font-style: italic;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+a.navigation-link-selected:hover[_^M_][_$_]
+{[_^M_][_$_]
+ text-decoration: underline;[_^M_][_$_]
+ color: #ffffff;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+ font-style: italic;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+a.navigation-link[_^M_][_$_]
+{[_^M_][_$_]
+ text-decoration: none;[_^M_][_$_]
+ color: rgb(100, 100, 100);[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+a.navigation-link:hover[_^M_][_$_]
+{[_^M_][_$_]
+ text-decoration: underline;[_^M_][_$_]
+ color: #ffffff;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+a.return[_^M_][_$_]
+{[_^M_][_$_]
+ text-decoration: none;[_^M_][_$_]
+ color: #41286f;[_^M_][_$_]
+ font-size: 8pt;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+a.return:hover;[_^M_][_$_]
+{[_^M_][_$_]
+ text-decoration: underline;[_^M_][_$_]
+ color: #68548D;[_^M_][_$_]
+ font-size: 8pt;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+a[_^M_][_$_]
+{[_^M_][_$_]
+ text-decoration: underline;[_^M_][_$_]
+ color: #41286f;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+a:hover[_^M_][_$_]
+{[_^M_][_$_]
+ text-decoration: underline;[_^M_][_$_]
+ color: #68548D;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+p[_^M_][_$_]
+{[_^M_][_$_]
+ font-family: Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size: 12px;[_^M_][_$_]
+ color: #000000;[_^M_][_$_]
+ font-weight: regular;[_^M_][_$_]
+ /* padding-bottom: 10px;[_^M_][_$_]
+ margin: 0px; */[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.header[_^M_][_$_]
+{[_^M_][_$_]
+ background: #9ebcb4;[_^M_][_$_]
+ /* background-image: url("./images/header_bg_1.gif"); */[_^M_][_$_]
+ background-repeat: no-repeat;[_^M_][_$_]
+ height: 50px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.navigation[_^M_][_$_]
+{[_^M_][_$_]
+ word-spacing: 5px;[_^M_][_$_]
+ position: absolute;[_^M_][_$_]
+ top: 35px;[_^M_][_$_]
+ right: 5px;[_^M_][_$_]
+ text-align: right;[_^M_][_$_]
+ font-family: Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size: 12px;[_^M_][_$_]
+ color: #ffffff;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+ word-spacing: 0px;[_^M_][_$_]
+ }[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+.sidebar[_^M_][_$_]
+{[_^M_][_$_]
+ font-family: Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size: 12px;[_^M_][_$_]
+ color: #000000;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+ padding-left: 15px;[_^M_][_$_]
+ padding-right: 5px;[_^M_][_$_]
+ position: fixed;[_^M_][_$_]
+ top: 10ex; right 1em;[_^M_][_$_]
+[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.text[_^M_][_$_]
+{[_^M_][_$_]
+ font-family: Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size: 12px;[_^M_][_$_]
+ color: #000000;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+li[_^M_][_$_]
+{[_^M_][_$_]
+ font-family: Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size: 12px;[_^M_][_$_]
+ color: #000000;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+pre[_^M_][_$_]
+{[_^M_][_$_]
+ background: 5px;[_^M_][_$_]
+ background-color: #e0e0e0;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+.label[_^M_][_$_]
+{[_^M_][_$_]
+ font-family: Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size: 12px;[_^M_][_$_]
+ color: #000000;[_^M_][_$_]
+ text-align: center;[_^M_][_$_]
+ font-style: italic;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.command[_^M_][_$_]
+{[_^M_][_$_]
+ font-family: Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size: 12px;[_^M_][_$_]
+ color: #000000;[_^M_][_$_]
+ background: #eae8e3;[_^M_][_$_]
+ font-weight: regular;[_^M_][_$_]
+ margin-bottom: 10px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.content[_^M_][_$_]
+{[_^M_][_$_]
+ background: #ffffff;[_^M_][_$_]
+ padding: 5px;[_^M_][_$_]
+ padding-right: 15px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.toc[_^M_][_$_]
+{[_^M_][_$_]
+ font-size: 10px;[_^M_][_$_]
+ background: #ffffff;[_^M_][_$_]
+ padding: 5px;[_^M_][_$_]
+ padding-right: 5px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.middle-bar[_^M_][_$_]
+{[_^M_][_$_]
+ height: 5px;[_^M_][_$_]
+ background: #A497BA;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.black-line[_^M_][_$_]
+{[_^M_][_$_]
+ height: 1px;[_^M_][_$_]
+ background: #000000;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.bottom[_^M_][_$_]
+{[_^M_][_$_]
+ position: absolute;[_^M_][_$_]
+ right: 5px;[_^M_][_$_]
+ bottom: 5px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.copyright[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size: 10px;[_^M_][_$_]
+ color: #808080;[_^M_][_$_]
+ font-weight: regular;[_^M_][_$_]
+ padding:5px;[_^M_][_$_]
+ text-align:right;[_^M_][_$_]
+ border-color:#808080;[_^M_][_$_]
+ border-width:0px;[_^M_][_$_]
+ border-style:dotted;[_^M_][_$_]
+ border-top-width:1px;[_^M_][_$_]
+ [_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.centerblock[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size: 12px;[_^M_][_$_]
+ color: black;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.tableheader[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size:12px;[_^M_][_$_]
+ color: white;[_^M_][_$_]
+ font-weight:bold;[_^M_][_$_]
+ background:#505050;[_^M_][_$_]
+ padding: 4px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.tablerow1[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size:12px;[_^M_][_$_]
+ color: black;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+ background:#e0e0e0;[_^M_][_$_]
+ padding:4px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.tablerow2[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size:12px;[_^M_][_$_]
+ color: black;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+ background:#f0f0f0;[_^M_][_$_]
+ padding: 4px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.tablerow_style[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size:12px;[_^M_][_$_]
+ color: black;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+ background:#f0f0f0;[_^M_][_$_]
+ padding: 4px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+h1[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size:18px;[_^M_][_$_]
+ color: #41286f;[_^M_][_$_]
+ font-weight:bold;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+h2[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size:16px;[_^M_][_$_]
+ color: #41286f;[_^M_][_$_]
+ font-weight:bold;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+h3[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size:14px;[_^M_][_$_]
+ color: #41286f;[_^M_][_$_]
+ font-weight:bold;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+h4[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size:12px;[_^M_][_$_]
+ color: #41286f;[_^M_][_$_]
+ font-weight:bold;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+h5[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Verdana, Arial, Helvetica;[_^M_][_$_]
+ font-size:10px;[_^M_][_$_]
+ color: #41286f;[_^M_][_$_]
+ font-weight:bold;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.captionimg[_^M_][_$_]
+{[_^M_][_$_]
+ align:right;[_^M_][_$_]
+ text-align:right;[_^M_][_$_]
+ font-style: italic;[_^M_][_$_]
+ font-weight: normal;[_^M_][_$_]
+ font-size:10px;[_^M_][_$_]
+ color: #303030;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.indent[_^M_][_$_]
+{[_^M_][_$_]
+ padding-left: 50px;[_^M_][_$_]
+}[_^M_][_$_]
+[_^M_][_$_]
+.command[_^M_][_$_]
+{[_^M_][_$_]
+ font-family:Courier;[_^M_][_$_]
+}[_^M_][_$_]
addfile ./docs/html/make-empty-environment-function.html
hunk ./docs/html/make-empty-environment-function.html 1
+<html>
+ <head>
+ <title>CL Unification: Function MAKE-EMPTY-ENVIRONMENT</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Function MAKE-EMPTY-ENVIRONMENT</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Function</i> <strong>MAKE-EMPTY-ENVIRONMENT</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+ <p>
+ <pre>
+ <b>make-empty-environment</b>
+ => <i>unification-environment</i>
+ </pre>
+ </p>
+
+ <h3>Arguments and Values:</h3>
+
+ <p><i><code>unification-environment</code></i>---a fresh <i>unification-environment</i>
+
+
+
+ <h2>Description:</h2>
+
+ <p>The function MAKE-EMPTY-ENVIRONMENT constructs a new
+ object of type UNIFY:ENVIRONMENT. The new
+ <i>unification-environment</i> is empty, i.e. it does not contain
+ any <em>binding</em>.
+ [_$_]
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY:ENVIRONMENT, BINDING, FIND-VARIABLE-VALUE</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-04-12</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/make-shared-environment-function.html
hunk ./docs/html/make-shared-environment-function.html 1
+<html>
+ <head>
+ <title>CL Unification: Function MAKE-SHARED-ENVIRONMENT</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Function MAKE-SHARED-ENVIRONMENT</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Function</i> <strong>MAKE-SHARED-ENVIRONMENT</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+ <p>
+ <pre>
+ <b>make-shared-environment</b> <i>env</i>
+ => <i>unification-environment</i>
+ </pre>
+ </p>
+
+ <h3>Arguments and Values:</h3>
+
+ <p><i><code>env</code></i>---an <i>unification-environment</i>.
+ <p><i><code>unification-environment</code></i>---a new <i>unification-environment</i>.
+
+
+
+ <h2>Description:</h2>
+
+ <p>The function MAKE-SHARED-ENVIRONMENT constructs a new
+ object of type UNIFY:ENVIRONMENT. The new
+ <i>unification-environment</i> shares the frames already present in <i>env</i>.</p>
+
+ <p>It is guaranteed that extending <i>unification-environment</i>
+ will not change <i>env</i>.</p>
+ [_$_]
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY:ENVIRONMENT, BINDING, FIND-VARIABLE-VALUE</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>This function is provided to allow for the construction of
+ "trees" of frames for interpreter-like environments. The macros
+ MATCH, MATCHING, and MATCH-CASE rely on this function, as they
+ immediately construct a "shared" environment.</p>
+
+ <h3>Current Implementation Note</h3>
+
+ <p>MAKE-SHARED-ENVIRONMENT relies on the LIST implementation of
+ environments.</p>
+
+ <p>The use of MAKE-SHARED-ENVIRONMENT in MATCHING and MATDCH-CASE is
+ still incomplete.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-11-04</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/match-case-macro.html
hunk ./docs/html/match-case-macro.html 1
+<html>
+ <head>
+ <title>CL Unification: Macro MATCH-CASE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Macro MATCH-CASE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Macro</i> <strong>MATCH-CASE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+
+ <p>
+ <pre>
+ <b>match-case</b> (<i>object</i> &key <i>errorp</i>) <clause>*</i>
+ => <i>results</i>*
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ <clause> ::= <regular clause> | <default clause>
+ <regular clause> ::= (<i>template</i> &body <i>forms</i>)
+ <default clause> ::= (t &body <i>forms</i>)
+ | (otherwise &body <i>forms</i>)
+ </pre>
+ </p>
+
+ <h3>Arguments and Values:</h3>
+
+ <p><i><code>template</code></i>---a <i>unification template</i>
+ <p><i><code>object</code></i>---an <i>object</i>
+ <p><i><code>substitution</code></i>---a <i>substitution</i>
+ <p><i><code>errorp</code></i>---a <i>generalized boolean</i>
+ <p><i><code>error-value</code></i>---an <i>object</i>
+ <p><i><code>forms</code></i>---an <i>implicit progn</i>
+ <p><i><code>results</code></i>---the <i>values</i> returned by <i>forms</i>
+
+
+
+
+ <h2>Description:</h2>
+
+ <p>MATCH-CASE sets up a CASE-like environment for multiple template matching clauses.
+ Each clause evaluates its forms in an environment where the variables
+ present in the template are bound lexically. Note that both variable
+ names '?FOO' and 'FOO' are bound for convenience.</p>
+
+ <p>The values returned by the MATCH-CASE form are those of the last form in
+ the first clause that satisfies the match test. I.e. the first
+ clause for which the <i>template</i> UNIFYes against <i>object</i>.</p>
+
+ <p>If <i>errorp</i> is non-NIL then if none of the regular clauses matches, then
+ an error of type UNIFICATION-NON-EXHAUSTIVE is signalled, regardless of
+ any default clause. Otherwise, the default clause behaves as a
+ standard COND default clause. The default value of <i>errorp</i> is NIL.</p>
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>See above.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY, UNIFICATION-FAILURE, UNIFICATION-NON-EXHAUSTIVE</p>
+
+ <h2>Notes:</h2>
+
+ <p>Note that UNIFICATION-FAILUREs
+ raising from the evaluation of <i>forms</i> in each clause will
+ <em>not</em> be caught and handled by the enclosing MATCH-CASE block.</p>
+
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- usci-variable.html -->
addfile ./docs/html/match-macro.html
hunk ./docs/html/match-macro.html 1
+<html>
+ <head>
+ <title>CL Unification: Macro MATCH</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Macro MATCH</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Macro</i> <strong>MATCH</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+
+ <p>
+ <pre>
+ <b>match</b> (<i>template</i> <i>object</i> &key <i>substitution</i> <i>errorp</i> <i>error-value</i>) &body <i>forms</i>
+ => <i>results</i>*
+ </pre>
+ </p>
+
+ <h3>Arguments and Values:</h3>
+
+ <p><i><code>template</code></i>---a <i>unification template</i>
+ <p><i><code>object</code></i>---an <i>object</i>
+ <p><i><code>substitution</code></i>---a <i>substitution</i>
+ <p><i><code>errorp</code></i>---a <i>generalized boolean</i>
+ <p><i><code>error-value</code></i>---an <i>object</i>
+ <p><i><code>forms</code></i>---an <i>implicit progn</i>
+ <p><i><code>results</code></i>---the <i>values</i> returned by <i>forms</i>
+
+
+
+
+ <h2>Description:</h2>
+
+ <p>
+ MATCH sets up a lexical environment to evaluate <i>forms</i> after a unification operation.
+ MATCH unifies a <i>template</i> and an <i>object</i> and then sets up a lexical
+ environment where the variables present in the template are bound
+ lexically. Note that both variable names '?FOO' and 'FOO' are bound
+ for convenience.</p>
+
+ <p>The MATCH form returns the values returned by the evaluation of the
+ last of the <i>forms</i>.</p>
+
+ <p>If <i>errorp</i> is non-NIL (the default) then the form raises a
+ UNIFICATION-FAILURE, otherwise the result of evaluating <i>error-value</i>,
+ whose default is NIL is returned.</p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>See above.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY, UNIFICATION-FAILURE</p>
+
+ <h2>Notes:</h2>
+
+ <p>Note that UNIFICATION-FAILUREs
+ raising from the evaluation of <i>forms</i> will also be caught and handled by the enclosing MATCH
+ according to <i>errorp</i> settings.</p>
+
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- usci-variable.html -->
addfile ./docs/html/matching-macro.html
hunk ./docs/html/matching-macro.html 1
+<html>
+ <head>
+ <title>CL Unification: Macro MATCHING</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Macro MATCHING</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Macro</i> <strong>MATCHING</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+
+ <p>
+ <pre>
+ <b>matching</b> (&key <i>errorp</i>) <clause>*</i>
+ => <i>results</i>*
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ <clause> ::= <regular clause> | <default clause>
+ <regular clause> ::= ((<i>template</i> <i>object</i>) &body <i>forms</i>)
+ <default clause> ::= (t &body <i>forms</i>)
+ | (otherwise &body <i>forms</i>)
+ </pre>
+ </p>
+
+ <h3>Arguments and Values:</h3>
+
+ <p><i><code>template</code></i>---a <i>unification template</i>
+ <p><i><code>object</code></i>---an <i>object</i>
+ <p><i><code>substitution</code></i>---a <i>substitution</i>
+ <p><i><code>errorp</code></i>---a <i>generalized boolean</i>
+ <p><i><code>error-value</code></i>---an <i>object</i>
+ <p><i><code>forms</code></i>---an <i>implicit progn</i>
+ <p><i><code>results</code></i>---the <i>values</i> returned by <i>forms</i>
+
+
+
+
+ <h2>Description:</h2>
+
+ <p>MATCHING sets up a COND-like environment for multiple template matching clauses.
+ Each clause evaluates its forms in an environment where the variables
+ present in the template are bound lexically. Note that both variable
+ names '?FOO' and 'FOO' are bound for convenience.</p>
+
+ <p>The values returned by the MATCHING form are those of the last form in
+ the first clause that satisfies the match test.</p>
+
+ <p>If <i>errorp</i> is non-NIL then if none of the regular clauses matches, then
+ an error of type UNIFICATION-NON-EXHAUSTIVE is signalled, regardless of
+ any default clause. Otherwise, the default clause behaves as a
+ standard COND default clause. The default value of <i>errorp</i> is NIL.</p>
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>See above.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY, UNIFICATION-FAILURE, UNIFICATION-NON-EXHAUSTIVE</p>
+
+ <h2>Notes:</h2>
+
+ <p>Note that UNIFICATION-FAILUREs
+ raising from the evaluation of <i>forms</i> in each clause will
+ <em>not</em> be caught and handled by the enclosing MATCHING block..</p>
+
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- usci-variable.html -->
addfile ./docs/html/nil-template-class.html
hunk ./docs/html/nil-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class NIL-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class NIL-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>NIL-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ NIL-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The NIL-TEMPLATE class denotes those object that are used
+ to unify against a VECTOR.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #Tnil
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ #T()
+ </pre>
+ </p>
+
+
+ <p>The NIL-TEMPLATE syntax denotes NIL.
+ NIL-TEMPLATE can only unified against NIL.</p>
+
+ <p>The NIL-TEMPLATE is used for symmetry reasons, given that the
+ template hierarchy (almost) mirrors the regular <strong>CL</strong>
+ type hierarchy.</p>
+ [_$_]
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify nil #Tnil))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (setq e (unify 42 #T()))
+ --> Error: UNIFICATION-FAILURE
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an NIL-TEMPLATE against a non-NIL object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/nth-template-class.html
hunk ./docs/html/nth-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class NTH-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class NTH-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>NTH-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ NTH-TEMPLATE, ELEMENT-TEMPLATE, EXPRESSION-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The NTH-TEMPLATE class denotes those object that are used
+ to unify against a particular element of a LIST.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>nth</b> <i>index</i> <i>item</i>)
+ </pre>
+ </p>
+
+ <p>The NTH-TEMPLATE syntax denotes the <i>item</i> at <i>index</i>
+ a LIST. A NTH-TEMPLATE must
+ be unified against a LIST object. <i>item</i> is <em>unified</em>
+ against the element extracted from the sequence object at
+ <i>index</i> by the standard function NTH.</p>
+
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify '(0 1 42 3 4 5) #T(<b>nth</b> 2 ?x)))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ 42
+
+ cl-prompt> (setq e (unify '(0 1 42 3 4 5) #T(<b>nth</b> 42 ?x)))
+ --> Error: index 42 out of bounds. <STRONG>FIX THIS</STRONG>
+
+
+ cl-prompt> (setq e (unify #(a s d) #T(<b>nth</b> 1 ?x)))
+ --> Error: UNIFICATION-FAILURE
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an NTH-TEMPLATE against a non-LIST object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/nthcdr-template-class.html
hunk ./docs/html/nthcdr-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class NTHCDR-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class NTHCDR-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>NTHCDR-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ NTHCDR-TEMPLATE, ELEMENT-TEMPLATE, EXPRESSION-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The NTHCDR-TEMPLATE class denotes those object that are used
+ to unify against a particular CONS of a LIST.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>nthcdr</b> <i>index</i> <i>item</i>)
+ </pre>
+ </p>
+
+ <p>The NTHCDR-TEMPLATE syntax denotes the CONS <i>item</i> at <i>index</i>
+ a LIST. A NTHCDR-TEMPLATE must
+ be unified against a LIST object. <i>item</i> is <em>unified</em>
+ against the element extracted from the LIST object at
+ <i>index</i> by the standard function NTHCDR.</p>
+
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify '(0 1 42 3 4 5) #T(<b>nthcdr</b> 2 ?x)))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ (42 3 4 5)
+
+ cl-prompt> (setq e (unify '(0 1 42 3 4 5) #T(<b>nthcdr</b> 42 ?x)))
+ --> Error: index 42 out of bounds. <STRONG>FIX THIS</STRONG>
+
+
+ cl-prompt> (setq e (unify #(a s d) #T(<b>nthcdr</b> 1 ?x)))
+ --> Error: UNIFICATION-FAILURE
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an NTHCDR-TEMPLATE against a non-LIST object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/number-template-class.html
hunk ./docs/html/number-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class NUMBER-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class NUMBER-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>NUMBER-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ NUMBER-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The NUMBER-TEMPLATE class denotes those object that are used
+ to unify against a VECTOR.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T42
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ #T(<b>number</b> 42)
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ #T(<b>number</b> ?num)
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ #T#C(1.2 3.4)
+ </pre>
+ </p>
+
+
+ <p>The NUMBER-TEMPLATE syntax denotes a NUMBER.
+ NUMBER-TEMPLATEs can only unified against a NUMBER.</p>
+
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify 42 #T42))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (setq e (unify 42 #T()))
+ --> Error: UNIFICATION-FAILURE
+
+ cl-prompt> (setf e (unify 42 #T(<b>number</b> ?num)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?num e)
+ 42
+ T
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an NUMBER-TEMPLATE against a non-NUMBER object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>There is no COMPLEX-NUMBER-TEMPLATE class, although a case for it can be easily made..</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/sequence-template-class.html
hunk ./docs/html/sequence-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class SEQUENCE-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class SEQUENCE-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>SEQUENCE-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ SEQUENCE-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ VECTOR-TEMPLATE, LIST-TEMPLATE.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The SEQUENCE-TEMPLATE class denotes those object that are used
+ to unify against a SEQUENCE.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>sequence</b> . <i><destructuring template lambda list></i>)
+ </pre>
+ </p>
+
+ <p>The SEQUENCE-TEMPLATE syntax denotes a SEQUENCE object. A
+ SEQUENCE-TEMPLATE must be unified against a SEQUENCE object. The elements
+ of the sequence must be unified against the
+ <i><destructuring template lambda list></i>
+ [_$_]
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify #(0 1 42 3 4 5) #T(<b>sequence</b> 0 1 ?x 3 4 5)))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setq e (unify #(0 1 42 3 4 5) #T(<b>sequence</b> 0 1 "FOO" 3 4 5)))
+ --> Error: UNIFICATION-FAILURE
+
+ cl-prompt> (setq e (unify #("foo" "bar" 42)) #T(<b>sequence</b> _ _ ?x))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setq e (unify (list "foo" "bar" 42) #T(<b>sequence</b> _ &rest ?x)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ ("bar" 42)
+
+ cl-prompt> (setq e (unify "I am a string" #T(<b>sequence</b> ?I _ &rest ?x)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ "am a string"
+ T
+
+ cl-prompt> (find-variable-value '?I e)
+ #\I
+ T
+
+ cl-prompt> (setq e (unify 42 #T(<b>sequence</b> _ &rest ?x)))
+ --> Error: UNIFICATION-FAILURE
+
+ cl-prompt> (setq e (unify #("foo" ?foo 42)) #T(<b>sequence</b> _ 33 ?x))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (find-variable-value '?foo e)
+ 33
+ T
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an SEQUENCE-TEMPLATE against a non-SEQUENCE object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/standard-object-template-class.html
hunk ./docs/html/standard-object-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class STANDARD-OBJECT-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class STANDARD-OBJECT-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>STANDARD-OBJECT-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ STANDARD-OBJECT-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The STANDARD-OBJECT-TEMPLATE class denotes those object that are used
+ to unify against any STANDARD-OBJECT.</p>
+
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<i><<strong>CL</strong> class designator></i> <i><slot spec></i>*)
+
+ <i><slot spec></i> ::= <i><reader method></i> <i><object></i>
+ | (slot-value <i><slot name></i>) <i><object></i>
+ </pre>
+ </p>
+
+ <p>The STANDARD-OBJECT-TEMPLATE syntax denotes any
+ <strong>CL</strong> object that is an instance of a
+ STANDARD-OBJECT. The semantic of the template in a unification depends on which
+ <i><slot spec></i>'s appear. In the first case the meaning of
+ <i><slot spec></i> is such that the
+ <i><reader method></i> gets called against the instance
+ against which the STANDARD-OBJECT-TEMPLATE is being UNIFYed. In the
+ second case, SLOT-VALUE is called with the instance being UNIFYed
+ and <i><slot name></i>. The result value of the call to either
+ <i><reader method></i>, or SLOT-VALUE is UNIFYed against
+ <i><object></i>.</p>
+
+ <p><i><object></i> can be any <strong>CL</strong> object,
+ including a TEMPLATE (in which case the unification machinery
+ proceeds recursively.)</p>
+ [_$_]
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (defclass foo () ((a :initform 42 :accessor foo-a)))
+ #<STANDARD-CLASS FOO XXXXX>
+
+ cl-prompt> (defclass bar (foo) ())
+ #<STANDARD-CLASS BAR XXXXX>
+
+ cl-prompt> (defclass baz ()
+ ((a :reader the-a-in-a-baz)
+ (b :accessor bazb :initarg :b)))
+ #<STANDARD-CLASS BAZ XXXXX>
+
+ cl-prompt> (setf e (unify (make-instance 'foo) #T(<em>foo</em> <em>foo-a</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (setf e (unify (make-instance 'bar) #T(<em>foo</em> <em>foo-a</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setf e (unify (make-instance 'bar) #T(<em>foo</em> <em>foo-a</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setf e (unify (make-instance 'baz) #T(<em>baz</em> <em>the-a-in-baz</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setf e (unify (make-instance 'baz) #T(<em>baz</em> <em>(slot-value b)</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setf e (unify (make-instance 'baz :b '?e) #T(<em>baz</em> <em>bazb</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setf e (unify (make-instance 'bar) #T(<em>baz</em> <em>foo-a</em> 42)))
+ --> Error: UNIFICATION-FAILURE
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying a STANDARD-OBJECT-TEMPLATE against a non-STANDARD-OBJECT object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+ <p>Unifying a STANDARD-OBJECT-TEMPLATE denoting an instance of class
+ C1 against an instance of class C2, results in
+ an UNIFICATION-FAILURE error being signaled, when C1 is not in the
+ class precedence list of C2.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/string-template-class.html
hunk ./docs/html/string-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class STRING-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class STRING-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>STRING-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ STRING-TEMPLATE, VECTOR-TEMPLATE, SEQUENCE-TEMPLATE, ARRAY-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The STRING-TEMPLATE class denotes those object that are used
+ to unify against a STRING.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>string</b> . <i><destructuring template lambda list></i>)
+ </pre>
+ </p>
+
+
+ <p>The STRING-TEMPLATE syntax denotes a STRING object. A
+ STRING-TEMPLATE must be unified against a CHARACTER VECTOR
+ object. The elements of the string must be unified against the
+ <i><destructuring template lambda list></i></p>
+
+ <p>The <i><destructuring template lambda list></i> has a
+ slight different interpretation in this case, in order to provide
+ more flexibility to the user. Ordinarily, each component appearing
+ in a <i><destructuring template lambda list></i> is unified
+ "element-wise" with the underlying SEQUENCE or ARRAY object. In the
+ case of a STRING-TEMPLATE, each component of the
+ <i><destructuring template lambda list></i> is allowed to be a
+ STRING or a STRING-TEMPLATE itself. The STRING or STRING-TEMPLATE
+ is unified against a subsequence of the CHARACTER VECTOR.</p>
+
+
+
+
+ [_$_]
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify "foobar" #T(<b>string</b> "foob" ?x #\r)))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ #\a
+
+ cl-prompt> (setq e (unify "foobar" #T(<b>string</b> "FOO" #\b #\a #\r)))
+ --> Error: UNIFICATION-FAILURE
+
+ cl-prompt> (setq e (unify "foobar") #T(<b>string</b> _ _ ?x _ _ _))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ #\o
+
+ cl-prompt> (setq e (unify "foobar" #T(<b>string</b> _ &rest ?x)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ "oobar"
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>The value of the variable *UNIFY-STRING-CASE-INSENSITIVE-P*.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an STRING-TEMPLATE against a non CHARACTER VECTOR object
+ results in an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+
+ <h2>Notes:</h2>
+
+ <h3>ARRAY Structural Properties</h3>
+
+ <p>There is no way to "unify" against structural properties of
+ vectors like fill pointers and displacements.</p>
+
+ <h3>Current Implementation Note</h3>
+
+ <p>The STRING-TEMPLATE class and the relevant UNIFY methods have not
+ been implemented yet.</p>
+ [_$_]
+ <p>The actual semantics of the STRING-TEMPLATE class is not
+ completely clear yet.</p>
+
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/structure-object-template-class.html
hunk ./docs/html/structure-object-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class STRUCTURE-OBJECT-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class STRUCTURE-OBJECT-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>STRUCTURE-OBJECT-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ STRUCTURE-OBJECT-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STRUCTURE-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The STRUCTURE-OBJECT-TEMPLATE class denotes those object that are used
+ to unify against any STRUCTURE-OBJECT.</p>
+
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<i><<strong>CL</strong> structure class designator></i> [<i><reader function></i> <i><object></i>]*)
+ </pre>
+ </p>
+
+ <p>The STRUCTURE-OBJECT-TEMPLATE syntax denotes any
+ <strong>CL</strong> object that is an instance of a
+ STRUCTURE-OBJECT. The syntax is such that the <i><reader
+ function></i> gets called against the instance against
+ which the STRUCTURE-OBJECT-TEMPLATE is being UNIFYed.
+ <i><object></i> can be any <strong>CL</strong> object,
+ including a TEMPLATE (in which case the unification machinery
+ proceeds recursively.)</p>
+ [_$_]
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (defstruct foo () (a 42))
+ FOO
+
+ cl-prompt> (defstruct (baz (:include foo)) (b 33))
+ BAZ
+
+ cl-prompt> (setf e (unify (make-foo) #T(<em>foo</em> <em>foo-a</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (setf e (unify (make-baz) #T(<em>foo</em> <em>foo-a</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setf e (unify (make-instance 'bar) #T(<em>foo</em> <em>foo-a</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setf e (unify (make-instance 'baz) #T(<em>baz</em> <em>the-a-in-baz</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setf e (unify (make-instance 'baz :b '?e) #T(<em>baz</em> <em>bazb</em> 42)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (setf e (unify (make-instance 'bar) #T(<em>baz</em> <em>foo-a</em> 42)))
+ --> Error: UNIFICATION-FAILURE
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying a STRUCTURE-OBJECT-TEMPLATE against a non-STRUCTURE-OBJECT object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+ <p>Unifying a STRUCTURE-OBJECT-TEMPLATE denoting an instance of structure
+ S1 against an instance of structure S2, results in
+ an UNIFICATION-FAILURE error being signaled, when S1 is not in the
+ class precedence list of S2.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/subseq-template-class.html
hunk ./docs/html/subseq-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class SUBSEQ-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class SUBSEQ-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>SUBSEQ-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ SUBSEQ-TEMPLATE, ELEMENT-TEMPLATE, EXPRESSION-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The SUBSEQ-TEMPLATE class denotes those object that are used
+ to unify against a particular element of an ARRAY.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>subseq</b> <i>start</i> <i>end</i> . <i><destructuring template lambda list></i>)
+ </pre>
+ </p>
+
+
+ <p>The SUBSEQ-TEMPLATE syntax is used to unify the elements of a
+ SEQUENCE starting from <i>start</i> and below <i>end</i>, against
+ the <i><destructuring template lambda list></i>.</p>
+
+ <p><i>start</i> and <i>end</i> must be supplied and must be valid
+ sequence indexes, i.e. most likely, FIXNUMs; however, <i>end</i> can
+ also be NIL, in which case the usual SUBSEQ semantics applies.</p>
+ [_$_]
+
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify #(0 1 42 3 4 5) #T(<b>subseq</b> 2 4 ?x ?y)))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ 42
+ T
+
+ cl-prompt> (find-variable-value '?y e)
+ 3
+ T
+
+ cl-prompt> (setq e (unify #(0 1 42 3 4 5) #T(<b>subseq</b> 0 4 42 ?x)))
+ --> Error: UNIFICATION-FAILURE
+
+
+ cl-prompt> (setq e (unify "This is a string!" #T(<b>subseq</b> 4 nil &rest ?str)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?str e)
+ " is a string!"
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an SUBSEQ-TEMPLATE against a non-SEQUENCE object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./docs/html/symbol-template-class.html
hunk ./docs/html/symbol-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class SYMBOL-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class SYMBOL-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>SYMBOL-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ SYMBOL-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ None.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The SYMBOL-TEMPLATE class is the class of the objects that UNIFY
+ recognizes as symbol templates.</p>
+
+ <h3>Template Syntax</h3>
+
+ <p>The <i>specification</i> of a SYMBOL-TEMPLATE has one of the two
+ forms below:</p>
+
+ <p><pre>
+ #T<i><symbol></i>
+ </pre>
+
+ or
+
+ <pre>
+ #T(<b>symbol</b> <i><value></i>)
+ </pre>
+
+ where <i>value</i> must be either a <em>unification variable</em> or
+ a SYMBOL.
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+
+ <p>Unifying a SYMBOL-TEMPLATE against a non-SYMBOL object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY, NIL-TEMPLATE</p>
+
+ <h2>Notes:</h2>
+
+ <p>NIL-TEMPLATE should be used to specifically UNIFY against NIL.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- symbol-template-class.html -->
addfile ./docs/html/template-class.html
hunk ./docs/html/template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ EXPRESSION-TEMPLATE, TYPE-TEMPLATE.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>
+ <ul>
+ <li>SPEC<br>
+ Type: (OR SYMBOL CONS)<br>
+ Accessor: TEMPLATE-SPEC<br>
+ Initarg: <code>:spec</code> (default NIL)</li>
+ </ul>
+ </p>
+
+
+ <h2>Description:</h2>
+
+ <p>The TEMPLATE class is the root of the <em>template</em> hierarchy.</p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- usci-variable.html -->
addfile ./docs/html/template-p-function.html
hunk ./docs/html/template-p-function.html 1
+<html>
+ <head>
+ <title>CL Unification: Standard Generic Function TEMPLATE-P</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Standard Generic Function TEMPLATE-P</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Generic function</i> <strong>TEMPLATE-P</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+ <p>
+ <pre>
+ <b>template-p</b> <i>object</i>
+ => <i>result</i>
+ </pre>
+ </p>
+
+ <h3>Arguments and Values:</h3>
+
+ <p><i><code>object</code></i>---an <i>object</i>
+ <p><i><code>result</code></i>---a <i>generalized boolean</i>
+
+
+
+ <h2>Description:</h2>
+
+ <p>The generic function TEMPLATE-P is the predicate that tests
+ whether an <i>object</i> is of class TEMPLATE. If <i>object</i> is
+ an instance of TEMPLATE or one of its sub-classes, then TEMPLATE-P
+ returns a non-NIL value.</p>
+ [_$_]
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>TEMPLATE</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-04-12</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/template-spec-accessor.html
hunk ./docs/html/template-spec-accessor.html 1
+<html>
+ <head>
+ <title>CL Unification: Accessor TEMPLATE-SPEC</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Standard Generic Function TEMPLATE-SPEC</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Accessor</i> <strong>TEMPLATE-SPEC</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+ <p>
+ <pre>
+ <b>template-spec</b> <i>template</i>
+ => <i>spec</i>
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ (setf (<b>template-spec</b> <i>template</i>) <i>spec</i>)
+ => <i>spec</i>
+ </pre>
+ </p>
+
+ <h3>Arguments and Values:</h3>
+
+ <p><i><code>template</code></i>---a <i>template object</i>
+ <p><i><code>spec</code></i>---a <i>symbol</i>, or a <i>cons</i>
+
+
+ <h2>Description:</h2>
+
+ <p>The accessor TEMPLATE-SPEC extracts the <em>template
+ specification</em> <i>spec</i> out of an instance of the class
+ TEMPLATE or one of its sub-classes. The SETF form sets the
+ <i>spec</i>.</p>
+ [_$_]
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>TEMPLATE, the "Template Sub-language" section.</p>
+
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-09</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/templates.html
hunk ./docs/html/templates.html 1
+<html>
+ <head>
+ <title>CL Unification Templates</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Extensions: UNIFICATION TEMPLATES</i><string>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link-selected">Home</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>The UNIFICATION TEMPLATES Sub-language</h1>
+
+ <p>The unification machinery relies on a <em>template
+ sub-language</em> to express structural patterns containing
+ <em>unification variables</em>. The template sub-language comprises
+ several objects organized in a hierarchy that parallels most of the
+ standard <strong>CL</strong> type hierarchy.</p>
+
+
+ <h2>Unification Variables</h2>
+ [_$_]
+ <p><em>Unification variables</em> are symbols with a <code>#\?</code> as the
+ first character of the name. This is a rather traditional choice,
+ although a different one based on quoted symbols is possible.
+ Therefore, the following are examples of variables.
+ <pre>
+ ?A ?s ?qwe ?42z ?a-variable-with-a-very-long-name ?_
+ </pre>
+ There are two special variables, <code>?_</code> and <code>_</code>,
+ which are used as anonymous place holders, they match anything, but
+ never appear in a substitution.</p>
+
+ <h3>Destructuring Template Lambda List</h3>
+
+ <p><strong>CL</strong> has the concept of <em>destructuring lambda
+ list</em> which is used in conjunction with the form
+ DSTRUCTURING-BIND, and, to some extent, with LOOP. The unifier
+ machinery relies on a related notion dubbed <em>destructuring
+ template lambda list</em> for lack of a better name.</p>
+
+ <p>A <em>destructuring template lambda list</em> (or just
+ <em>template lambda list</em>) is just like a regular
+ <em>destructuring lambda list</em> (ANSI 3.4.5) with a number of
+ restrictions. The full syntax is the following.</p>
+
+ <p>
+ <pre>
+ template-lambda-list ::= (<reqvars> <optvars> <restvar> <keyvars>)
+ | (<reqvars> <optvars> . <template>)
+
+ reqvars ::= <template>*
+
+ optvars ::= [&optional <template>*]
+
+ restvar ::= [&rest <template>]
+
+ keyvars ::= [&key {<template> | ({<template> | (<keyword-name> <template>)})}*
+ [&allow-other-keys]]
+ </pre>
+ </p>
+
+ <p>Where <i><template></i> is either an object with syntax
+ defined in the next section or it can be a normal
+ <strong>CL</strong> object. The remaining non terminal grammar
+ symbols have the usual <strong>CL</strong> interpretation.</p>
+
+
+
+ <h2>Unification Templates</h2>
+ [_$_]
+ <p>The <em>unification templates</em> are organized in an object
+ hierachy. There is a standard <strong>CLOS</strong> class for each
+ template kind. The hierarchy is shown below.</p>
+
+ <p>
+ <img src="images/unif-templ-hier.gif"></p>
+ [_$_]
+ <p>The template hierarchy is rooted at the TEMPLATE class. There are
+ two <em>kinds</em> of templates: <em>type</em> templates, and
+ <em>expression</em> templates. Type templates are used as patterns
+ of regular objects. Expression templates are used to unify against
+ a specific sub-structure of a given object.</p>
+
+ <p>The predefined templates are:
+ <ul>
+ <li><a href="template-class.html">TEMPLATE</a></li>
+ <li><a href="expression-template-class.html">EXPRESSION-TEMPLATE</a></li>
+ <li><a href="element-template-class.html">ELEMENT-TEMPLATE</a></li>
+ <li><a href="aref-template-class.html">AREF-TEMPLATE</a></li>
+ <li><a href="elt-template-class.html">ELT-TEMPLATE</a></li>
+ <li><a href="nth-template-class.html">NTH-TEMPLATE</a></li>
+
+ <li><a href="subseq-template-class.html">SUBSEQ-TEMPLATE</a></li>
+
+ <li><a href="type-template-class.html">TYPE-TEMPLATE</a></li>
+ <li><a href="array-template-class.html">ARRAY-TEMPLATE</a></li>
+
+ <li><a href="sequence-template-class.html">SEQUENCE-TEMPLATE</a></li>
+
+ <li><a href="list-template-class.html">LIST-TEMPLATE</a></li>
+
+ <li><a href="vector-template-class.html">VECTOR-TEMPLATE</a></li>
+
+ <li><a href="string-template-class.html">STRING-TEMPLATE</a></li>
+
+ <li><a href="nil-template-class.html">NIL-TEMPLATE</a></li>
+
+ <li><a href="number-template-class.html">NUMBER-TEMPLATE</a></li>
+
+ <li><a href="standard-object-template-class.html">STANDARD-OBJECT-TEMPLATE</a></li>
+ <li><a href="structure-object-template-class.html">STRUCTURE-OBJECT-TEMPLATE</a></li>
+
+ <li><a href="symbol-template-class.html">SYMBOL-TEMPLATE</a></li>
+ </ul>
+
+
+<!--
+;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;;
+;;; Permission to use, modify, and redistribute this code is hereby
+;;; granted.
+;;; The code is provided AS IS with NO warranty whatsoever. The author
+;;; will not be held liable etc etc etc etc etc.
+-->
+
+ <h2>Site Map</h2>
+
+
+ <p>Enjoy!</p>
+
+
+
+ <hr>
+ <p>Questions? Queries? Suggestions? Comments? Please direct them
+ at <a href="mailto:marcoxa_PROVA_A_SPAMMARME@alu.org">me</a>.
+ </p>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-09</strong><br>
+ Document created
+ </li>
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/type-template-class.html
hunk ./docs/html/type-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class TYPE-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class TYPE-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>TYPE-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ ARRAY-TEMPLATE, NIL-TEMPLATE, NUMBER-TEMPLATE, SEQUENCE-TEMPLATE,
+ STANDARD-OBJECT-TEMPLATE, STRUCTURE-OBJECT-TEMPLATE, SYMBOL-TEMPLATE.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The TYPE-TEMPLATE class is the root of the <em>type template</em> sub-hierarchy.</p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- usci-variable.html -->
addfile ./docs/html/unification-dictionary.html
hunk ./docs/html/unification-dictionary.html 1
+<html>
+ <head>
+ <title>CL Unification Dictionary</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Extensions: UNIFICATION Dictionary</i><string>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="index.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>Common Lisp Extensions: UNIFICATION Dictionary</h1>
+
+ <ul>
+ <li><a href="unify-package.html"><i>Package</i> <b>CL.EXT.DACF.UNIFICATION</b></a>
+ <li><a href="unify-function.html"><i>Generic function</i> <b>UNIFY</b></a>
+ <li><a href="usci-variable.html"><i>Variable</i> <b>*UNIFY-STRING-CASE-INSENSITIVE*</b></a>
+
+ <li><a href="template-class.html"><i>Class</i> <b>TEMPLATE</b></a>
+ <li><a href="expression-template-class.html"><i>Class</i> <b>EXPRESSION-TEMPLATE</b></a>
+ <li><a href="element-template-class.html"><i>Class</i> <b>ELEMENT-TEMPLATE</b></a></li>
+ <li><a href="array-template-class.html"><i>Class</i> <b>ARRAY-TEMPLATE</b></a></li>
+ <li><a href="elt-template-class.html"><i>Class</i> <b>ELT-TEMPLATE</b></a></li>
+ <li><a href="nth-template-class.html"><i>Class</i> <b>NTH-TEMPLATE</b></a></li>
+ <li><a href="nthcdr-template-class.html"><i>Class</i> <b>NTHCDR-TEMPLATE</b></a></li>
+
+ <li><a href="type-template-class.html"><i>Class</i> <b>TYPE-TEMPLATE</b></a>
+ <li><a href="symbol-template-class.html"><i>Class</i> <b>SYMBOL-TEMPLATE</b></a>
+
+ <li><a href="make-template-function.html"><i>Function</i> <b>MAKE-TEMPLATE</b></a>
+ <li><a href="template-p-function.html"><i>Generic function</i> <b>TEMPLATE-P</b></a>
+ <li><a href="template-spec-accessor.html"><i>Accessor</i> <b>TEMPLATE-SPEC</b></a>
+ <li><a href="hash-t-read-macro.html"><i>Reader Macro</i> <b>#T</b></a>
+ <li><a href="make-empty-environment-function.html"><i>Function</i> <b>MAKE-EMPTY-ENVIRONMENT</b></a>
+ <li><a href="find-variable-value-function.html"><i>Function</i> <b>FIND-VARIABLE-VALUE</b></a>
+ <li><a href="match-macro.html"><i>Macro</i> <b>MATCH</b></a>
+ <li><a href="matching-macro.html"><i>Macro</i> <b>MATCHING</b></a>
+ <li><a href="match-case-macro.html"><i>Macro</i> <b>MATCH-CASE</b></a>
+ </ul>
+ [_$_]
+
+<!--
+;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;;
+;;; Permission to use, modify, and redistribute this code is hereby
+;;; granted.
+;;; The code is provided AS IS with NO warranty whatsoever. The author
+;;; will not be held liable etc etc etc etc etc.
+-->
+
+ <h2>Site Map</h2>
+
+
+ <p>Enjoy!</p>
+
+
+
+ <hr>
+ <p>Questions? Queries? Suggestions? Comments? Please direct them
+ at <a href="mailto:marcoxa_PROVA_A_SPAMMARME@alu.org">me</a>.
+ </p>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-05-05</strong><br>
+ Started the site.
+ </li>
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/unify-function.html
hunk ./docs/html/unify-function.html 1
+<html>
+ <head>
+ <title>CL Unification: Standard Generic Function UNIFY</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Standard Generic Function UNIFY</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Generic function</i> <strong>UNIFY</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Syntax:</h2>
+
+ <p>
+ <pre>
+ <b>unify</b> <i>object1</i> <i>object2</i> &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <h3>Arguments and Values:</h3>
+
+ <p><i><code>object1</code></i>---an <i>object</i>
+ <p><i><code>object2</code></i>---an <i>object</i>
+ <p><i><code>substitution</code></i>---a <i>substitution</i>
+
+
+
+
+ <h2>Description:</h2>
+
+ <p>The generic function UNIFY is the entry point in the unification
+ machinery. It takes two <strong>CL</strong> objects, <i>object1</i>
+ and <i>object2</i> and checks whether they can be <em>unified</em>
+ by constructing a (possibly empty) consistent substitution assigning
+ appropriate values to the <em>unification variables</em> appearing
+ each object. The rules by which the unification process is carried
+ on are dependent on the types of the two objects. The known rules
+ are described in the <a href="#known_methods">"known methods"</a>
+ section.</p>
+
+ <p>UNIFY takes a <em>substitution</em> as an optional argument. The
+ default value is a <em>fresh</em> empty substitution obtained by
+ calling MAKE-EMPTY-ENVIRONMENT.</p>
+
+ <h3><a name="known_methods">Known Methods</a>:</h3>
+
+ <p>Note that UNIFY is commutative in its two required arguments. Each
+ method listed exists also with <i>object1</i> and <i>object2</i>
+ reversed.</p>
+
+ <p>First, the methods defined on standard <strong>CL</strong> types
+ are described, and then all the methods involving <em>unification
+ templates</em> are described.</p>
+
+
+ <p>
+ <ul>
+ <li>
+ <p>
+ <pre>
+ <b>unify</b> (<i>s1</i> symbol) (<i>s2</i> symbol) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+ [_$_]
+ <p>The unification of two symbols depends on whether one (or both)
+ of them is a unification variable (i.e. either the symbol with name
+ <code>"_"</code>, or a symbol with name starting with the character
+ <code>#\?</code>.)</p>
+
+ <p>If neither object is an unification variable, then UNIFY succeds
+ if and only if the two symbols <i>s1</i> and <i>s2</i> are EQ.</p>
+
+ <p>If <i>s1</i> is an unification variable, and either <i>s1</i> is not
+ bound in <i>substitution</i>, or <i>s1</i> is bound to <i>s2</i>
+ then UNIFY succeds. If <i>s1</i> was not bound in the
+ <i>substitution</i>, then a new binding for <i>s1</i> to <i>s2</i>
+ is created.</p>
+
+ <p>The symmetric case holds if <i>s1</i> is not an unification
+ variable but <i>s2</i> is.</p>
+
+ <p>Otherwise an error of type UNIFICATION-FAILURE is signaled.</p>
+ </li>
+
+ <li>
+ <p>
+ <pre>
+ <b>unify</b> (<i>v</i> symbol) (<i>object</i> t) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>The symbol <i>v</i> must be an unification variable. If not, an
+ error of type UNIFICATION-FAILURE will be signaled.
+ Otherwise, the a new binding for the variable <i>v</i> with value
+ <i>object</i> will be created in the <i>substitution</i>.<p>
+
+ <p>The creation of the new binding for <i>v</i> in the
+ <i>substitution</i> is dependent on the <em>occur check</em>
+ implemented by the generic function OCCURS-IN-P. OCCURS-IN-P is
+ called by the unification machinery if the variable
+ *OCCURRENCE-CHECK-P* is non-NIL (the default.) If
+ *OCCURENCE-CHECK-P* is non-NIL, and if the variable
+ <i>v</i> <em>occurs</em> in the <i>object</i> (i.e. OCCURS-IN-P
+ returns a non-NIL value,) then an error of type UNIFICATION-FAILURE
+ is signaled.</p>
+ </li>
+
+
+ <li>
+ <p>
+ <pre>
+ <b>unify</b> (<i>n1</i> number) (<i>n2</i> number) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>Two numbers unify if and only if they are =, in which case
+ <i>substitution</i> is returned unmodified. Otherwise, an error of
+ type UNIFICATION-FAILURE is signaled.</p>
+ </li>
+
+
+ <li>
+ <p>
+ <pre>
+ <b>unify</b> (<i>s1</i> string) (<i>s2</i> string) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>Two strings unify only is they are "equal", under the following
+ condition. If the variable *UNIFY-STRING-CASE-INSENSITIVE-P* is NIL
+ (the default) then the two strings <i>s1</i> and <i>s2</i> are
+ compared using STRING=, otherwise they are compared using STRING-EQUAL.
+ </p>
+
+ <p>If the two strings <i>s1</i> and <i>s2</i> are equal then
+ <i>substitution</i> is returned unchanged, otherwise an error of type
+ UNIFICATION-FAILURE is signaled.</p>
+ </li>
+
+ <li>
+ <p>
+ <pre>
+ <b>unify</b> (<i>v1</i> vector) (<i>v2</i> vector) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ <b>unify</b> (<i>l1</i> list) (<i>l2</i> list) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ <b>unify</b> (<i>s1</i> sequence) (<i>s2</i> sequence) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>The "sequence" methods (and the specialized ones, mostly for
+ efficiency) extend the <i>substitution</i> by calling UNIFY
+ recursively on each element of the two sequences, <i>s1</i> and
+ <i>s2</i> (respectively, <i>l1</i> and <i>l2</i>, <i>v1</i> and
+ <i>v2</i>.)
+ </p>
+
+ <p>An error of type UNIFICATION-FAILURE is signaled if the two
+ sequences are of different LENGTH or if any call to
+ UNIFY fails.</p>
+ </li>
+
+
+ <li>
+ <p>
+ <pre>
+ <b>unify</b> (<i>a1</i> array) (<i>a2</i> array) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>Two arrays <i>a1</i> and <i>a2</i> UNIFY if and only if each of
+ the respective elements does. The two arrays are traversed using
+ ROW-MAJOR-AREF. Otherwise an error of type UNIFICATION-FAILURE is
+ signaled.</p>
+
+ <p>An error of type UNIFICATION-FAILURE is also signaled if the two
+ arrays have different total size (as returned by ARRAY-TOTAL-SIZE.)</p>
+ </li>
+
+
+ <li>
+ <p>
+ <pre>
+ <b>unify</b> (<i>object1</i> t) (<i>object2</i> t) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>This is the catch all method that is called as a last resort.
+ No recursive call to UNIFY is attempted, and the call succeeds if and
+ only if <i>object1</i> and <i>object2</i> are EQUALP. Otherwise, an
+ error of type UNIFICATION-FAILURE is signaled.</p>
+ </li>
+ [_$_]
+ </ul>
+ </p>
+
+ <p>The next methods all involve a <em>unification template</em>.
+ Again all these methods are commutative in their required
+ arguments.</p>
+
+ <p>
+ <ul>
+ <li>
+ <p>
+ <pre>
+ <b>unify</b> (<i>s</i> structure-object) (<i>st</i> structure-object-template) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>This method UNIFYs a <i>s</i> against a STRUCTURE-OBJECT-TEMPLATE
+ <i>st</i>. <i>st</i> has the following (general) structure.</p>
+ <pre>
+ (<i><structure-class specifier></i> [ (<i><reader></i> <i><value></i>) ]* )
+ </pre></p>
+
+ <p>The <i>structure-class specifier</i> is a symbol naming a
+ structure class, <i>reader</i> is one of the DEFSTRUCT-generated
+ accessors, and <i>value</i> is a regular <strong>CL</strong> object,
+ a unification variable, or a <em>unification template</em>.</p>
+
+ <p>The class of <i>s</i> must be a subclass of <i>structure-class
+ specifier</i>. Otherwise, an
+ error of type UNIFICATION-FAILURE is signaled.</p>
+
+ <p>UNIFY
+ is called recursively on each <i>value</i> and the result of
+ applying <i>reader</i> to <i>s</i>.</p>
+
+ <p>If all the (recursive) calls to UNIFY succeed, then a possibly
+ augmented <i>substitution</i> is returned. Otherwise, an
+ error of type UNIFICATION-FAILURE is signaled.</p>
+ </li>
+
+
+ <li>
+ <p>
+ <pre>
+ <b>unify</b> (<i>s</i> standard-object) (<i>st</i> standard-object-template) &optional <i>substitution</i>
+ => <i>substitution</i>
+ </pre>
+ </p>
+
+ <p>This method UNIFYs a <i>s</i> against a STANDARD-OBJECT-TEMPLATE
+ <i>st</i>. <i>st</i> has the following (general) structure.</p>
+ <pre>
+ (<i><standard-class specifier></i> [ ([slot-value | slot-accessor] <i><slot-spec></i> <i><value></i>) ]* )
+ </pre></p>
+
+ <p>The <i>standard-class specifier</i> is a symbol naming a
+ class, <i>slot-spec</i> is a valid slot accessor when
+ <code>slot-value</code> is specified, or a valid slot name for the
+ class, when <code>slot-value</code> is specified, and <i>value</i>
+ is a regular <strong>CL</strong> object,
+ a unification variable, or a <em>unification template</em>.</p>
+
+ <p>The class of <i>s</i> must be a subclass of <i>standard-class
+ specifier</i>. Otherwise, an
+ error of type UNIFICATION-FAILURE is signaled.</p>
+
+ <p>UNIFY
+ is called recursively on each <i>value</i> and the result of
+ extracting the slot value from <i>s</i> using either the accessor
+ supplied, or SLOT-VALUE.</p>
+
+ <p>If all the (recursive) calls to UNIFY succeed, then a possibly
+ augmented <i>substitution</i> is returned. Otherwise, an
+ error of type UNIFICATION-FAILURE is signaled.</p>
+ </li>
+
+ </ul>
+ </p>
+ [_$_]
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>If <i>object1</i> and <i>object2</i> cannot be unified, then an
+ error of type UNIFICATION-FAILURE is signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>MAKE-EMPTY-ENVIRONMENT, UNIFICATION-FAILURE,
+ *UNIFY-STRING-CASE-INSENSITIVE-P*, OCCURS-IN-P,
+ *OCCURENCE-CHECK-P*.</p>
+
+ <h2>Notes:</h2>
+
+ <p>The unification algorithm implemented is very flexible and
+ provides many hooks for customization. However, it is not
+ necessarily asymptotically efficient (it has a worst case
+ exponential time complexity.)</p>
+
+ <p>It would be interesting to reimplement the kernel of the system
+ using a linear unification algorithm like the one described in<p>
+
+ <p>[MM82] A. Martelli and U. Montanari, <i>An Efficient Unification
+ Algorithm</i>, ACM Transactions on Programming Languages and
+ Systems, Vol. 4, No. 2, April 1982, Pages 258--282.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-04-12</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/unify-package.html
hunk ./docs/html/unify-package.html 1
+<html>
+ <head>
+ <title>CL Unification: Package CL.EXT.DACF.UNIFICATION</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Package CL.EXT.DACF.UNIFICATION</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="../../../images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="../../../images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="../../../images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Package</i> <strong>CL.EXT.DACF.UNIFICATION</strong></h1>
+
+ <h2>Nicknames:</h2>
+
+ <p><code>UNIFY</code></p>
+
+ <h2>Uses:</h2>
+
+ <p><code>COMMON-LISP</code></p>
+
+
+ <h2>Description:</h2>
+
+ <p>This package contains all the definitions necessary for the general
+ Common Lisp unifier to work.</p>
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>None.</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-04-12</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/unifying-substitutions.html
hunk ./docs/html/unifying-substitutions.html 1
+<html>
+ <head>
+ <title>CL Unifying Substitutions</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Extensions: UNIFYING SUBSTITUTIONS</i><string>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link-selected">Home</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>Unifying Substitutions</h1>
+
+ <p>The central notion of every unification machinery is that of
+ <em>unifying substitution</em>. A unifying substitution - or
+ <em>environment</em> - is a
+ mapping from <em>variable names</em> (or <em>variables</em>) to
+ <em>values</em> (which can be variables themselves.)</p>
+
+ <p>The generic function UNIFY, and several other functions and macros
+ in the package accept unifying substitutions as parameters, and
+ return them as values.</p>
+
+ <p>There are several notations to describe such unifying
+ substitutions. The one chosen here is simply the following:</p>
+
+ <p>
+ <pre>
+ {x<sub>1</sub> -> y<sub>1</sub>, x<sub>2</sub> -> y<sub>2</sub>, ..., x<sub>k</sub> -> y<sub>k</sub>}
+ </pre>
+ </p>
+
+ <p>The UNIFY library has a number of functions and data structures
+ that can be used to construct and manipulate unifying substitutions.</p>
+
+ <p>In order to facilitate the construction of interpreter-like
+ programs the UNIFICATION library provides data structures
+ representing <em>bindings</em>, <em>frames</em>, and
+ <em>environments</em> - i.e. the unifying substitions proper.</p>
+
+ <ul>
+ <li><em>Bindings</em>
+
+ <p>A <em>binding</em> simply represent the mapping between a variable and a
+ value.</p>
+
+ <p>
+ <pre>
+ <i>binding</i>: <i>variable</i> --> <i>value</i>
+ </pre>
+ </p>
+
+ <li><em>Frames</em>
+
+ <p>A <em>frame</em> is simply a collection of bindings.</p>
+
+ <p>
+ <pre>
+ <i>frame</i>: {<i>binding</i><sub>i</sub>}
+ </pre>
+ </p>
+ [_$_]
+
+ <li><em>Environments</em>
+
+ <p>An <em>environment</em> is simply a stack of frames.</p>
+
+ <p>
+ <pre>
+ <i>environment</i>: <<i>frame</i><sub>0</sub>, <i>frame</i><sub>1</sub>, ..., <i>frame</i><sub>k</sub>>
+ </pre>
+ </p>
+ </ul>
+
+ <p>The collection of operators described hereafter manipulates these
+ opaque data structures.</p>
+
+ <h1>Unifying Substitutions Dictionary</h1>
+
+ <ul>
+ <li><a href="find-variable-value-function.html">FIND-VARIABLE-VALUE</a></li>
+ <li><a href="make-empty-environment-function.html">MAKE-EMTPY-ENVIRONMENT</a></li>
+ <li><a href="make-shared-environment-function.html">MAKE-SHARED-ENVIRONMENT</a></li>
+
+ </ul>
+ [_$_]
+
+
+ <h1>Notes</h1>
+
+ <h2>Current Implementation Details</h2>
+
+ <p>The current implementation is rather straightforward. A binding
+ is a CONS, a frame is a wrapper around an A-LIST, and an environment
+ is a wrapper around a LIST (stack) of frames.</p>
+
+
+ <h2>Functional Style Unifying Substitutions</h2>
+
+ <p>There are very elegant implementations of unification and
+ substitutions based on curried functions. A typical exercise in
+ functional programming using ML or a similar language is to write a
+ simplified Milner Type Checker. Writing the unifying substitution
+ support can be achieved by using curried functions in that context.</p>
+
+
+<!--
+;;; Copyright (c) 2004 Marco Antoniotti, All rigths reserved.
+;;;
+;;; Permission to use, modify, and redistribute this code is hereby
+;;; granted.
+;;; The code is provided AS IS with NO warranty whatsoever. The author
+;;; will not be held liable etc etc etc etc etc.
+-->
+
+ <h2>Site Map</h2>
+
+
+ <p>Enjoy!</p>
+
+
+
+ <hr>
+ <p>Questions? Queries? Suggestions? Comments? Please direct them
+ at <a href="mailto:marcoxa_PROVA_A_SPAMMARME@alu.org">me</a>.
+ </p>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Document created
+ </li>
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
addfile ./docs/html/usci-variable.html
hunk ./docs/html/usci-variable.html 1
+<html>
+ <head>
+ <title>CL Unification: Variable *UNIFY-STRING-CASE-INSENSITIVE-P*</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Variable *UNIFY-STRING-CASE-INSENSITIVE-P*</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Variable</i> <strong>*UNIFY-STRING-CASE-INSENSITIVE-P*</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Value Type:</h2>
+
+ <p>
+ A <i>generalized boolean</i>.
+ </p>
+
+
+ <h2>Initial Value:</h2>
+
+ <p>
+ NIL
+ </p>
+
+
+ <h2>Description:</h2>
+
+ <p>The value of *UNIFY-STRING-CASE-INSENSITIVE-P* controls the
+ behavior of the UNIFY method with signature <code>(<i>string</i> <i>string</i>)</code>.
+ If NIL (the default), the method will use STRING= to test for
+ equality of the two strings. Otherwise, the UNIFY method will use STRING-EQUAL.</p>
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>None.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+ <h2>Notes:</h2>
+
+ <p>None.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-06-11</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- usci-variable.html -->
addfile ./docs/html/vector-template-class.html
hunk ./docs/html/vector-template-class.html 1
+<html>
+ <head>
+ <title>CL Unification: Class VECTOR-TEMPLATE</title>
+ <link rel="stylesheet" href="main.css">
+ </head>
+[_^I_][_$_]
+ <body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0" bgcolor="#ffffff">
+
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" vspace="0" hspace="0">
+ <tr>
+ <td colspan="3">
+ <div class="header"
+ style="font-family:=Verdana,Arial,Helvetica; font-size: 18px; color: #41286f;">
+ <strong><i>CL Unification: Class VECTOR-TEMPLATE</title></i></strong>
+ <div class="navigation">
+ <a href="index.html" class="navigation-link">Home</a>
+ | <a href="unification-package.html" class="navigation-link">Previous</a>
+ | <a href="index.html" class="navigation-link">Next</a>
+ | <a href="downloads.html" class="navigation-link">Downloads</a>
+ | <a href="links.html" class="navigation-link">Links</a>
+ </div>
+ </div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ <div class="middle-bar"><img src="images/shim.gif" height="5" width="1"></div>
+ <div class="black-line"><img src="images/shim.gif" height="1" width="1"></div>
+ </td>
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+[_^I_][_$_]
+ <h1><i>Class</i> <strong>VECTOR-TEMPLATE</strong></h1>
+
+ <h2>Package:</h2>
+
+ <p><code>COMMON-LISP.EXTENSIONS.DATA-AND-CONTROL-FLOW.UNIFICATION</code></p>
+
+
+ <h2>Class Precedence List:</h2>
+
+ <p>
+ VECTOR-TEMPLATE, SEQUENCE-TEMPLATE, ARRAY-TEMPLATE, TYPE-TEMPLATE, TEMPLATE, STANDARD-OBJECT, T.
+ </p>
+
+ <h2>Known Subclasses:</h2>
+
+ <p>
+ STRING-TEMPLATE.
+ </p>
+
+
+ <h2>Slots:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Description:</h2>
+
+ <p>The VECTOR-TEMPLATE class denotes those object that are used
+ to unify against a VECTOR.</p>
+
+ <h3>Template Syntax:</h3>
+
+ <p>
+ <pre>
+ #T(<b>vector</b> . <i><destructuring template lambda list></i>)
+ </pre>
+ </p>
+
+ <p>
+ <pre>
+ #T(<i><<strong>CL</strong> vector type specifier></i> . <i><destructuring template lambda list></i>)
+ </pre>
+ </p>
+
+
+ <p>The VECTOR-TEMPLATE syntax denotes a VECTOR object. A
+ VECTOR-TEMPLATE must be unified against an VECTOR object. The elements
+ of the array must be unified against the
+ <i><destructuring template lambda list></i>
+ [_$_]
+
+ <h2>Examples:</h2>
+
+ <p>
+ <pre>
+ cl-prompt> (setf e (unify #(0 1 42 3 4 5) #T(<b>vector</b> 0 1 ?x 3 4 5)))
+ #<ENVIRONMENT xxx>
+ [_$_]
+ cl-prompt> (find-variable-value '?x e)
+ 42
+
+ cl-prompt> (setq e (unify #(0 1 42 3 4 5) #T(<b>vector</b> 0 1 "FOO" 3 4 5)))
+ --> Error: UNIFICATION-FAILURE
+
+ cl-prompt> (setq e (unify #("foo" "bar" 42)) #T(<b>vector</b> _ _ ?x))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ 42
+
+ cl-prompt> (setq e (unify #("foo" "bar" 42) #T(<b>vector</b> _ &rest ?x)))
+ #<ENVIRONMENT xxx>
+
+ cl-prompt> (find-variable-value '?x e)
+ #("bar" 42)
+
+ cl-prompt> (setq e (unify #("foo" "bar" 42) #T((<b>vector</b> fixnum) _ &rest ?x)))
+ --> Error: UNIFICATION-FAILURE
+ </pre>
+ </p>
+
+
+ <h2>Affected By:</h2>
+
+ <p>None.</p>
+
+
+ <h2>Exceptional Situations:</h2>
+
+ <p>Unifying an VECTOR-TEMPLATE against a non-VECTOR object results in
+ an UNIFICATION-FAILURE error being signaled.</p>
+
+
+ <h2>See Also:</h2>
+
+ <p>UNIFY</p>
+
+
+ <h2>Notes:</h2>
+
+ <h3>ARRAY Structural Properties</h3>
+
+ <p>There is no way to "unify" against structural properties of
+ vectors like fill pointers and displacements.</p>
+
+ <h3>Current Implementation Note</h3>
+
+ <p>Type checking for templates like
+ <code>#T((<b>vector</b> fixnum) 1 2 3)</code>
+ is not yet implemented.</p>
+
+ </td>
+ [_$_]
+ <!-- <td height="100%"> </td> -->
+ </tr>
+
+ <tr height="100%">
+ <td height="100%"> </td>
+ <td valign="top" width="80%" height="100%">
+
+ <div class="content">
+ <div class="text" style="padding-top: 10px;">
+
+ <h1>News</h1>
+
+ <p>News in chronological order, most recent on top.
+ </p>
+
+ <ul>
+ <li><strong>2004-10-30</strong><br>
+ Completed description.
+ </li>
+
+ </ul>
+
+ </div>
+ </div>
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_$_]
+ </td>
+ [_$_]
+ <td height="100%"> </td>
+ </tr>
+
+
+
+ [_$_]
+ <tr>
+ <td colspan="3" valign="bottom" align="right">
+ <div class="copyright">
+ © 2003-2004, Marco Antoniotti, all rights reserved.
+ </div>
+ </td>
+ </tr>
+ [_$_]
+ </table>
+ </body>
+</html>
+
+<!-- end of file -- expression-template-class.html -->
addfile ./lambda-list-parsing.lisp
hunk ./lambda-list-parsing.lisp 1
+;;; -*- Mode: Lisp -*-[_^M_][_$_]
+[_^M_][_$_]
+;;; lambda-list-parsing.lisp --[_^M_][_$_]
+[_^M_][_$_]
+(in-package "UNIFY")[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(declaim (inline type-is-t-p))[_^M_][_$_]
+[_^M_][_$_]
+(defun type-is-t-p (type-spec)[_^M_][_$_]
+ (nth-value 0 (and (subtypep type-spec t) (subtypep t type-spec))))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(declaim (inline type-specifier-p))[_^M_][_$_]
+[_^M_][_$_]
+(defun type-specifier-p (x)[_^M_][_$_]
+ (nth-value 0 (ignore-errors (subtypep x t))))[_^M_][_$_]
+[_^M_][_$_]
+(defun normalize-lambda-list (lambda-list)[_^M_][_$_]
+ (mapcar (lambda (lambda-element)[_^M_][_$_]
+ (etypecase lambda-element[_^M_][_$_]
+ (symbol lambda-element)[_^M_][_$_]
+ (cons (first lambda-element))))[_^M_][_$_]
+ lambda-list))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defstruct lambda-var-info[_^M_][_$_]
+ (name nil :read-only t)[_^M_][_$_]
+ (type t :read-only t)[_^M_][_$_]
+ )[_^M_][_$_]
+[_^M_][_$_]
+(defstruct (optional-lambda-var-info (:include lambda-var-info))[_^M_][_$_]
+ (default-value nil :read-only t)[_^M_][_$_]
+ (name-for-supplied-indicator nil :read-only t)[_^M_][_$_]
+ )[_^M_][_$_]
+[_^M_][_$_]
+(defstruct (aux-lambda-var-info (:include optional-lambda-var-info)))[_^M_][_$_]
+[_^M_][_$_]
+(defstruct (key-lambda-var-info (:include optional-lambda-var-info))[_^M_][_$_]
+ (keyword-name nil :read-only t)[_^M_][_$_]
+ )[_^M_][_$_]
+[_^M_][_$_]
+(defstruct (rest-lambda-var-info (:include lambda-var-info)[_^M_][_$_]
+ (:constructor make-rest-lambda-var-info (&key[_^M_][_$_]
+ name[_^M_][_$_]
+ (type 'list)[_^M_][_$_]
+ (element-type t))))[_^M_][_$_]
+ (element-type t :read-only t)[_^M_][_$_]
+ )[_^M_][_$_]
+[_^M_][_$_]
+;;; The next function is really implementation-dependent, give the[_^M_][_$_]
+;;; definition of LAMBDA-LIST-KEYWORDS [_^M_][_$_]
+[_^M_][_$_]
+(define-condition lambda-list-parsing-error (program-error)[_^M_][_$_]
+ ((item :reader lambda-list-parsing-error-item[_^M_][_$_]
+ :initarg :item)[_^M_][_$_]
+ )[_^M_][_$_]
+ )[_^M_][_$_]
+[_^M_][_$_]
+(defun symbol-or-cons-p (x)[_^M_][_$_]
+ (or (symbolp x) (consp x)))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defun parse-extended-ordinary-lambda-list (lambda-list[_^M_][_$_]
+ &key[_^M_][_$_]
+ (ordinary-variable-test #'symbolp)[_^M_][_$_]
+ (optional-variable-test #'symbol-or-cons-p)[_^M_][_$_]
+ (rest-variable-test #'symbolp)[_^M_][_$_]
+ (key-variable-test #'symbol-or-cons-p)[_^M_][_$_]
+ (aux-variable-test #'symbol-or-cons-p)[_^M_][_$_]
+ )[_^M_][_$_]
+ (let ((vars ())[_^M_][_$_]
+ (optionals ())[_^M_][_$_]
+ (keywords ())[_^M_][_$_]
+ (rest ())[_^M_][_$_]
+ (auxiliary ())[_^M_][_$_]
+ )[_^M_][_$_]
+ (labels ((parse-named-arguments (lambda-list &aux (head (first lambda-list)))[_^M_][_$_]
+ (cond ((null lambda-list) nil)[_^M_][_$_]
+ ((and (symbolp head)[_^M_][_$_]
+ (member head lambda-list-keywords))[_^M_][_$_]
+ (case head[_^M_][_$_]
+ (&optional (parse-optional-arguments (rest lambda-list)))[_^M_][_$_]
+ (&key (parse-keyword-arguments (rest lambda-list)))[_^M_][_$_]
+ (&aux (parse-auxiliary-arguments (rest lambda-list)))[_^M_][_$_]
+ (&rest (parse-rest-arguments (rest lambda-list)))[_^M_][_$_]
+ (otherwise[_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ The parsing may not work properly."[_^M_][_$_]
+ head)[_^M_][_$_]
+ (skip-until-next-lambda-list-keyword (rest lambda-list))[_^M_][_$_]
+ ))[_^M_][_$_]
+ )[_^M_][_$_]
+ ((funcall ordinary-variable-test head)[_^M_][_$_]
+ (push head vars)[_^M_][_$_]
+ (parse-named-arguments (rest lambda-list)))[_^M_][_$_]
+ (t (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ ))[_^M_][_$_]
+[_^M_][_$_]
+ (parse-optional-arguments (lambda-list &aux (head (first lambda-list)))[_^M_][_$_]
+ (cond ((null lambda-list) nil)[_^M_][_$_]
+ ((and (symbolp head)[_^M_][_$_]
+ (member head lambda-list-keywords))[_^M_][_$_]
+ (case head[_^M_][_$_]
+ (&optional (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (&key (parse-keyword-arguments (rest lambda-list)))[_^M_][_$_]
+ (&aux (parse-auxiliary-arguments (rest lambda-list)))[_^M_][_$_]
+ (&rest (parse-rest-arguments (rest lambda-list)))[_^M_][_$_]
+ (otherwise[_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ The parsing may not work properly."[_^M_][_$_]
+ head)[_^M_][_$_]
+ (skip-until-next-lambda-list-keyword (rest lambda-list))[_^M_][_$_]
+ ))[_^M_][_$_]
+ )[_^M_][_$_]
+ ((funcall optional-variable-test head)[_^M_][_$_]
+ (push head optionals)[_^M_][_$_]
+ (parse-optional-arguments (rest lambda-list)))[_^M_][_$_]
+ (t (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ ))[_^M_][_$_]
+[_^M_][_$_]
+ (parse-keyword-arguments (lambda-list &aux (head (first lambda-list)))[_^M_][_$_]
+ (cond ((null lambda-list) nil)[_^M_][_$_]
+ ((and (symbolp head)[_^M_][_$_]
+ (member head lambda-list-keywords))[_^M_][_$_]
+ (case head[_^M_][_$_]
+ (&optional (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (&key (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (&aux (parse-auxiliary-arguments (rest lambda-list)))[_^M_][_$_]
+ (&rest (parse-rest-arguments (rest lambda-list)))[_^M_][_$_]
+ (&allow-other-keys[_^M_][_$_]
+ (unless (or (null (rest lambda-list))[_^M_][_$_]
+ (eql (cadr lambda-list) '&aux))[_^M_][_$_]
+ (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (skip-until-next-lambda-list-keyword (rest lambda-list)))[_^M_][_$_]
+ (otherwise[_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ The parsing may not work properly."[_^M_][_$_]
+ head)[_^M_][_$_]
+ (skip-until-next-lambda-list-keyword (rest lambda-list))[_^M_][_$_]
+ ))[_^M_][_$_]
+ )[_^M_][_$_]
+ ((funcall key-variable-test head)[_^M_][_$_]
+ (push head keywords)[_^M_][_$_]
+ (parse-keyword-arguments (rest lambda-list)))[_^M_][_$_]
+ (t (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ ))[_^M_][_$_]
+[_^M_][_$_]
+ (parse-rest-arguments (lambda-list &aux (head (first lambda-list)))[_^M_][_$_]
+ (cond ((null lambda-list) nil)[_^M_][_$_]
+ ((consp head)[_^M_][_$_]
+ (push head rest)[_^M_][_$_]
+ ;; Error checking here.[_^M_][_$_]
+ (parse-rest-arguments (rest lambda-list)))[_^M_][_$_]
+ ((and (symbolp head)[_^M_][_$_]
+ (member head lambda-list-keywords))[_^M_][_$_]
+ (case head[_^M_][_$_]
+ (&optional (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (&key (parse-keyword-arguments (rest lambda-list)))[_^M_][_$_]
+ (&aux (parse-auxiliary-arguments (rest lambda-list)))[_^M_][_$_]
+ (&rest (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (otherwise[_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ The parsing may not work properly."[_^M_][_$_]
+ head)[_^M_][_$_]
+ (skip-until-next-lambda-list-keyword (rest lambda-list))[_^M_][_$_]
+ ))[_^M_][_$_]
+ )[_^M_][_$_]
+ ((funcall rest-variable-test head)[_^M_][_$_]
+ (push head rest)[_^M_][_$_]
+ (parse-rest-arguments (rest lambda-list)))[_^M_][_$_]
+ (t (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ ))[_^M_][_$_]
+[_^M_][_$_]
+ (parse-auxiliary-arguments (lambda-list &aux (head (first lambda-list)))[_^M_][_$_]
+ (cond ((null lambda-list) nil)[_^M_][_$_]
+ ((and (symbolp head)[_^M_][_$_]
+ (member head lambda-list-keywords))[_^M_][_$_]
+ (case head[_^M_][_$_]
+ (&optional (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (&key (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (&aux (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (&rest (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ (otherwise[_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ The parsing may not work properly."[_^M_][_$_]
+ head)[_^M_][_$_]
+ (skip-until-next-lambda-list-keyword (rest lambda-list))[_^M_][_$_]
+ ))[_^M_][_$_]
+ )[_^M_][_$_]
+ ((funcall aux-variable-test head)[_^M_][_$_]
+ (push head auxiliary)[_^M_][_$_]
+ (parse-auxiliary-arguments (rest lambda-list)))[_^M_][_$_]
+ (t (error 'lambda-list-parsing-error :item head))[_^M_][_$_]
+ ))[_^M_][_$_]
+[_^M_][_$_]
+ (skip-until-next-lambda-list-keyword (lambda-list[_^M_][_$_]
+ &aux (head (first lambda-list)))[_^M_][_$_]
+ (cond ((null lambda-list) nil)[_^M_][_$_]
+ ((and (symbolp head)[_^M_][_$_]
+ (member head lambda-list-keywords))[_^M_][_$_]
+ (case head[_^M_][_$_]
+ (&optional (parse-optional-arguments (rest lambda-list)))[_^M_][_$_]
+ (&key (parse-keyword-arguments (rest lambda-list)))[_^M_][_$_]
+ (&aux (parse-auxiliary-arguments (rest lambda-list)))[_^M_][_$_]
+ (&rest (parse-rest-arguments (rest lambda-list)))[_^M_][_$_]
+ (otherwise[_^M_][_$_]
+ (warn "Keyword ~A is implementation dependent.~@ [_^M_][_$_]
+ The parsing may not work properly."[_^M_][_$_]
+ head)[_^M_][_$_]
+ (skip-until-next-lambda-list-keyword (rest lambda-list))[_^M_][_$_]
+ ))[_^M_][_$_]
+ )[_^M_][_$_]
+ ((symbol-or-cons-p head)[_^M_][_$_]
+ (skip-until-next-lambda-list-keyword (rest lambda-list)))[_^M_][_$_]
+ ))[_^M_][_$_]
+ )[_^M_][_$_]
+ (parse-named-arguments lambda-list)[_^M_][_$_]
+ (values (nreverse vars)[_^M_][_$_]
+ (nreverse optionals)[_^M_][_$_]
+ (nreverse keywords)[_^M_][_$_]
+ (nreverse rest)[_^M_][_$_]
+ (nreverse auxiliary))[_^M_][_$_]
+ )))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defun parse-var-type-info (var)[_^M_][_$_]
+ (etypecase var[_^M_][_$_]
+ (symbol (make-lambda-var-info :name var))[_^M_][_$_]
+ (cons (make-lambda-var-info :name (first var) :type (second var)))))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defun parse-optional-var-type-info (var)[_^M_][_$_]
+ (etypecase var[_^M_][_$_]
+ (symbol (make-optional-lambda-var-info :name var))[_^M_][_$_]
+ (cons (etypecase (first var)[_^M_][_$_]
+ (symbol (if (second var) ; special case (foo nil) and (foo)[_^M_][_$_]
+ (make-optional-lambda-var-info[_^M_][_$_]
+ :name (first var)[_^M_][_$_]
+ :type (or (and (constantp (second var)) (type-of (second var)))[_^M_][_$_]
+ t))[_^M_][_$_]
+ (make-optional-lambda-var-info :name (first var))))[_^M_][_$_]
+ (cons (make-optional-lambda-var-info[_^M_][_$_]
+ :name (caar var)[_^M_][_$_]
+ :type (cadar var)[_^M_][_$_]
+ :default-value (cadr var)))[_^M_][_$_]
+ ))[_^M_][_$_]
+ ))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defun parse-auxiliary-var-type-info (var)[_^M_][_$_]
+ (parse-optional-var-type-info var))[_^M_][_$_]
+[_^M_][_$_]
+(defun parse-rest-var-type-info (var) ; See the FUNCTION type ANSI spec for an explanation.[_^M_][_$_]
+ (etypecase var[_^M_][_$_]
+ (symbol (make-rest-lambda-var-info :name var))[_^M_][_$_]
+ (cons (make-rest-lambda-var-info :name (first var) :element-type (second var)))))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defun parse-key-var-type-info (var)[_^M_][_$_]
+ (etypecase var[_^M_][_$_]
+ (symbol (make-key-lambda-var-info :name var))[_^M_][_$_]
+ (cons (destructuring-bind (var &optional (init-value nil init-value-supplied-p))[_^M_][_$_]
+ var[_^M_][_$_]
+ (let ((init-value-type[_^M_][_$_]
+ (if init-value-supplied-p[_^M_][_$_]
+ (or (and (constantp init-value) (type-of init-value))[_^M_][_$_]
+ t)[_^M_][_$_]
+ t))[_^M_][_$_]
+ )[_^M_][_$_]
+ (etypecase var[_^M_][_$_]
+ (symbol (make-key-lambda-var-info :name var[_^M_][_$_]
+ :type init-value-type[_^M_][_$_]
+ :default-value init-value))[_^M_][_$_]
+ [_^M_][_$_]
+ (cons (destructuring-bind (kwd var)[_^M_][_$_]
+ var[_^M_][_$_]
+ (etypecase var[_^M_][_$_]
+ (symbol[_^M_][_$_]
+ (make-key-lambda-var-info :name var[_^M_][_$_]
+ :default-value init-value[_^M_][_$_]
+ :type init-value-type[_^M_][_$_]
+ :keyword-name kwd))[_^M_][_$_]
+ (cons[_^M_][_$_]
+ (make-key-lambda-var-info :name (first var)[_^M_][_$_]
+ :default-value init-value[_^M_][_$_]
+ :type (second var)[_^M_][_$_]
+ :keyword-name kwd))))[_^M_][_$_]
+ ))[_^M_][_$_]
+ )))[_^M_][_$_]
+ ))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+;;; end of file -- lambda-list-parsing.lisp --[_^M_][_$_]
adddir ./lib-dependent
addfile ./lib-dependent/cl-ppcre-template.asd
hunk ./lib-dependent/cl-ppcre-template.asd 1
+;;;; -*- Mode: Lisp -*-
+
+;;;; cl-ppcre-template.asd --
+;;;; ASDF system file.
+
+(asdf:defsystem cl-ppcre-template
+ :author "Marco Antoniotti"
+ :components ((:file "cl-ppcre-template"))
+ :depends-on (cl-ppcre cl-unification))
+
+;;;; end of file -- cl-ppcre-template.asd --
addfile ./lib-dependent/cl-ppcre-template.lisp
hunk ./lib-dependent/cl-ppcre-template.lisp 1
+;;;; -*- Mode: Lisp -*-
+
+;;;; cl-ppcre-template.lisp --
+;;;; REGEXP template dependent on CL-PPCRE.
+
+(in-package "CL.EXT.DACF.UNIFICATION") ; DACF = Data And Control Flow.
+
+
+;;;; REGEXP Templates.
+;;;; Another extension of the type specifier language.
+
+;;;; A template can also be
+;;;;
+;;;; <template> ::= #| templates from template-hierarchy.lisp |#
+;;;; | <regexp template>
+;;;;
+;;;; Hairier REGEXP template spec syntax:
+;;;;
+;;;; (regexp|regular-expression) <REGEXP> &optional <unification vars> &rest <keys>
+;;;;
+;;;; where
+;;;;
+;;;; <REGEXP> ::= <a CL-PPCRE regexp string or tree>
+;;;; <unification vars> ::= '(' <variable>* ')'
+;;;; <keys> ::= <CL-PPCRE (constant) keys to be passed to CL-PPCRE:CREATE-SCANNER>
+
+(defclass regular-expression-template (string-template)
+ ((scanner :reader scanner)
+ (regexp :reader regular-expression)
+ (vars :reader variables
+ :reader registers
+ :type list)
+ )
+ (:documentation "The Regular Expression Template.
+
+A template for matching strings using regular expressions.
+The actual matching is done thankes to the CL-PPCRE library.")
+ )
+
+
+
+(defgeneric regular-expression-template-p (x)
+ (:method ((x regular-expression-template)) t)
+ (:method ((x t)) nil))
+
+
+(defmethod make-template ((kind (eql 'regexp)) (spec cons))
+ (make-instance 'regular-expression-template :spec spec))
+
+(defmethod make-template ((kind (eql 'regular-expression)) (spec cons))
+ (make-template 'regexp spec))
+
+
+(defmethod initialize-instance :after ((re-t regular-expression-template) &key)
+ (destructuring-bind (re-kwd regexp &optional vars &rest keys)
+ (template-spec re-t)
+ (declare (ignore re-kwd))
+ (multiple-value-bind (scanner reg-names)
+ (let ((cl-ppcre:*allow-named-registers* t))
+ (apply #'cl-ppcre:create-scanner regexp keys))
+ (declare (ignorable reg-names))
+ (setf (slot-value re-t 'scanner)
+ scanner
+
+ (slot-value re-t 'regexp)
+ regexp
+
+ (slot-value re-t 'vars)
+ vars ; Maybe will merge with REG-NAMES...
+ )
+ )))
+
+#|
+(defmethod initialize-instance :after ((re-t regular-expression-template) &key)
+ ;; FIX: handling of CL-PPCRE:CREATE-SCANNER keywords. This can be
+ ;; done by using the "harier" syntax of SPEC (see above).
+ (destructuring-bind (re-kwd regexp &optional vars &rest keys)
+ (template-spec re-t)
+ (declare (ignore re-kwd)
+ (ignorable regexp vars keys))
+ (multiple-value-bind (scanner reg-names)
+ (let ((cl-ppcre:*allow-named-registers* t))
+ (cl-ppcre:create-scanner (second (template-spec re-t))))
+ (declare (ignorable reg-names))
+ (setf (slot-value re-t 'scanner)
+ scanner
+
+ (slot-value re-t 'regexp)
+ (second (template-spec re-t)) ; For the time being just stored and
+ ; used for debugging.
+ )
+ )))
+|#
+
+;;;;---------------------------------------------------------------------------
+;;;; Implementation.
+
+;;; Unification.
+
+(defmethod unify ((ret1 regular-expression-template)
+ (ret2 regular-expression-template)
+ &optional (env (make-empty-environment))
+ &key &allow-other-keys)
+ (if (eq ret1 ret2)
+ env
+ ;; I could UNIFY the result of the CL-PPCRE:PARSE-STRINGs.
+ (error 'unification-failure
+ :format-control "Do not know how unify the two ~
+ regular-expression templates: ~S and ~S."
+ :format-arguments (list ret1 ret2))))
+
+
+(defmethod unify ((re-t regular-expression-template) (s string)
+ &optional (env (make-empty-environment))
+ &key
+ (start 0)
+ end
+ &allow-other-keys)
+ (declare (type (integer 0 #.most-positive-fixnum) start)
+ (type (or null (integer 0 #.most-positive-fixnum)) end))
+ (let ((end (or end (length s))))
+ (declare (type (integer 0 #.most-positive-fixnum) end))
+
+ (multiple-value-bind (matched-p strings)
+ (cl-ppcre:scan-to-strings (scanner re-t) s :start start :end end)
+ (unless matched-p
+ (error 'unification-failure
+ :format-control "String ~S cannot be matched against ~
+ regular expression ~S."
+ :format-arguments (list s
+ (regular-expression re-t))))
+ (let ((vars (variables re-t)))
+ (if (null vars)
+ env
+ (loop for r-string of-type string across strings
+ for v in vars
+ for result-env = (var-unify v r-string env)
+ then (var-unify v r-string result-env)
+ finally (return result-env))))
+ )))
+
+
+(defmethod unify ((s string) (re-t regular-expression-template)
+ &optional (env (make-empty-environment))
+ &key (start 0) end &allow-other-keys)
+ (unify re-t s env :start start :end end))
+ [_$_]
+
+;;;; end of file -- cl-ppcre-template.lisp --
addfile ./lib-dependent/cl-ppcre-template.system
hunk ./lib-dependent/cl-ppcre-template.system 1
+;;;; -*- Mode: Lisp -*-
+
+;;;; cl-ppcre-template.system --
+;;;; MK system file.
+
+(mk:defsystem "CL-PPCRE-TEMPLATE"
+ :author "Marco Antoniotti"
+ :non-required-p t
+ :components ((:file "cl-ppcre-template"))
+ :depends-on ("CL-PPCRE"))
+
+;;;; end of file -- cl-ppcre-template.system --
addfile ./match-block.lisp
hunk ./match-block.lisp 1
+;;; -*- Mode: Lisp -*-[_^M_][_$_]
+[_^M_][_$_]
+(in-package "UNIFY")[_^M_][_$_]
+[_^M_][_$_]
+(defun clean-unify-var-name (v)[_^M_][_$_]
+ (assert (variablep v))[_^M_][_$_]
+ (intern (subseq (symbol-name v) 1)[_^M_][_$_]
+ (symbol-package v)))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defmacro match ((template object[_^M_][_$_]
+ &key[_^M_][_$_]
+ (substitution (make-empty-environment))[_^M_][_$_]
+ (errorp t)[_^M_][_$_]
+ (error-value nil))[_^M_][_$_]
+ &body forms)[_^M_][_$_]
+ "Sets up a lexical environment to evaluate FORMS after a unification operation.[_^M_][_$_]
+MATCH unifies a TEMPLATE and an OBJECT and then sets up a lexical[_^M_][_$_]
+environment where the variables present in the template are bound[_^M_][_$_]
+lexically. Note that both variable names '?FOO' and 'FOO' are bound[_^M_][_$_]
+for convenience.[_^M_][_$_]
+[_^M_][_$_]
+The MATCH form returns the values returned by the evaluation of the[_^M_][_$_]
+last of the FORMS.[_^M_][_$_]
+[_^M_][_$_]
+If ERRORP is non-NIL (the default) then the form raises a[_^M_][_$_]
+UNIFICATION-FAILURE, otherwise the result of evaluating ERROR-VALUE,[_^M_][_$_]
+whose default is NIL is returned. (Note that UNIFICATION-FAILUREs[_^M_][_$_]
+raising from the evaluation of FORMS will also be caught and handled[_^M_][_$_]
+according to ERRORP settings.)[_^M_][_$_]
+"[_^M_][_$_]
+ (let ((template-vars (collect-template-vars template))[_^M_][_$_]
+ (env-var (gensym "UNIFICATION-ENV-"))[_^M_][_$_]
+ )[_^M_][_$_]
+ (flet ((generate-var-bindings ()[_^M_][_$_]
+ (loop for v in template-vars[_^M_][_$_]
+ nconc (list `(,v (find-variable-value ',v ,env-var))[_^M_][_$_]
+ `(,(clean-unify-var-name v) ,v))))[_^M_][_$_]
+ )[_^M_][_$_]
+ `(block nil[_^M_][_$_]
+ (handler-case[_^M_][_$_]
+ (let* ((,env-var (unify ',template ,object ,substitution))[_^M_][_$_]
+ ,@(generate-var-bindings)[_^M_][_$_]
+ )[_^M_][_$_]
+ ,@forms)[_^M_][_$_]
+ (unification-failure (uf)[_^M_][_$_]
+ (if ,errorp[_^M_][_$_]
+ (signal uf)[_^M_][_$_]
+ ,error-value))[_^M_][_$_]
+ )))))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(define-condition unification-non-exhaustive (unification-failure)[_^M_][_$_]
+ ())[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+(defmacro matching ((&key errorp[_^M_][_$_]
+ (default-substitution (make-empty-environment)))[_^M_][_$_]
+ &rest match-clauses)[_^M_][_$_]
+ "MATCHING sets up a COND-like environment for multiple template matching clauses.[_^M_][_$_]
+The syntax of MATCHING comprises a number of clauses of the form[_^M_][_$_]
+[_^M_][_$_]
+ <clause> ::= <regular-clause> | <default-clause>[_^M_][_$_]
+ <regular-clause> ::= ((<template> <form>) &body <forms>)[_^M_][_$_]
+ <default-clause> ::= (t &body <forms>)[_^M_][_$_]
+ | (otherwise &body <forms>)[_^M_][_$_]
+<form> and <forms> are regular Common Lisp forms.[_^M_][_$_]
+<template> is a unification template.[_^M_][_$_]
+[_^M_][_$_]
+The full syntax of MATCHING is[_^M_][_$_]
+[_^M_][_$_]
+ matching (&key errorp default-substitution) <clauses>[_^M_][_$_]
+[_^M_][_$_]
+Each clause evaluates its forms in an environment where the variables[_^M_][_$_]
+present in the template are bound lexically. Note that both variable[_^M_][_$_]
+names '?FOO' and 'FOO' are bound for convenience.[_^M_][_$_]
+[_^M_][_$_]
+The values returned by the MATCHING form are those of the last form in[_^M_][_$_]
+the first clause that satisfies the match test.[_^M_][_$_]
+[_^M_][_$_]
+If ERRORP is non-NIL then if none of the regular clauses matches, then[_^M_][_$_]
+an error of type UNIFICATION-NON-EXAUSTIVE is signalled, regardless of[_^M_][_$_]
+any default clause. Otherwise, the default clause behaves as a[_^M_][_$_]
+standard COND default clause. The default value of ERRORP is NIL.[_^M_][_$_]
+"[_^M_][_$_]
+ (declare (ignore default-substitution)) ; For the time being.[_^M_][_$_]
+ (labels ((%%match%% (clause-var template object forms substitution)[_^M_][_$_]
+ (let ((template-vars (collect-template-vars template)))[_^M_][_$_]
+ (flet ((generate-var-bindings ()[_^M_][_$_]
+ (loop for v in template-vars[_^M_][_$_]
+ nconc (list `(,v (find-variable-value ',v ,clause-var))[_^M_][_$_]
+ `(,(clean-unify-var-name v) ,v))))[_^M_][_$_]
+ )[_^M_][_$_]
+ `((setf ,clause-var[_^M_][_$_]
+ (ignore-errors (unify ',template ,object ,substitution)))[_^M_][_$_]
+ (let* (,@(generate-var-bindings))[_^M_][_$_]
+ ,@forms))[_^M_][_$_]
+ )))[_^M_][_$_]
+[_^M_][_$_]
+ (build-match-clause (match-clause match-env-var)[_^M_][_$_]
+ (destructuring-bind ((template object) &body forms)[_^M_][_$_]
+ match-clause[_^M_][_$_]
+ (%%match%% match-env-var template object forms '(make-empty-environment))))[_^M_][_$_]
+ )[_^M_][_$_]
+ (when (or (> 1 (count t match-clauses :key #'first))[_^M_][_$_]
+ (> 1 (count 'otherwise match-clauses :key #'first)))[_^M_][_$_]
+ (error 'program-error))[_^M_][_$_]
+ (let* ((default-clause (or (find t match-clauses :key #'first)[_^M_][_$_]
+ (find 'otherwise match-clauses :key #'first)))[_^M_][_$_]
+ (match-clauses (delete default-clause match-clauses)) ; EQL test suffices.[_^M_][_$_]
+ )[_^M_][_$_]
+ `(block matching[_^M_][_$_]
+ (cond ,@(mapcar (lambda (match-clause match-clause-env-var)[_^M_][_$_]
+ (build-match-clause match-clause match-clause-env-var))[_^M_][_$_]
+ match-clauses[_^M_][_$_]
+ (mapcar (lambda (mc)[_^M_][_$_]
+ (declare (ignore mc))[_^M_][_$_]
+ (gensym "UNIFICATION-ENV-")[_^M_][_$_]
+ )[_^M_][_$_]
+ match-clauses))[_^M_][_$_]
+ (,errorp[_^M_][_$_]
+ (error 'unification-non-exhaustive[_^M_][_$_]
+ :format-control "Non exhaustive matching."))[_^M_][_$_]
+ ,@(when default-clause (list default-clause)))))[_^M_][_$_]
+ ))[_^M_][_$_]
+[_^M_][_$_]
+[_^M_][_$_]
+;;; end of file -- math-blocks.lisp --[_^M_][_$_]
addfile ./substitutions.lisp
hunk ./substitutions.lisp 1
+;;; -*- Mode: Lisp -*-
+
+;;; substitutions.lisp
+;;; General CL structures unifier.
+;;; Substitution definitions.
+
+(in-package "CL.EXT.DACF.UNIFICATION") ; DACF = Data And Control Flow.
+
+;;;---------------------------------------------------------------------------
+;;; Bindings.
+
+(deftype binding () 'cons)
+
+(deftype bindings () 'list) ; An A-LIST.
+
+(defun make-binding (variable value)
+ (cons variable value))
+
+(defun extend-bindings (variable value bindings)
+ (acons variable value bindings))
+
+
+(defun binding-variable (b)
+ (declare (type binding b))
+ (car b))
+
+(defun binding-value (b)
+ (declare (type binding b))
+ (cdr b))
+
+
+(define-condition unification-variable-unbound (unbound-variable)
+ ()
+ )
+
+(define-condition unification-failure (simple-error)
+ ())
+
+
+;;;---------------------------------------------------------------------------
+;;; Frames.
+
+(defstruct frame
+ (bindings () :type bindings))
+
+(defun empty-frame-p (f)
+ (declare (type frame f))
+ (null (frame-bindings f)))
+
+
+(defun find-variable-binding-in-frame (v f)
+ (declare (type frame f))
+ (assoc v (frame-bindings f)))
+
+
+(defun find-variable-value-in-frame (v f)
+ (declare (type frame f))
+ (let ((b (find-variable-binding-in-frame v f)))
+ (declare (type (or null binding) b))
+ (if b
+ (values (cdr b) t)
+ (values nil nil))))
+
+
+;;;---------------------------------------------------------------------------
+;;; Environments.
+
+(defstruct (environment (:print-object print-environment))
+ (frames () :type list))
+
+(defun print-environment (env stream)
+ (if *print-readably*
+ (format stream "#S(ENVIRONMENT FRAMES ~S)"
+ (environment-frames env))
+ (print-unreadable-object (env stream :type nil :identity t)
+ (format stream "~:[~;EMPTY ~]UNIFY ENVIRONMENT: ~D frame~:P"
+ (empty-environment-p env)
+ (list-length (environment-frames env))))))
+
+(deftype substitution () 'environment)
+
+(defun substitution-p (x) (environment-p x))
+
+(defun first-frame (env)
+ (first (environment-frames env)))
+
+
+(defun make-empty-environment ()
+ (make-environment :frames (list (make-frame))))
+
+(defun copy-environment (env)
+ (make-environment :frames (copy-list (environment-frames env))))
+
+(defun make-shared-environment (env)
+ (make-environment :frames (environment-frames env)))
+
+(defun empty-environment-p (env &aux (env-frames (environment-frames env)))
+ (declare (type environment env))
+ (and (= 1 (list-length env-frames))
+ (empty-frame-p (first env-frames))))
+
+(defparameter *null-environment* (make-empty-environment))
+
+
+(defun find-variable-value (variable &optional (env *null-environment*) errorp)
+ (declare (type environment env))
+ (labels ((find-var-value (frames)
+ (cond (frames
+ (multiple-value-bind (val foundp)
+ (find-variable-value-in-frame variable (first frames))
+ (if foundp
+ (values val t)
+ (find-var-value (rest frames)))))
+ (errorp
+ (error 'unification-variable-unbound :variable variable))
+ (t (values nil nil))))
+ )
+ (find-var-value (environment-frames env))))
+
+
+
+(defun extend-environment (var pat env)
+ (let ((first-frame (first-frame env)))
+ (setf (frame-bindings first-frame)
+ (extend-bindings var pat (frame-bindings first-frame)))
+ env))
+
+
+;;; end of file -- substitutions.lisp --
addfile ./templates-hierarchy-saved.lisp
hunk ./templates-hierarchy-saved.lisp 1
+;;; -*- Mode: Lisp -*-
+
+(in-package "CL.EXT.DACF.UNIFICATION") ; DACF = Data And Control Flow.
+
+;;; Templates.
+;;; Essentially we extend the type specifier language.
+;;; The interesting thing is that we need to specify how a "match"
+;;; between a template and a CL object is performed.
+
+;;; A template is one of the following
+;;;
+;;; <template> ::= <logical variable>
+;;; | <structure template>
+;;; | <instance template>
+;;; | <destructuring template>
+;;; | <vector template>
+;;; | <sequence template>
+;;; | <array template>
+;;; | <type template>
+;;; | <lisp object>
+;;;
+
+;;; Destructuring Template Lambda List (as per standard CL terminology)
+;;;
+;;; <destructuring template lambda list> ::= <a "destructuring LL" with <template> in lieu of <var>>
+
+;;; Templates for Structures and Instances
+;;;
+;;; <structure template> ::= (<class designator> <structure-slot-spec>*)
+;;;
+;;; <instance template> ::= (<class designator> <slot-spec>*)
+;;;
+;;; where
+;;;
+;;; <structure-slot-spec> ::= (<reader-name> <template>)
+;;; <instance-slot-spec> ::= (slot-access <accessor-name> <template>)
+;;; | (slot-value <slot-name> <template>)
+
+;;; Template for Sequences
+;;;
+;;; <sequence template> ::= (<container type> . <destructuring template lambda list>)
+;;; | (subseq <from> <to> . <destructuring template lambda list>)
+;;; <container type> ::= list | cons | vector | array
+
+;;; Templates for Vectors and Arrays.
+;;;
+;;; <vector template> ::= (vector . <destructuring template lambda list>)
+;;;
+;;; <array template> ::= (array <shape template>)
+;;; | (aref <index template> <template>)
+;;; <shape template> ::= (<destructuring template lambda list>)
+;;; | <sequence template>
+;;; | (<shape template>)
+
+;;; Templates for LIST and CONS
+;;; <list template> ::= (list <destructuring template lambda list>)
+;;; <cons template> ::= (cons <template> <template>)
+
+;;; A regular list or cons acts as a list or cons template.
+
+(define-condition unification-template-error (simple-error)
+ ())
+
+;;; Templates are introduced by the reader macro #T(...)
+
+(defclass template ()
+ ((spec :accessor template-spec :type (or symbol cons) :initarg :spec))
+ (:default-initargs :spec nil))
+
+(defgeneric template-p (x)
+ (:method ((x template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass type-template (template) ())
+
+(defgeneric type-template-p (x)
+ (:method ((x type-template)) t)
+ (:method ((x t)) nil))
+
+
+(defgeneric type-template-type-spec (x)
+ (:method ((x type-template))
+ (let ((spec (template-spec x)))
+ (if spec
+ (first spec)
+ 'null))))
+
+
+
+(defclass nil-template (type-template) ()) ; This is the point where we break the type hierarchy.
+
+(defgeneric nil-template-p (x)
+ (:method ((x nil-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass expression-template (template) ())
+
+(defgeneric expression-template-p (x)
+ (:method ((x expression-template)) t)
+ (:method ((x t)) nil))
+
+
+(defmethod print-object ((template template) (stream stream))
+ (format stream "#T~S" (template-spec template)))
+
+
+(defclass sequence-template (type-template) ())
+
+(defgeneric sequence-template-p (x)
+ (:method ((x sequence-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass list-template (sequence-template) ())
+
+(defgeneric list-template-p (x)
+ (:method ((x list-template)) t)
+ (:method ((x t)) nil))
+
+(defclass array-template (type-template) ())
+
+(defgeneric array-template-p (x)
+ (:method ((x array-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass vector-template (sequence-template array-template) ())
+
+(defgeneric vector-template-p (x)
+ (:method ((x vector-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass string-template (vector-template) ())
+
+(defgeneric string-template-p (x)
+ (:method ((x string-template)) t)
+ (:method ((x t)) nil))
+
+
+
+
+(defclass symbol-template (type-template) ())
+
+(defgeneric symbol-template-p (x)
+ (:method ((x symbol-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass number-template (type-template) ())
+
+(defgeneric number-template-p (x)
+ (:method ((x number-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass structure-object-template (type-template) ())
+
+(defgeneric structure-object-template-p (x)
+ (:method ((x structure-object-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass standard-object-template (type-template) ())
+
+(defgeneric standard-object-template-p (x)
+ (:method ((x standard-object-template)) t)
+ (:method ((x t)) nil))
+
+
+;;; Expression Templates.
+
+(defclass subseq-template (expression-template) ())
+
+(defgeneric subseq-template-p (x)
+ (:method ((x subseq-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass elt-template (expression-template) ())
+
+(defgeneric elt-template-p (x)
+ (:method ((x elt-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass aref-template (elt-template) ())
+
+(defgeneric aref-template-p (x)
+ (:method ((x aref-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass nth-template (elt-template) ())
+
+(defgeneric nth-template-p (x)
+ (:method ((x nth-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass nthcdr-template (elt-template) ())
+
+(defgeneric nthcdr-template-p (x)
+ (:method ((x nthcdr-template)) t)
+ (:method ((x t)) nil))
+
+
+(defgeneric make-template (kind spec))
+
+;;; Setting up the reader macro.
+
+(defun |#T-reader| (stream subchar arg)
+ (declare (ignore subchar arg))
+ (let ((spec (read stream t nil t)))
+ (typecase spec
+ (null (make-template nil spec))
+ (cons (make-template (first spec) spec))
+ (t (make-template spec spec)))))
+
+
+(eval-when (:load-toplevel :execute)
+ (set-dispatch-macro-character #\# #\T #'|#T-reader|))
+
+(defmethod make-template ((kind null) (spec symbol))
+ (assert (null spec) (spec) "MAKE-TEMPLATE called erroneously with ~S and ~S." kind spec)
+ (make-instance 'nil-template :spec spec))
+
+(defmethod make-template ((kind symbol) (spec symbol))
+ (make-instance 'symbol-template :spec spec))
+
+(defmethod make-template ((kind (eql 'symbol)) (spec cons))
+ (make-instance 'symbol-template :spec spec))
+
+(defmethod make-template ((kind symbol) (spec cons))
+ (cond ((subtypep kind 'number)
+ (make-instance 'number-template :spec spec))
+ ((subtypep kind 'structure-object)
+ (make-instance 'structure-object-template :spec spec))
+ ((subtypep kind 'standard-object)
+ (make-instance 'standard-object-template :spec spec))
+ (t
+ (error 'unification-template-error
+ :format-control "Unknown template specifier ~S."
+ :format-arguments (list kind)))
+ ))
+
+(defmethod make-template ((kind cons) (spec cons))
+ (cond ((subtypep kind 'number)
+ (make-instance 'number-template :spec spec))
+ ((subtypep kind 'string)
+ (make-instance 'string-template :spec spec))
+ ((subtypep kind 'vector)
+ (make-instance 'vector-template :spec spec))
+ ((subtypep kind 'array)
+ (make-instance 'array-template :spec spec))
+ (t
+ (error 'unification-template-error
+ :format-control "Unknown template specifier ~S."
+ :format-arguments (list kind)))
+ ))
+
+(defmethod make-template ((kind (eql 'sequence)) (spec cons))
+ (make-instance 'sequence-template :spec spec))
+
+(defmethod make-template ((kind (eql 'list)) (spec cons))
+ (make-instance 'list-template :spec spec))
+
+(defmethod make-template ((kind (eql 'vector)) (spec cons))
+ (make-instance 'vector-template :spec spec))
+
+(defmethod make-template ((kind (eql 'string)) (spec cons))
+ (make-instance 'stringvector-template :spec spec))
+
+(defmethod make-template ((kind (eql 'array)) (spec cons))
+ (make-instance 'array-template :spec spec))
+
+
+(defmethod make-template ((kind (eql 'subseq)) (spec cons))
+ (make-instance 'subseq-template :spec spec))
+
+(defmethod make-template ((kind (eql 'elt)) (spec cons))
+ (make-instance 'elt-template :spec spec))
+
+(defmethod make-template ((kind (eql 'aref)) (spec cons))
+ (make-instance 'aref-template :spec spec))
+
+(defmethod make-template ((kind (eql 'nth)) (spec cons))
+ (make-instance 'nth-template :spec spec))
+
+(defmethod make-template ((kind (eql 'nthcdr)) (spec cons))
+ (make-instance 'nthcdr-template :spec spec))
+
+
+
+
+;;; Implementation.
+
+;;; Symbol Templates.
+;;; Specification is
+;;;
+;;; (symbol <symbol>)
+
+(defun symbol-template-symbol (x)
+ (declare (type symbol-template x))
+ (assert (symbol-template-p x) (x) "Non symbol template ~S." x)
+ (let ((spec (template-spec x)))
+ (cond ((symbolp spec) spec)
+ ((consp spec) (second spec)))))
+
+
+;;; Number template
+;;; Specification is
+;;;
+;;; (<number type> <number>)
+;;; or
+;;;
+;;; <number>
+
+(defun number-template-number (x)
+ (declare (type number-template x))
+ (assert (number-template-p x) (x) "Non number template ~S." x)
+ (let ((spec (template-spec x)))
+ (etypecase spec
+ (symbol spec)
+ (number spec)
+ (consp (second spec)))))
+
+
+;;; Sequence Templates.
+;;; Specification is
+;;;
+;;; (<sequence subtype> . <destructuring template lambda list>)
+;;; or
+;;; (subseq <from> <to> . <destructuring template lambda list>)
+
+(defun sequence-template-lambda-list (x)
+ (declare (type sequence-template x))
+ (assert (sequence-template-p x) (x) "Non sequence template ~S." x)
+ (rest (template-spec x)))
+
+
+;;; Array Templates.
+;;; Specification is
+;;;
+;;; (array (['*' | <element type>] [<dimension spec>]) <shape template>)
+;;; or
+;;; (<array type specifier> <shape template>)
+
+
+(defun array-template-shape-template (x)
+ (declare (type array-template x))
+ (assert (array-template-p x) (x) "Non array template ~S." x)
+ (let ((spec (template-spec x)))
+ (third spec)))
+
+
+(defun array-template-type-template (x)
+ (declare (type array-template x))
+ (assert (array-template-p x) (x) "Non array template ~S." x)
+ (let ((spec (template-spec x)))
+ (second spec)))
+
+
+(defun aref-template-indexes (x)
+ (declare (type aref-template x))
+ (assert (aref-template-p x) (x) "Non aref template ~S." x)
+ (let ((spec (template-spec x)))
+ (second spec)))
+
+
+(defun aref-template-element (x)
+ (declare (type aref-template x))
+ (assert (aref-template-p x) (x) "Non array template ~S." x)
+ (let ((spec (template-spec x)))
+ (third spec)))
+
+
+;;; Vector Templates.
+;;; Specification is
+;;;
+;;; (vector . <destructuring template lambda list>)
+
+;;; Structure and Standard Object Templates.
+
+(defun structure-object-template-slots (x)
+ (and (structure-object-template-p x)
+ (rest (template-spec x))))
+
+
+(defun standard-object-template-slots (x)
+ (and (standard-object-template-p x)
+ (rest (template-spec x))))
+
+
+;;;===========================================================================
+;;; Template variables.
+;;; Let's walk down a template.
+;;; Note that there is an asymmetry here: I admit some containers to have
+;;; variables inside, but I do not search instances of a class for variables.
+;;; This is an asymmetry that would be way too hard to fix without more
+;;; introspective power (which is available in the MOP, but not standard.)
+
+(defgeneric collect-template-vars (template))
+
+(defmethod collect-template-vars ((template template))
+ (let ((spec (template-spec template)))
+ (nconc (collect-template-vars (car spec))
+ (collect-template-vars (cdr spec)))))
+
+(defmethod collect-template-vars ((template symbol-template))
+ (let ((template (symbol-template-symbol template)))
+ (when (and (variablep template) (not (variable-any-p template)))
+ (list template))))
+
+
+(defmethod collect-template-vars ((template number-template))
+ (let ((template (number-template-number template)))
+ (etypecase template
+ (number ())
+ (symbol (cond ((variablep template) template)
+ ((and (boundp template)
+ (numberp (symbol-value template)))
+ (symbol-value template))
+ (t
+ (error "Invalid number template ~S." template)))))))
+
+
+(defmethod collect-template-vars ((template symbol))
+ (when (and (variablep template) (not (variable-any-p template)))
+ (list template)))
+
+(defmethod collect-template-vars ((template null))
+ ())
+
+(defmethod collect-template-vars ((template cons))
+ (nconc (collect-template-vars (car template))
+ (collect-template-vars (cdr template))))
+
+(defmethod collect-template-vars ((template string))
+ ())
+
+
+(defmethod collect-template-vars ((template vector))
+ (loop for e across template
+ nconc (collect-template-vars e)))
+
+
+(defmethod collect-template-vars ((template array))
+ (loop for i below (array-total-size template)
+ nconc (collect-template-vars (row-major-aref template i))))
+
+
+(defmethod collect-template-vars ((template t))
+ ())
+
+;;; end of file -- templates.lisp --
addfile ./templates-hierarchy.lisp
hunk ./templates-hierarchy.lisp 1
+;;; -*- Mode: Lisp -*-
+
+(in-package "CL.EXT.DACF.UNIFICATION") ; DACF = Data And Control Flow.
+
+;;; Templates.
+;;; Essentially we extend the type specifier language.
+;;; The interesting thing is that we need to specify how a "match"
+;;; between a template and a CL object is performed.
+
+;;; A template is one of the following
+;;;
+;;; <template> ::= <logical variable>
+;;; | <structure template>
+;;; | <instance template>
+;;; | <destructuring template>
+;;; | <vector template>
+;;; | <sequence template>
+;;; | <array template>
+;;; | <type template>
+;;; | <lisp object>
+;;;
+
+;;; Destructuring Template Lambda List (as per standard CL terminology)
+;;;
+;;; <destructuring template lambda list> ::= <a "destructuring LL" with <template> in lieu of <var>>
+
+;;; Templates for Structures and Instances
+;;;
+;;; <structure template> ::= (<class designator> <structure-slot-spec>*)
+;;;
+;;; <instance template> ::= (<class designator> <slot-spec>*)
+;;;
+;;; where
+;;;
+;;; <structure-slot-spec> ::= <reader-name> <template>
+;;; <instance-slot-spec> ::= <accessor-name> <template>
+;;; | (slot-value <slot-name>) <template>
+
+;;; Template for Sequences
+;;;
+;;; <sequence template> ::= (<container type> . <destructuring template lambda list>)
+;;; | (subseq <from> <to> . <destructuring template lambda list>)
+;;; <container type> ::= list | cons | vector | array
+
+;;; Templates for Vectors and Arrays.
+;;;
+;;; <vector template> ::= (vector . <destructuring template lambda list>)
+;;;
+;;; <array template> ::= (array <shape template>)
+;;; | (<array CL type specifier> <shape template>)
+;;; | (array (['*' | <element type>] [<dimension spec>]]) <shape template>)
+;;; | (aref <index template> <template>)
+;;; <shape template> ::= <destructuring template lambda list>
+;;; | <sequence template>
+;;; | (<shape template>)
+
+;;; Templates for LIST and CONS
+;;; <list template> ::= (list . <destructuring template lambda list>)
+;;; <cons template> ::= (cons <template> <template>)
+
+;;; A regular list or cons acts as a list (hence as a sequence) template, or a cons template.
+
+(define-condition unification-template-error (simple-error)
+ ())
+
+;;; Templates are introduced by the reader macro #T(...)
+
+(defclass template ()
+ ((spec :accessor template-spec :type (or symbol cons) :initarg :spec))
+ (:default-initargs :spec nil))
+
+(defgeneric template-p (x)
+ (:method ((x template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass type-template (template) ())
+
+(defgeneric type-template-p (x)
+ (:method ((x type-template)) t)
+ (:method ((x t)) nil))
+
+
+(defgeneric type-template-type-spec (x)
+ (:method ((x type-template))
+ (let ((spec (template-spec x)))
+ (if spec
+ (first spec)
+ 'null))))
+
+
+
+(defclass nil-template (type-template) ()) ; This is the point where we break the type hierarchy.
+
+(defgeneric nil-template-p (x)
+ (:method ((x nil-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass expression-template (template) ())
+
+(defgeneric expression-template-p (x)
+ (:method ((x expression-template)) t)
+ (:method ((x t)) nil))
+
+
+(defmethod print-object ((template template) (stream stream))
+ (format stream "#T~S" (template-spec template)))
+
+
+(defclass sequence-template (type-template) ())
+
+(defgeneric sequence-template-p (x)
+ (:method ((x sequence-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass list-template (sequence-template) ())
+
+(defgeneric list-template-p (x)
+ (:method ((x list-template)) t)
+ (:method ((x t)) nil))
+
+(defclass array-template (type-template) ())
+
+(defgeneric array-template-p (x)
+ (:method ((x array-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass vector-template (sequence-template array-template) ())
+
+(defgeneric vector-template-p (x)
+ (:method ((x vector-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass string-template (vector-template) ())
+
+(defgeneric string-template-p (x)
+ (:method ((x string-template)) t)
+ (:method ((x t)) nil))
+
+
+
+
+(defclass symbol-template (type-template) ())
+
+(defgeneric symbol-template-p (x)
+ (:method ((x symbol-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass number-template (type-template) ())
+
+(defgeneric number-template-p (x)
+ (:method ((x number-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass structure-object-template (type-template) ())
+
+(defgeneric structure-object-template-p (x)
+ (:method ((x structure-object-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass standard-object-template (type-template) ())
+
+(defgeneric standard-object-template-p (x)
+ (:method ((x standard-object-template)) t)
+ (:method ((x t)) nil))
+
+
+;;; Expression Templates.
+
+(defclass subseq-template (expression-template) ())
+
+(defgeneric subseq-template-p (x)
+ (:method ((x subseq-template)) t)
+ (:method ((x t)) nil))
+
+
+
+(defclass element-template (expression-template) ())
+
+(defgeneric element-template-p (x)
+ (:method ((x element-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass elt-template (element-template) ())
+
+(defgeneric elt-template-p (x)
+ (:method ((x elt-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass aref-template (element-template) ())
+
+(defgeneric aref-template-p (x)
+ (:method ((x aref-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass nth-template (element-template) ())
+
+(defgeneric nth-template-p (x)
+ (:method ((x nth-template)) t)
+ (:method ((x t)) nil))
+
+
+(defclass nthcdr-template (element-template) ())
+
+(defgeneric nthcdr-template-p (x)
+ (:method ((x nthcdr-template)) t)
+ (:method ((x t)) nil))
+
+
+(defgeneric make-template (kind spec))
+
+;;; Setting up the reader macro.
+
+(defun |#T-reader| (stream subchar arg)
+ (declare (ignore subchar arg))
+ (let ((spec (read stream t nil t)))
+ (typecase spec
+ (null (make-template nil spec))
+ (cons (make-template (first spec) spec))
+ (t (make-template spec spec)))))
+
+
+(eval-when (:load-toplevel :execute)
+ (set-dispatch-macro-character #\# #\T #'|#T-reader|))
+
+(defmethod make-template ((kind null) (spec symbol))
+ (assert (null spec) (spec) "MAKE-TEMPLATE called erroneously with ~S and ~S." kind spec)
+ (make-instance 'nil-template :spec spec))
+
+(defmethod make-template ((kind symbol) (spec symbol))
+ (make-instance 'symbol-template :spec spec))
+
+(defmethod make-template ((kind (eql 'symbol)) (spec cons))
+ (make-instance 'symbol-template :spec spec))
+
+(defmethod make-template ((kind symbol) (spec cons))
+ (cond ((subtypep kind 'number)
+ (make-instance 'number-template :spec spec))
+ ((subtypep kind 'structure-object)
+ (make-instance 'structure-object-template :spec spec))
+ ((subtypep kind 'standard-object)
+ (make-instance 'standard-object-template :spec spec))
+ (t
+ (error 'unification-template-error
+ :format-control "Unknown template specifier ~S."
+ :format-arguments (list kind)))
+ ))
+
+(defmethod make-template ((kind cons) (spec cons))
+ (cond ((subtypep kind 'number)
+ (make-instance 'number-template :spec spec))
+ ((subtypep kind 'string)
+ (make-instance 'string-template :spec spec))
+ ((subtypep kind 'vector)
+ (make-instance 'vector-template :spec spec))
+ ((subtypep kind 'array)
+ (make-instance 'array-template :spec spec))
+ (t
+ (error 'unification-template-error
+ :format-control "Unknown template specifier ~S."
+ :format-arguments (list kind)))
+ ))
+
+(defmethod make-template ((kind number) (spec number))
+ (assert (= kind spec))
+ (make-instance 'number-template :spec spec))
+
+(defmethod make-template ((kind (eql 'sequence)) (spec cons))
+ (make-instance 'sequence-template :spec spec))
+
+(defmethod make-template ((kind (eql 'list)) (spec cons))
+ (make-instance 'list-template :spec spec))
+
+(defmethod make-template ((kind (eql 'vector)) (spec cons))
+ (make-instance 'vector-template :spec spec))
+
+(defmethod make-template ((kind (eql 'string)) (spec cons))
+ (make-instance 'string-template :spec spec))
+
+(defmethod make-template ((kind (eql 'array)) (spec cons))
+ (make-instance 'array-template :spec spec))
+
+
+(defmethod make-template ((kind (eql 'subseq)) (spec cons))
+ (make-instance 'subseq-template :spec spec))
+
+(defmethod make-template ((kind (eql 'elt)) (spec cons))
+ (make-instance 'elt-template :spec spec))
+
+(defmethod make-template ((kind (eql 'aref)) (spec cons))
+ (make-instance 'aref-template :spec spec))
+
+(defmethod make-template ((kind (eql 'nth)) (spec cons))
+ (make-instance 'nth-template :spec spec))
+
+(defmethod make-template ((kind (eql 'nthcdr)) (spec cons))
+ (make-instance 'nthcdr-template :spec spec))
+
+
+
+
+;;; Implementation.
+
+;;; Symbol Templates.
+;;; Specification is
+;;;
+;;; (symbol <symbol>)
+
+(defun symbol-template-symbol (x)
+ (declare (type symbol-template x))
+ (assert (symbol-template-p x) (x) "Non symbol template ~S." x)
+ (let ((spec (template-spec x)))
+ (cond ((symbolp spec) spec)
+ ((consp spec) (second spec)))))
+
+
+;;; Number template
+;;; Specification is
+;;;
+;;; (<number type> <number>)
+;;; or
+;;;
+;;; <number>
+
+(defun number-template-number (x)
+ (declare (type number-template x))
+ (assert (number-template-p x) (x) "Non number template ~S." x)
+ (let ((spec (template-spec x)))
+ (etypecase spec
+ (symbol spec)
+ (number spec)
+ (cons (second spec)))))
+
+
+;;; Sequence Templates.
+;;; Specification is
+;;;
+;;; (<sequence subtype> . <destructuring template lambda list>)
+;;; or
+;;; (subseq <from> <to> . <destructuring template lambda list>)
+
+(defun sequence-template-lambda-list (x)
+ (declare (type sequence-template x))
+ (assert (sequence-template-p x) (x) "Non sequence template ~S." x)
+ (rest (template-spec x)))
+
+
+;;; Vector Templates.
+;;; Specification is
+;;;
+;;; (<vector type specifier> . <destructuring template lambda list>)
+
+(defun vector-template-element-type (x)
+ (declare (type vector-template x))
+ (assert (vector-template-p x) (x) "Non vector template ~S." x)
+ (let ((spec (type-template-type-spec x)))
+ (if (consp spec)
+ (destructuring-bind (vector-kwd &optional (element-type '*) size)
+ spec
+ (declare (ignore vector-kwd size))
+ element-type)
+ '*)))
+
+
+(defun vector-template-size (x)
+ (declare (type vector-template x))
+ (assert (vector-template-p x) (x) "Non vector template ~S." x)
+ (let ((spec (type-template-type-spec x)))
+ (if (consp spec)
+ (destructuring-bind (vector-kwd &optional element-type (size '*))
+ spec
+ (declare (ignore vector-kwd element-type))
+ size)
+ '*)))
+
+
+;;; Array Templates.
+;;; Specification is
+;;;
+;;; (array (['*' | <element type>] [<dimension spec>]) <shape template>)
+;;; or
+;;; (<array type specifier> <shape template>)
+
+
+(defun array-template-shape-template (x)
+ (declare (type array-template x))
+ (assert (array-template-p x) (x) "Non array template ~S." x)
+ (let ((t-spec (template-spec x)))
+ (if (= 2 (list-length t-spec))
+ (second t-spec)
+ (third t-spec))))
+
+
+(defun array-template-element-type (x)
+ (declare (type array-template x))
+ (assert (array-template-p x) (x) "Non array template ~S." x)
+ (let ((type-spec (type-template-type-spec x)))
+ (if (consp type-spec)
+ (destructuring-bind (array-kwd &optional (element-type '*) dimension-spec)
+ type-spec
+ (declare (ignore array-kwd dimension-spec))
+ element-type)
+ '*)))
+
+
+(defun array-template-dimensions (x)
+ (declare (type array-template x))
+ (assert (array-template-p x) (x) "Non array template ~S." x)
+ (let ((type-spec (type-template-type-spec x)))
+ (if (consp type-spec)
+ (destructuring-bind (array-kwd &optional element-type (dimension-spec '*))
+ type-spec
+ (declare (ignore array-kwd element-type))
+ dimension-spec)
+ '*)))
+
+
+
+;;; Structure and Standard Object Templates.
+
+(defun structure-object-template-slots (x)
+ (and (structure-object-template-p x)
+ (rest (template-spec x))))
+
+
+(defun standard-object-template-slots (x)
+ (and (standard-object-template-p x)
+ (rest (template-spec x))))
+
+
+;;;---------------------------------------------------------------------------
+;;; Expression Templates.
+
+
+;;; AREF Templates.
+
+(defun aref-template-indexes (x)
+ (declare (type aref-template x))
+ (assert (aref-template-p x) (x) "Non aref template ~S." x)
+ (let ((spec (template-spec x)))
+ (second spec)))
+
+
+(defun aref-template-element (x)
+ (declare (type aref-template x))
+ (assert (aref-template-p x) (x) "Non array template ~S." x)
+ (let ((spec (template-spec x)))
+ (third spec)))
+
+
+
+
+;;;===========================================================================
+;;; Template variables.
+;;; Let's walk down a template.
+;;; Note that there is an asymmetry here: I admit some containers to have
+;;; variables inside, but I do not search instances of a class for variables.
+;;; This is an asymmetry that would be way too hard to fix without more
+;;; introspective power (which is available in the MOP, but not standard.)
+
+(defgeneric collect-template-vars (template))
+
+(defmethod collect-template-vars ((template template))
+ (let ((spec (template-spec template)))
+ (nconc (collect-template-vars (car spec))
+ (collect-template-vars (cdr spec)))))
+
+(defmethod collect-template-vars ((template symbol-template))
+ (let ((template (symbol-template-symbol template)))
+ (when (and (variablep template) (not (variable-any-p template)))
+ (list template))))
+
+
+(defmethod collect-template-vars ((template number-template))
+ (let ((template (number-template-number template)))
+ (etypecase template
+ (number ())
+ (symbol (cond ((variablep template) template)
+ ((and (boundp template)
+ (numberp (symbol-value template)))
+ (symbol-value template))
+ (t
+ (error "Invalid number template ~S." template)))))))
+
+
+(defmethod collect-template-vars ((template symbol))
+ (when (and (variablep template) (not (variable-any-p template)))
+ (list template)))
+
+(defmethod collect-template-vars ((template null))
+ ())
+
+(defmethod collect-template-vars ((template cons))
+ (nconc (collect-template-vars (car template))
+ (collect-template-vars (cdr template))))
+
+(defmethod collect-template-vars ((template string))
+ ())
+
+
+(defmethod collect-template-vars ((template vector))
+ (loop for e across template
+ nconc (collect-template-vars e)))
+
+
+(defmethod collect-template-vars ((template array))
+ (loop for i below (array-total-size template)
+ nconc (collect-template-vars (row-major-aref template i))))
+
+
+(defmethod collect-template-vars ((template t))
+ ())
+
+;;; end of file -- templates.lisp --
adddir ./test
addfile ./test/unification-tests.lisp
hunk ./test/unification-tests.lisp 1
+;;;; -*- Mode: Lisp -*-
+
+;;;; unification-tests.lisp --
+;;;; CL-UNIFICATION test suite. Requires Franz's util.test package.
+
+(in-package "UNIFY.TESTS")
+
+(use-package "UNIFY")
+(use-package "UTIL.TEST")
+
+(with-tests (:name "basic constant unification")
+ (test t (unify:environment-p (unify 42 42)))
+
+ (test-error (unify 42 12) :condition-type 'unification-failure)
+
+ (test-error (unify 42 'a) :condition-type 'unification-failure)
+
+ (test t (unify:environment-p (unify 'a 'a)))
+
+ (test t (unify:environment-p (unify '(a s d) '(a s d))))
+
+ (test t (unify:environment-p (unify '(a (s 42) d) '(a (s 42) d))))
+
+ (test-error (unify '(a (s forty-two) d) '(a (s 42) z))
+ :condition-type 'unification-failure)
+
+ (test t (unify:environment-p (unify #(a s d) #(a s d))))
+
+ (test t (unify:environment-p (unify #2a((a s d) (a s d))
+ #2a((a s d) (a s d)))))
+
+ (test-error (unify #2a((a s d) (a s d))
+ #2a((a s d) (a 42 d)))
+ :condition-type 'unification-failure)
+
+ (test t (unify:environment-p (unify "I am a string" "I am a string")))
+
+ (test-error (unify "I am a string" "I am A string")
+ :condition-type 'unification-failure)
+
+ (test t (let ((*unify-string-case-insensitive-p* t))
+ (unify:environment-p (unify "I am a string" "I am A string"))))
+
+ )
+
+
+(with-tests (:name "variables unification")
+ (test '(42 T) (find-variable-value '?x (unify 42 '?x))
+ :multiple-values t)
+ (test '(NIL NIL) (find-variable-value '?y (unify 42 '?x))
+ :multiple-values t)
+
+ (test '(42 T) (find-variable-value '?x (unify '?x 42))
+ :multiple-values t)
+
+ (test '(s T) (v? '?x (unify '(a (?x 42) d) '(a (s 42) d)))
+ :multiple-values t)
+ (test '(s T) (v? '?x (unify '(a (?x 42) d) '(a (s 42) d)))
+ :multiple-values t)
+
+ (test '((?x 42) T) (v? '?z (unify '(a (?x 42) d) '(a ?z d)))
+ :multiple-values t :test 'equal)
+
+ (test '(NIL T) (v? '?x (unify '(a (?x 42) d) '(a (() 42) d)))
+ :multiple-values t)
+
+ (test '(NIL NIL) (v? '?variable (unify '(a (() 42) d) '(a (?x 42) d)))
+ :multiple-values t)
+
+ (test t (unify:environment-p (unify '_ '(1 2 3))))
+
+ (test t (unify:environment-p (unify '_ '(1 _ 3))))
+
+ (test t (unify:environment-p (unify '(1 2 _) '(1 _ 3))))
+
+ (test t (unify:environment-p (unify '(1 2 _) '(1 _ 3))))
+
+ (test '(2 T) (v? '?x (unify #(1 2 _) #(1 ?x 3)))
+ :multiple-values t)
+
+ (test-error (unify '(1 2 _) #(1 _ 3))
+ :condition-type 'unification-failure
+ :known-failure t
+ :fail-info "Unification on SEQUENCEs does not discriminate type.")
+ )
+
+
+(with-tests (:name "basic templates unification")
+
+ (with-tests (:name "number templates unification")
+ (test t (unify:environment-p (unify #T(number 42) 42)))
+ (test t (unify:environment-p (unify 42 #T(number 42))))
+ (test t (unify:environment-p (unify 42 #T(integer 42))))
+ (test t (unify:environment-p (unify 42 #T(fixnum 42))))
+
+ (test t (unify:environment-p (unify 42.0 #T(real 42))))
+ (test t (unify:environment-p (unify #C(0 1) #T(complex #C(0 1)))))
+
+ (test '(42 T) (v? '?x (unify #T(number ?x) 42)) :multiple-values t)
+
+ (test-error (unify 42 #T(float 42.0))
+ :condition-type 'unification-failure
+ :known-failure t
+ :fail-info "Check rules for unification on numeric tower.")
+ )
+ )
+
+
+(defclass test1 ()
+ ((a :initarg :a :accessor a)
+ (b :initarg :b :accessor b)))
+
+(defstruct s-root a)
+(defstruct (s-child (:include s-root)) b)
+
+(with-tests (:name "advanced templates unification")
+
+ (test '(a T) (v? '?x (unify #2A((1 #T(symbol ?x) 3) (_ _ _))
+ #2A((1 a 3) (q w e))))
+ :multiple-values t)
+
+ (test '(#\Space T) (ignore-errors (v? '?x (unify "This is a string!" #T(elt 4 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (ignore-errors (v? '?x (unify '(0 1 42 3 4 5) #T(nth 2 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (ignore-errors (v? '?x (unify '(0 1 42 3 4 5) #T(elt 2 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (ignore-errors (v? '?x (unify #(0 1 42 3 4 5) #T(aref 2 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (ignore-errors (v? '?x (unify #(0 1 42 3 4 5) #T(elt 2 ?x))))
+ :multiple-values t)
+
+ (test '(42 T) (v? '?x (unify #2a((0 1 42 3 4 5)) #T(aref (0 2) ?x)))
+ :multiple-values t)
+
+ (test '(42 T) (v? '?x (unify #T(aref (0 2) 42) #2a((0 1 ?x 3 4 5))))
+ :multiple-values t)
+
+ (test '(42 T) (v? '?x (unify #2a((0 1 ?x 3 4 5)) #T(aref (0 2) 42)))
+ :multiple-values t)
+
+ (test-error (unify #(0 1 42 3 4 5) #T(nth 2 ?x))
+ :condition-type 'unification-failure
+ :announce t)
+
+ (test '(foo (1) (2) (3)) (let ((result-env (unify '(0 1 #T(list foo _ &rest ?z) 42)
+ '(0 1 (?y bar (1) (2) (3)) 42)))
+ )
+ (cons (v? '?y result-env)
+ (v? '?z result-env)))
+ :test #'equal)
+
+ (test '(2 T) (v? '?x (unify #T(test1 a #T(list 1 ?x 3 &rest) b "woot")
+ (make-instance 'test1 :a '(1 2 3) :b "woot")))
+ :multiple-values t)
+
+ (test-error (unify #T(s-root s-root-a '(1 ?x 3 4))
+ (make-s-root :a '(1 2 3 4)))
+ :condition-type 'unification-failure
+ :announce t
+ ;; #T reader non evaluating sub forms.
+ )
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a #T(list 1 ?x 3 4))
+ (make-s-root :a '(1 2 3 4))))
+ :multiple-values t)
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a (1 ?x 3 4))
+ (make-s-root :a '(1 2 3 4))))
+ :multiple-values t)
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a #T(list 1 ?x 3 &rest))
+ (make-s-root :a '(1 2 3 4))))
+ :multiple-values t)
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a #(1 ?x 3 4))
+ (make-s-root :a #(1 2 3 4))))
+ :multiple-values t)
+
+ (test '(2 T) (v? '?x (unify #T(s-root s-root-a #T(vector 1 ?x 3 &rest))
+ (make-s-root :a #(1 2 3 4))))
+ :multiple-values t)
+
+ )
+
+
+(defun nested-match-cases (input)
+ (match-case (input)
+ ('(:a ?a :b #T(list &rest ?bs))
+ (loop for b in ?bs
+ collect (match-case (b)
+ ('(:c ?c) ?c)
+ ('(:d ?d) ?d)
+ (otherwise (error "error-inner")))))
+ (otherwise (error "error-outer"))))
+
+(with-tests (:name "control flow")
+ (test-error (nested-match-cases '(:a 42 :b 33)) :announce t)
+
+ (test-error (nested-match-cases '(:a 42 :b (33 42))) :announce t)
+
+ (test '(42 43 44) (nested-match-cases '(:a 42 :b ((:d 42) (:c 43) (:c 44))))
+ :test #'equal)
+ )
+
+
+;;;; end of file -- unification-tests.lisp --
addfile ./unification-package.lisp
hunk ./unification-package.lisp 1
+;;; -*- Mode: Lisp -*-
+
+(defpackage "CL.EXT.DACF.UNIFICATION" (:use "CL")
+ (:nicknames "UNIFY")
+ (:documentation "The CL.EXT.DACF.UNIFICATION Package.
+This package contains all the definitions necessary for the general
+Common Lisp unifier to work.
+The package also has the \"UNIFY\" nickname.")
+ (:export
+ "MAKE-TEMPLATE"
+ "TEMPLATEP"
+ "TEMPLATE-SPEC")
+ (:export
+ "*UNIFY-STRING-CASE-INSENSITIVE-P*"
+ "UNIFY"
+ "FIND-VARIABLE-VALUE"
+ "MAKE-EMPTY-ENVIRONMENT")
+ (:export
+ "MATCH"
+ "MATCHING"))
+
+;;; end of file -- unification-package.lisp --
addfile ./unification.system
hunk ./unification.system 1
+;;; -*- Mode: Lisp -*-
+
+(mk:defsystem "UNIFICATION"
+ :components ("unification-package"
+ "variables"
+ "substitutions"
+ "lambda-list-parsing"
+ "templates-hierarchy"
+ "unifier"
+ "match-block"))
+ [_$_]
+;;; end of file -- unification.system --
addfile ./unifier.lisp
hunk ./unifier.lisp 1
+;;; -*- Mode: Lisp -*-
+
+;;; unifier.lisp
+;;; General CL structures unifier.
+
+(in-package "CL.EXT.DACF.UNIFICATION") ; DACF = Data And Control Flow.
+
+(defgeneric unify (a b &optional env)
+ (:documentation
+ "Unifies two objects A and B given a substitution ENV.
+A is a Common Lisp object and B is either a Common Lisp object or a
+\"template\", A and B can be commuted.
+
+The unification rules are rather complex. Each method of the generic
+function implements a specific rule of unification.
+
+The generic function returns a `substitution' upon success or it
+signals a UNIFICATION-FAILURE condition upon failure."))
+
+
+
+;;;===========================================================================
+;;; Simple, non template methods.
+
+(defmethod unify ((a symbol) (b list) &optional (env (make-empty-environment)))
+ "Unifies a symbol A and a list B in an environment ENV.
+If A is not a variable then an error of type UNIFICATION-FAILURE is
+signaled. If A is a unification variable, then the environment ENV is
+extended with a binding for A to B, unless the occurrence check is
+called and fails, in which case an error is signaled."
+ (cond ((variable-any-p a) env)
+ ((variablep a) (var-unify a b env))
+ (t (error 'unification-failure
+ :format-control "Cannot unify a symbol with a list: ~S ~S."
+ :format-arguments (list a b)))))
+
+
+(defmethod unify ((b list) (a symbol) &optional (env (make-empty-environment)))
+ "Unifies a symbol B and a list A in an environment ENV.
+If A is not a variable then an error of type UNIFICATION-FAILURE is
+signaled. If A is a unification variable, then the environment ENV is
+extended with a binding for A to B, unless the occurrence check is
+called and fails, in which case an error is signaled."
+ (cond ((variable-any-p a) env)
+ ((variablep a) (var-unify a b env))
+ (t (error 'unification-failure
+ :format-control "Cannot unify a list with a symbol: ~S ~S."
+ :format-arguments (list b a)))))
+
+
+(defmethod unify ((a list) (b list) &optional (env (make-empty-environment)))
+ "Unifies a list A and a list B in an environment ENV.
+The unification procedure proceedes recursively on each element of
+both lists. If two elements cannot be unified then an error of type
+UNIFICATION-FAILURE is signaled. Otherwise a possibly extended
+environment is returned."
+ (unify (rest a) (rest b) (unify (first a) (first b) env)))
+
+
+
+(defmethod unify ((a number) (b number) &optional (env (make-empty-environment)))
+ "Unifies two numbers A and B.
+Two numbers unify only if and only if they are equal as per the function #'=, in
+which case an unmodified envirironment ENV is returned.
+Otherwise an error of type UNIFICATION-FAILURE is signalled.
+Of course, asking for unification of two floating point numbers may
+not yield the expected result."
+ (if (= a b)
+ env
+ (error 'unification-failure
+ :format-control "Cannot unify two different numbers: ~S ~S."
+ :format-arguments (list a b))))
+
+
+(defparameter *unify-string-case-insensitive-p* nil)
+
+(defmethod unify ((a string) (b string) &optional (env (make-empty-environment)))
+ "Unifies two strings A and B.
+Two strings A and B unify if and only if they satisfy either #'STRING= or
+#'STRING-EQUAL. The choice of which of test to perform (#'STRING= or #'STRING-EQUAL)
+is made according to the value of the variable
+*UNIFY-STRING-CASE-INSENSITIVE-P*, which defaults to NIL.
+If A and B unify then an unmodified environment ENV is returned,
+otherwise an error of type UNIFICATION-FAILURE is signaled."
+ (cond ((and *unify-string-case-insensitive-p* (string-equal a b))
+ env)
+ ((string= a b)
+ env)
+ (t
+ (error 'unification-failure
+ :format-control "Connot unify two different strings: ~S ~S."
+ :format-arguments (list a b)))))
+
+
+(defmethod unify ((a symbol) (b string) &optional (env (make-empty-environment)))
+ (cond ((variable-any-p a) env)
+ ((variablep a) (extend-environment a b env))
+ (t (error 'unification-failure
+ :format-control "Cannot unify a symbol with a string: ~S ~S."
+ :format-arguments (list a b)))))
+
+
+(defmethod unify ((b string) (a symbol) &optional (env (make-empty-environment)))
+ (cond ((variable-any-p a) env)
+ ((variablep a) (extend-environment a b env))
+ (t (error 'unification-failure
+ :format-control "Cannot unify a string with a symbol: ~S ~S."
+ :format-arguments (list b a)))))
+
+
+(defmethod unify ((a symbol) (b symbol) &optional (env (make-empty-environment)))
+ (cond ((variable-any-p a) env)
+ ((variablep a) (var-unify a b env))
+ ((variable-any-p b) env)
+ ((variablep b) (var-unify b a env))
+ ((eq a b) env)
+ (t (error 'unification-failure
+ :format-control "Cannot unify two different symbols: ~S ~S."
+ :format-arguments (list a b)))))
+
+
+(defmethod unify ((a symbol) (b t) &optional (env (make-empty-environment)))
+ (cond ((variable-any-p a) env)
+ ((variablep a) (extend-environment a b env))
+ (t (call-next-method))))
+
+
+(defmethod unify ((b t) (a symbol) &optional (env (make-empty-environment)))
+ (cond ((variable-any-p a) env)
+ ((variablep a) (extend-environment a b env))
+ (t (call-next-method))))
+
+
+(defmethod unify ((a symbol) (b array) &optional (env (make-empty-environment)))
+ (cond ((variable-any-p a) env)
+ ((variablep a) (var-unify a b env))
+ (t (error 'unification-failure
+ :format-control "Cannot unify a symbol with an array or vector: ~S and ~S."
+ :format-arguments (list a b)))))
+
+
+(defmethod unify ((b array) (a symbol) &optional (env (make-empty-environment)))
+ (cond ((variable-any-p a) env)
+ ((variablep a) (var-unify a b env))
+ (t (error 'unification-failure
+ :format-control "Cannot unify an array or vector with a symbol: ~S and ~S."
+ :format-arguments (list a b)))))
+
+
+(defmethod unify ((as vector) (bs vector) &optional (env (make-empty-environment)))
+ (unless (= (length as) (length bs))
+ (error 'unification-failure
+ :format-control "Cannot unify two vectors of different length: ~D and ~D."
+ :format-arguments (list (length as) (length bs))))
+ (loop for a across as
+ for b across bs
+ for mgu = (unify a b env) then (unify a b mgu)
+ finally (return mgu)))
+
+
+(defmethod unify ((s1 sequence) (s2 sequence) &optional (env (make-empty-environment)))
+ (unless (= (length s1) (length s2))
+ (error 'unification-failure
+ :format-control "Cannot unify two sequences of different length: ~D and ~D."
+ :format-arguments (list (length s1) (length s2))))
+ (loop for i from 0 below (length s1)
+ for j from 0 below (length s2)
+ for mgu = (unify (elt s1 i) (elt s2 j) env) then (unify (elt s1 i) (elt s2 j) mgu)
+ finally (return mgu)))
+
+
+
+(defgeneric untyped-unify (a b &optional env))
+
+(defmethod untyped-unify ((as list) (bs vector) &optional (env (make-empty-environment)))
+ (loop for a in as
+ for b across bs
+ for mgu = (unify a b env) then (unify a b mgu)
+ finally (return mgu)))
+
+
+(defmethod untyped-unify ((as vector) (bs list) &optional (env (make-empty-environment)))
+ (untyped-unify bs as env))
+
+(defmethod untyped-unify ((a t) (b t) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+(defmethod unify ((as array) (bs array) &optional (env (make-empty-environment)))
+ (unless (= (array-total-size as) (array-total-size bs))
+ (error 'unification-failure
+ :format-control "Cannot unify two arrays of different total size: ~D and ~D."
+ :format-arguments (list (array-total-size as) (array-total-size bs))))
+ (loop for ai from 0 below (array-total-size as)
+ for bi from 0 below (array-total-size bs)
+ for mgu = (unify (row-major-aref as ai) (row-major-aref bs bi) env)
+ then (unify (row-major-aref as ai) (row-major-aref bs bi) mgu)
+ finally (return mgu)))
+
+
+;;; Catch all method.
+
+(defmethod unify ((a t) (b t) &optional (env (make-empty-environment)))
+ (if (equalp a b)
+ env
+ (error 'unification-failure
+ :format-control "Cannot unify a ~S and a ~S: ~S ~S."
+ :format-arguments (list (type-of a) (type-of b) a b))))
+
+
+;;;===========================================================================
+;;; Templates methods.
+
+
+;;; valid-template-p --
+;;; Useful later. Tests whether the object X can be considered a template.
+
+(defun valid-template-p (x)
+ (or (symbolp x)
+ (consp x)
+ (numberp x)
+ (template-p x)))
+
+
+;;; Special catch all method.
+
+(defmethod unify ((x template) (y template) &optional (env (make-empty-environment)))
+ (error 'unification-failure
+ :format-control "Unification of two templates of type ~A and ~A has not been yet implemented."
+ :format-arguments (list (class-name (class-of x))
+ (class-name (class-of y)))))
+
+
+;;;---------------------------------------------------------------------------
+;;; NIL special unification methods.
+
+(defmethod unify ((x null) (nt nil-template) &optional (env (make-empty-environment)))
+ env)
+
+
+(defmethod unify ((nt nil-template) (x null) &optional (env (make-empty-environment)))
+ env)
+
+
+(defmethod unify ((nt1 nil-template) (nt2 nil-template) &optional (env (make-empty-environment)))
+ env)
+
+
+;;;---------------------------------------------------------------------------
+;;; Symbol methods.
+
+(defmethod unify ((a symbol) (b symbol-template) &optional (env (make-empty-environment)))
+ (cond ((variable-any-p a) env)
+ ((variablep a) (var-unify a b env))
+ (t (unify a (symbol-template-symbol b) env))))
+
+
+(defmethod unify ((b symbol-template) (a symbol) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+(defmethod unify ((a symbol) (b template) &optional (env (make-empty-environment)))
+ (declare (ignore env))
+ (error 'unification-failure
+ :format-control "Cannot unify symbol ~S with template ~S."
+ :format-arguments (list a b)))
+
+(defmethod unify ((b template) (a symbol) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+
+;;;---------------------------------------------------------------------------
+;;; Number template methods.
+
+(defmethod unify ((a number) (b number-template) &optional (env (make-empty-environment)))
+ (unify a (number-template-number b) env))
+
+
+(defmethod unify ((b number-template) (a number) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+(defmethod unify ((a number) (b template) &optional (env (make-empty-environment)))
+ (declare (ignore env))
+ (error 'unification-failure
+ :format-control "Cannot unify the number ~S with template ~S."
+ :format-arguments (list a b)))
+
+(defmethod unify ((b template) (a number) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+;;;---------------------------------------------------------------------------
+;;; Sequence (List) template methods
+
+(defmethod unify ((a sequence) (b template) &optional (env (make-empty-environment)))
+ (error 'unification-failure
+ :format-control "Cannot unify a sequence with a non sequence or non sequence access template: ~S ~S."
+ :format-arguments (list a b)))
+
+
+(defmethod unify ((b template) (a sequence) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+;;; The next is incomplete and does not signal appropriate errors.
+
+(defmethod unify ((a list) (b template) &optional (env (make-empty-environment)))
+ (declare (ignore env))
+ (error 'unification-failure
+ :format-control "Cannot unify a list with a non-list template: ~S ~S."
+ :format-arguments (list a b)))
+
+
+(defmethod unify ((a list) (b sequence-template) &optional (env (make-empty-environment)))
+ (let ((template-lambda-list (sequence-template-lambda-list b))
+ (ll (list-length a))
+ )
+ (multiple-value-bind (vars optionals keys rest)
+ (parse-extended-ordinary-lambda-list template-lambda-list
+ :ordinary-variable-test #'valid-template-p
+ :optional-variable-test #'valid-template-p
+ :key-variable-test #'valid-template-p
+ :rest-variable-test #'valid-template-p
+ )
+ [_$_]
+ (let* ((n-vars (list-length vars))
+ (n-optionals (list-length optionals))
+ (env (unify (subseq a 0 (list-length vars)) vars env))
+ )
+ (when (and optionals (>= ll (+ n-vars n-optionals)))
+ (setf env (unify (subseq a n-vars (+ n-vars n-optionals)) optionals env)))
+ (when (and rest (>= ll (+ n-vars n-optionals)))
+ (setf env (unify (subseq a (+ n-vars n-optionals)) (first rest) env)))
+ (when keys (warn "Sorry mathcing of keywords ~S not yet implemented." keys))
+ env
+ ))))
+
+
+
+(defmethod unify ((b template) (a list) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+
+;;;---------------------------------------------------------------------------
+;;; Vector template methods.
+
+(defmethod unify ((a vector) (b template) &optional (env (make-empty-environment)))
+ (error 'unification-failure
+ :format-control "Cannot unify a vector with a non-vector template: ~S ~S."
+ :format-arguments (list a b)))
+
+
+(defmethod unify ((a vector) (b vector-template) &optional (env (make-empty-environment)))
+ (let ((template-lambda-list (sequence-template-lambda-list b))
+ (vl (length a))
+ )
+ (multiple-value-bind (vars optionals keys rest)
+ (parse-extended-ordinary-lambda-list template-lambda-list
+ :ordinary-variable-test #'valid-template-p
+ :optional-variable-test #'valid-template-p
+ :key-variable-test #'valid-template-p
+ :rest-variable-test #'valid-template-p
+ )
+ [_$_]
+ (let ((n-vars (list-length vars))
+ (n-optionals (list-length optionals))
+ )
+ (loop for v in vars
+ for e across (subseq a 0 (list-length vars))
+ for mgu = (unify v e env) then (unify v e mgu)
+ finally (setf env mgu))
+ (when (and optionals (>= vl (+ n-vars n-optionals)))
+ (loop for v in optionals
+ for e across (subseq a n-vars (+ n-vars n-optionals))
+ for mgu = (unify v e env) then (unify v e mgu)
+ finally (setf env mgu)))
+ (when (and rest (>= vl (+ n-vars n-optionals)))
+ (setf env (unify (subseq a (+ n-vars n-optionals)) (first rest) env)))
+ (when keys (warn "Sorry matching of keywords ~S not yet implemented." keys))
+ env
+ ))))
+
+
+(defmethod unify ((b template) (a vector) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+;;;---------------------------------------------------------------------------
+;;; Array template methods.
+
+(defmethod unify ((a array) (b template) &optional (env (make-empty-environment)))
+ (error 'unification-failure
+ :format-control "Cannot unify an array with a non array or non array access template: ~S ~S."
+ :format-arguments (list a b)))
+
+(defmethod unify ((b template) (a array) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+(defun unify-array-row (array dims shape-template indexes env)
+ (cond ((null dims) env)
+ ((= (list-length dims) 1)
+ ;; Unify the row with the shape-template.
+ (let ((row (make-array (first dims)
+ :displaced-to array
+ :displaced-index-offset
+ (apply #'array-row-major-index array (append indexes (list 0))))))
+ (declare (dynamic-extent row)
+ (type array row))
+ (untyped-unify row shape-template env)))
+ (t
+ (loop for i from 0 below (first dims)
+ for row-template in shape-template
+ do (unify-array-row array
+ (rest dims)
+ row-template
+ (append indexes (list i))
+ env)
+ finally (return env)))
+ ))
+
+
+(defun unify-array-rows (array shape-template env)
+ (unify-array-row array (array-dimensions array) shape-template () env))
+
+
+(defmethod unify ((a array) (b array-template) &optional (env (make-empty-environment)))
+ (let ((template-spec (template-spec b)))
+ (if (= 2 (length template-spec))
+
+ ;; Template is (<array type specifier> <shape-template>)
+ (destructuring-bind (array-type-spec shape-template)
+ template-spec
+ (declare (ignore array-type-spec))
+ ;; Missing check for type-spec.
+ (unify-array-rows a shape-template env))
+
+ ;; Template is (array (['*' | <element type>] [<dimension spec>]) <shape template>)
+ (destructuring-bind (array-kwd type-spec shape-template)
+ template-spec
+ (declare (ignore array-kwd))
+ ;; Missing check for type-spec.
+ (unify-array-rows a shape-template env))
+ )))
+
+
+
+;;;---------------------------------------------------------------------------
+;;; Standard object template methods.
+
+(defmethod unify ((a standard-object) (b template) &optional (env (make-empty-environment)))
+ (error 'unification-failure
+ :format-control "Cannot unify a standard object with a non standard object template: ~S ~S."
+ :format-arguments (list a b)))
+
+#| Old version with heavy syntax
+(defmethod unify ((a standard-object) (b standard-object-template)
+ &optional (env (make-empty-environment)))
+ (destructuring-bind (class &rest template-slot-specs)
+ (template-spec b)
+ (unless (typep a class)
+ (error 'unification-failure
+ :format-control "Cannot unify an instance of ~S with a template for class ~S."
+ :format-arguments (list (class-of a) class)))
+ (flet ((slot-spec-unify (accessor-spec reader value-template mgu)
+ (ecase accessor-spec
+ (slot-value
+ (unify (slot-value a reader) value-template mgu))
+ (slot-accessor
+ (unify (funcall reader a) value-template mgu))))
+ )
+ (if template-slot-specs
+ (loop for (accessor-spec reader value-template) in template-slot-specs
+ for mgu = (slot-spec-unify accessor-spec reader value-template env)
+ then (slot-spec-unify accessor-spec reader value-template mgu)
+ finally (return mgu))
+ env))))
+|#
+
+
+(defmethod unify ((a standard-object) (b standard-object-template)
+ &optional (env (make-empty-environment)))
+ (destructuring-bind (class &rest template-slot-specs)
+ (template-spec b)
+ (unless (typep a class)
+ (error 'unification-failure
+ :format-control "Cannot unify an instance of ~S with a template for class ~S."
+ :format-arguments (list (class-of a) class)))
+ (flet ((slot-spec-unify (reader value-template mgu)
+ (etypecase reader
+ (list
+ (assert (eq (first reader) 'slot-value))
+ (unify (slot-value a (second reader)) value-template mgu))
+ ((or function symbol)
+ (unify (funcall reader a) value-template mgu))))
+ )
+ (if template-slot-specs
+ (loop for (reader value-template) on template-slot-specs by #'cddr
+ for mgu = (slot-spec-unify reader value-template env)
+ then (slot-spec-unify reader value-template mgu)
+ finally (return mgu))
+ env))))
+
+
+(defmethod unify ((b template) (a standard-object) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+;;;---------------------------------------------------------------------------
+;;; Structure object template methods.
+
+(defmethod unify ((a structure-object) (b template) &optional (env (make-empty-environment)))
+ (error 'unification-failure
+ :format-control "Cannot unify a structure object with a non structure object template: ~S ~S."
+ :format-arguments (list a b)))
+
+
+(defmethod unify ((a structure-object) (b structure-object-template)
+ &optional (env (make-empty-environment)))
+ (destructuring-bind (class &rest template-slot-specs)
+ (template-spec b)
+ (unless (typep a class)
+ (error 'unification-failure
+ :format-control "Cannot unify an instance of ~S with a template for structure ~S."
+ :format-arguments (list (class-of a) class)))
+ (if template-slot-specs
+ (loop for (reader value-template) on template-slot-specs by #'cddr
+ for mgu = (unify (funcall reader a) value-template env)
+ then (unify (funcall reader a) value-template mgu)
+ finally (return mgu))
+ env)))
+
+
+(defmethod unify ((b template) (a structure-object) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+;;;---------------------------------------------------------------------------
+;;; Expression template SUBSEQ methods.
+
+(defmethod unify ((a sequence) (b subseq-template) &optional (env (make-empty-environment)))
+ (destructuring-bind (subseq-kwd from to &rest spec)
+ (template-spec b)
+ (let* ((seq-type (type-of a))
+ (seq-template-kind (if (symbolp seq-type) seq-type (first seq-type))) ; Stupid FTTB.
+ )
+ (unify (subseq a from to) (make-template seq-template-kind `(,seq-template-kind ,@spec))))))
+
+
+(defmethod unify ((b subseq-template) (a sequence) &optional (env (make-empty-environment)))
+ (unify a b env))
+
+
+;;;---------------------------------------------------------------------------
+;;; Expression template AREF methods.
+
+(defmethod unify ((a array) (b aref-template) &optional (env (make-empty-environment)))
+ (destructuring-bind (aref-kwd indexes value-template)
+ (template-spec b)
+ (declare (ignore aref-kwd))
+ ;; Missing check on index spec.
+ (unless (consp indexes)
+ (setf indexes (list indexes)))
+ (unify (apply #'aref a indexes) value-template env)))
+
+
+;;;---------------------------------------------------------------------------
+;;; VAR-UNIFY
+
+(defparameter *occurrence-check-p* t)
+
+(defgeneric occurs-in-p (var pat env))
+
+(defun var-unify (var pat env)
+ (if (eq var pat)
+ env
+ (multiple-value-bind (value foundp)
+ (find-variable-value var env)
+ (cond (foundp
+ (unify value pat env))
+ ((and *occurrence-check-p*
+ (occurs-in-p var pat env))
+ (error 'unification-failure
+ :format-control "Variable ~S occurs in ~S."
+ :format-arguments (list var pat)))
+ (t
+ (extend-environment var pat env))))))
+
+
+
+#|
+(defmethod occurs-in-p ((var symbol) pat env)
+ (cond ((variablep pat)
+ (or (eq var pat)
+ (multiple-value-bind (value foundp)
+ (find-variable-value pat env)
+ (when foundp
+ (occurs-in-p var value env)))
+ ))
+ ((atom pat) nil)
+ ((consp pat)
+ (or (occurs-in-p var (first pat) env)
+ (occurs-in-p var (rest pat) env)))
+ (t
+ (error "unimplemented"))))
+|#
+
+(defmethod occurs-in-p ((var symbol) (pat symbol) env)
+ (when (variablep pat)
+ (or (eq var pat)
+ (multiple-value-bind (value foundp)
+ (find-variable-value pat env)
+ (when foundp
+ (occurs-in-p var value env)))
+ )))
+
+(defmethod occurs-in-p ((var symbol) (pat list) env)
+ (or (occurs-in-p var (first pat) env)
+ (occurs-in-p var (rest pat) env)))
+
+(defmethod occurs-in-p ((var symbol) (pat array) env)
+ (loop for i from 0 below (array-total-size pat)
+ thereis (occurs-in-p var (row-major-aref pat i) env)))
+
+
+(defmethod occurs-in-p ((var symbol) (pat vector) env) ; This may be faster than the above.
+ (some #'(lambda (x) (occurs-in-p var x env)) pat))
+
+
+(defmethod occurs-in-p ((var symbol) (pat string) env) ; This is useless, but it's here for completeness.
+ (declare (ignore env))
+ nil)
+
+
+(defmethod occurs-in-p ((var symbol) (pat number) env)
+ (declare (ignore env))
+ nil)
+
+
+(defmethod occurs-in-p ((var symbol) (pat t) env)
+ (declare (ignore env))
+ (warn "Occurrence test unimplemented for pattern ~S of type ~S; returning false."
+ pat
+ (type-of pat))
+ nil)
+
+
+(defmethod occurs-in-p ((var t) (pat t) env)
+ (declare (ignore env))
+ (error "Occurrence test called on a non symbol ~S. Major problem."
+ var))
+
+;;; end of file -- unifier.lisp --
addfile ./variables.lisp
hunk ./variables.lisp 1
+;;; -*- Mode: Lisp -*-
+
+(in-package "CL.EXT.DACF.UNIFICATION") ; DACF = Data And Control Flow.
+
+(defun variablep (x)
+ (and (symbolp x)
+ (or (char= (char (symbol-name x) 0) #\?)
+ (string= x "_"))))
+
+(defun variable-any-p (x)
+ (and (symbolp x)
+ (or (string= x "_")
+ (string= x "?_"))))
+
+
+;;; end of file -- variables.lisp --