summaryrefslogtreecommitdiff
path: root/books/workshops/2000/medina/polynomials/addition.lisp
blob: 8bc356fc1bd8fb851387fe73bdd117afd63d7488 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
(in-package "POL")

(include-book "normal-form")

;;; -------------------
;;; Polynomial addition
;;; -------------------

(defun + (p1 p2)
  (declare (xargs :guard (and (polynomialp p1) (polynomialp p2))))
  (cond ((and (not (polynomialp p1)) (not (polynomialp p2)))
	 *null*)
	((not (polynomialp p1))
	 p2)
	((not (polynomialp p2))
	 p1)
	(t
	 (append p1 p2))))

;;; Type rules.

(defthm polynomialp-append
  (implies (and (polynomialp p1) (polynomialp p2))
	   (polynomialp (append p1 p2)))
  :rule-classes (:type-prescription :rewrite))

(defthm polynomialp-+
  (polynomialp (+ p1 p2))
  :rule-classes (:type-prescription :rewrite))

;;; -------------------
;;; Addition properties
;;; -------------------

;;; Polynomial addition has left and right identity element.

(defthm append-identity-1
  (implies (polynomialp p)
	   (equal (append p *null*) p)))

(defthm +-identity-1
  (= (+ p *null*) p))

(defthm append-identity-2
  (equal (append *null* p) p))

(defthm +-identity-2
  (= (+ *null* p) p))

;;; Polynomial addition is associative.

(defthm associativity-of-append
  (equal (append (append p1 p2) p3)
	 (append p1 (append p2 p3))))

(defthm associativity-of-+
  (= (+ (+ p1 p2) p3) (+ p1 (+ p2 p3))))

;;; Polynomial addition is commutative.

(encapsulate ()
  (local
    (defthm technical-lemma
      (equal (+-monomial m1 (+-monomial m2 (nf p)))
	     (+-monomial m2 (+-monomial m1 (nf p))))))

  (defthm commutativity-of-append-technical-lemma
    (implies (and (polynomialp p1)
		  (polynomialp p2)
		  (not (nullp p2)))
	     (equal (nf (append p1 p2))
		    (+-monomial (first p2)
			       (nf (append p1 (rest p2))))))))

(defthm commutativity-of-append
  (implies (and (polynomialp p1) (polynomialp p2))
	   (= (append p1 p2) (append p2 p1))))

(defthm commutativity-of-+
  (= (+ p1 p2) (+ p2 p1))
  :hints (("Goal"
	   :in-theory (disable =))))

;;; Polynomial addition is associative-commutative.

(defthm associativity-commutativity-of-append
  (implies (and (polynomialp p1) (polynomialp p2) (polynomialp p3))
	   (= (append p3 (append p2 p1))
	      (append p2 (append p3 p1)))))

(defthm associativity-commutativity-of-+
  (= (+ p3 (+ p2 p1)) (+ p2 (+ p3 p1)))
  :hints (("Goal" :in-theory (disable =))
	  ("Subgoal 1" :in-theory (enable =))))