Theory Extra_Pretty_Code_Examples
section ‹‹Extra_Pretty_Code_Examples› -- Setup for nicer output of ‹value››
theory Extra_Pretty_Code_Examples
imports
"HOL-Examples.Sqrt"
Real_Impl.Real_Impl
"HOL-Library.Code_Target_Numeral"
Jordan_Normal_Form.Matrix_Impl
begin
text ‹Some setup that makes the output of the ‹value› command more readable
if matrices and complex numbers are involved.
It is not recommended to import this theory in theories that get included in actual
developments (because of the changes to the code generation setup).
It is meant for inclusion in example theories only.›
lemma [simp]: "2 ∈ sqrt_irrat"
using sqrt_prime_irrational[OF two_is_prime_nat]
unfolding Rats_def sqrt_irrat_def image_def apply auto
proof -
fix p :: rat
assume "p * p = 2"
hence f1: "(Ratreal p)⇧2 = real 2"
by (metis Ratreal_def of_nat_numeral of_rat_numeral_eq power2_eq_square real_times_code)
have "∀r. if 0 ≤ r then sqrt (r⇧2) = r else r + sqrt (r⇧2) = 0"
by simp
hence f2: "Ratreal p + sqrt ((Ratreal p)⇧2) = 0"
using f1 by (metis Ratreal_def Rats_def ‹sqrt (real 2) ∉ ℚ› range_eqI)
have f3: "sqrt (real 2) + - 1 * sqrt ((Ratreal p)⇧2) ≤ 0"
using f1 by fastforce
have f4: "0 ≤ sqrt (real 2) + - 1 * sqrt ((Ratreal p)⇧2)"
using f1 by force
have f5: "(- 1 * sqrt (real 2) = real_of_rat p) = (sqrt (real 2) + real_of_rat p = 0)"
by linarith
have "∀x0. - (x0::real) = - 1 * x0"
by auto
hence "sqrt (real 2) + real_of_rat p ≠ 0"
using f5 by (metis (no_types) Rats_def Rats_minus_iff ‹sqrt (real 2) ∉ ℚ› range_eqI)
thus False
using f4 f3 f2 by simp
qed
lemma [code_post]:
shows "Complex a 0 = complex_of_real a"
and "complex_of_real 0 = 0"
and "complex_of_real 1 = 1"
and "complex_of_real (a/b) = complex_of_real a / complex_of_real b"
and "complex_of_real (numeral n) = numeral n"
and "complex_of_real (-r) = - complex_of_real r"
using complex_eq_cancel_iff2 by auto
lemma [code_post]:
shows "real_of (Abs_mini_alg (p, 0, b)) = real_of_rat p"
and "real_of (Abs_mini_alg (p, q, 2)) = real_of_rat p + real_of_rat q * sqrt 2"
and "sqrt 0 = 0"
and "sqrt (real 0) = 0"
and "x * (0::real) = 0"
and "(0::real) * x = 0"
and "(0::real) + x = x"
and "x + (0::real) = x"
and "(1::real) * x = x"
and "x * (1::real) = x"
by (auto simp add: eq_onp_same_args real_of.abs_eq)
translations "x" ↽ "CONST IArray x"
end