src/HOL/Integ/int_arith1.ML
changeset 21820 2f2b6a965ccc
parent 21243 afffe1f72143
child 21873 62d2416728f5
equal deleted inserted replaced
21819:8eb82ffcdd15 21820:2f2b6a965ccc
   158 in 
   158 in 
   159 fun numterm_ord (Abs (_, T, t), Abs(_, U, u)) =
   159 fun numterm_ord (Abs (_, T, t), Abs(_, U, u)) =
   160       (case numterm_ord (t, u) of EQUAL => typ_ord (T, U) | ord => ord)
   160       (case numterm_ord (t, u) of EQUAL => typ_ord (T, U) | ord => ord)
   161   | numterm_ord
   161   | numterm_ord
   162      (Const("Numeral.number_of", _) $ v, Const("Numeral.number_of", _) $ w) =
   162      (Const("Numeral.number_of", _) $ v, Const("Numeral.number_of", _) $ w) =
   163      num_ord (HOLogic.dest_binum v, HOLogic.dest_binum w)
   163      num_ord (HOLogic.dest_numeral v, HOLogic.dest_numeral w)
   164   | numterm_ord (Const("Numeral.number_of", _) $ _, _) = LESS
   164   | numterm_ord (Const("Numeral.number_of", _) $ _, _) = LESS
   165   | numterm_ord (_, Const("Numeral.number_of", _) $ _) = GREATER
   165   | numterm_ord (_, Const("Numeral.number_of", _) $ _) = GREATER
   166   | numterm_ord (t, u) =
   166   | numterm_ord (t, u) =
   167       (case int_ord (size_of_term t, size_of_term u) of
   167       (case int_ord (size_of_term t, size_of_term u) of
   168         EQUAL =>
   168         EQUAL =>
   179 val num_ss = HOL_ss settermless numtermless;
   179 val num_ss = HOL_ss settermless numtermless;
   180 
   180 
   181 
   181 
   182 (** Utilities **)
   182 (** Utilities **)
   183 
   183 
   184 fun mk_numeral T n = HOLogic.number_of_const T $ HOLogic.mk_binum n;
   184 fun mk_number T n = HOLogic.number_of_const T $ HOLogic.mk_numeral n;
   185 
   185 
   186 (*Decodes a binary INTEGER*)
   186 (*Decodes a binary INTEGER*)
   187 fun dest_numeral (Const("HOL.zero", _)) = 0
   187 fun dest_number (Const("HOL.zero", _)) = 0
   188   | dest_numeral (Const("HOL.one", _)) = 1
   188   | dest_number (Const("HOL.one", _)) = 1
   189   | dest_numeral (Const("Numeral.number_of", _) $ w) =
   189   | dest_number (Const("Numeral.number_of", _) $ w) =
   190      (HOLogic.dest_binum w
   190      (HOLogic.dest_numeral w
   191       handle TERM _ => raise TERM("Int_Numeral_Simprocs.dest_numeral:1", [w]))
   191       handle TERM _ => raise TERM("Int_Numeral_Simprocs.dest_number:1", [w]))
   192   | dest_numeral t = raise TERM("Int_Numeral_Simprocs.dest_numeral:2", [t]);
   192   | dest_number t = raise TERM("Int_Numeral_Simprocs.dest_number:2", [t]);
   193 
   193 
   194 fun find_first_numeral past (t::terms) =
   194 fun find_first_numeral past (t::terms) =
   195         ((dest_numeral t, rev past @ terms)
   195         ((dest_number t, rev past @ terms)
   196          handle TERM _ => find_first_numeral (t::past) terms)
   196          handle TERM _ => find_first_numeral (t::past) terms)
   197   | find_first_numeral past [] = raise TERM("find_first_numeral", []);
   197   | find_first_numeral past [] = raise TERM("find_first_numeral", []);
   198 
   198 
   199 val mk_plus = HOLogic.mk_binop "HOL.plus";
   199 val mk_plus = HOLogic.mk_binop "HOL.plus";
   200 
   200 
   202   let val T = Term.fastype_of t
   202   let val T = Term.fastype_of t
   203   in Const ("HOL.uminus", T --> T) $ t
   203   in Const ("HOL.uminus", T --> T) $ t
   204   end;
   204   end;
   205 
   205 
   206 (*Thus mk_sum[t] yields t+0; longer sums don't have a trailing zero*)
   206 (*Thus mk_sum[t] yields t+0; longer sums don't have a trailing zero*)
   207 fun mk_sum T []        = mk_numeral T 0
   207 fun mk_sum T []        = mk_number T 0
   208   | mk_sum T [t,u]     = mk_plus (t, u)
   208   | mk_sum T [t,u]     = mk_plus (t, u)
   209   | mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts);
   209   | mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts);
   210 
   210 
   211 (*this version ALWAYS includes a trailing zero*)
   211 (*this version ALWAYS includes a trailing zero*)
   212 fun long_mk_sum T []        = mk_numeral T 0
   212 fun long_mk_sum T []        = mk_number T 0
   213   | long_mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts);
   213   | long_mk_sum T (t :: ts) = mk_plus (t, mk_sum T ts);
   214 
   214 
   215 val dest_plus = HOLogic.dest_bin "HOL.plus" Term.dummyT;
   215 val dest_plus = HOLogic.dest_bin "HOL.plus" Term.dummyT;
   216 
   216 
   217 (*decompose additions AND subtractions as a sum*)
   217 (*decompose additions AND subtractions as a sum*)
   228 val dest_diff = HOLogic.dest_bin "HOL.minus" Term.dummyT;
   228 val dest_diff = HOLogic.dest_bin "HOL.minus" Term.dummyT;
   229 
   229 
   230 val mk_times = HOLogic.mk_binop "HOL.times";
   230 val mk_times = HOLogic.mk_binop "HOL.times";
   231 
   231 
   232 fun mk_prod T = 
   232 fun mk_prod T = 
   233   let val one = mk_numeral T 1
   233   let val one = mk_number T 1
   234   fun mk [] = one
   234   fun mk [] = one
   235     | mk [t] = t
   235     | mk [t] = t
   236     | mk (t :: ts) = if t = one then mk ts else mk_times (t, mk ts)
   236     | mk (t :: ts) = if t = one then mk ts else mk_times (t, mk ts)
   237   in mk end;
   237   in mk end;
   238 
   238 
   239 (*This version ALWAYS includes a trailing one*)
   239 (*This version ALWAYS includes a trailing one*)
   240 fun long_mk_prod T []        = mk_numeral T 1
   240 fun long_mk_prod T []        = mk_number T 1
   241   | long_mk_prod T (t :: ts) = mk_times (t, mk_prod T ts);
   241   | long_mk_prod T (t :: ts) = mk_times (t, mk_prod T ts);
   242 
   242 
   243 val dest_times = HOLogic.dest_bin "HOL.times" Term.dummyT;
   243 val dest_times = HOLogic.dest_bin "HOL.times" Term.dummyT;
   244 
   244 
   245 fun dest_prod t =
   245 fun dest_prod t =
   246       let val (t,u) = dest_times t
   246       let val (t,u) = dest_times t
   247       in  dest_prod t @ dest_prod u  end
   247       in  dest_prod t @ dest_prod u  end
   248       handle TERM _ => [t];
   248       handle TERM _ => [t];
   249 
   249 
   250 (*DON'T do the obvious simplifications; that would create special cases*)
   250 (*DON'T do the obvious simplifications; that would create special cases*)
   251 fun mk_coeff (k, t) = mk_times (mk_numeral (Term.fastype_of t) k, t);
   251 fun mk_coeff (k, t) = mk_times (mk_number (Term.fastype_of t) k, t);
   252 
   252 
   253 (*Express t as a product of (possibly) a numeral with other sorted terms*)
   253 (*Express t as a product of (possibly) a numeral with other sorted terms*)
   254 fun dest_coeff sign (Const ("HOL.uminus", _) $ t) = dest_coeff (~sign) t
   254 fun dest_coeff sign (Const ("HOL.uminus", _) $ t) = dest_coeff (~sign) t
   255   | dest_coeff sign t =
   255   | dest_coeff sign t =
   256     let val ts = sort Term.term_ord (dest_prod t)
   256     let val ts = sort Term.term_ord (dest_prod t)