ML ‹ fun dbl_dec_conv a = let
val dbl_dec_neg_numeral_a = inst [a] [] @{thm dbl_dec_neg_numeral [meta]};
val dbl_dec_0_a = inst [a] [] @{thm dbl_dec_simps(2) [folded numeral_One, meta]};
val dbl_dec_numeral_a = inst [a] [] @{thm dbl_dec_simps(5) [meta]}; in
fn n => case strip_numeral n of
(🍋‹zero_class.zero›, []) => dbl_dec_0_a
| (🍋‹uminus›, [k]) => inst [] [k] dbl_dec_neg_numeral_a
| (🍋‹numeral›, [k]) =>
transitive'
(inst [] [k] dbl_dec_numeral_a)
(cong1 (args1 BitM_conv)) end; ›
ML ‹ fun sub_conv a = let
val [sub_One_One, sub_One_Bit0, sub_One_Bit1,
sub_Bit0_One, sub_Bit1_One, sub_Bit0_Bit0,
sub_Bit0_Bit1, sub_Bit1_Bit0, sub_Bit1_Bit1] =
map (inst [a] []) @{thms sub_num_simps [meta]};
val dbl_conv_a = dbl_conv a;
val dbl_inc_conv_a = dbl_inc_conv a;
val dbl_dec_conv_a = dbl_dec_conv a;
ML ‹ fun expand1 a = let val numeral_1_eq_1_a = inst [a] [] @{thm numeral_One [meta, symmetric]} in
fn n => caseThm.term_of n of 🍋‹one_class.one _› => numeral_1_eq_1_a
| 🍋‹uminus _ for🍋‹one_class.one _›› => Thm.combination (Thm.reflexive (Thm.dest_fun n)) numeral_1_eq_1_a
| 🍋‹zero_class.zero _› => Thm.reflexive n
| 🍋‹numeral _ for _› => Thm.reflexive n
| 🍋‹uminus _ for🍋‹numeral _ for _›› => Thm.reflexive n
| _ => err "expand1" n end;
fun norm1_eq a = let val numeral_1_eq_1_a = inst [a] [] @{thm numeral_One [meta]} in
fn eq => caseThm.term_of (Thm.rhs_of eq) of 🍋‹Num.numeral _ for🍋‹Num.One›› => Thm.transitive eq numeral_1_eq_1_a
| 🍋‹uminus _ for🍋‹Num.numeral _ for🍋‹Num.One››› => Thm.transitive eq
(Thm.combination (Thm.reflexive (Thm.dest_fun (Thm.rhs_of eq)))
numeral_1_eq_1_a)
| _ => eq end; ›
ML ‹ fun plus_conv f a = let
val add_0_a = inst [a] [] @{thm add_0 [meta]};
val add_0_right_a = inst [a] [] @{thm add_0_right [meta]};
val numeral_plus_numeral_a = inst [a] [] @{thm numeral_plus_numeral [meta]};
val expand1_a = expand1 a;
fun conv m n = (case (strip_app m, strip_app n) of
((🍋‹zero_class.zero›, []), _) => inst [] [n] add_0_a
| (_, (🍋‹zero_class.zero›, [])) => inst [] [m] add_0_right_a
| ((🍋‹numeral›, [m]), (🍋‹numeral›, [n])) =>
transitive'
(inst [] [m, n] numeral_plus_numeral_a)
(cong1 (args2 add_num_conv))
| _ => cong2'' (f conv) (expand1_a m) (expand1_a n)) in f conv end;
val nat_plus_conv = plus_conv I 🍋‹nat›; ›
lemma neg_numeral_plus_neg_numeral: "- Num.numeral m + - Num.numeral n = (- Num.numeral (m + n) ::'a::neg_numeral)" by simp
ML ‹ fun plus_neg_conv a = let
val numeral_plus_neg_numeral_a =
inst [a] [] @{thm add_neg_numeral_simps(1) [meta]};
val neg_numeral_plus_numeral_a =
inst [a] [] @{thm add_neg_numeral_simps(2) [meta]};
val neg_numeral_plus_neg_numeral_a =
inst [a] [] @{thm neg_numeral_plus_neg_numeral [meta]};
val sub_conv_a = sub_conv a; in
fn conv => fn m => fn n => case (strip_numeral m, strip_numeral n) of
((🍋‹Num.numeral›, [m]), (🍋‹uminus›, [n])) => Thm.transitive
(inst [] [m, n] numeral_plus_neg_numeral_a)
(sub_conv_a m n)
| ((🍋‹uminus›, [m]), (🍋‹Num.numeral›, [n])) => Thm.transitive
(inst [] [m, n] neg_numeral_plus_numeral_a)
(sub_conv_a n m)
| ((🍋‹uminus›, [m]), (🍋‹uminus›, [n])) =>
transitive'
(inst [] [m, n] neg_numeral_plus_neg_numeral_a)
(cong1 (cong1 (args2 add_num_conv)))
| _ => conv m n end;
fun plus_conv' a = norm1_eq a oo plus_conv (plus_neg_conv a) a;
ML ‹ fun mult_conv f a = let
val mult_zero_left_a = inst [a] [] @{thm mult_zero_left [meta]};
val mult_zero_right_a = inst [a] [] @{thm mult_zero_right [meta]};
val numeral_times_numeral_a = inst [a] [] @{thm numeral_times_numeral [meta]};
val expand1_a = expand1 a;
val norm1_eq_a = norm1_eq a;
fun conv m n = (case (strip_app m, strip_app n) of
((🍋‹zero_class.zero›, []), _) => inst [] [n] mult_zero_left_a
| (_, (🍋‹zero_class.zero›, [])) => inst [] [m] mult_zero_right_a
| ((🍋‹numeral›, [m]), (🍋‹numeral›, [n])) =>
transitive'
(inst [] [m, n] numeral_times_numeral_a)
(cong1 (args2 mult_num_conv))
| _ => cong2'' (f conv) (expand1_a m) (expand1_a n)) in norm1_eq_a oo f conv end;
val nat_mult_conv = mult_conv I 🍋‹nat›; ›
ML ‹ fun mult_neg_conv a = let
val [neg_numeral_times_neg_numeral_a, neg_numeral_times_numeral_a,
numeral_times_neg_numeral_a] =
map (inst [a] []) @{thms mult_neg_numeral_simps [meta]}; in
fn conv => fn m => fn n => case (strip_numeral m, strip_numeral n) of
((🍋‹uminus›, [m]), (🍋‹uminus›, [n])) =>
transitive'
(inst [] [m, n] neg_numeral_times_neg_numeral_a)
(cong1 (args2 mult_num_conv))
| ((🍋‹uminus›, [m]), (🍋‹numeral›, [n])) =>
transitive'
(inst [] [m, n] neg_numeral_times_numeral_a)
(cong1 (cong1 (args2 mult_num_conv)))
| ((🍋‹numeral›, [m]), (🍋‹uminus›, [n])) =>
transitive'
(inst [] [m, n] numeral_times_neg_numeral_a)
(cong1 (cong1 (args2 mult_num_conv)))
| _ => conv m n end;
ML ‹ fun eq_conv f a = let
val zero_eq_zero_a = inst [a] [] @{thm refl [of 0, THEN Eq_TrueI]};
val zero_neq_numeral_a =
inst [a] [] @{thm zero_neq_numeral [THEN Eq_FalseI]};
val numeral_neq_zero_a =
inst [a] [] @{thm numeral_neq_zero [THEN Eq_FalseI]};
val numeral_eq_iff_a = inst [a] [] @{thm numeral_eq_iff [meta]};
val expand1_a = expand1 a;
fun conv m n = (case (strip_app m, strip_app n) of
((🍋‹zero_class.zero›, []), (🍋‹zero_class.zero›, [])) =>
zero_eq_zero_a
| ((🍋‹zero_class.zero›, []), (🍋‹numeral›, [n])) =>
inst [] [n] zero_neq_numeral_a
| ((🍋‹numeral›, [m]), (🍋‹zero_class.zero›, [])) =>
inst [] [m] numeral_neq_zero_a
| ((🍋‹numeral›, [m]), (🍋‹numeral›, [n])) => Thm.transitive
(inst [] [m, n] numeral_eq_iff_a)
(eq_num_conv m n)
| _ => cong2'' (f conv) (expand1_a m) (expand1_a n)) in f conv end;
val nat_eq_conv = eq_conv I 🍋‹nat›; ›
ML ‹ fun eq_neg_conv a = let
val neg_numeral_neq_zero_a =
inst [a] [] @{thm neg_numeral_neq_zero [THEN Eq_FalseI]};
val zero_neq_neg_numeral_a =
inst [a] [] @{thm zero_neq_neg_numeral [THEN Eq_FalseI]};
val neg_numeral_neq_numeral_a =
inst [a] [] @{thm neg_numeral_neq_numeral [THEN Eq_FalseI]};
val numeral_neq_neg_numeral_a =
inst [a] [] @{thm numeral_neq_neg_numeral [THEN Eq_FalseI]};
val neg_numeral_eq_iff_a = inst [a] [] @{thm neg_numeral_eq_iff [meta]} in
fn conv => fn m => fn n => case (strip_numeral m, strip_numeral n) of
((🍋‹uminus›, [m]), (🍋‹zero_class.zero›, [])) =>
inst [] [m] neg_numeral_neq_zero_a
| ((🍋‹zero_class.zero›, []), (🍋‹uminus›, [n])) =>
inst [] [n] zero_neq_neg_numeral_a
| ((🍋‹Num.numeral›, [m]), (🍋‹uminus›, [n])) =>
inst [] [m, n] numeral_neq_neg_numeral_a
| ((🍋‹uminus›, [m]), (🍋‹Num.numeral›, [n])) =>
inst [] [m, n] neg_numeral_neq_numeral_a
| ((🍋‹uminus›, [m]), (🍋‹uminus›, [n])) => Thm.transitive
(inst [] [m, n] neg_numeral_eq_iff_a)
(eq_num_conv m n)
| _ => conv m n end;
ML ‹ fun le_conv f a = let
val zero_le_zero_a = inst [a] [] @{thm order_refl [of 0, THEN Eq_TrueI]};
val zero_le_numeral_a =
inst [a] [] @{thm zero_le_numeral [THEN Eq_TrueI]};
val not_numeral_le_zero_a =
inst [a] [] @{thm not_numeral_le_zero [THEN Eq_FalseI]};
val numeral_le_iff_a = inst [a] [] @{thm numeral_le_iff [meta]};
val expand1_a = expand1 a;
fun conv m n = (case (strip_app m, strip_app n) of
((🍋‹zero_class.zero›, []), (🍋‹zero_class.zero›, [])) =>
zero_le_zero_a
| ((🍋‹zero_class.zero›, []), (🍋‹numeral›, [n])) =>
inst [] [n] zero_le_numeral_a
| ((🍋‹numeral›, [m]), (🍋‹zero_class.zero›, [])) =>
inst [] [m] not_numeral_le_zero_a
| ((🍋‹numeral›, [m]), (🍋‹numeral›, [n])) => Thm.transitive
(inst [] [m, n] numeral_le_iff_a)
(le_num_conv m n)
| _ => cong2'' (f conv) (expand1_a m) (expand1_a n)) in f conv end;
val nat_le_conv = le_conv I 🍋‹nat›; ›
ML ‹ fun le_neg_conv a = let
val neg_numeral_le_zero_a =
inst [a] [] @{thm neg_numeral_le_zero [THEN Eq_TrueI]};
val not_zero_le_neg_numeral_a =
inst [a] [] @{thm not_zero_le_neg_numeral [THEN Eq_FalseI]};
val neg_numeral_le_numeral_a =
inst [a] [] @{thm neg_numeral_le_numeral [THEN Eq_TrueI]};
val not_numeral_le_neg_numeral_a =
inst [a] [] @{thm not_numeral_le_neg_numeral [THEN Eq_FalseI]};
val neg_numeral_le_iff_a = inst [a] [] @{thm neg_numeral_le_iff [meta]} in
fn conv => fn m => fn n => case (strip_numeral m, strip_numeral n) of
((🍋‹uminus›, [m]), (🍋‹zero_class.zero›, [])) =>
inst [] [m] neg_numeral_le_zero_a
| ((🍋‹zero_class.zero›, []), (🍋‹uminus›, [n])) =>
inst [] [n] not_zero_le_neg_numeral_a
| ((🍋‹Num.numeral›, [m]), (🍋‹uminus›, [n])) =>
inst [] [m, n] not_numeral_le_neg_numeral_a
| ((🍋‹uminus›, [m]), (🍋‹Num.numeral›, [n])) =>
inst [] [m, n] neg_numeral_le_numeral_a
| ((🍋‹uminus›, [m]), (🍋‹uminus›, [n])) => Thm.transitive
(inst [] [m, n] neg_numeral_le_iff_a)
(le_num_conv n m)
| _ => conv m n end;
fun le_conv' a = le_conv (le_neg_conv a) a;
val int_le_conv = le_conv' \<^ctyp>\int\; ›
ML ‹ fun less_conv f a = let
val not_zero_less_zero_a = inst [a] [] @{thm less_irrefl [of 0, THEN Eq_FalseI]};
val zero_less_numeral_a =
inst [a] [] @{thm zero_less_numeral [THEN Eq_TrueI]};
val not_numeral_less_zero_a =
inst [a] [] @{thm not_numeral_less_zero [THEN Eq_FalseI]};
val numeral_less_iff_a = inst [a] [] @{thm numeral_less_iff [meta]};
val expand1_a = expand1 a;
fun conv m n = (case (strip_app m, strip_app n) of
((🍋‹zero_class.zero›, []), (🍋‹zero_class.zero›, [])) =>
not_zero_less_zero_a
| ((🍋‹zero_class.zero›, []), (🍋‹numeral›, [n])) =>
inst [] [n] zero_less_numeral_a
| ((🍋‹numeral›, [m]), (🍋‹zero_class.zero›, [])) =>
inst [] [m] not_numeral_less_zero_a
| ((🍋‹numeral›, [m]), (🍋‹numeral›, [n])) => Thm.transitive
(inst [] [m, n] numeral_less_iff_a)
(less_num_conv m n)
| _ => cong2'' (f conv) (expand1_a m) (expand1_a n)) in f conv end;
val nat_less_conv = less_conv I 🍋‹nat›; ›
ML ‹ fun less_neg_conv a = let
val neg_numeral_less_zero_a =
inst [a] [] @{thm neg_numeral_less_zero [THEN Eq_TrueI]};
val not_zero_less_neg_numeral_a =
inst [a] [] @{thm not_zero_less_neg_numeral [THEN Eq_FalseI]};
val neg_numeral_less_numeral_a =
inst [a] [] @{thm neg_numeral_less_numeral [THEN Eq_TrueI]};
val not_numeral_less_neg_numeral_a =
inst [a] [] @{thm not_numeral_less_neg_numeral [THEN Eq_FalseI]};
val neg_numeral_less_iff_a = inst [a] [] @{thm neg_numeral_less_iff [meta]} in
fn conv => fn m => fn n => case (strip_numeral m, strip_numeral n) of
((🍋‹uminus›, [m]), (🍋‹zero_class.zero›, [])) =>
inst [] [m] neg_numeral_less_zero_a
| ((🍋‹zero_class.zero›, []), (🍋‹uminus›, [n])) =>
inst [] [n] not_zero_less_neg_numeral_a
| ((🍋‹Num.numeral›, [m]), (🍋‹uminus›, [n])) =>
inst [] [m, n] not_numeral_less_neg_numeral_a
| ((🍋‹uminus›, [m]), (🍋‹Num.numeral›, [n])) =>
inst [] [m, n] neg_numeral_less_numeral_a
| ((🍋‹uminus›, [m]), (🍋‹uminus›, [n])) => Thm.transitive
(inst [] [m, n] neg_numeral_less_iff_a)
(less_num_conv n m)
| _ => conv m n end;
fun less_conv' a = less_conv (less_neg_conv a) a;
val int_less_conv = less_conv' \<^ctyp>\int\; ›
ML ‹ fun If_conv a = let
val if_True = inst [a] [] @{thm if_True [meta]};
val if_False = inst [a] [] @{thm if_False [meta]} in
fn p => fn x => fn y => fn ct => case strip_app ct of
(🍋‹If›, [cb, cx, cy]) => let
val p_eq = p cb
val eq = Thm.combination (Thm.reflexive (Thm.dest_fun (Thm.dest_fun2 ct))) p_eq in caseThm.term_of (Thm.rhs_of p_eq) of 🍋‹True› => let
val x_eq = x cx;
val cx = Thm.rhs_of x_eq; in Thm.transitive
(Thm.combination
(Thm.combination eq x_eq)
(Thm.reflexive cy))
(inst [] [cx, cy] if_True) end
| 🍋‹False› => let
val y_eq = y cy;
val cy = Thm.rhs_of y_eq; in Thm.transitive
(Thm.combination
(Thm.combination eq (Thm.reflexive cx))
y_eq)
(inst [] [cx, cy] if_False) end
| _ => err "If_conv" (Thm.rhs_of p_eq) end end; ›
ML ‹ fun drop_conv a = let
val drop_0_a = inst [a] [] @{thm drop_0 [meta]};
val drop_Cons_a = inst [a] [] @{thm drop_Cons' [meta]};
val If_conv_a = If_conv (type_of_eqn drop_0_a);
fun conv n ys = (caseThm.term_of n of 🍋‹zero_class.zero _› => inst [] [ys] drop_0_a
| _ => (case strip_app ys of
(🍋‹Cons›, [x, xs]) =>
transitive'
(inst [] [n, x, xs] drop_Cons_a)
(If_conv_a (args2 nat_eq_conv) Thm.reflexive
(cong2' conv (args2 nat_minus_conv) Thm.reflexive)))) in conv end; ›
ML ‹ fun nth_conv a = let
val nth_Cons_a = inst [a] [] @{thm nth_Cons' [meta]};
val If_conv_a = If_conv a;
fun conv ys n = (case strip_app ys of
(🍋‹Cons›, [x, xs]) =>
transitive'
(inst [] [x, xs, n] nth_Cons_a)
(If_conv_a (args2 nat_eq_conv) Thm.reflexive
(cong2' conv Thm.reflexive (args2 nat_minus_conv)))) in conv end; ›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.