ML ‹
expand1 a =
let val numeral_1_eq_1_a = inst [a] [] @{thm numeral_One [meta, symmetric]}
in
fn n =>
case Thm.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;
norm1_eq a =
let val numeral_1_eq_1_a = inst [a] [] @{thm numeral_One [meta]}
in
fn eq =>
case Thm.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 ‹
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
((const_name‹zero_class.zero›, []), _) => inst [] [n] add_0_a
| (_, (const_name‹zero_class.zero›, [])) => inst [] [m] add_0_right_a
| ((const_name‹numeral›, [m]), (const_name‹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;
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 ‹
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
((const_name‹Num.numeral›, [m]), (const_name‹uminus›, [n])) =>
Thm.transitive
(inst [] [m, n] numeral_plus_neg_numeral_a)
(sub_conv_a m n)
| ((const_name‹uminus›, [m]), (const_name‹Num.numeral›, [n])) =>
Thm.transitive
(inst [] [m, n] neg_numeral_plus_numeral_a)
(sub_conv_a n m)
| ((const_name‹uminus›, [m]), (const_name‹uminus›, [n])) =>
transitive'
(inst [] [m, n] neg_numeral_plus_neg_numeral_a)
(cong1 (cong1 (args2 add_num_conv)))
| _ => conv m n
end;
plus_conv' a = norm1_eq a oo plus_conv (plus_neg_conv a) a;
ML ‹
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
((const_name‹zero_class.zero›, []), _) => inst [] [n] mult_zero_left_a
| (_, (const_name‹zero_class.zero›, [])) => inst [] [m] mult_zero_right_a
| ((const_name‹numeral›, [m]), (const_name‹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;
nat_mult_conv = mult_conv I 🚫‹nat›; ›
ML ‹
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
((const_name‹uminus›, [m]), (const_name‹uminus›, [n])) =>
transitive'
(inst [] [m, n] neg_numeral_times_neg_numeral_a)
(cong1 (args2 mult_num_conv))
| ((const_name‹uminus›, [m]), (const_name‹numeral›, [n])) =>
transitive'
(inst [] [m, n] neg_numeral_times_numeral_a)
(cong1 (cong1 (args2 mult_num_conv)))
| ((const_name‹numeral›, [m]), (const_name‹uminus›, [n])) =>
transitive'
(inst [] [m, n] numeral_times_neg_numeral_a)
(cong1 (cong1 (args2 mult_num_conv)))
| _ => conv m n
end;
ML ‹
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
((const_name‹zero_class.zero›, []), (const_name‹zero_class.zero›, [])) =>
zero_le_zero_a
| ((const_name‹zero_class.zero›, []), (const_name‹numeral›, [n])) =>
inst [] [n] zero_le_numeral_a
| ((const_name‹numeral›, [m]), (const_name‹zero_class.zero›, [])) =>
inst [] [m] not_numeral_le_zero_a
| ((const_name‹numeral›, [m]), (const_name‹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;
nat_le_conv = le_conv I 🚫‹nat›; ›
ML ‹
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
((const_name‹uminus›, [m]), (const_name‹zero_class.zero›, [])) =>
inst [] [m] neg_numeral_le_zero_a
| ((const_name‹zero_class.zero›, []), (const_name‹uminus›, [n])) =>
inst [] [n] not_zero_le_neg_numeral_a
| ((const_name‹Num.numeral›, [m]), (const_name‹uminus›, [n])) =>
inst [] [m, n] not_numeral_le_neg_numeral_a
| ((const_name‹uminus›, [m]), (const_name‹Num.numeral›, [n])) =>
inst [] [m, n] neg_numeral_le_numeral_a
| ((const_name‹uminus›, [m]), (const_name‹uminus›, [n])) =>
Thm.transitive
(inst [] [m, n] neg_numeral_le_iff_a)
(le_num_conv n m)
| _ => conv m n
end;
le_conv' a = le_conv (le_neg_conv a) a;
int_le_conv = le_conv' 🚫‹int›; ›
ML ‹
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
((const_name‹zero_class.zero›, []), (const_name‹zero_class.zero›, [])) =>
not_zero_less_zero_a
| ((const_name‹zero_class.zero›, []), (const_name‹numeral›, [n])) =>
inst [] [n] zero_less_numeral_a
| ((const_name‹numeral›, [m]), (const_name‹zero_class.zero›, [])) =>
inst [] [m] not_numeral_less_zero_a
| ((const_name‹numeral›, [m]), (const_name‹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;
nat_less_conv = less_conv I 🚫‹nat›; ›
ML ‹
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
((const_name‹uminus›, [m]), (const_name‹zero_class.zero›, [])) =>
inst [] [m] neg_numeral_less_zero_a
| ((const_name‹zero_class.zero›, []), (const_name‹uminus›, [n])) =>
inst [] [n] not_zero_less_neg_numeral_a
| ((const_name‹Num.numeral›, [m]), (const_name‹uminus›, [n])) =>
inst [] [m, n] not_numeral_less_neg_numeral_a
| ((const_name‹uminus›, [m]), (const_name‹Num.numeral›, [n])) =>
inst [] [m, n] neg_numeral_less_numeral_a
| ((const_name‹uminus›, [m]), (const_name‹uminus›, [n])) =>
Thm.transitive
(inst [] [m, n] neg_numeral_less_iff_a)
(less_num_conv n m)
| _ => conv m n
end;
less_conv' a = less_conv (less_neg_conv a) a;
int_less_conv = less_conv' 🚫‹int›; ›
ML ‹
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
(const_name‹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
case Thm.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 ‹
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 = (case Thm.term_of n of 🚫‹zero_class.zero _› => inst [] [ys] drop_0_a
| _ => (case strip_app ys of
(const_name‹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 ‹
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
(const_name‹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; ›
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet am 2026-06-30)
¤
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.