lemma starrel_in_star: "starrel``{x} \ star" by (simp add: star_def quotientI)
lemma star_n_eq_iff: "star_n X = star_n Y \ eventually (\n. X n = Y n) \" by (simp add: star_n_def Abs_star_inject starrel_in_star equiv_starrel_iff)
subsection \<open>Transfer principle\<close>
text\<open>This introduction rule starts each transfer proof.\<close> lemma transfer_start: "P \ eventually (\n. Q) \ \ Trueprop P \ Trueprop Q" by (simp add: FreeUltrafilterNat.proper)
text\<open>Standard principles that play a central role in the transfer tactic.\<close> definition Ifun :: "('a \ 'b) star \ 'a star \ 'b star"
(\<open>(\<open>notation=\<open>infix \<star>\<close>\<close>_ \<star>/ _)\<close> [300, 301] 300) where"Ifun f \ \<lambda>x. Abs_star (\<Union>F\<in>Rep_star f. \<Union>X\<in>Rep_star x. starrel``{\<lambda>n. F n (X n)})"
lemma Ifun_congruent2: "congruent2 starrel starrel (\F X. starrel``{\n. F n (X n)})" by (auto simp add: congruent2_def equiv_starrel_iff elim!: eventually_rev_mp)
lemma Ifun_star_n: "star_n F \ star_n X = star_n (\n. F n (X n))" by (simp add: Ifun_def star_n_def Abs_star_inverse starrel_in_star
UN_equiv_class2 [OF equiv_starrel equiv_starrel Ifun_congruent2])
lemma transfer_Ifun: "f \ star_n F \ x \ star_n X \ f \ x \ star_n (\n. F n (X n))" by (simp only: Ifun_star_n)
definition star_of :: "'a \ 'a star" where"star_of x \ star_n (\n. x)"
text\<open>Initialize transfer tactic.\<close>
ML_file \<open>transfer_principle.ML\<close>
lemma transfer_ex [transfer_intro]: "(\X. p (star_n X) \ eventually (\n. P n (X n)) \) \ \<exists>x::'a star. p x \<equiv> eventually (\<lambda>n. \<exists>x. P n x) \<U>" by (simp only: ex_star_eq eventually_ex)
lemma transfer_all [transfer_intro]: "(\X. p (star_n X) \ eventually (\n. P n (X n)) \) \ \<forall>x::'a star. p x \<equiv> eventually (\<lambda>n. \<forall>x. P n x) \<U>" by (simp only: all_star_eq FreeUltrafilterNat.eventually_all_iff)
lemma transfer_not [transfer_intro]: "p \ eventually P \ \ \ p \ eventually (\n. \P n) \" by (simp only: FreeUltrafilterNat.eventually_not_iff)
lemma transfer_conj [transfer_intro]: "p \ eventually P \ \ q \ eventually Q \ \ p \ q \ eventually (\n. P n \ Q n) \" by (simp only: eventually_conj_iff)
lemma transfer_disj [transfer_intro]: "p \ eventually P \ \ q \ eventually Q \ \ p \ q \ eventually (\n. P n \ Q n) \" by (simp only: FreeUltrafilterNat.eventually_disj_iff)
lemma transfer_imp [transfer_intro]: "p \ eventually P \ \ q \ eventually Q \ \ p \ q \ eventually (\n. P n \ Q n) \" by (simp only: FreeUltrafilterNat.eventually_imp_iff)
lemma transfer_iff [transfer_intro]: "p \ eventually P \ \ q \ eventually Q \ \ p = q \ eventually (\n. P n = Q n) \" by (simp only: FreeUltrafilterNat.eventually_iff_iff)
lemma transfer_if_bool [transfer_intro]: "p \ eventually P \ \ x \ eventually X \ \ y \ eventually Y \ \
(if p then x else y) \<equiv> eventually (\<lambda>n. if P n then X n else Y n) \<U>" by (simp only: if_bool_eq_conj transfer_conj transfer_imp transfer_not)
lemma transfer_eq [transfer_intro]: "x \ star_n X \ y \ star_n Y \ x = y \ eventually (\n. X n = Y n) \" by (simp only: star_n_eq_iff)
lemma transfer_if [transfer_intro]: "p \ eventually (\n. P n) \ \ x \ star_n X \ y \ star_n Y \
(if p then x else y) \<equiv> star_n (\<lambda>n. if P n then X n else Y n)" by (rule eq_reflection) (auto simp: star_n_eq_iff transfer_not elim!: eventually_mono)
lemma transfer_fun_eq [transfer_intro]: "(\X. f (star_n X) = g (star_n X) \ eventually (\n. F n (X n) = G n (X n)) \) \
f = g \<equiv> eventually (\<lambda>n. F n = G n) \<U>" by (simp only: fun_eq_iff transfer_all)
lemma transfer_star_n [transfer_intro]: "star_n X \ star_n (\n. X n)" by (rule reflexive)
lemma transfer_bool [transfer_intro]: "p \ eventually (\n. p) \" by (simp add: FreeUltrafilterNat.proper)
subsection \<open>Standard elements\<close>
definition Standard :: "'a star set" where"Standard = range star_of"
text\<open>Transfer tactic should remove occurrences of \<^term>\<open>star_of\<close>.\<close> setup\<open>Transfer_Principle.add_const \<^const_name>\<open>star_of\<close>\<close>
lemma star_of_inject: "star_of x = star_of y \ x = y" by transfer (rule refl)
lemma Standard_star_of [simp]: "star_of x \ Standard" by (simp add: Standard_def)
subsection \<open>Internal functions\<close>
text\<open>Transfer tactic should remove occurrences of \<^term>\<open>Ifun\<close>.\<close> setup\<open>Transfer_Principle.add_const \<^const_name>\<open>Ifun\<close>\<close>
lemma Ifun_star_of [simp]: "star_of f \ star_of x = star_of (f x)" by transfer (rule refl)
lemma Standard_Ifun [simp]: "f \ Standard \ x \ Standard \ f \ x \ Standard" by (auto simp add: Standard_def)
text\<open>Nonstandard extensions of functions.\<close>
definition starfun :: "('a \ 'b) \ 'a star \ 'b star"
(\<open>(\<open>open_block notation=\<open>prefix starfun\<close>\<close>*f* _)\<close> [80] 80) where"starfun f \ \x. star_of f \ x"
definition starfun2 :: "('a \ 'b \ 'c) \ 'a star \ 'b star \ 'c star"
(\<open>(\<open>open_block notation=\<open>prefix starfun2\<close>\<close>*f2* _)\<close> [80] 80) where"starfun2 f \ \x y. star_of f \ x \ y"
lemma starfun_star_of [simp]: "( *f* f) (star_of x) = star_of (f x)" by transfer (rule refl)
lemma starfun2_star_of [simp]: "( *f2* f) (star_of x) = *f* f x" by transfer (rule refl)
lemma Standard_starfun [simp]: "x \ Standard \ starfun f x \ Standard" by (simp add: starfun_def)
lemma Standard_starfun2 [simp]: "x \ Standard \ y \ Standard \ starfun2 f x y \ Standard" by (simp add: starfun2_def)
lemma Standard_starfun_iff: assumes inj: "\x y. f x = f y \ x = y" shows"starfun f x \ Standard \ x \ Standard" proof assume"x \ Standard" thenshow"starfun f x \ Standard" by simp next from inj have inj': "\x y. starfun f x = starfun f y \ x = y" by transfer assume"starfun f x \ Standard" thenobtain b where b: "starfun f x = star_of b" unfolding Standard_def .. thenhave"\x. starfun f x = star_of b" .. thenhave"\a. f a = b" by transfer thenobtain a where"f a = b" .. thenhave"starfun f (star_of a) = star_of b"by transfer with b have"starfun f x = starfun f (star_of a)"by simp thenhave"x = star_of a"by (rule inj') thenshow"x \ Standard" by (simp add: Standard_def) qed
lemma Standard_starfun2_iff: assumes inj: "\a b a' b'. f a b = f a' b' \ a = a' \ b = b'" shows"starfun2 f x y \ Standard \ x \ Standard \ y \ Standard" proof assume"x \ Standard \ y \ Standard" thenshow"starfun2 f x y \ Standard" by simp next have inj': "\x y z w. starfun2 f x y = starfun2 f z w \ x = z \ y = w" using inj by transfer assume"starfun2 f x y \ Standard" thenobtain c where c: "starfun2 f x y = star_of c" unfolding Standard_def .. thenhave"\x y. starfun2 f x y = star_of c" by auto thenhave"\a b. f a b = c" by transfer thenobtain a b where"f a b = c"by auto thenhave"starfun2 f (star_of a) (star_of b) = star_of c"by transfer with c have"starfun2 f x y = starfun2 f (star_of a) (star_of b)"by simp thenhave"x = star_of a \ y = star_of b" by (rule inj') thenshow"x \ Standard \ y \ Standard" by (simp add: Standard_def) qed
subsection \<open>Internal predicates\<close>
definition unstar :: "bool star \ bool" where"unstar b \ b = star_of True"
lemma unstar_star_n: "unstar (star_n P) \ eventually P \" by (simp add: unstar_def star_of_def star_n_eq_iff)
text\<open>Transfer tactic should remove occurrences of \<^term>\<open>unstar\<close>.\<close> setup\<open>Transfer_Principle.add_const \<^const_name>\<open>unstar\<close>\<close>
lemma transfer_unstar [transfer_intro]: "p \ star_n P \ unstar p \ eventually P \" by (simp only: unstar_star_n)
definition starP :: "('a \ bool) \ 'a star \ bool"
(\<open>(\<open>open_block notation=\<open>prefix starP\<close>\<close>*p* _)\<close> [80] 80) where"*p* P = (\x. unstar (star_of P \ x))"
definition starP2 :: "('a \ 'b \ bool) \ 'a star \ 'b star \ bool"
(\<open>(\<open>open_block notation=\<open>prefix starP2\<close>\<close>*p2* _)\<close> [80] 80) where"*p2* P = (\x y. unstar (star_of P \ x \ y))"
lemma starP_star_of [simp]: "( *p* P) (star_of x) = P x" by transfer (rule refl)
lemma starP2_star_of [simp]: "( *p2* P) (star_of x) = *p* P x" by transfer (rule refl)
subsection \<open>Internal sets\<close>
definition Iset :: "'a set star \ 'a star set" where"Iset A = {x. ( *p2* (\)) x A}"
lemma Iset_star_n: "(star_n X \ Iset (star_n A)) = (eventually (\n. X n \ A n) \)" by (simp add: Iset_def starP2_star_n)
text\<open>Transfer tactic should remove occurrences of \<^term>\<open>Iset\<close>.\<close> setup\<open>Transfer_Principle.add_const \<^const_name>\<open>Iset\<close>\<close>
lemma transfer_mem [transfer_intro]: "x \ star_n X \ a \ Iset (star_n A) \ x \ a \ eventually (\n. X n \ A n) \" by (simp only: Iset_star_n)
lemma transfer_Collect [transfer_intro]: "(\X. p (star_n X) \ eventually (\n. P n (X n)) \) \
Collect p \<equiv> Iset (star_n (\<lambda>n. Collect (P n)))" by (simp add: atomize_eq set_eq_iff all_star_eq Iset_star_n)
lemma transfer_set_eq [transfer_intro]: "a \ Iset (star_n A) \ b \ Iset (star_n B) \ a = b \ eventually (\n. A n = B n) \" by (simp only: set_eq_iff transfer_all transfer_iff transfer_mem)
lemma transfer_ball [transfer_intro]: "a \ Iset (star_n A) \ (\X. p (star_n X) \ eventually (\n. P n (X n)) \) \ \<forall>x\<in>a. p x \<equiv> eventually (\<lambda>n. \<forall>x\<in>A n. P n x) \<U>" by (simp only: Ball_def transfer_all transfer_imp transfer_mem)
lemma transfer_bex [transfer_intro]: "a \ Iset (star_n A) \ (\X. p (star_n X) \ eventually (\n. P n (X n)) \) \ \<exists>x\<in>a. p x \<equiv> eventually (\<lambda>n. \<exists>x\<in>A n. P n x) \<U>" by (simp only: Bex_def transfer_ex transfer_conj transfer_mem)
lemma transfer_Iset [transfer_intro]: "a \ star_n A \ Iset a \ Iset (star_n (\n. A n))" by simp
text\<open>Nonstandard extensions of sets.\<close>
definition starset :: "'a set \ 'a star set"
(\<open>(\<open>open_block notation=\<open>prefix starset\<close>\<close>*s* _)\<close> [80] 80) where"starset A = Iset (star_of A)"
declare starset_def [transfer_unfold]
lemma starset_mem: "star_of x \ *s* A \ x \ A" by transfer (rule refl)
lemma starset_UNIV: "*s* (UNIV::'a set) = (UNIV::'a star set)" by (transfer UNIV_def) (rule refl)
subsection \<open>Ordering and lattice classes\<close>
instance star :: (order) order proof show"\x y::'a star. (x < y) = (x \ y \ \ y \ x)" by transfer (rule less_le_not_le) show"\x::'a star. x \ x" by transfer (rule order_refl) show"\x y z::'a star. \x \ y; y \ z\ \ x \ z" by transfer (rule order_trans) show"\x y::'a star. \x \ y; y \ x\ \ x = y" by transfer (rule order_antisym) qed
instantiation star :: (semilattice_inf) semilattice_inf begin definition star_inf_def [transfer_unfold]: "inf \ *f2* inf" instanceby (standard; transfer) auto end
instantiation star :: (semilattice_sup) semilattice_sup begin definition star_sup_def [transfer_unfold]: "sup \ *f2* sup" instanceby (standard; transfer) auto end
instance star :: (lattice) lattice ..
instance star :: (distrib_lattice) distrib_lattice by (standard; transfer) (auto simp add: sup_inf_distrib1)
lemma Standard_inf [simp]: "x \ Standard \ y \ Standard \ inf x y \ Standard" by (simp add: star_inf_def)
lemma Standard_sup [simp]: "x \ Standard \ y \ Standard \ sup x y \ Standard" by (simp add: star_sup_def)
lemma star_of_inf [simp]: "star_of (inf x y) = inf (star_of x) (star_of y)" by transfer (rule refl)
lemma star_of_sup [simp]: "star_of (sup x y) = sup (star_of x) (star_of y)" by transfer (rule refl)
instance star :: (linorder) linorder by (intro_classes, transfer, rule linorder_linear)
instance star :: (ordered_ab_semigroup_add) ordered_ab_semigroup_add by (intro_classes, transfer, rule add_left_mono)
instance star :: (ordered_cancel_ab_semigroup_add) ordered_cancel_ab_semigroup_add ..
instance star :: (ordered_ab_semigroup_add_imp_le) ordered_ab_semigroup_add_imp_le by (intro_classes, transfer, rule add_le_imp_le_left)
instance star :: (ordered_comm_monoid_add) ordered_comm_monoid_add .. instance star :: (ordered_ab_semigroup_monoid_add_imp_le) ordered_ab_semigroup_monoid_add_imp_le .. instance star :: (ordered_cancel_comm_monoid_add) ordered_cancel_comm_monoid_add .. instance star :: (ordered_ab_group_add) ordered_ab_group_add ..
instance star :: (ordered_ab_group_add_abs) ordered_ab_group_add_abs by intro_classes (transfer, simp add: abs_ge_self abs_leI abs_triangle_ineq)+
instance star :: (linordered_cancel_ab_semigroup_add) linordered_cancel_ab_semigroup_add ..
subsection \<open>Ring and field classes\<close>
instance star :: (semiring) semiring by (intro_classes; transfer) (fact distrib_right distrib_left)+
instance star :: (semiring_0) semiring_0 by (intro_classes; transfer) simp_all
instance star :: (semiring_0_cancel) semiring_0_cancel ..
instance star :: (comm_semiring) comm_semiring by (intro_classes; transfer) (fact distrib_right)
instance star :: (comm_semiring_0) comm_semiring_0 .. instance star :: (comm_semiring_0_cancel) comm_semiring_0_cancel ..
instance star :: (zero_neq_one) zero_neq_one by (intro_classes; transfer) (fact zero_neq_one)
instance star :: (semiring_1) semiring_1 .. instance star :: (comm_semiring_1) comm_semiring_1 ..
declare dvd_def [transfer_refold]
instance star :: (comm_semiring_1_cancel) comm_semiring_1_cancel by (intro_classes; transfer) (fact right_diff_distrib')
instance star :: (semiring_no_zero_divisors) semiring_no_zero_divisors by (intro_classes; transfer) (fact no_zero_divisors)
instance star :: (semiring_1_no_zero_divisors) semiring_1_no_zero_divisors ..
instance star :: (semiring_no_zero_divisors_cancel) semiring_no_zero_divisors_cancel by (intro_classes; transfer) simp_all
instance star :: (semiring_1_cancel) semiring_1_cancel .. instance star :: (ring) ring .. instance star :: (comm_ring) comm_ring .. instance star :: (ring_1) ring_1 .. instance star :: (comm_ring_1) comm_ring_1 .. instance star :: (semidom) semidom ..
instance star :: (semidom_divide) semidom_divide by (intro_classes; transfer) simp_all
instance star :: (ring_no_zero_divisors) ring_no_zero_divisors .. instance star :: (ring_1_no_zero_divisors) ring_1_no_zero_divisors .. instance star :: (idom) idom .. instance star :: (idom_divide) idom_divide ..
instance star :: (divide_trivial) divide_trivial by (intro_classes; transfer) simp_all
instance star :: (division_ring) division_ring by (intro_classes; transfer) (simp_all add: divide_inverse)
instance star :: (field) field by (intro_classes; transfer) (simp_all add: divide_inverse)
instance star :: (ordered_semiring) ordered_semiring by (intro_classes; transfer) (fact mult_left_mono mult_right_mono)+
instance star :: (ordered_cancel_semiring) ordered_cancel_semiring ..
instance star :: (linordered_semiring_strict) linordered_semiring_strict by (intro_classes; transfer) (fact mult_strict_left_mono mult_strict_right_mono)+
instance star :: (ordered_comm_semiring) ordered_comm_semiring by (intro_classes; transfer) (fact mult_left_mono)
instance star :: (ordered_cancel_comm_semiring) ordered_cancel_comm_semiring ..
instance star :: (linordered_comm_semiring_strict) linordered_comm_semiring_strict by (intro_classes; transfer) (fact mult_strict_left_mono)
instance star :: (ordered_ring) ordered_ring ..
instance star :: (ordered_ring_abs) ordered_ring_abs by (intro_classes; transfer) (fact abs_eq_mult)
instance star :: (abs_if) abs_if by (intro_classes; transfer) (fact abs_if)
instance star :: (linordered_ring_strict) linordered_ring_strict .. instance star :: (ordered_comm_ring) ordered_comm_ring ..
instance star :: (linordered_semidom) linordered_semidom by (intro_classes; transfer) (fact zero_less_one le_add_diff_inverse2)+
instance star :: (linordered_idom) linordered_idom by (intro_classes; transfer) (fact sgn_if)
instance star :: (linordered_field) linordered_field ..
instance star :: (algebraic_semidom) algebraic_semidom ..
instantiation star :: (normalization_semidom) normalization_semidom begin
definition unit_factor_star :: "'a star \ 'a star" where [transfer_unfold]: "unit_factor_star = *f* unit_factor"
definition normalize_star :: "'a star \ 'a star" where [transfer_unfold]: "normalize_star = *f* normalize"
instance by standard (transfer; simp add: is_unit_unit_factor unit_factor_mult)+
end
instance star :: (semidom_modulo) semidom_modulo by standard (transfer; simp)
subsection \<open>Power\<close>
lemma star_power_def [transfer_unfold]: "(^) \ \x n. ( *f* (\x. x ^ n)) x" proof (rule eq_reflection, rule ext, rule ext) show"x ^ n = ( *f* (\x. x ^ n)) x" for n :: nat and x :: "'a star" proof (induct n arbitrary: x) case 0 have"\x::'a star. ( *f* (\x. 1)) x = 1" by transfer simp thenshow ?caseby simp next case (Suc n) have"\x::'a star. x * ( *f* (\x::'a. x ^ n)) x = ( *f* (\x::'a. x * x ^ n)) x" by transfer simp with Suc show ?caseby simp qed qed
lemma Standard_power [simp]: "x \ Standard \ x ^ n \ Standard" by (simp add: star_power_def)
lemma star_of_power [simp]: "star_of (x ^ n) = star_of x ^ n" by transfer (rule refl)
subsection \<open>Number classes\<close>
instance star :: (numeral) numeral ..
lemma star_numeral_def [transfer_unfold]: "numeral k = star_of (numeral k)" by (induct k) (simp_all only: numeral.simps star_of_one star_of_add)
lemma Standard_numeral [simp]: "numeral k \ Standard" by (simp add: star_numeral_def)
lemma star_of_numeral [simp]: "star_of (numeral k) = numeral k" by transfer (rule refl)
lemma star_of_nat_def [transfer_unfold]: "of_nat n = star_of (of_nat n)" by (induct n) simp_all
lemma Standard_of_nat [simp]: "of_nat n \ Standard" by (simp add: star_of_nat_def)
lemma star_of_of_nat [simp]: "star_of (of_nat n) = of_nat n" by transfer (rule refl)
lemma star_of_int_def [transfer_unfold]: "of_int z = star_of (of_int z)" by (rule int_diff_cases [of z]) simp
lemma Standard_of_int [simp]: "of_int z \ Standard" by (simp add: star_of_int_def)
lemma star_of_of_int [simp]: "star_of (of_int z) = of_int z" by transfer (rule refl)
instance star :: (semiring_char_0) semiring_char_0 proof have"inj (star_of :: 'a \ 'a star)" by (rule injI) simp thenhave"inj (star_of \ of_nat :: nat \ 'a star)" using inj_of_nat by (rule inj_compose) thenshow"inj (of_nat :: nat \ 'a star)" by (simp add: comp_def) qed
instance star :: (ring_char_0) ring_char_0 ..
subsection \<open>Finite class\<close>
lemma starset_finite: "finite A \ *s* A = star_of ` A" by (erule finite_induct) simp_all
instance star :: (finite) finite proof intro_classes show"finite (UNIV::'a star set)" by (metis starset_UNIV finite finite_imageI starset_finite) qed
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.0.15Bemerkung:
(vorverarbeitet)
¤
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 ist noch experimentell.