diff options
Diffstat (limited to 'books/workshops/2006/cowles-gamboa-euclid/Euclid/fld-u-poly/fuproducto.lisp')
-rw-r--r-- | books/workshops/2006/cowles-gamboa-euclid/Euclid/fld-u-poly/fuproducto.lisp | 583 |
1 files changed, 583 insertions, 0 deletions
diff --git a/books/workshops/2006/cowles-gamboa-euclid/Euclid/fld-u-poly/fuproducto.lisp b/books/workshops/2006/cowles-gamboa-euclid/Euclid/fld-u-poly/fuproducto.lisp new file mode 100644 index 0000000..3639b3d --- /dev/null +++ b/books/workshops/2006/cowles-gamboa-euclid/Euclid/fld-u-poly/fuproducto.lisp @@ -0,0 +1,583 @@ +; ACL2 Univariate Polynomials over a Field books -- Polynomial Products +;; Products of Univariate Polynomials over a Field +; Copyright (C) 2006 John R. Cowles and Ruben A. Gamboa, University of +; Wyoming + +; This book is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. + +; This book is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with this book; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;; Modified by J. Cowles + +;; Last modified July 2006 (for ACL2 Version 3.0). + +; Modified by Matt Kaufmann for ACL2 Version 3.1 because +; SBCL complains about LISP::. + +;; Based on +;;; --------------------------------------------------------------- +;;; Producto de polinomios +;;; +;;; Autores: +;;; +;;; Inmaculada Medina Bulo +;;; Francisco Palomo Lozano +;;; +;;; Descripción: +;;; +;;; Desarrollo del producto externo de un monomio por un polinomio y +;;; del producto de polinomios. Las funciones se completan +;;; cuidadosamente, de lo contrario, no es posible establecer las +;;; congruencias, ya que éstas no pueden contener hipótesis. Se +;;; demuestra que los polinomios con el producto forman un monoide +;;; conmutativo y que el producto distribuye respecto de la suma, +;;; completándose con esto la demostración de las propiedades del +;;; anillo de polinomios. +;;; ---------------------------------------------------------------- +#| +To certify this book, first, create a world with the following packages: + +(in-package "ACL2") + +(defconst *import-symbols* + (set-difference-eq + (union-eq *acl2-exports* + *common-lisp-symbols-from-main-lisp-package*) + '(null + * - < = / commutativity-of-* associativity-of-* + commutativity-of-+ associativity-of-+ distributivity))) + +(defpkg "FLD" + *import-symbols*) + +(defpkg "FUTER" + *import-symbols*) + +(defpkg "FUMON" + (union-eq *import-symbols* + '(FLD::fdp FUTER::terminop))) + +(defpkg "FUPOL" + (union-eq *import-symbols* + '(FUTER::naturalp FUTER::terminop FUMON::monomio FUMON::coeficiente + FUMON::termino FUMON::monomiop))) + +(certify-book "fuproducto" + 5 + nil ;;compile-flg + ) +|# +(in-package "FUPOL") + +;; (include-book "opuesto") +(include-book "fuopuesto" + :load-compiled-file nil) + +;;; ------ +;;; Neutro +;;; ------ + +(defmacro identidad () + `(+M (FUMON::identidad) (nulo))) + +(defmacro identidadp (p) + `(= ,p (identidad))) + +(defthm polinomiop-identidad + (polinomiop (identidad)) + :rule-classes :type-prescription) + +;; (defthm +;; |RNG::1 !RNG::= RNG::0| +;; (not (RNG::= (RNG::1_r)(RNG::0_r))) +;; :hints (("Goal" +;; :use RNG::|0 != 1|))) + +(defthm ordenadop-identidad + (ordenadop (identidad)) + :hints (("Goal" :in-theory (enable FUMON::identidad))) + :rule-classes :type-prescription) + +;;; ------------------------------- +;;; Producto de monomio y polinomio +;;; ------------------------------- + +(defun *-monomio (m p) + (cond ((or (nulop p) (not (monomiop m)) (not (polinomiop p))) + (nulo)) + (t + (+M (FUMON::* m (primero p)) (*-monomio m (resto p)))))) + +;;; Clausura + +(defthm polinomiop-*-monomio + (polinomiop (*-monomio m p)) + :rule-classes (:type-prescription + :rewrite)) + +;;; Neutro + +(defthm |1 *M p = p| + (implies (polinomiop (double-rewrite p)) + (= (*-monomio (FUMON::identidad) p) p))) + +;;; Cancelación + +;;; NOTA: +;;; +;;; Primero se demuestra sintácticamente, introduciendo la forma +;;; normal. Luego se extiende a la igualdad semántica. + +(defthm |m = 0 => fn(m *M p) =e 0| + (implies (FUMON::nulop m) + (equal (fn (*-monomio m p)) (nulo)))) + +(defthm |m = 0 => m *M p = 0| + (implies (FUMON::nulop m) + (= (*-monomio m p) (nulo)))) + +;;; Distributividad del producto externo respecto de la suma. + +(defthm |m1 *M (m2 +M p) =e (m1 * m2) +M (m *M p)| + (implies (and (monomiop (double-rewrite m1)) + (monomiop (double-rewrite m2))) + (equal (*-monomio m1 (+M m2 p)) + (+M (FUMON::* m1 m2) (*-monomio m1 p))))) + +(defthm |m *M (p + q) = (m *M p) + (m *M q)| + (= (*-monomio m (+ p q)) + (+ (*-monomio m p) (*-monomio m q))) + :hints (("Goal" + :in-theory (disable = + +M |p + q = q + p|)) + ("Subgoal *1/1" :in-theory (enable = + +M)))) + +;;; NOTA: +;;; +;;; Esta propiedad permite cambiar un producto externo por otro +;;; más sencillo sobre monomios. + +(defthm |m1 *M (m2 *M p) = (m1 * m2) *M p| + (implies (and (monomiop (double-rewrite m1)) + (monomiop (double-rewrite m2))) + (= (*-monomio m1 (*-monomio m2 p)) + (*-monomio (FUMON::* m1 m2) p))) + :hints (("Goal" :in-theory (disable = + +M)) + ("Subgoal *1/1" :in-theory (enable = + +M)))) + +(defthm + |p != 0 => m *M p != 0| + (implies (and (monomiop (double-rewrite m)) + (polinomiop (double-rewrite p)) + (not (nulop p))) + (not (nulop (*-monomio m p))))) + +(defthm + |ordenadop p => ordenadop m *M p| + (implies (and (not (FUMON::nulop m)) + (ordenadop (double-rewrite p))) + (ordenadop (*-monomio m p)))) + +(defthm + | m != 0 and p != 0 => fn(m *M p) != 0| + (implies (and (monomiop (double-rewrite m)) + (not (FUMON::nulop m)) + (ordenadop (double-rewrite p)) + (not (nulop p))) + (not (nulop (fn (*-monomio m p))))) + :hints (("Goal" + :in-theory (disable fnp-iff-ordenadop) + :use |p != 0 => m *M p != 0|))) + +;;; ---------------------- +;;; Producto de polinomios +;;; ---------------------- + +(defun * (p q) + (cond ((or (nulop p) (not (polinomiop p))) + (nulo)) + (t + (+ (*-monomio (primero p) q) (* (resto p) q))))) + +;;; Clausura + +(defthm polinomiop-* + (polinomiop (* p q)) + :rule-classes (:type-prescription + :rewrite)) + +;;; El producto de un monomio por el producto de dos polinomios es +;;; igual al producto del segundo polinomio por el resultado de +;;; multiplicar el monomio por el primer polinomio + +(defthm |m *M (p * q) = (m *M p) * q| + (implies (monomiop (double-rewrite m)) + (= (*-monomio m (* p q)) + (* (*-monomio m p) q))) + :hints (("Goal" + :in-theory (disable + =)))) + +;;; Distributividad respecto de la suma + +(defthm |p * q =e mp(p) *M q + resto(p) * q| + (implies (and (polinomiop (double-rewrite p)) + (not (nulop p))) + (equal (* p q) + (+ (*-monomio (primero p) q) (* (resto p) q))))) + +(defthm |(p + q) * r = (p * r) + (q * r)| + (= (* (+ p q) r) (+ (* p r) (* q r))) + :hints (("Goal" + :induct (fn p) + :in-theory (disable = + *)) + ("Subgoal *1/1" + :in-theory (enable = + *)))) + +;;; Neutro + +(defthm |1 * p = p| + (= (* (identidad) p) p)) + +;;; Cancelación + +(defthm |0 * p =e 0| + (equal (* (nulo) p) (nulo))) + +;; (defthm |0 * p = 0| +;; (= (* (nulo) p) (nulo))) + +;;; Asociatividad + +(defthm |(p * q) * r = p * (q * r)| + (= (* (* p q) r) (* p (* q r))) + :hints (("Goal" :in-theory (disable = +)))) + +;;; Conmutatividad + +;;; NOTA: +;;; +;;; La inducción apropiada es múltiple. Unas veces se requiere una +;;; hipótesis de inducción sobre uno de los parámetros, otras veces +;;; sobre el otro y otras sobre ambos. Hemos de suministrar el +;;; esquema. + +(encapsulate () + (local + (defthm tecnico + (implies (and (monomiop (double-rewrite m)) + (polinomiop (double-rewrite p)) + (polinomiop (double-rewrite q))) + (= (+ p (+M m q)) (+ q (+M m p)))) + :hints (("Goal" :in-theory (disable = +))))) + + (local + (defun esquema-de-induccion (p q) + (declare (xargs :verify-guards nil :measure (ACL2::+ (len p) (len q)))) + (cond ((or (nulop p) (nulop q)) + t) + (t + (and (esquema-de-induccion (resto p) (resto q)) + (esquema-de-induccion (resto p) q) + (esquema-de-induccion p (resto q))))))) + + (defthm |p * q = q * p| + (= (* p q) (* q p)) + :hints (("Goal" + :induct (esquema-de-induccion p q) + :do-not '(eliminate-destructors) + :in-theory (disable = + +M + |m = 0 => m *M p = 0| + |p != 0 => m *M p != 0|))))) + +;;; Distributividad respecto de la suma + +(defthm |p * (q + r) = (p * q) + (p * r)| + (= (* p (+ q r)) (+ (* p q) (* p r))) + :hints (("Goal" + :in-theory (disable = + *) + :use ((:instance |(p + q) * r = (p * r) + (q * r)| + (r p) (p q) (q r)))))) + +(defthm |p * 1 = p| + (= (* p (identidad)) p)) + +(defthm |p * 0 =e 0| + (equal (* p (nulo))(nulo))) + +;; (defthm |p * 0 = 0| +;; (= (* p (nulo)) (nulo))) + +(defthm + |nulop p1 * p2 <=> nulop p1 or nulop p2| + (implies (and (polinomiop (double-rewrite p1)) + (polinomiop (double-rewrite p2))) + (equal (nulop (* p1 p2)) + (or (nulop p1) + (nulop p2))))) + +(defthm + |p1 * p2 = 0 <=> p1 = 0 or p2 = 0| + (implies (and (polinomiop (double-rewrite p1)) + (polinomiop (double-rewrite p2))) + (equal (equal (* p1 p2)(nulo)) + (or (equal p1 (nulo)) + (equal p2 (nulo)))))) + +(defthm + |primero (p1 * p2) =e (primero p1) FUMON::* (primero p2)| + (implies (and (polinomiop (double-rewrite p1)) + (polinomiop (double-rewrite p2)) + (not (nulop p1)) + (not (nulop p2))) + (equal (primero (* p1 p2)) + (FUMON::* (primero p1)(primero p2))))) + +(defun + >-monomio (m p) + "Determine if monomio m is FUMON::> than + every monomio in p." + (if (consp p) + (and (FUTER::< (termino (primero p))(termino m)) + (>-monomio m (resto P))) + t)) + +(defthm + |primero p FUMON::< m => >-monomio m p| + (implies (and (ordenadop (double-rewrite p)) + (FUMON::< (primero p) m)) + (>-monomio m p))) + +(defthm + |m >-monomio p => primero (m +M p) =e m| + (implies (and (monomiop m) + (not (FUMON::nulop m)) + (>-monomio m p)) + (equal (primero (+-monomio m p)) m))) + +(defthm + |m >-monomio (n +-monomio p)| + (implies (and (>-monomio m p) + (FUTER::< (termino n)(termino m))) + (>-monomio m (+-monomio n p)))) + +(defthm + |m >-monomio p => m >-monomio (fn p)| + (implies (>-monomio m p) + (>-monomio m (fn p)))) + +(defthm + |(primero p) >-monomio (resto p) => primero (fn p) =e primero p| + (implies (and (polinomiop (double-rewrite p)) + (not (FUMON::nulop (primero p))) + (>-monomio (primero p)(resto p))) + (equal (primero (fn p))(primero p)))) + +(defthm + |primero (p1 * p2) != 0| + (implies (and (ordenadop (double-rewrite p1)) + (ordenadop (double-rewrite p2)) + (not (nulop p1)) + (not (nulop p2))) + (not (FUMON::nulop (primero (* p1 p2))))) + :hints (("Goal" + :in-theory (disable + |primero (p1 * p2) =e (primero p1) FUMON::* (primero p2)|) + :use |primero (p1 * p2) =e (primero p1) FUMON::* (primero p2)|))) + +(defthm + |ordenadop p => (primero p) >-monomio (resto p)| + (implies (and (ordenadop (double-rewrite p)) + (not (nulop p))) + (>-monomio (primero p)(resto p)))) + +(defthm + |primero (m *M p) >-monomio resto (m *M p)| + (implies (and (not (FUMON::nulop m)) + (ordenadop (double-rewrite p))) + (>-monomio (primero (*-monomio m p)) + (resto (*-monomio m p)))) + :hints (("Goal" + :in-theory (disable |ordenadop p => ordenadop m *M p|) + :use |ordenadop p => ordenadop m *M p|))) + +(defthm + |m >-monomio (append p1 p2)| + (implies (and (>-monomio m p1) + (>-monomio m p2)) + (>-monomio m (append p1 p2)))) + +(defthm + |termino (primero (*-monomio n p)) FUTER::< termino (primero (*-monomio m p))| + (implies (and (monomiop (double-rewrite m)) + (monomiop (double-rewrite n)) + (FUMON::< n m) + (polinomiop (double-rewrite p)) + (not (nulop p))) + (FUTER::< (termino (primero (*-monomio n p))) + (termino (primero (*-monomio m p)))))) + +(defthm + |m FUMON::> n and n >-monomio p => m >-monomio p| + (implies (and (FUMON::< n m) + (>-monomio n p)) + (>-monomio m p))) + +(defthm + |primero (m *M p) >- monomio append (resto m *M p)(n *m p)| + (implies (and (monomiop (double-rewrite m)) + (not (FUMON::nulop m)) + (not (FUMON::nulop n)) + (FUMON::< n m) + (ordenadop (double-rewrite p))) + (>-monomio (primero (*-monomio m p)) + (append (resto (*-monomio m p)) + (*-monomio n p)))) + :hints + (("Goal" + :in-theory + (disable + |m >-monomio (append p1 p2)| + |termino (primero (*-monomio n p)) FUTER::< termino (primero (*-monomio m p))|) + :use + (|termino (primero (*-monomio n p)) FUTER::< termino (primero (*-monomio m p))| + (:instance + |m >-monomio (append p1 p2)| + (m (primero (*-monomio m p))) + (p1 (resto (*-monomio m p))) + (p2 (*-monomio n p))))))) + +(defthm + |primero append (m *M p)(n *M p) >- monomio resto append ( m *M p)(n *m p)| + (implies (and (monomiop (double-rewrite m)) + (not (FUMON::nulop m)) + (not (FUMON::nulop n)) + (FUMON::< n m) + (ordenadop (double-rewrite p))) + (>-monomio (primero (append (*-monomio m p) + (*-monomio n p))) + (resto (append (*-monomio m p) + (*-monomio n p))))) + :hints (("Goal" + :in-theory (disable + |primero (m *M p) >- monomio append (resto m *M p)(n *m p)|) + :use |primero (m *M p) >- monomio append (resto m *M p)(n *m p)|))) + +(defthm + |primero (m *M p2) >-monomio append (resto m *M p2) p1| + (implies (and (not (FUMON::nulop m)) + (>-monomio (primero p1)(resto p1)) + (FUMON::< (primero p1)(primero (*-monomio m p2))) + (ordenadop (double-rewrite p2))) + (>-monomio (primero (*-monomio m p2)) + (append (resto (*-monomio m p2)) + p1)))) + +(defthm + |primero (append (m *M p2) p1) >-monomio resto (append (m *M p2) p1)| + (implies (and (not (FUMON::nulop m)) + (>-monomio (primero p1)(resto p1)) + (FUMON::< (primero p1)(primero (*-monomio m p2))) + (ordenadop (double-rewrite p2))) + (>-monomio (primero (append (*-monomio m p2) + p1)) + (resto (append (*-monomio m p2) + p1)))) + :hints (("Goal" + :in-theory (disable + |primero (m *M p2) >-monomio append (resto m *M p2) p1|) + :use |primero (m *M p2) >-monomio append (resto m *M p2) p1|))) + +(defthm + |primero (* p1 p2) >-monomio resto (* p1 p2)-lemma| + (implies (and (>-monomio (primero (* (resto p1) p2)) + (resto (* (resto p1) p2))) + (not (FUMON::nulop (primero p1))) + (FUMON::< (primero (resto p1))(primero p1)) + (ordenadop (double-rewrite p2))) + (>-monomio (car (append (*-monomio (primero p1) p2) + (* (resto p1) p2))) + (cdr (append (*-monomio (primero p1) p2) + (* (resto p1) p2))))) + :hints (("Goal" + :in-theory + (disable + |primero (append (m *M p2) p1) >-monomio resto (append (m *M p2) p1)| + |primero (p1 * p2) =e (primero p1) FUMON::* (primero p2)|) + :use + ((:instance + |primero (append (m *M p2) p1) >-monomio resto (append (m *M p2) p1)| + (m (car p1)) + (p1 (* (CDR P1) P2))) + (:instance + |primero (p1 * p2) =e (primero p1) FUMON::* (primero p2)| + (p1 (cdr p1))))))) + +(defthm + |primero (* p1 p2) >-monomio resto (* p1 p2)| + (implies (and (ordenadop (double-rewrite p1)) + (ordenadop (double-rewrite p2))) + (>-monomio (primero (* p1 p2))(resto (* p1 p2))))) + +(defthm + |primero fn (p1 * p2) =e primero (p1 * p2)| + (implies (and (ordenadop (double-rewrite p1)) + (ordenadop (double-rewrite p2)) + (not (nulop p1)) + (not (nulop p2))) + (equal (primero (fn (* p1 p2)))(primero (* p1 p2))))) + +(defthm + |primero fn (p1 * p2) != 0| + (implies (and (ordenadop (double-rewrite p1)) + (ordenadop (double-rewrite p2)) + (not (nulop p1)) + (not (nulop p2))) + (not (FUMON::nulop (primero (fn (* p1 p2)))))) + :hints (("Goal" + :in-theory (disable |primero (p1 * p2) != 0|) + :use |primero (p1 * p2) != 0|))) + +(defthm + |p1 != 0 and p2 != 0 => fn(p1 * p2) != 0| + (implies (and (ordenadop (double-rewrite p1)) + (ordenadop (double-rewrite p2)) + (not (nulop p1)) + (not (nulop p2))) + (not (nulop (fn (* p1 p2))))) + :hints (("Goal" + :in-theory + (e/d (coeficiente monomiop) + (|primero fn (p1 * p2) != 0| + |primero fn (p1 * p2) =e primero (p1 * p2)| + |(primero p) >-monomio (resto p) => primero (fn p) =e primero p|)) + :use |primero fn (p1 * p2) != 0|))) + +(defthm + |nulop fn(p1 * p2) <=> nulop p1 or nulop p2| + (implies (and (ordenadop (double-rewrite p1)) + (ordenadop (double-rewrite p2))) + (equal (nulop (fn (* p1 p2))) + (or (nulop p1) + (nulop p2)))) + :hints (("Subgoal 3" + :in-theory (disable |p1 != 0 and p2 != 0 => fn(p1 * p2) != 0|) + :use |p1 != 0 and p2 != 0 => fn(p1 * p2) != 0|))) + +(defthm + |fn(p1 * p2) = 0 <=> p1 = 0 or p2 = 0| + (implies (and (ordenadop (double-rewrite p1)) + (ordenadop (double-rewrite p2))) + (equal (equal (fn (* p1 p2))(nulo)) + (or (equal p1 (nulo)) + (equal p2 (nulo))))) + :hints (("Subgoal 3" + :in-theory (disable |p1 != 0 and p2 != 0 => fn(p1 * p2) != 0|) + :use |p1 != 0 and p2 != 0 => fn(p1 * p2) != 0|))) |