src/HOL/arith_data.ML
changeset 4310 cad4f24be60b
parent 4309 c98f44948d86
child 4332 d4a15e32c024
equal deleted inserted replaced
4309:c98f44948d86 4310:cad4f24be60b
    16 struct
    16 struct
    17 
    17 
    18 
    18 
    19 (** abstract syntax of structure nat: 0, Suc, + **)
    19 (** abstract syntax of structure nat: 0, Suc, + **)
    20 
    20 
    21 (* mk_sum *)
    21 (* mk_sum, mk_norm_sum *)
    22 
    22 
       
    23 val one = HOLogic.mk_nat 1;
    23 val mk_plus = HOLogic.mk_binop "op +";
    24 val mk_plus = HOLogic.mk_binop "op +";
    24 
    25 
    25 fun mk_sum [] = HOLogic.zero
    26 fun mk_sum [] = HOLogic.zero
    26   | mk_sum [t] = t
    27   | mk_sum [t] = t
    27   | mk_sum (t :: ts) = mk_plus (t, mk_sum ts);
    28   | mk_sum (t :: ts) = mk_plus (t, mk_sum ts);
    28 
    29 
       
    30 (*normal form of sums: Suc (... (Suc (a + (b + ...))))*)
       
    31 fun mk_norm_sum ts =
       
    32   let val (ones, sums) = partition (equal one) ts in
       
    33     funpow (length ones) HOLogic.mk_Suc (mk_sum sums)
       
    34   end;
       
    35 
    29 
    36 
    30 (* dest_sum *)
    37 (* dest_sum *)
    31 
    38 
    32 val dest_plus = HOLogic.dest_bin "op +" HOLogic.natT;
    39 val dest_plus = HOLogic.dest_bin "op +" HOLogic.natT;
    33 val one = HOLogic.mk_nat 1;
       
    34 
    40 
    35 fun dest_sum tm =
    41 fun dest_sum tm =
    36   if HOLogic.is_zero tm then []
    42   if HOLogic.is_zero tm then []
    37   else
    43   else
    38     (case try HOLogic.dest_Suc tm of
    44     (case try HOLogic.dest_Suc tm of
    70 
    76 
    71 (** cancel common summands **)
    77 (** cancel common summands **)
    72 
    78 
    73 structure Sum =
    79 structure Sum =
    74 struct
    80 struct
    75   val mk_sum = mk_sum;
    81   val mk_sum = mk_norm_sum;
    76   val dest_sum = dest_sum;
    82   val dest_sum = dest_sum;
    77   val prove_conv = prove_conv;
    83   val prove_conv = prove_conv;
    78   val norm_tac = simp_all add_rules THEN simp_all add_ac;
    84   val norm_tac = simp_all add_rules THEN simp_all add_ac;
    79 end;
    85 end;
    80 
    86 
   123 
   129 
   124 (** cancel common factor **)
   130 (** cancel common factor **)
   125 
   131 
   126 structure Factor =
   132 structure Factor =
   127 struct
   133 struct
   128   val mk_sum = mk_sum;
   134   val mk_sum = mk_norm_sum;
   129   val dest_sum = dest_sum;
   135   val dest_sum = dest_sum;
   130   val prove_conv = prove_conv;
   136   val prove_conv = prove_conv;
   131   val norm_tac = simp_all (add_rules @ mult_rules) THEN simp_all add_ac;
   137   val norm_tac = simp_all (add_rules @ mult_rules) THEN simp_all add_ac;
   132 end;
   138 end;
   133 
   139