kenzo/src/effective-homology.lisp

544 lines
18 KiB
Common Lisp

;;; EFFECTIVE-HOMOLOGY EFFECTIVE-HOMOLOGY EFFECTIVE-HOMOLOGY
;;; EFFECTIVE-HOMOLOGY EFFECTIVE-HOMOLOGY EFFECTIVE-HOMOLOGY
;;; EFFECTIVE-HOMOLOGY EFFECTIVE-HOMOLOGY EFFECTIVE-HOMOLOGY
(IN-PACKAGE #:cat)
(PROVIDE "effective-homology")
;;;
;;; REDUCTIONS
;;;
#+clisp(eval-when (:compile-toplevel :load-toplevel :execute)
(setf (ext:package-lock :clos) nil))
(DEFMETHOD PRINT-OBJECT ((rdct reduction) stream)
(the reduction
(progn
(format stream "[K~D Reduction K~D => K~D]"
(idnm rdct) (idnm (tcc rdct)) (idnm (bcc rdct)))
rdct)))
#+clisp(eval-when (:compile-toplevel :load-toplevel :execute)
(setf (ext:package-lock :clos) t))
(DEFUN RDCT (n)
(declare (fixnum n))
"--------------------------------------------------------------[function-doc]
RDCT
Args: (n)
Returns the N-th user-created reduction from the list *RDCT-LIST*. Returns NIL
if it doesn't exist.
------------------------------------------------------------------------------"
(the (or null reduction)
(find n *rdct-list* :key #'idnm)))
(DEFUN BUILD-RDCT (&key f g h orgn)
(declare
(type morphism f g h)
(list orgn))
"--------------------------------------------------------------[function-doc]
BUILD-RDCT
Args: (&key f g h orgn)
Returns an instance of the class REDUCTION. The keyword arguments are as
follows:
:F F, an object of type morphism representing the morphism f of a reduction
:G G, an object of type morphism representing the morphism g of a reduction
:H H, an object of type morphism representing the morphism h of a reduction
:ORGN ORGN, a list containing a relevant and carefully chosen comment about
the origin of the chain complex. This comment should be unique
for a Kenzo session (between calls of CAT-INIT), as it is used
for caching purposes.
Use this function instead of creating instances via the standard constructor
MAKE-INSTANCE.
------------------------------------------------------------------------------"
(the reduction
(progn
(unless orgn
(setf orgn `(build-rdct ,f ,g ,h)))
(let ((already (find orgn *rdct-list* :test #'equal :key #'orgn)))
(declare (type (or reduction null) already))
(when already
(return-from build-rdct already)))
(with-slots ((fsorc sorc) (ftrgt trgt) (fdegr degr)) f
(declare
(type chain-complex fsorc ftrgt)
(fixnum fdegr))
(with-slots ((gsorc sorc) (gtrgt trgt) (gdegr degr)) g
(declare
(type chain-complex gsorc gtrgt)
(fixnum gdegr))
(with-slots ((hsorc sorc) (htrgt trgt) (hdegr degr)) h
(declare
(type chain-complex hsorc htrgt)
(fixnum hdegr))
(unless (and (eq gsorc ftrgt)
(eq fsorc gtrgt)
(eq hsorc fsorc)
(eq htrgt fsorc)
(zerop fdegr)
(zerop gdegr)
(= +1 hdegr))
(error "In BUILD-RDCT, the data are non coherent."))
(let ((rdct (make-instance 'reduction
:tcc fsorc :bcc ftrgt
:f f :g g :h h
:orgn orgn)))
(declare (type reduction rdct))
(push rdct *rdct-list*)
rdct)))))))
(DEFUN TRIVIAL-RDCT (chcm)
(declare (type chain-complex chcm))
"--------------------------------------------------------------[function-doc]
TRIVIAL-RDCT
Args: (chcm)
Builds the trivial reduction according to the following diagram, which
involves the chain complex CHCM only:
Zero s
C -------> C
^
| |
Id | | Id
| |
v
C
Zero is the zero morphism of degree 1 of C and Id is its identity morphism.
See also: ZERO-MRPH, IDNT-MRPH.
------------------------------------------------------------------------------"
(build-rdct
:f (idnt-mrph chcm)
:g (idnt-mrph chcm)
:h (zero-mrph chcm chcm +1)
:orgn `(trivial-rdct ,chcm)))
;;;
;;; HOMOTOPY-EQUIVALENCES
;;;
;;(defgeneric build-hmeq (keyword lrdct &key &allow-other-keys)
(DEFGENERIC BUILD-HMEQ (keyword lrdct &key))
(DEFMETHOD BUILD-HMEQ ((keyword1 (eql :lrdct)) lrdct &key rrdct orgn)
(declare
(type reduction lrdct rrdct)
(list orgn))
(the homotopy-equivalence
(progn
(with-slots ((lf f) (lg g) (lh h) (ltcc tcc) (lbcc bcc)) lrdct
(declare
(type morphism lf lg lh)
(type chain-complex ltcc lbcc))
(with-slots ((rf f) (rg g) (rh h) (rtcc tcc) (rbcc bcc)) rrdct
(declare
(type morphism rf rg rh)
(type chain-complex rtcc rbcc))
(unless (eq ltcc rtcc)
(error "In BUILD-HMEQ (version from rdct), the tcc's are not the same."))
(unless orgn
(setf orgn `(build-hmeq ,lrdct ,rrdct)))
(let ((already (find orgn *hmeq-list* :test #'equal :key #'orgn)))
(declare (type (or homotopy-equivalence null) already))
(when already
(return-from build-hmeq already)))
(let ((hmeq (make-instance 'homotopy-equivalence
:lbcc lbcc :tcc ltcc :rbcc rbcc
:lf lf :lg lg :lh lh
:rf rf :rg rg :rh rh
:lrdct lrdct :rrdct rrdct
:orgn orgn)))
(declare (type homotopy-equivalence hmeq))
(push hmeq *hmeq-list*)
hmeq))))))
#+clisp(eval-when (:compile-toplevel :load-toplevel :execute)
(setf (ext:package-lock :clos) nil))
(DEFMETHOD PRINT-OBJECT ((hmeq homotopy-equivalence) stream)
(the homotopy-equivalence
(progn
(format stream "[K~D Homotopy-Equivalence K~D <= K~D => K~D]"
(idnm hmeq)
(idnm (lbcc hmeq)) (idnm (tcc hmeq)) (idnm (rbcc hmeq)))
hmeq)))
#+clisp(eval-when (:compile-toplevel :load-toplevel :execute)
(setf (ext:package-lock :clos) t))
(DEFGENERIC HMEQ (integer))
(DEFMETHOD HMEQ ((n integer))
(declare (fixnum n))
(the (or homotopy-equivalence null)
(find n *hmeq-list* :key #'idnm)))
(DEFMETHOD BUILD-HMEQ ((keyword1 (eql :lf)) lf &key lg lh rf rg rh orgn)
(declare
(type morphism lf lg lh rf rg rh)
(list orgn))
(the homotopy-equivalence
(progn
(unless orgn
(setf orgn `(build-hmeq ,lf ,lg ,lh ,rf ,rg ,rh)))
(let ((already (find orgn *hmeq-list* :test #'equal :key #'orgn)))
(declare (type (or null homotopy-equivalence) already))
(when already
(return-from build-hmeq already)))
(build-hmeq
:lrdct (build-rdct :f lf :g lg :h lh
:orgn `(build-hmeq ,lf ,lg ,lh ,rf ,rg ,rh lrdct))
:rrdct (build-rdct :f rf :g rg :h rh
:orgn `(build-hmeq ,lf ,lg ,lh ,rf ,rg ,rh rrdct))
:orgn orgn))))
(DEFUN TRIVIAL-HMEQ (chcm)
(declare (type chain-complex chcm))
(build-hmeq
:lrdct (trivial-rdct chcm)
:rrdct (trivial-rdct chcm)
:orgn `(trivial-hmeq ,chcm)))
;; Functions.
(DEFUN PRE-CHECK-RDCT (rdct)
"--------------------------------------------------------------[function-doc]
PRE-CHECK-RDCT
Args: (rdct)
Assigns the following Lisp global variables, using morphisms from RDCT and the
differentials and identity morphisms of the underlying chain complexes,
according to these formulas:
*TDD* = d ° d
^ ^
C C
*BDD* = d ° d
C C
*ID-FG* = Id - f ° g
C
*ID-GF-DH-HD* = Id - g ° f - (d ° h + h ° d )
^ ^ ^
C C C
*HH* = h ° h
*FH* = f ° h
*HG* = h ° g
*DF-FD* = d ° f - f ° d
C ^
C
*DG-GD* = d ° g - g ° d
^ C
C
------------------------------------------------------------------------------"
(declare (type reduction rdct))
(with-slots (bcc tcc f g h) rdct
(declare
(type chain-complex bcc tcc)
(type morphism f g h))
(setf *tdd* (cmps tcc tcc)
*bdd* (cmps bcc bcc)
*df-fd* (sbtr
(cmps bcc f)
(cmps f tcc))
*dg-gd* (sbtr
(cmps tcc g)
(cmps g bcc))
*id-fg* (sbtr (idnt-mrph bcc) (cmps f g))
*id-gf-dh-hd* (i-sbtr (idnt-mrph tcc)
(cmps g f)
(cmps tcc h)
(cmps h tcc))
*hh* (cmps h h)
*fh* (cmps f h)
*hg* (cmps h g)))
(done))
(DEFUN CHECK-RDCT ()
"--------------------------------------------------------------[function-doc]
CHECK-RDCT
Args: ()
Maps combinations of the top and bottom chain complexes of a reduction using
the morphisms created by PRE-CHECK-RDCT. Having no parameters, the
combinations must be provided via the Lisp global variables *TC* and *BC*,
for the top and bottom chain complex, respectively. If the morphisms are
coherent, the result of each mapping is a null combination.
Note: This function is intended for interactive use. It pauses after each
evaluation for the user to inspect the result. Resume execution, by pressing
the <Enter> key.
------------------------------------------------------------------------------"
(dolist (cmbn '(*tc* *bc*))
(declare (type symbol cmbn))
(format t "~%~A => ~A" cmbn (eval cmbn)))
(dolist (phi '(*tdd* *bdd* *df-fd* *dg-gd* *id-fg* *id-gf-dh-hd*
*hh* *fh* *hg*))
(declare (type symbol phi))
(format t "~%Checking ~A = 0" phi)
(format t "~%Result: ")
(princ (cmbn-? (eval phi)
(if (member phi '(*bdd* *dg-gd* *id-fg* *dg-gd* *hg*))
*bc* *tc*)))
(read-line))
(done))
(DEFUN CHECK-RDCT-NO-WAIT ()
"--------------------------------------------------------------[function-doc]
CHECK-RDCT-NO-WAIT
Args: ()
Maps combinations of the top and bottom chain complexes of a reduction using
the morphisms created by PRE-CHECK-RDCT. Having no parameters, the
combinations must be provided via the Lisp global variables *TC* and *BC*,
for the top and bottom chain complex, respectively. If the morphisms are
coherent, the result of each mapping is a null combination.
------------------------------------------------------------------------------"
(dolist (cmbn '(*tc* *bc*))
(declare (type symbol cmbn))
(format t "~%~A => ~A" cmbn (eval cmbn)))
(dolist (phi '(*tdd* *bdd* *df-fd* *dg-gd* *id-fg* *id-gf-dh-hd*
*hh* *fh* *hg*))
(declare (type symbol phi))
(format t "~%Checking ~A = 0" phi)
(format t "~%Result: ")
(princ (cmbn-? (eval phi)
(if (member phi '(*bdd* *dg-gd* *id-fg* *dg-gd* *hg*))
*bc* *tc*))))
(done))
(DEFMETHOD CMPS ((brdct reduction) (trdct reduction) &optional dummy)
(declare (ignore dummy))
(when (eq (first (orgn brdct)) 'trivial-rdct)
(return-from cmps trdct))
(when (eq (first (orgn trdct)) 'trivial-rdct)
(return-from cmps brdct))
(with-slots ((tf f) (tg g) (th h)) trdct
(declare (type morphism tf tg th))
(with-slots ((bf f) (bg g) (bh h)) brdct
(declare (type morphism bf bg bh))
(build-rdct
:f (cmps bf tf)
:g (cmps tg bg)
:h (add th (i-cmps tg bh tf))
:orgn `(cmps ,brdct ,trdct)))))
;;
;; BASIC PERTURBATION LEMMA.
;;
(DEFMETHOD ADD ((rdct reduction) (perturbation morphism) &optional dummy)
(declare (type null dummy))
(when dummy
(error "Why a third argument in (ADD REDUCTION MORPHISM)?"))
(when (eq (grmd (tcc rdct)) (grmd (sorc perturbation)))
(return-from add
(basic-perturbation-lemma rdct perturbation)))
(when (eq (grmd (bcc rdct)) (grmd (sorc perturbation)))
(return-from add
(easy-perturbation-lemma rdct perturbation)))
(error "In (METHOD ADD REDUCTION MORPHISM),~@
the data do not sound like coherent."))
(DEFUN BASIC-PERTURBATION-LEMMA (reduction top-perturbation)
(declare
(type reduction reduction)
(type morphism top-perturbation))
(the (values reduction morphism)
(with-slots ((old-tcc tcc) (old-bcc bcc)
(old-f f) (old-g g) (old-h h)) reduction
(declare
(type chain-complex old-tcc old-bcc)
(type morphism old-f old-g old-h))
(when (eq (first (orgn top-perturbation)) 'zero-mrph)
(return-from basic-perturbation-lemma
(values reduction (zero-mrph old-bcc))))
(when (eq (first (orgn (h reduction))) 'zero-mrph)
(return-from basic-perturbation-lemma
(values
(trivial-rdct (add old-tcc top-perturbation))
(i-cmps old-f top-perturbation old-g))))
(let* ((sigma (bpl-*-sigma old-h top-perturbation))
(new-f (cmps old-f
(sbtr (idnt-mrph old-tcc)
(i-cmps
top-perturbation
sigma
old-h))))
(new-g (cmps sigma old-g))
(new-h (cmps sigma old-h))
(bottom-perturbation (i-cmps
old-f
top-perturbation
new-g))
(new-tcc (add old-tcc top-perturbation))
(new-bcc (add old-bcc bottom-perturbation)))
(declare
(type chain-complex new-tcc new-bcc)
(type morphism sigma new-f new-g new-h bottom-perturbation))
(setf new-f (dstr-change-sorc-trgt new-f :new-sorc new-tcc
:new-trgt new-bcc)
new-g (dstr-change-sorc-trgt new-g :new-sorc new-bcc
:new-trgt new-tcc)
new-h (dstr-change-sorc-trgt new-h :new-sorc new-tcc
:new-trgt new-tcc))
(values
(build-rdct :f new-f :g new-g :h new-h
:orgn `(basic-perturbation-lemma ,reduction
,top-perturbation))
bottom-perturbation)))))
(DEFUN EASY-PERTURBATION-LEMMA (reduction bottom-perturbation)
(declare
(type reduction reduction)
(type morphism bottom-perturbation))
(the (values reduction morphism)
(with-slots ((old-tcc tcc) (old-bcc bcc)
(old-f f) (old-g g) (old-h h)) reduction
(declare
(type chain-complex old-tcc old-bcc)
(type morphism old-f old-g old-h))
(when (eq 'zero-mrph (first (orgn bottom-perturbation)))
(return-from easy-perturbation-lemma
(values reduction (zero-mrph old-tcc))))
(when (eq 'trivial-rdct (first (orgn reduction)))
(return-from easy-perturbation-lemma
(trivial-rdct (add (bcc reduction) bottom-perturbation))))
(let ((top-perturbation (i-cmps old-g bottom-perturbation old-f)))
(declare (type morphism top-perturbation))
(let ((new-bcc (add old-bcc bottom-perturbation))
(new-tcc (add old-tcc top-perturbation)))
(declare (type chain-complex new-bcc new-tcc))
(values
(build-rdct
:f (dstr-change-sorc-trgt old-f :new-sorc new-tcc
:new-trgt new-bcc)
:g (dstr-change-sorc-trgt old-g :new-sorc new-bcc
:new-trgt new-tcc)
:h (dstr-change-sorc-trgt old-h :new-sorc new-tcc
:new-trgt new-tcc)
:orgn `(easy-perturbation-lemma ,reduction
,bottom-perturbation))
top-perturbation))))))
(DEFUN SPECIAL-BPL (reduction top-perturbation)
(declare
(type reduction reduction)
(type morphism top-perturbation))
(when (eq (first (orgn top-perturbation)) 'zero-mrph)
(return-from special-bpl reduction))
(the reduction
(with-slots ((old-tcc tcc) (old-bcc bcc)
(old-f f) (old-g g) (old-h h)) reduction
(declare
(type chain-complex old-tcc old-bcc)
(type morphism old-f old-g old-h))
(let* ((sigma (bpl-*-sigma old-h top-perturbation))
(new-f (cmps old-f
(sbtr (idnt-mrph old-tcc)
(i-cmps
top-perturbation
sigma
old-h))))
(new-h (cmps sigma old-h))
(new-tcc (add old-tcc top-perturbation)))
(declare
(type chain-complex new-tcc)
(type morphism sigma new-f new-h))
(setf new-f (dstr-change-sorc-trgt new-f :new-sorc new-tcc)
old-g (dstr-change-sorc-trgt old-g :new-trgt new-tcc)
new-h (dstr-change-sorc-trgt new-h :new-sorc new-tcc
:new-trgt new-tcc))
(build-rdct :f new-f :g old-g :h new-h
:orgn `(special-bpl ,reduction ,top-perturbation))))))
(DEFUN SPECIAL-BPL-2 (reduction top-perturbation)
(declare
(type reduction reduction)
(type morphism top-perturbation))
(the reduction
(with-slots ((old-tcc tcc) (old-bcc bcc)
(old-f f) (old-g g) (old-h h)) reduction
(declare
(type chain-complex old-tcc old-bcc)
(type morphism old-f old-g old-h))
(when (eq (first (orgn top-perturbation)) 'zero-mrph)
(return-from special-bpl-2
(values reduction (zero-mrph old-bcc))))
(when (eq (first (orgn (h reduction))) 'zero-mrph)
(return-from special-bpl-2
(values
(trivial-rdct (add old-tcc top-perturbation))
(i-cmps old-f top-perturbation old-g))))
(let* ((sigma (bpl-*-sigma old-h top-perturbation))
(new-g (cmps sigma old-g))
(new-h (cmps sigma old-h))
(new-tcc (add old-tcc top-perturbation)))
(declare
(type chain-complex new-tcc)
(type morphism sigma new-g new-h))
(setf old-f (dstr-change-sorc-trgt old-f :new-sorc new-tcc)
new-g (dstr-change-sorc-trgt new-g :new-trgt new-tcc)
new-h (dstr-change-sorc-trgt new-h :new-sorc new-tcc
:new-trgt new-tcc))
(values
(build-rdct :f old-f :g new-g :h new-h
:orgn `(special-bpl-2 ,reduction ,top-perturbation)))))))
(DEFUN BPL-*-sigma (homotopy perturbation)
(declare (type morphism homotopy perturbation))
(the morphism
(let ((cmpr (cmpr (sorc perturbation)))
(h-delta (cmps homotopy perturbation)))
(declare
(type cmprf cmpr)
(type morphism h-delta))
(flet
((sigma-* (degr gnrt)
(declare
(fixnum degr)
(type gnrt gnrt))
(do ((rslt (zero-cmbn degr) (2cmbn-add cmpr rslt iterated))
(iterated (term-cmbn degr 1 gnrt)
(cmbn-opps (cmbn-? h-delta iterated))))
((cmbn-zero-p iterated) rslt)
(declare (type cmbn rslt iterated)))))
(build-mrph
:sorc (sorc homotopy) :trgt (sorc homotopy) :degr 0
:intr #'sigma-*
:strt :gnrt
:orgn `(bpl-*-sigma ,homotopy ,perturbation))))))
(DEFMETHOD ADD ((hmeq homotopy-equivalence) (lb-perturbation morphism)
&optional dummy)
(declare (ignore dummy))
(the homotopy-equivalence
(with-slots (lrdct rrdct) hmeq
(declare (type reduction lrdct rrdct))
(multiple-value-bind (new-lrdct top-perturbation)
(add lrdct lb-perturbation)
(declare
(type reduction new-lrdct)
(type morphism lb-perturbation))
(build-hmeq
:lrdct new-lrdct
:rrdct (add rrdct top-perturbation)
:orgn `(add ,hmeq ,lb-perturbation))))))