| author | paulson <lp15@cam.ac.uk> | 
| Mon, 09 Dec 2019 16:37:26 +0000 | |
| changeset 71260 | 308baf6b450a | 
| parent 70019 | 095dce9892e8 | 
| child 74397 | e80c4cde6064 | 
| permissions | -rw-r--r-- | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 1 | (* Title: HOL/Decision_Procs/Commutative_Ring.thy | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 2 | Author: Bernhard Haeupler, Stefan Berghofer, and Amine Chaieb | 
| 17516 | 3 | |
| 4 | Proving equalities in commutative rings done "right" in Isabelle/HOL. | |
| 5 | *) | |
| 6 | ||
| 60533 | 7 | section \<open>Proving equalities in commutative rings\<close> | 
| 17516 | 8 | |
| 9 | theory Commutative_Ring | |
| 67123 | 10 | imports | 
| 11 | Conversions | |
| 12 | Algebra_Aux | |
| 13 | "HOL-Library.Code_Target_Numeral" | |
| 17516 | 14 | begin | 
| 15 | ||
| 60533 | 16 | text \<open>Syntax of multivariate polynomials (pol) and polynomial expressions.\<close> | 
| 17516 | 17 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 18 | datatype pol = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 19 | Pc int | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 20 | | Pinj nat pol | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 21 | | PX pol nat pol | 
| 17516 | 22 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 23 | datatype polex = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 24 | Var nat | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 25 | | Const int | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 26 | | Add polex polex | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 27 | | Sub polex polex | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 28 | | Mul polex polex | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 29 | | Pow polex nat | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 30 | | Neg polex | 
| 17516 | 31 | |
| 60533 | 32 | text \<open>Interpretation functions for the shadow syntax.\<close> | 
| 17516 | 33 | |
| 67123 | 34 | context cring | 
| 35 | begin | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 36 | |
| 67123 | 37 | definition in_carrier :: "'a list \<Rightarrow> bool" | 
| 38 | where "in_carrier xs \<longleftrightarrow> (\<forall>x\<in>set xs. x \<in> carrier R)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 39 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 40 | lemma in_carrier_Nil: "in_carrier []" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 41 | by (simp add: in_carrier_def) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 42 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 43 | lemma in_carrier_Cons: "x \<in> carrier R \<Longrightarrow> in_carrier xs \<Longrightarrow> in_carrier (x # xs)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 44 | by (simp add: in_carrier_def) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 45 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 46 | lemma drop_in_carrier [simp]: "in_carrier xs \<Longrightarrow> in_carrier (drop n xs)" | 
| 67123 | 47 | using set_drop_subset [of n xs] by (auto simp add: in_carrier_def) | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 48 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 49 | primrec head :: "'a list \<Rightarrow> 'a" | 
| 67123 | 50 | where | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 51 | "head [] = \<zero>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 52 | | "head (x # xs) = x" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 53 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 54 | lemma head_closed [simp]: "in_carrier xs \<Longrightarrow> head xs \<in> carrier R" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 55 | by (cases xs) (simp_all add: in_carrier_def) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 56 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 57 | primrec Ipol :: "'a list \<Rightarrow> pol \<Rightarrow> 'a" | 
| 67123 | 58 | where | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 59 | "Ipol l (Pc c) = \<guillemotleft>c\<guillemotright>" | 
| 22742 
06165e40e7bd
switched from recdef to function package; constants add, mul, pow now curried; infix syntax for algebraic operations.
 haftmann parents: 
22665diff
changeset | 60 | | "Ipol l (Pinj i P) = Ipol (drop i l) P" | 
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 61 | | "Ipol l (PX P x Q) = Ipol l P \<otimes> head l [^] x \<oplus> Ipol (drop 1 l) Q" | 
| 17516 | 62 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 63 | lemma Ipol_Pc: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 64 | "Ipol l (Pc 0) = \<zero>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 65 | "Ipol l (Pc 1) = \<one>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 66 | "Ipol l (Pc (numeral n)) = \<guillemotleft>numeral n\<guillemotright>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 67 | "Ipol l (Pc (- numeral n)) = \<ominus> \<guillemotleft>numeral n\<guillemotright>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 68 | by simp_all | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 69 | |
| 67123 | 70 | lemma Ipol_closed [simp]: "in_carrier l \<Longrightarrow> Ipol l p \<in> carrier R" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 71 | by (induct p arbitrary: l) simp_all | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 72 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 73 | primrec Ipolex :: "'a list \<Rightarrow> polex \<Rightarrow> 'a" | 
| 67123 | 74 | where | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 75 | "Ipolex l (Var n) = head (drop n l)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 76 | | "Ipolex l (Const i) = \<guillemotleft>i\<guillemotright>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 77 | | "Ipolex l (Add P Q) = Ipolex l P \<oplus> Ipolex l Q" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 78 | | "Ipolex l (Sub P Q) = Ipolex l P \<ominus> Ipolex l Q" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 79 | | "Ipolex l (Mul P Q) = Ipolex l P \<otimes> Ipolex l Q" | 
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 80 | | "Ipolex l (Pow p n) = Ipolex l p [^] n" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 81 | | "Ipolex l (Neg P) = \<ominus> Ipolex l P" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 82 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 83 | lemma Ipolex_Const: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 84 | "Ipolex l (Const 0) = \<zero>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 85 | "Ipolex l (Const 1) = \<one>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 86 | "Ipolex l (Const (numeral n)) = \<guillemotleft>numeral n\<guillemotright>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 87 | by simp_all | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 88 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 89 | end | 
| 17516 | 90 | |
| 60533 | 91 | text \<open>Create polynomial normalized polynomials given normalized inputs.\<close> | 
| 17516 | 92 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 93 | definition mkPinj :: "nat \<Rightarrow> pol \<Rightarrow> pol" | 
| 67123 | 94 | where "mkPinj x P = | 
| 60534 | 95 | (case P of | 
| 96 | Pc c \<Rightarrow> Pc c | |
| 97 | | Pinj y P \<Rightarrow> Pinj (x + y) P | |
| 98 | | PX p1 y p2 \<Rightarrow> Pinj x P)" | |
| 17516 | 99 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 100 | definition mkPX :: "pol \<Rightarrow> nat \<Rightarrow> pol \<Rightarrow> pol" | 
| 67123 | 101 | where "mkPX P i Q = | 
| 55754 | 102 | (case P of | 
| 103 | Pc c \<Rightarrow> if c = 0 then mkPinj 1 Q else PX P i Q | |
| 104 | | Pinj j R \<Rightarrow> PX P i Q | |
| 105 | | PX P2 i2 Q2 \<Rightarrow> if Q2 = Pc 0 then PX P2 (i + i2) Q else PX P i Q)" | |
| 17516 | 106 | |
| 60533 | 107 | text \<open>Defining the basic ring operations on normalized polynomials\<close> | 
| 17516 | 108 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 109 | function add :: "pol \<Rightarrow> pol \<Rightarrow> pol" (infixl "\<langle>+\<rangle>" 65) | 
| 67123 | 110 | where | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 111 | "Pc a \<langle>+\<rangle> Pc b = Pc (a + b)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 112 | | "Pc c \<langle>+\<rangle> Pinj i P = Pinj i (P \<langle>+\<rangle> Pc c)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 113 | | "Pinj i P \<langle>+\<rangle> Pc c = Pinj i (P \<langle>+\<rangle> Pc c)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 114 | | "Pc c \<langle>+\<rangle> PX P i Q = PX P i (Q \<langle>+\<rangle> Pc c)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 115 | | "PX P i Q \<langle>+\<rangle> Pc c = PX P i (Q \<langle>+\<rangle> Pc c)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 116 | | "Pinj x P \<langle>+\<rangle> Pinj y Q = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 117 | (if x = y then mkPinj x (P \<langle>+\<rangle> Q) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 118 | else (if x > y then mkPinj y (Pinj (x - y) P \<langle>+\<rangle> Q) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 119 | else mkPinj x (Pinj (y - x) Q \<langle>+\<rangle> P)))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 120 | | "Pinj x P \<langle>+\<rangle> PX Q y R = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 121 | (if x = 0 then P \<langle>+\<rangle> PX Q y R | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 122 | else (if x = 1 then PX Q y (R \<langle>+\<rangle> P) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 123 | else PX Q y (R \<langle>+\<rangle> Pinj (x - 1) P)))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 124 | | "PX P x R \<langle>+\<rangle> Pinj y Q = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 125 | (if y = 0 then PX P x R \<langle>+\<rangle> Q | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 126 | else (if y = 1 then PX P x (R \<langle>+\<rangle> Q) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 127 | else PX P x (R \<langle>+\<rangle> Pinj (y - 1) Q)))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 128 | | "PX P1 x P2 \<langle>+\<rangle> PX Q1 y Q2 = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 129 | (if x = y then mkPX (P1 \<langle>+\<rangle> Q1) x (P2 \<langle>+\<rangle> Q2) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 130 | else (if x > y then mkPX (PX P1 (x - y) (Pc 0) \<langle>+\<rangle> Q1) y (P2 \<langle>+\<rangle> Q2) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 131 | else mkPX (PX Q1 (y - x) (Pc 0) \<langle>+\<rangle> P1) x (P2 \<langle>+\<rangle> Q2)))" | 
| 67123 | 132 | by pat_completeness auto | 
| 22742 
06165e40e7bd
switched from recdef to function package; constants add, mul, pow now curried; infix syntax for algebraic operations.
 haftmann parents: 
22665diff
changeset | 133 | termination by (relation "measure (\<lambda>(x, y). size x + size y)") auto | 
| 17516 | 134 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 135 | function mul :: "pol \<Rightarrow> pol \<Rightarrow> pol" (infixl "\<langle>*\<rangle>" 70) | 
| 67123 | 136 | where | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 137 | "Pc a \<langle>*\<rangle> Pc b = Pc (a * b)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 138 | | "Pc c \<langle>*\<rangle> Pinj i P = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 139 | (if c = 0 then Pc 0 else mkPinj i (P \<langle>*\<rangle> Pc c))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 140 | | "Pinj i P \<langle>*\<rangle> Pc c = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 141 | (if c = 0 then Pc 0 else mkPinj i (P \<langle>*\<rangle> Pc c))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 142 | | "Pc c \<langle>*\<rangle> PX P i Q = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 143 | (if c = 0 then Pc 0 else mkPX (P \<langle>*\<rangle> Pc c) i (Q \<langle>*\<rangle> Pc c))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 144 | | "PX P i Q \<langle>*\<rangle> Pc c = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 145 | (if c = 0 then Pc 0 else mkPX (P \<langle>*\<rangle> Pc c) i (Q \<langle>*\<rangle> Pc c))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 146 | | "Pinj x P \<langle>*\<rangle> Pinj y Q = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 147 | (if x = y then mkPinj x (P \<langle>*\<rangle> Q) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 148 | else | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 149 | (if x > y then mkPinj y (Pinj (x - y) P \<langle>*\<rangle> Q) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 150 | else mkPinj x (Pinj (y - x) Q \<langle>*\<rangle> P)))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 151 | | "Pinj x P \<langle>*\<rangle> PX Q y R = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 152 | (if x = 0 then P \<langle>*\<rangle> PX Q y R | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 153 | else | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 154 | (if x = 1 then mkPX (Pinj x P \<langle>*\<rangle> Q) y (R \<langle>*\<rangle> P) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 155 | else mkPX (Pinj x P \<langle>*\<rangle> Q) y (R \<langle>*\<rangle> Pinj (x - 1) P)))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 156 | | "PX P x R \<langle>*\<rangle> Pinj y Q = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 157 | (if y = 0 then PX P x R \<langle>*\<rangle> Q | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 158 | else | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 159 | (if y = 1 then mkPX (Pinj y Q \<langle>*\<rangle> P) x (R \<langle>*\<rangle> Q) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 160 | else mkPX (Pinj y Q \<langle>*\<rangle> P) x (R \<langle>*\<rangle> Pinj (y - 1) Q)))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 161 | | "PX P1 x P2 \<langle>*\<rangle> PX Q1 y Q2 = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 162 | mkPX (P1 \<langle>*\<rangle> Q1) (x + y) (P2 \<langle>*\<rangle> Q2) \<langle>+\<rangle> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 163 | (mkPX (P1 \<langle>*\<rangle> mkPinj 1 Q2) x (Pc 0) \<langle>+\<rangle> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 164 | (mkPX (Q1 \<langle>*\<rangle> mkPinj 1 P2) y (Pc 0)))" | 
| 67123 | 165 | by pat_completeness auto | 
| 22742 
06165e40e7bd
switched from recdef to function package; constants add, mul, pow now curried; infix syntax for algebraic operations.
 haftmann parents: 
22665diff
changeset | 166 | termination by (relation "measure (\<lambda>(x, y). size x + size y)") | 
| 
06165e40e7bd
switched from recdef to function package; constants add, mul, pow now curried; infix syntax for algebraic operations.
 haftmann parents: 
22665diff
changeset | 167 | (auto simp add: mkPinj_def split: pol.split) | 
| 17516 | 168 | |
| 60533 | 169 | text \<open>Negation\<close> | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 170 | primrec neg :: "pol \<Rightarrow> pol" | 
| 67123 | 171 | where | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 172 | "neg (Pc c) = Pc (- c)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 173 | | "neg (Pinj i P) = Pinj i (neg P)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 174 | | "neg (PX P x Q) = PX (neg P) x (neg Q)" | 
| 17516 | 175 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 176 | text \<open>Subtraction\<close> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 177 | definition sub :: "pol \<Rightarrow> pol \<Rightarrow> pol" (infixl "\<langle>-\<rangle>" 65) | 
| 67123 | 178 | where "sub P Q = P \<langle>+\<rangle> neg Q" | 
| 17516 | 179 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 180 | text \<open>Square for Fast Exponentiation\<close> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 181 | primrec sqr :: "pol \<Rightarrow> pol" | 
| 67123 | 182 | where | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 183 | "sqr (Pc c) = Pc (c * c)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 184 | | "sqr (Pinj i P) = mkPinj i (sqr P)" | 
| 67123 | 185 | | "sqr (PX A x B) = mkPX (sqr A) (x + x) (sqr B) \<langle>+\<rangle> mkPX (Pc 2 \<langle>*\<rangle> A \<langle>*\<rangle> mkPinj 1 B) x (Pc 0)" | 
| 17516 | 186 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 187 | text \<open>Fast Exponentiation\<close> | 
| 58710 
7216a10d69ba
augmented and tuned facts on even/odd and division
 haftmann parents: 
58310diff
changeset | 188 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 189 | fun pow :: "nat \<Rightarrow> pol \<Rightarrow> pol" | 
| 67123 | 190 | where pow_if [simp del]: "pow n P = | 
| 60534 | 191 | (if n = 0 then Pc 1 | 
| 192 | else if even n then pow (n div 2) (sqr P) | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 193 | else P \<langle>*\<rangle> pow (n div 2) (sqr P))" | 
| 17516 | 194 | |
| 60534 | 195 | lemma pow_simps [simp]: | 
| 58710 
7216a10d69ba
augmented and tuned facts on even/odd and division
 haftmann parents: 
58310diff
changeset | 196 | "pow 0 P = Pc 1" | 
| 58712 | 197 | "pow (2 * n) P = pow n (sqr P)" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 198 | "pow (Suc (2 * n)) P = P \<langle>*\<rangle> pow n (sqr P)" | 
| 58710 
7216a10d69ba
augmented and tuned facts on even/odd and division
 haftmann parents: 
58310diff
changeset | 199 | by (simp_all add: pow_if) | 
| 17516 | 200 | |
| 60534 | 201 | lemma even_pow: "even n \<Longrightarrow> pow n P = pow (n div 2) (sqr P)" | 
| 58712 | 202 | by (erule evenE) simp | 
| 203 | ||
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 204 | lemma odd_pow: "odd n \<Longrightarrow> pow n P = P \<langle>*\<rangle> pow (n div 2) (sqr P)" | 
| 58712 | 205 | by (erule oddE) simp | 
| 206 | ||
| 60534 | 207 | |
| 60533 | 208 | text \<open>Normalization of polynomial expressions\<close> | 
| 17516 | 209 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 210 | primrec norm :: "polex \<Rightarrow> pol" | 
| 67123 | 211 | where | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 212 | "norm (Var n) = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 213 | (if n = 0 then PX (Pc 1) 1 (Pc 0) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 214 | else Pinj n (PX (Pc 1) 1 (Pc 0)))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 215 | | "norm (Const i) = Pc i" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 216 | | "norm (Add P Q) = norm P \<langle>+\<rangle> norm Q" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 217 | | "norm (Sub P Q) = norm P \<langle>-\<rangle> norm Q" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 218 | | "norm (Mul P Q) = norm P \<langle>*\<rangle> norm Q" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 219 | | "norm (Pow P n) = pow n (norm P)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 220 | | "norm (Neg P) = neg (norm P)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 221 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 222 | context cring | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 223 | begin | 
| 17516 | 224 | |
| 60533 | 225 | text \<open>mkPinj preserve semantics\<close> | 
| 17516 | 226 | lemma mkPinj_ci: "Ipol l (mkPinj a B) = Ipol l (Pinj a B)" | 
| 29667 | 227 | by (induct B) (auto simp add: mkPinj_def algebra_simps) | 
| 17516 | 228 | |
| 60533 | 229 | text \<open>mkPX preserves semantics\<close> | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 230 | lemma mkPX_ci: "in_carrier l \<Longrightarrow> Ipol l (mkPX A b C) = Ipol l (PX A b C)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 231 | by (cases A) (auto simp add: mkPX_def mkPinj_ci nat_pow_mult [symmetric] m_ac) | 
| 17516 | 232 | |
| 60533 | 233 | text \<open>Correctness theorems for the implemented operations\<close> | 
| 17516 | 234 | |
| 60533 | 235 | text \<open>Negation\<close> | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 236 | lemma neg_ci: "in_carrier l \<Longrightarrow> Ipol l (neg P) = \<ominus> (Ipol l P)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 237 | by (induct P arbitrary: l) (auto simp add: minus_add l_minus) | 
| 17516 | 238 | |
| 60533 | 239 | text \<open>Addition\<close> | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 240 | lemma add_ci: "in_carrier l \<Longrightarrow> Ipol l (P \<langle>+\<rangle> Q) = Ipol l P \<oplus> Ipol l Q" | 
| 20622 | 241 | proof (induct P Q arbitrary: l rule: add.induct) | 
| 17516 | 242 | case (6 x P y Q) | 
| 60708 | 243 | consider "x < y" | "x = y" | "x > y" by arith | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 244 | then show ?case | 
| 60708 | 245 | proof cases | 
| 246 | case 1 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 247 | with 6 show ?thesis by (simp add: mkPinj_ci a_ac) | 
| 17516 | 248 | next | 
| 60708 | 249 | case 2 | 
| 250 | with 6 show ?thesis by (simp add: mkPinj_ci) | |
| 17516 | 251 | next | 
| 60708 | 252 | case 3 | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 253 | with 6 show ?thesis by (simp add: mkPinj_ci) | 
| 17516 | 254 | qed | 
| 255 | next | |
| 256 | case (7 x P Q y R) | |
| 60534 | 257 | consider "x = 0" | "x = 1" | "x > 1" by arith | 
| 258 | then show ?case | |
| 259 | proof cases | |
| 260 | case 1 | |
| 261 | with 7 show ?thesis by simp | |
| 262 | next | |
| 263 | case 2 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 264 | with 7 show ?thesis by (simp add: a_ac) | 
| 60534 | 265 | next | 
| 266 | case 3 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 267 | with 7 show ?thesis by (cases x) (simp_all add: a_ac) | 
| 60534 | 268 | qed | 
| 17516 | 269 | next | 
| 270 | case (8 P x R y Q) | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 271 | then show ?case by (simp add: a_ac) | 
| 17516 | 272 | next | 
| 273 | case (9 P1 x P2 Q1 y Q2) | |
| 60534 | 274 | consider "x = y" | d where "d + x = y" | d where "d + y = x" | 
| 275 | by atomize_elim arith | |
| 276 | then show ?case | |
| 277 | proof cases | |
| 278 | case 1 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 279 | with 9 show ?thesis by (simp add: mkPX_ci r_distr a_ac m_ac) | 
| 17516 | 280 | next | 
| 60534 | 281 | case 2 | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 282 | with 9 show ?thesis by (auto simp add: mkPX_ci nat_pow_mult [symmetric] r_distr a_ac m_ac) | 
| 17516 | 283 | next | 
| 60534 | 284 | case 3 | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 285 | with 9 show ?thesis by (auto simp add: nat_pow_mult [symmetric] mkPX_ci r_distr a_ac m_ac) | 
| 17516 | 286 | qed | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 287 | qed (auto simp add: a_ac m_ac) | 
| 17516 | 288 | |
| 60533 | 289 | text \<open>Multiplication\<close> | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 290 | lemma mul_ci: "in_carrier l \<Longrightarrow> Ipol l (P \<langle>*\<rangle> Q) = Ipol l P \<otimes> Ipol l Q" | 
| 20622 | 291 | by (induct P Q arbitrary: l rule: mul.induct) | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 292 | (simp_all add: mkPX_ci mkPinj_ci a_ac m_ac r_distr add_ci nat_pow_mult [symmetric]) | 
| 17516 | 293 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 294 | text \<open>Subtraction\<close> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 295 | lemma sub_ci: "in_carrier l \<Longrightarrow> Ipol l (P \<langle>-\<rangle> Q) = Ipol l P \<ominus> Ipol l Q" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 296 | by (simp add: add_ci neg_ci sub_def minus_eq) | 
| 17516 | 297 | |
| 60533 | 298 | text \<open>Square\<close> | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 299 | lemma sqr_ci: "in_carrier ls \<Longrightarrow> Ipol ls (sqr P) = Ipol ls P \<otimes> Ipol ls P" | 
| 22742 
06165e40e7bd
switched from recdef to function package; constants add, mul, pow now curried; infix syntax for algebraic operations.
 haftmann parents: 
22665diff
changeset | 300 | by (induct P arbitrary: ls) | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 301 | (simp_all add: add_ci mkPinj_ci mkPX_ci mul_ci l_distr r_distr | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 302 | a_ac m_ac nat_pow_mult [symmetric] of_int_2) | 
| 17516 | 303 | |
| 60533 | 304 | text \<open>Power\<close> | 
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 305 | lemma pow_ci: "in_carrier ls \<Longrightarrow> Ipol ls (pow n P) = Ipol ls P [^] n" | 
| 58712 | 306 | proof (induct n arbitrary: P rule: less_induct) | 
| 307 | case (less k) | |
| 60708 | 308 | consider "k = 0" | "k > 0" by arith | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 309 | then show ?case | 
| 60708 | 310 | proof cases | 
| 311 | case 1 | |
| 60534 | 312 | then show ?thesis by simp | 
| 20622 | 313 | next | 
| 60708 | 314 | case 2 | 
| 58712 | 315 | then have "k div 2 < k" by arith | 
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 316 | with less have *: "Ipol ls (pow (k div 2) (sqr P)) = Ipol ls (sqr P) [^] (k div 2)" | 
| 58712 | 317 | by simp | 
| 17516 | 318 | show ?thesis | 
| 58712 | 319 | proof (cases "even k") | 
| 60534 | 320 | case True | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 321 | with * \<open>in_carrier ls\<close> show ?thesis | 
| 70019 
095dce9892e8
A few results in Algebra, and bits for Analysis
 paulson <lp15@cam.ac.uk> parents: 
69597diff
changeset | 322 | by (simp add: even_pow sqr_ci nat_pow_distrib nat_pow_mult | 
| 60534 | 323 | mult_2 [symmetric] even_two_times_div_two) | 
| 17516 | 324 | next | 
| 60534 | 325 | case False | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 326 | with * \<open>in_carrier ls\<close> show ?thesis | 
| 70019 
095dce9892e8
A few results in Algebra, and bits for Analysis
 paulson <lp15@cam.ac.uk> parents: 
69597diff
changeset | 327 | by (simp add: odd_pow mul_ci sqr_ci nat_pow_distrib nat_pow_mult | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 328 | mult_2 [symmetric] trans [OF nat_pow_Suc m_comm, symmetric]) | 
| 17516 | 329 | qed | 
| 330 | qed | |
| 331 | qed | |
| 332 | ||
| 60533 | 333 | text \<open>Normalization preserves semantics\<close> | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 334 | lemma norm_ci: "in_carrier l \<Longrightarrow> Ipolex l Pe = Ipol l (norm Pe)" | 
| 17516 | 335 | by (induct Pe) (simp_all add: add_ci sub_ci mul_ci neg_ci pow_ci) | 
| 336 | ||
| 60533 | 337 | text \<open>Reflection lemma: Key to the (incomplete) decision procedure\<close> | 
| 17516 | 338 | lemma norm_eq: | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 339 | assumes "in_carrier l" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 340 | and "norm P1 = norm P2" | 
| 17516 | 341 | shows "Ipolex l P1 = Ipolex l P2" | 
| 342 | proof - | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 343 | from assms have "Ipol l (norm P1) = Ipol l (norm P2)" by simp | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 344 | with assms show ?thesis by (simp only: norm_ci) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 345 | qed | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 346 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 347 | end | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 348 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 349 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 350 | text \<open>Monomials\<close> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 351 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 352 | datatype mon = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 353 | Mc int | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 354 | | Minj nat mon | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 355 | | MX nat mon | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 356 | |
| 67123 | 357 | primrec (in cring) Imon :: "'a list \<Rightarrow> mon \<Rightarrow> 'a" | 
| 358 | where | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 359 | "Imon l (Mc c) = \<guillemotleft>c\<guillemotright>" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 360 | | "Imon l (Minj i M) = Imon (drop i l) M" | 
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 361 | | "Imon l (MX x M) = Imon (drop 1 l) M \<otimes> head l [^] x" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 362 | |
| 67123 | 363 | lemma (in cring) Imon_closed [simp]: "in_carrier l \<Longrightarrow> Imon l m \<in> carrier R" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 364 | by (induct m arbitrary: l) simp_all | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 365 | |
| 67123 | 366 | definition mkMinj :: "nat \<Rightarrow> mon \<Rightarrow> mon" | 
| 367 | where "mkMinj i M = | |
| 368 | (case M of | |
| 369 | Mc c \<Rightarrow> Mc c | |
| 370 | | Minj j M \<Rightarrow> Minj (i + j) M | |
| 371 | | _ \<Rightarrow> Minj i M)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 372 | |
| 67123 | 373 | definition Minj_pred :: "nat \<Rightarrow> mon \<Rightarrow> mon" | 
| 374 | where "Minj_pred i M = (if i = 1 then M else mkMinj (i - 1) M)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 375 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 376 | primrec mkMX :: "nat \<Rightarrow> mon \<Rightarrow> mon" | 
| 67123 | 377 | where | 
| 378 | "mkMX i (Mc c) = MX i (Mc c)" | |
| 379 | | "mkMX i (Minj j M) = (if j = 0 then mkMX i M else MX i (Minj_pred j M))" | |
| 380 | | "mkMX i (MX j M) = MX (i + j) M" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 381 | |
| 67123 | 382 | lemma (in cring) mkMinj_correct: "Imon l (mkMinj i M) = Imon l (Minj i M)" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 383 | by (simp add: mkMinj_def add.commute split: mon.split) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 384 | |
| 67123 | 385 | lemma (in cring) Minj_pred_correct: "0 < i \<Longrightarrow> Imon (drop 1 l) (Minj_pred i M) = Imon l (Minj i M)" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 386 | by (simp add: Minj_pred_def mkMinj_correct) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 387 | |
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 388 | lemma (in cring) mkMX_correct: "in_carrier l \<Longrightarrow> Imon l (mkMX i M) = Imon l M \<otimes> head l [^] i" | 
| 67123 | 389 | by (induct M) | 
| 390 | (simp_all add: Minj_pred_correct [simplified] nat_pow_mult [symmetric] m_ac split: mon.split) | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 391 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 392 | fun cfactor :: "pol \<Rightarrow> int \<Rightarrow> pol \<times> pol" | 
| 67123 | 393 | where | 
| 394 | "cfactor (Pc c') c = (Pc (c' mod c), Pc (c' div c))" | |
| 395 | | "cfactor (Pinj i P) c = | |
| 396 | (let (R, S) = cfactor P c | |
| 397 | in (mkPinj i R, mkPinj i S))" | |
| 398 | | "cfactor (PX P i Q) c = | |
| 399 | (let | |
| 400 | (R1, S1) = cfactor P c; | |
| 401 | (R2, S2) = cfactor Q c | |
| 402 | in (mkPX R1 i R2, mkPX S1 i S2))" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 403 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 404 | lemma (in cring) cfactor_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 405 | "in_carrier l \<Longrightarrow> Ipol l P = Ipol l (fst (cfactor P c)) \<oplus> \<guillemotleft>c\<guillemotright> \<otimes> Ipol l (snd (cfactor P c))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 406 | proof (induct P c arbitrary: l rule: cfactor.induct) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 407 | case (1 c' c) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 408 | show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 409 | by (simp add: of_int_mult [symmetric] of_int_add [symmetric] del: of_int_mult) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 410 | next | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 411 | case (2 i P c) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 412 | then show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 413 | by (simp add: mkPinj_ci split_beta) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 414 | next | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 415 | case (3 P i Q c) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 416 | from 3(1) 3(2) [OF refl prod.collapse] 3(3) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 417 | show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 418 | by (simp add: mkPX_ci r_distr a_ac m_ac split_beta) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 419 | qed | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 420 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 421 | fun mfactor :: "pol \<Rightarrow> mon \<Rightarrow> pol \<times> pol" | 
| 67123 | 422 | where | 
| 423 | "mfactor P (Mc c) = (if c = 1 then (Pc 0, P) else cfactor P c)" | |
| 424 | | "mfactor (Pc d) M = (Pc d, Pc 0)" | |
| 425 | | "mfactor (Pinj i P) (Minj j M) = | |
| 426 | (if i = j then | |
| 427 | let (R, S) = mfactor P M | |
| 428 | in (mkPinj i R, mkPinj i S) | |
| 429 | else if i < j then | |
| 430 | let (R, S) = mfactor P (Minj (j - i) M) | |
| 431 | in (mkPinj i R, mkPinj i S) | |
| 432 | else (Pinj i P, Pc 0))" | |
| 433 | | "mfactor (Pinj i P) (MX j M) = (Pinj i P, Pc 0)" | |
| 434 | | "mfactor (PX P i Q) (Minj j M) = | |
| 435 | (if j = 0 then mfactor (PX P i Q) M | |
| 436 | else | |
| 437 | let | |
| 438 | (R1, S1) = mfactor P (Minj j M); | |
| 439 | (R2, S2) = mfactor Q (Minj_pred j M) | |
| 440 | in (mkPX R1 i R2, mkPX S1 i S2))" | |
| 441 | | "mfactor (PX P i Q) (MX j M) = | |
| 442 | (if i = j then | |
| 443 | let (R, S) = mfactor P (mkMinj 1 M) | |
| 444 | in (mkPX R i Q, S) | |
| 445 | else if i < j then | |
| 446 | let (R, S) = mfactor P (MX (j - i) M) | |
| 447 | in (mkPX R i Q, S) | |
| 448 | else | |
| 449 | let (R, S) = mfactor P (mkMinj 1 M) | |
| 450 | in (mkPX R i Q, mkPX S (i - j) (Pc 0)))" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 451 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 452 | lemmas mfactor_induct = mfactor.induct | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 453 | [case_names Mc Pc_Minj Pc_MX Pinj_Minj Pinj_MX PX_Minj PX_MX] | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 454 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 455 | lemma (in cring) mfactor_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 456 | "in_carrier l \<Longrightarrow> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 457 | Ipol l P = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 458 | Ipol l (fst (mfactor P M)) \<oplus> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 459 | Imon l M \<otimes> Ipol l (snd (mfactor P M))" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 460 | proof (induct P M arbitrary: l rule: mfactor_induct) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 461 | case (Mc P c) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 462 | then show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 463 | by (simp add: cfactor_correct) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 464 | next | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 465 | case (Pc_Minj d i M) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 466 | then show ?case | 
| 60534 | 467 | by simp | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 468 | next | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 469 | case (Pc_MX d i M) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 470 | then show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 471 | by simp | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 472 | next | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 473 | case (Pinj_Minj i P j M) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 474 | then show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 475 | by (simp add: mkPinj_ci split_beta) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 476 | next | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 477 | case (Pinj_MX i P j M) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 478 | then show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 479 | by simp | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 480 | next | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 481 | case (PX_Minj P i Q j M) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 482 | from PX_Minj(1,2) PX_Minj(3) [OF _ refl prod.collapse] PX_Minj(4) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 483 | show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 484 | by (simp add: mkPX_ci Minj_pred_correct [simplified] r_distr a_ac m_ac split_beta) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 485 | next | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 486 | case (PX_MX P i Q j M) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 487 | from \<open>in_carrier l\<close> | 
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 488 | have eq1: "(Imon (drop (Suc 0) l) M \<otimes> head l [^] (j - i)) \<otimes> | 
| 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 489 | Ipol l (snd (mfactor P (MX (j - i) M))) \<otimes> head l [^] i = | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 490 | Imon (drop (Suc 0) l) M \<otimes> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 491 | Ipol l (snd (mfactor P (MX (j - i) M))) \<otimes> | 
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 492 | (head l [^] (j - i) \<otimes> head l [^] i)" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 493 | by (simp add: m_ac) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 494 | from \<open>in_carrier l\<close> | 
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 495 | have eq2: "(Imon (drop (Suc 0) l) M \<otimes> head l [^] j) \<otimes> | 
| 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 496 | (Ipol l (snd (mfactor P (mkMinj (Suc 0) M))) \<otimes> head l [^] (i - j)) = | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 497 | Imon (drop (Suc 0) l) M \<otimes> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 498 | Ipol l (snd (mfactor P (mkMinj (Suc 0) M))) \<otimes> | 
| 67341 
df79ef3b3a41
Renamed (^) to [^] in preparation of the move from "op X" to (X)
 nipkow parents: 
67123diff
changeset | 499 | (head l [^] (i - j) \<otimes> head l [^] j)" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 500 | by (simp add: m_ac) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 501 | from PX_MX \<open>in_carrier l\<close> show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 502 | by (simp add: mkPX_ci mkMinj_correct l_distr eq1 eq2 split_beta nat_pow_mult) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 503 | (simp add: a_ac m_ac) | 
| 17516 | 504 | qed | 
| 505 | ||
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 506 | primrec mon_of_pol :: "pol \<Rightarrow> mon option" | 
| 67123 | 507 | where | 
| 508 | "mon_of_pol (Pc c) = Some (Mc c)" | |
| 509 | | "mon_of_pol (Pinj i P) = (case mon_of_pol P of | |
| 510 | None \<Rightarrow> None | |
| 511 | | Some M \<Rightarrow> Some (mkMinj i M))" | |
| 512 | | "mon_of_pol (PX P i Q) = | |
| 513 | (if Q = Pc 0 then (case mon_of_pol P of | |
| 514 | None \<Rightarrow> None | |
| 515 | | Some M \<Rightarrow> Some (mkMX i M)) | |
| 516 | else None)" | |
| 17516 | 517 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 518 | lemma (in cring) mon_of_pol_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 519 | assumes "in_carrier l" | 
| 67123 | 520 | and "mon_of_pol P = Some M" | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 521 | shows "Ipol l P = Imon l M" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 522 | using assms | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 523 | proof (induct P arbitrary: M l) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 524 | case (PX P1 i P2) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 525 | from PX(1,3,4) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 526 | show ?case | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 527 | by (auto simp add: mkMinj_correct mkMX_correct split: if_split_asm option.split_asm) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 528 | qed (auto simp add: mkMinj_correct split: option.split_asm) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 529 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 530 | fun (in cring) Ipolex_polex_list :: "'a list \<Rightarrow> (polex \<times> polex) list \<Rightarrow> bool" | 
| 67123 | 531 | where | 
| 532 | "Ipolex_polex_list l [] = True" | |
| 533 | | "Ipolex_polex_list l ((P, Q) # pps) = ((Ipolex l P = Ipolex l Q) \<and> Ipolex_polex_list l pps)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 534 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 535 | fun (in cring) Imon_pol_list :: "'a list \<Rightarrow> (mon \<times> pol) list \<Rightarrow> bool" | 
| 67123 | 536 | where | 
| 537 | "Imon_pol_list l [] = True" | |
| 538 | | "Imon_pol_list l ((M, P) # mps) = ((Imon l M = Ipol l P) \<and> Imon_pol_list l mps)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 539 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 540 | fun mk_monpol_list :: "(polex \<times> polex) list \<Rightarrow> (mon \<times> pol) list" | 
| 67123 | 541 | where | 
| 542 | "mk_monpol_list [] = []" | |
| 543 | | "mk_monpol_list ((P, Q) # pps) = | |
| 544 | (case mon_of_pol (norm P) of | |
| 545 | None \<Rightarrow> mk_monpol_list pps | |
| 546 | | Some M \<Rightarrow> (M, norm Q) # mk_monpol_list pps)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 547 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 548 | lemma (in cring) mk_monpol_list_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 549 | "in_carrier l \<Longrightarrow> Ipolex_polex_list l pps \<Longrightarrow> Imon_pol_list l (mk_monpol_list pps)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 550 | by (induct pps rule: mk_monpol_list.induct) | 
| 67123 | 551 | (auto split: option.split simp add: norm_ci [symmetric] mon_of_pol_correct [symmetric]) | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 552 | |
| 67123 | 553 | definition ponesubst :: "pol \<Rightarrow> mon \<Rightarrow> pol \<Rightarrow> pol option" | 
| 554 | where "ponesubst P1 M P2 = | |
| 555 | (let (Q, R) = mfactor P1 M in | |
| 556 | (case R of | |
| 557 | Pc c \<Rightarrow> if c = 0 then None else Some (add Q (mul P2 R)) | |
| 558 | | _ \<Rightarrow> Some (add Q (mul P2 R))))" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 559 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 560 | fun pnsubst1 :: "pol \<Rightarrow> mon \<Rightarrow> pol \<Rightarrow> nat \<Rightarrow> pol" | 
| 67123 | 561 | where "pnsubst1 P1 M P2 n = | 
| 562 | (case ponesubst P1 M P2 of | |
| 563 | None \<Rightarrow> P1 | |
| 564 | | Some P3 \<Rightarrow> if n = 0 then P3 else pnsubst1 P3 M P2 (n - 1))" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 565 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 566 | lemma pnsubst1_0 [simp]: "pnsubst1 P1 M P2 0 = (case ponesubst P1 M P2 of | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 567 | None \<Rightarrow> P1 | Some P3 \<Rightarrow> P3)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 568 | by (simp split: option.split) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 569 | |
| 67123 | 570 | lemma pnsubst1_Suc [simp]: | 
| 571 | "pnsubst1 P1 M P2 (Suc n) = | |
| 572 | (case ponesubst P1 M P2 of | |
| 573 | None \<Rightarrow> P1 | |
| 574 | | Some P3 \<Rightarrow> pnsubst1 P3 M P2 n)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 575 | by (simp split: option.split) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 576 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 577 | declare pnsubst1.simps [simp del] | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 578 | |
| 67123 | 579 | definition pnsubst :: "pol \<Rightarrow> mon \<Rightarrow> pol \<Rightarrow> nat \<Rightarrow> pol option" | 
| 580 | where "pnsubst P1 M P2 n = | |
| 581 | (case ponesubst P1 M P2 of | |
| 582 | None \<Rightarrow> None | |
| 583 | | Some P3 \<Rightarrow> Some (pnsubst1 P3 M P2 n))" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 584 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 585 | fun psubstl1 :: "pol \<Rightarrow> (mon \<times> pol) list \<Rightarrow> nat \<Rightarrow> pol" | 
| 67123 | 586 | where | 
| 587 | "psubstl1 P1 [] n = P1" | |
| 588 | | "psubstl1 P1 ((M, P2) # mps) n = psubstl1 (pnsubst1 P1 M P2 n) mps n" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 589 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 590 | fun psubstl :: "pol \<Rightarrow> (mon \<times> pol) list \<Rightarrow> nat \<Rightarrow> pol option" | 
| 67123 | 591 | where | 
| 592 | "psubstl P1 [] n = None" | |
| 593 | | "psubstl P1 ((M, P2) # mps) n = | |
| 594 | (case pnsubst P1 M P2 n of | |
| 595 | None \<Rightarrow> psubstl P1 mps n | |
| 596 | | Some P3 \<Rightarrow> Some (psubstl1 P3 mps n))" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 597 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 598 | fun pnsubstl :: "pol \<Rightarrow> (mon \<times> pol) list \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> pol" | 
| 67123 | 599 | where "pnsubstl P1 mps m n = | 
| 600 | (case psubstl P1 mps n of | |
| 601 | None \<Rightarrow> P1 | |
| 602 | | Some P3 \<Rightarrow> if m = 0 then P3 else pnsubstl P3 mps (m - 1) n)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 603 | |
| 67123 | 604 | lemma pnsubstl_0 [simp]: | 
| 605 | "pnsubstl P1 mps 0 n = (case psubstl P1 mps n of None \<Rightarrow> P1 | Some P3 \<Rightarrow> P3)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 606 | by (simp split: option.split) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 607 | |
| 67123 | 608 | lemma pnsubstl_Suc [simp]: | 
| 609 | "pnsubstl P1 mps (Suc m) n = (case psubstl P1 mps n of None \<Rightarrow> P1 | Some P3 \<Rightarrow> pnsubstl P3 mps m n)" | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 610 | by (simp split: option.split) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 611 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 612 | declare pnsubstl.simps [simp del] | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 613 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 614 | lemma (in cring) ponesubst_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 615 | "in_carrier l \<Longrightarrow> ponesubst P1 M P2 = Some P3 \<Longrightarrow> Imon l M = Ipol l P2 \<Longrightarrow> Ipol l P1 = Ipol l P3" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 616 | by (auto simp add: ponesubst_def split_beta mfactor_correct [of l P1 M] | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 617 | add_ci mul_ci split: pol.split_asm if_split_asm) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 618 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 619 | lemma (in cring) pnsubst1_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 620 | "in_carrier l \<Longrightarrow> Imon l M = Ipol l P2 \<Longrightarrow> Ipol l (pnsubst1 P1 M P2 n) = Ipol l P1" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 621 | by (induct n arbitrary: P1) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 622 | (simp_all add: ponesubst_correct split: option.split) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 623 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 624 | lemma (in cring) pnsubst_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 625 | "in_carrier l \<Longrightarrow> pnsubst P1 M P2 n = Some P3 \<Longrightarrow> Imon l M = Ipol l P2 \<Longrightarrow> Ipol l P1 = Ipol l P3" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 626 | by (auto simp add: pnsubst_def | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 627 | pnsubst1_correct ponesubst_correct split: option.split_asm) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 628 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 629 | lemma (in cring) psubstl1_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 630 | "in_carrier l \<Longrightarrow> Imon_pol_list l mps \<Longrightarrow> Ipol l (psubstl1 P1 mps n) = Ipol l P1" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 631 | by (induct P1 mps n rule: psubstl1.induct) (simp_all add: pnsubst1_correct) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 632 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 633 | lemma (in cring) psubstl_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 634 | "in_carrier l \<Longrightarrow> psubstl P1 mps n = Some P2 \<Longrightarrow> Imon_pol_list l mps \<Longrightarrow> Ipol l P1 = Ipol l P2" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 635 | by (induct P1 mps n rule: psubstl.induct) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 636 | (auto simp add: psubstl1_correct pnsubst_correct split: option.split_asm) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 637 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 638 | lemma (in cring) pnsubstl_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 639 | "in_carrier l \<Longrightarrow> Imon_pol_list l mps \<Longrightarrow> Ipol l (pnsubstl P1 mps m n) = Ipol l P1" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 640 | by (induct m arbitrary: P1) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 641 | (simp_all add: psubstl_correct split: option.split) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 642 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 643 | lemma (in cring) norm_subst_correct: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 644 | "in_carrier l \<Longrightarrow> Ipolex_polex_list l pps \<Longrightarrow> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 645 | Ipolex l P = Ipol l (pnsubstl (norm P) (mk_monpol_list pps) m n)" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 646 | by (simp add: pnsubstl_correct mk_monpol_list_correct norm_ci) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 647 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 648 | lemma in_carrier_trivial: "cring_class.in_carrier l" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 649 | by (induct l) (simp_all add: cring_class.in_carrier_def carrier_class) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 650 | |
| 64999 | 651 | ML \<open> | 
| 69597 | 652 | val term_of_nat = HOLogic.mk_number \<^typ>\<open>nat\<close> o @{code integer_of_nat};
 | 
| 64999 | 653 | |
| 69597 | 654 | val term_of_int = HOLogic.mk_number \<^typ>\<open>int\<close> o @{code integer_of_int};
 | 
| 64999 | 655 | |
| 69597 | 656 | fun term_of_pol (@{code Pc} k) = \<^term>\<open>Pc\<close> $ term_of_int k
 | 
| 657 |   | term_of_pol (@{code Pinj} (n, p)) = \<^term>\<open>Pinj\<close> $ term_of_nat n $ term_of_pol p
 | |
| 658 |   | term_of_pol (@{code PX} (p, n, q)) = \<^term>\<open>PX\<close> $ term_of_pol p $ term_of_nat n $ term_of_pol q;
 | |
| 64999 | 659 | |
| 660 | local | |
| 661 | ||
| 69597 | 662 | fun pol (ctxt, ct, t) = Thm.mk_binop \<^cterm>\<open>Pure.eq :: pol \<Rightarrow> pol \<Rightarrow> prop\<close> | 
| 64999 | 663 | ct (Thm.cterm_of ctxt t); | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 664 | |
| 64999 | 665 | val (_, raw_pol_oracle) = Context.>>> (Context.map_theory_result | 
| 69597 | 666 | (Thm.add_oracle (\<^binding>\<open>pnsubstl\<close>, pol))); | 
| 64999 | 667 | |
| 668 | fun pol_oracle ctxt ct t = raw_pol_oracle (ctxt, ct, t); | |
| 669 | ||
| 670 | in | |
| 671 | ||
| 672 | val cv = @{computation_conv pol
 | |
| 673 | terms: pnsubstl mk_monpol_list norm | |
| 674 | nat_of_integer Code_Target_Nat.natural | |
| 675 | "0::nat" "1::nat" "2::nat" "3::nat" | |
| 676 | "0::int" "1::int" "2::int" "3::int" "-1::int" | |
| 677 | datatypes: polex "(polex * polex) list" int integer num} | |
| 65043 
fd753468786f
explicit dynamic context for gap-bridging function
 haftmann parents: 
64999diff
changeset | 678 | (fn ctxt => fn p => fn ct => pol_oracle ctxt ct (term_of_pol p)) | 
| 64999 | 679 | |
| 680 | end | |
| 681 | \<close> | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 682 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 683 | ML \<open> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 684 | signature RING_TAC = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 685 | sig | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 686 | structure Ring_Simps: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 687 | sig | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 688 | type T | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 689 | val get: Context.generic -> T | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 690 | val put: T -> Context.generic -> Context.generic | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 691 | val map: (T -> T) -> Context.generic -> Context.generic | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 692 | end | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 693 | val insert_rules: ((term * 'a) * (term * 'a) -> bool) -> (term * 'a) -> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 694 | (term * 'a) Net.net -> (term * 'a) Net.net | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 695 | val eq_ring_simps: | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 696 | (term * (thm list * thm list * thm list * thm list * thm * thm)) * | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 697 | (term * (thm list * thm list * thm list * thm list * thm * thm)) -> bool | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 698 | val ring_tac: bool -> thm list -> Proof.context -> int -> tactic | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 699 | val get_matching_rules: Proof.context -> (term * 'a) Net.net -> term -> 'a option | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 700 | val norm: thm -> thm | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 701 | val mk_in_carrier: Proof.context -> term -> thm list -> (string * typ) list -> thm | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 702 | val mk_ring: typ -> term | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 703 | end | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 704 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 705 | structure Ring_Tac : RING_TAC = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 706 | struct | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 707 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 708 | fun eq_ring_simps | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 709 | ((t, (ths1, ths2, ths3, ths4, th5, th)), | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 710 | (t', (ths1', ths2', ths3', ths4', th5', th'))) = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 711 | t aconv t' andalso | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 712 | eq_list Thm.eq_thm (ths1, ths1') andalso | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 713 | eq_list Thm.eq_thm (ths2, ths2') andalso | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 714 | eq_list Thm.eq_thm (ths3, ths3') andalso | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 715 | eq_list Thm.eq_thm (ths4, ths4') andalso | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 716 | Thm.eq_thm (th5, th5') andalso | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 717 | Thm.eq_thm (th, th'); | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 718 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 719 | structure Ring_Simps = Generic_Data | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 720 | (struct | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 721 | type T = (term * (thm list * thm list * thm list * thm list * thm * thm)) Net.net | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 722 | val empty = Net.empty | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 723 | val extend = I | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 724 | val merge = Net.merge eq_ring_simps | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 725 | end); | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 726 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 727 | fun get_matching_rules ctxt net t = get_first | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 728 | (fn (p, x) => | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 729 | if Pattern.matches (Proof_Context.theory_of ctxt) (p, t) then SOME x else NONE) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 730 | (Net.match_term net t); | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 731 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 732 | fun insert_rules eq (t, x) = Net.insert_term eq (t, (t, x)); | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 733 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 734 | fun norm thm = thm COMP_INCR asm_rl; | 
| 47432 | 735 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 736 | fun get_ring_simps ctxt optcT t = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 737 | (case get_matching_rules ctxt (Ring_Simps.get (Context.Proof ctxt)) t of | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 738 | SOME (ths1, ths2, ths3, ths4, th5, th) => | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 739 | let val tr = | 
| 67649 | 740 | Thm.transfer' ctxt #> | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 741 | (case optcT of NONE => I | SOME cT => inst [cT] [] #> norm) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 742 | in (map tr ths1, map tr ths2, map tr ths3, map tr ths4, tr th5, tr th) end | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 743 | | NONE => error "get_ring_simps: lookup failed"); | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 744 | |
| 69597 | 745 | fun ring_struct (Const (\<^const_name>\<open>Ring.ring.add\<close>, _) $ R $ _ $ _) = SOME R | 
| 746 | | ring_struct (Const (\<^const_name>\<open>Ring.a_minus\<close>, _) $ R $ _ $ _) = SOME R | |
| 747 | | ring_struct (Const (\<^const_name>\<open>Group.monoid.mult\<close>, _) $ R $ _ $ _) = SOME R | |
| 748 | | ring_struct (Const (\<^const_name>\<open>Ring.a_inv\<close>, _) $ R $ _) = SOME R | |
| 749 | | ring_struct (Const (\<^const_name>\<open>Group.pow\<close>, _) $ R $ _ $ _) = SOME R | |
| 750 | | ring_struct (Const (\<^const_name>\<open>Ring.ring.zero\<close>, _) $ R) = SOME R | |
| 751 | | ring_struct (Const (\<^const_name>\<open>Group.monoid.one\<close>, _) $ R) = SOME R | |
| 752 | | ring_struct (Const (\<^const_name>\<open>Algebra_Aux.of_integer\<close>, _) $ R $ _) = SOME R | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 753 | | ring_struct _ = NONE; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 754 | |
| 69597 | 755 | fun reif_polex vs (Const (\<^const_name>\<open>Ring.ring.add\<close>, _) $ _ $ a $ b) = | 
| 756 | \<^const>\<open>Add\<close> $ reif_polex vs a $ reif_polex vs b | |
| 757 | | reif_polex vs (Const (\<^const_name>\<open>Ring.a_minus\<close>, _) $ _ $ a $ b) = | |
| 758 | \<^const>\<open>Sub\<close> $ reif_polex vs a $ reif_polex vs b | |
| 759 | | reif_polex vs (Const (\<^const_name>\<open>Group.monoid.mult\<close>, _) $ _ $ a $ b) = | |
| 760 | \<^const>\<open>Mul\<close> $ reif_polex vs a $ reif_polex vs b | |
| 761 | | reif_polex vs (Const (\<^const_name>\<open>Ring.a_inv\<close>, _) $ _ $ a) = | |
| 762 | \<^const>\<open>Neg\<close> $ reif_polex vs a | |
| 763 | | reif_polex vs (Const (\<^const_name>\<open>Group.pow\<close>, _) $ _ $ a $ n) = | |
| 764 | \<^const>\<open>Pow\<close> $ reif_polex vs a $ n | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 765 | | reif_polex vs (Free x) = | 
| 69597 | 766 | \<^const>\<open>Var\<close> $ HOLogic.mk_number HOLogic.natT (find_index (equal x) vs) | 
| 767 | | reif_polex vs (Const (\<^const_name>\<open>Ring.ring.zero\<close>, _) $ _) = | |
| 768 | \<^term>\<open>Const 0\<close> | |
| 769 | | reif_polex vs (Const (\<^const_name>\<open>Group.monoid.one\<close>, _) $ _) = | |
| 770 | \<^term>\<open>Const 1\<close> | |
| 771 | | reif_polex vs (Const (\<^const_name>\<open>Algebra_Aux.of_integer\<close>, _) $ _ $ n) = | |
| 772 | \<^const>\<open>Const\<close> $ n | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 773 | | reif_polex _ _ = error "reif_polex: bad expression"; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 774 | |
| 69597 | 775 | fun reif_polex' vs (Const (\<^const_name>\<open>Groups.plus\<close>, _) $ a $ b) = | 
| 776 | \<^const>\<open>Add\<close> $ reif_polex' vs a $ reif_polex' vs b | |
| 777 | | reif_polex' vs (Const (\<^const_name>\<open>Groups.minus\<close>, _) $ a $ b) = | |
| 778 | \<^const>\<open>Sub\<close> $ reif_polex' vs a $ reif_polex' vs b | |
| 779 | | reif_polex' vs (Const (\<^const_name>\<open>Groups.times\<close>, _) $ a $ b) = | |
| 780 | \<^const>\<open>Mul\<close> $ reif_polex' vs a $ reif_polex' vs b | |
| 781 | | reif_polex' vs (Const (\<^const_name>\<open>Groups.uminus\<close>, _) $ a) = | |
| 782 | \<^const>\<open>Neg\<close> $ reif_polex' vs a | |
| 783 | | reif_polex' vs (Const (\<^const_name>\<open>Power.power\<close>, _) $ a $ n) = | |
| 784 | \<^const>\<open>Pow\<close> $ reif_polex' vs a $ n | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 785 | | reif_polex' vs (Free x) = | 
| 69597 | 786 | \<^const>\<open>Var\<close> $ HOLogic.mk_number HOLogic.natT (find_index (equal x) vs) | 
| 787 | | reif_polex' vs (Const (\<^const_name>\<open>numeral\<close>, _) $ b) = | |
| 788 |       \<^const>\<open>Const\<close> $ (@{const numeral (int)} $ b)
 | |
| 789 | | reif_polex' vs (Const (\<^const_name>\<open>zero_class.zero\<close>, _)) = \<^term>\<open>Const 0\<close> | |
| 790 | | reif_polex' vs (Const (\<^const_name>\<open>one_class.one\<close>, _)) = \<^term>\<open>Const 1\<close> | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 791 | | reif_polex' vs t = error "reif_polex: bad expression"; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 792 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 793 | fun head_conv (_, _, _, _, head_simp, _) ys = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 794 | (case strip_app ys of | 
| 69597 | 795 | (\<^const_name>\<open>Cons\<close>, [y, xs]) => inst [] [y, xs] head_simp); | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 796 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 797 | fun Ipol_conv (rls as | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 798 | ([Ipol_simps_1, Ipol_simps_2, Ipol_simps_3, | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 799 | Ipol_simps_4, Ipol_simps_5, Ipol_simps_6, | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 800 | Ipol_simps_7], _, _, _, _, _)) = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 801 | let | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 802 | val a = type_of_eqn Ipol_simps_1; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 803 | val drop_conv_a = drop_conv a; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 804 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 805 | fun conv l p = (case strip_app p of | 
| 69597 | 806 | (\<^const_name>\<open>Pc\<close>, [c]) => (case strip_numeral c of | 
| 807 | (\<^const_name>\<open>zero_class.zero\<close>, _) => inst [] [l] Ipol_simps_4 | |
| 808 | | (\<^const_name>\<open>one_class.one\<close>, _) => inst [] [l] Ipol_simps_5 | |
| 809 | | (\<^const_name>\<open>numeral\<close>, [m]) => inst [] [l, m] Ipol_simps_6 | |
| 810 | | (\<^const_name>\<open>uminus\<close>, [m]) => inst [] [l, m] Ipol_simps_7 | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 811 | | _ => inst [] [l, c] Ipol_simps_1) | 
| 69597 | 812 | | (\<^const_name>\<open>Pinj\<close>, [i, P]) => | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 813 | transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 814 | (inst [] [l, i, P] Ipol_simps_2) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 815 | (cong2' conv (args2 drop_conv_a) Thm.reflexive) | 
| 69597 | 816 | | (\<^const_name>\<open>PX\<close>, [P, x, Q]) => | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 817 | transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 818 | (inst [] [l, P, x, Q] Ipol_simps_3) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 819 | (cong2 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 820 | (cong2 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 821 | (args2 conv) (cong2 (args1 (head_conv rls)) Thm.reflexive)) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 822 | (cong2' conv (args2 drop_conv_a) Thm.reflexive))) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 823 | in conv end; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 824 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 825 | fun Ipolex_conv (rls as | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 826 | (_, | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 827 | [Ipolex_Var, Ipolex_Const, Ipolex_Add, | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 828 | Ipolex_Sub, Ipolex_Mul, Ipolex_Pow, | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 829 | Ipolex_Neg, Ipolex_Const_0, Ipolex_Const_1, | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 830 | Ipolex_Const_numeral], _, _, _, _)) = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 831 | let | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 832 | val a = type_of_eqn Ipolex_Var; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 833 | val drop_conv_a = drop_conv a; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 834 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 835 | fun conv l r = (case strip_app r of | 
| 69597 | 836 | (\<^const_name>\<open>Var\<close>, [n]) => | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 837 | transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 838 | (inst [] [l, n] Ipolex_Var) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 839 | (cong1' (head_conv rls) (args2 drop_conv_a)) | 
| 69597 | 840 | | (\<^const_name>\<open>Const\<close>, [i]) => (case strip_app i of | 
| 841 | (\<^const_name>\<open>zero_class.zero\<close>, _) => inst [] [l] Ipolex_Const_0 | |
| 842 | | (\<^const_name>\<open>one_class.one\<close>, _) => inst [] [l] Ipolex_Const_1 | |
| 843 | | (\<^const_name>\<open>numeral\<close>, [m]) => inst [] [l, m] Ipolex_Const_numeral | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 844 | | _ => inst [] [l, i] Ipolex_Const) | 
| 69597 | 845 | | (\<^const_name>\<open>Add\<close>, [P, Q]) => | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 846 | transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 847 | (inst [] [l, P, Q] Ipolex_Add) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 848 | (cong2 (args2 conv) (args2 conv)) | 
| 69597 | 849 | | (\<^const_name>\<open>Sub\<close>, [P, Q]) => | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 850 | transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 851 | (inst [] [l, P, Q] Ipolex_Sub) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 852 | (cong2 (args2 conv) (args2 conv)) | 
| 69597 | 853 | | (\<^const_name>\<open>Mul\<close>, [P, Q]) => | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 854 | transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 855 | (inst [] [l, P, Q] Ipolex_Mul) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 856 | (cong2 (args2 conv) (args2 conv)) | 
| 69597 | 857 | | (\<^const_name>\<open>Pow\<close>, [P, n]) => | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 858 | transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 859 | (inst [] [l, P, n] Ipolex_Pow) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 860 | (cong2 (args2 conv) Thm.reflexive) | 
| 69597 | 861 | | (\<^const_name>\<open>Neg\<close>, [P]) => | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 862 | transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 863 | (inst [] [l, P] Ipolex_Neg) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 864 | (cong1 (args2 conv))) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 865 | in conv end; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 866 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 867 | fun Ipolex_polex_list_conv (rls as | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 868 | (_, _, | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 869 | [Ipolex_polex_list_Nil, Ipolex_polex_list_Cons], _, _, _)) l pps = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 870 | (case strip_app pps of | 
| 69597 | 871 | (\<^const_name>\<open>Nil\<close>, []) => inst [] [l] Ipolex_polex_list_Nil | 
| 872 | | (\<^const_name>\<open>Cons\<close>, [p, pps']) => (case strip_app p of | |
| 873 | (\<^const_name>\<open>Pair\<close>, [P, Q]) => | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 874 | transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 875 | (inst [] [l, P, Q, pps'] Ipolex_polex_list_Cons) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 876 | (cong2 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 877 | (cong2 (args2 (Ipolex_conv rls)) (args2 (Ipolex_conv rls))) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 878 | (args2 (Ipolex_polex_list_conv rls))))); | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 879 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 880 | fun dest_conj th = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 881 | let | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 882 |     val th1 = th RS @{thm conjunct1};
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 883 |     val th2 = th RS @{thm conjunct2}
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 884 | in | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 885 | dest_conj th1 @ dest_conj th2 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 886 | end handle THM _ => [th]; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 887 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 888 | fun mk_in_carrier ctxt R prems xs = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 889 | let | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 890 | val (_, _, _, [in_carrier_Nil, in_carrier_Cons], _, _) = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 891 | get_ring_simps ctxt NONE R; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 892 | val props = map fst (Facts.props (Proof_Context.facts_of ctxt)) @ maps dest_conj prems; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 893 | val ths = map (fn p as (x, _) => | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 894 | (case find_first | 
| 69597 | 895 | ((fn Const (\<^const_name>\<open>Trueprop\<close>, _) $ | 
| 896 | (Const (\<^const_name>\<open>Set.member\<close>, _) $ | |
| 897 | Free (y, _) $ (Const (\<^const_name>\<open>carrier\<close>, _) $ S)) => | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 898 | x = y andalso R aconv S | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 899 | | _ => false) o Thm.prop_of) props of | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 900 | SOME th => th | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 901 |        | NONE => error ("Variable " ^ Syntax.string_of_term ctxt (Free p) ^
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 902 | " not in carrier"))) xs | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 903 | in | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 904 | fold_rev (fn th1 => fn th2 => [th1, th2] MRS in_carrier_Cons) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 905 | ths in_carrier_Nil | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 906 | end; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 907 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 908 | fun mk_ring T = | 
| 69597 | 909 | Const (\<^const_name>\<open>cring_class_ops\<close>, | 
| 910 | Type (\<^type_name>\<open>partial_object_ext\<close>, [T, | |
| 911 | Type (\<^type_name>\<open>monoid_ext\<close>, [T, | |
| 912 | Type (\<^type_name>\<open>ring_ext\<close>, [T, \<^typ>\<open>unit\<close>])])])); | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 913 | |
| 69597 | 914 | val iterations = \<^cterm>\<open>1000::nat\<close>; | 
| 915 | val Trueprop_cong = Thm.combination (Thm.reflexive \<^cterm>\<open>Trueprop\<close>); | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 916 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 917 | fun commutative_ring_conv ctxt prems eqs ct = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 918 | let | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 919 | val cT = Thm.ctyp_of_cterm ct; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 920 | val T = Thm.typ_of cT; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 921 | val eqs' = map (HOLogic.dest_eq o HOLogic.dest_Trueprop o Thm.prop_of) eqs; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 922 | val xs = filter (equal T o snd) (rev (fold Term.add_frees | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 923 | (map fst eqs' @ map snd eqs' @ [Thm.term_of ct]) [])); | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 924 | val (R, optcT, prem', reif) = (case ring_struct (Thm.term_of ct) of | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 925 | SOME R => (R, NONE, mk_in_carrier ctxt R prems xs, reif_polex xs) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 926 |       | NONE => (mk_ring T, SOME cT, @{thm in_carrier_trivial}, reif_polex' xs));
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 927 | val rls as (_, _, _, _, _, norm_subst_correct) = get_ring_simps ctxt optcT R; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 928 | val cxs = Thm.cterm_of ctxt (HOLogic.mk_list T (map Free xs)); | 
| 69597 | 929 | val ceqs = Thm.cterm_of ctxt (HOLogic.mk_list \<^typ>\<open>polex * polex\<close> | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 930 | (map (HOLogic.mk_prod o apply2 reif) eqs')); | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 931 | val cp = Thm.cterm_of ctxt (reif (Thm.term_of ct)); | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 932 | val prem = Thm.equal_elim | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 933 | (Trueprop_cong (Thm.symmetric (Ipolex_polex_list_conv rls cxs ceqs))) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 934 |       (fold_rev (fn th1 => fn th2 => [th1, th2] MRS @{thm conjI})
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 935 |          eqs @{thm TrueI});
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 936 | in | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 937 | Thm.transitive | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 938 | (Thm.symmetric (Ipolex_conv rls cxs cp)) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 939 | (transitive' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 940 | ([prem', prem] MRS inst [] [cxs, ceqs, cp, iterations, iterations] | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 941 | norm_subst_correct) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 942 | (cong2' (Ipol_conv rls) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 943 | Thm.reflexive | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 944 | (cv ctxt))) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 945 | end; | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 946 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 947 | fun ring_tac in_prems thms ctxt = | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 948 | tactic_of_conv (fn ct => | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 949 | (if in_prems then Conv.prems_conv else Conv.concl_conv) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 950 | (Logic.count_prems (Thm.term_of ct)) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 951 | (Conv.arg_conv (Conv.binop_conv (commutative_ring_conv ctxt [] thms))) ct) THEN' | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 952 |   TRY o (assume_tac ctxt ORELSE' resolve_tac ctxt [@{thm refl}]);
 | 
| 17516 | 953 | |
| 954 | end | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 955 | \<close> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 956 | |
| 67123 | 957 | context cring | 
| 958 | begin | |
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 959 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 960 | local_setup \<open> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 961 | Local_Theory.declaration {syntax = false, pervasive = false}
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 962 | (fn phi => Ring_Tac.Ring_Simps.map (Ring_Tac.insert_rules Ring_Tac.eq_ring_simps | 
| 69597 | 963 | (Morphism.term phi \<^term>\<open>R\<close>, | 
| 64962 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 964 |      (Morphism.fact phi @{thms Ipol.simps [meta] Ipol_Pc [meta]},
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 965 |       Morphism.fact phi @{thms Ipolex.simps [meta] Ipolex_Const [meta]},
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 966 |       Morphism.fact phi @{thms Ipolex_polex_list.simps [meta]},
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 967 |       Morphism.fact phi @{thms in_carrier_Nil in_carrier_Cons},
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 968 |       singleton (Morphism.fact phi) @{thm head.simps(2) [meta]},
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 969 |       singleton (Morphism.fact phi) @{thm norm_subst_correct [meta]}))))
 | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 970 | \<close> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 971 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 972 | end | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 973 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 974 | method_setup ring = \<open> | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 975 | Scan.lift (Args.mode "prems") -- Attrib.thms >> (SIMPLE_METHOD' oo uncurry Ring_Tac.ring_tac) | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 976 | \<close> "simplify equations involving rings" | 
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 977 | |
| 
bf41e1109db3
Added new / improved tactics for fields and rings
 berghofe parents: 
60708diff
changeset | 978 | end |