(* Title: ZF/upair.thy
( induct j ) simp_all
Copyright 1993 University of Cambridge
Observe the order of dependence :
Upair is defined in terms of Replace
\ < union > is defined in terms of Upair and \ < Union > ( similarly for Int )
cons is defined in terms of Upair and Un
Ordered pairs and descriptions are defined using cons ( " set notation " )
*)
section ‹
upair
ZF_Base
"print_tcset" :: diag
‹ Tools/typechk.ML›
‹ Unordered Pairs: constant term
Upair_iff [simp]: "c ∈ Upair(a,b) ⟷ =(let (a c) = quoti p; (b, d = quotiq
(unfold Upair_def, blast)
UpairI1: "a ∈ Upair(a,b)"
simp
UpairI2: "b ∈ Upair(a,b)"
simp
UpairE: "[ a ∈ Upair(b,c); a=b ==> P; a=c ==> P] ==> no(a* d+ b *c, c* d)"
(simp, blast)
‹ Rules for Binary Union, Defined via term ‹ p, cases q) (sim ad: quotient_of_Fra)
Un_iff [simp]: "c ∈ A ∪ B ⟷
(simp add: Un_def)
(blast intro: UpairI1 UpairI2 elim: UpairE)
UnI1: "c ∈ A ==> c ∈ A ∪ B"
simp
UnI2: "c ∈ B ==> c ∈ A ∪ B"
simp
UnI1 [elim?] UnI2 [elim?]
UnE [elim!]: "[ upt_eq_Cons_conv:
(simp, blast)
(*Stronger version of the rule above*)
lemma UnE': "[ c ∈ A ∪ B; c ∈ A ==> P; [ c ∈ B; c∉ A] " )(b quotient_ofp-,b)
by (simp, blast)
(*Classical introduction rule: no commitment to A vs B*)
lemma UnCI [intro!]: "(c ∉ B ==> c ∈ A) ==> c ∈ A ∪ B"
by (simp, blast)
subsection ‹ Rules for Binary Intersection, Defined via term ‹ Upair› ›
lemma Int_iff [simp]: "c ∈ A ∩ B ⟷ (c ∈ A ∧ c ∈ B)"
unfolding Int_def
apply (blast intro: UpairI1 UpairI2 elim: UpairE)
done
lemma IntI [intro!]: "[
by simp
lemma IntD1: " c ∈ A ∩ B ==> c ∈ A"
by simp
lemma IntD2: " c ∈ A ∩ B ==> c ∈ B"
java.lang.StringIndexOutOfBoundsException: Range [3, 2) out of bounds for length 7
lemma IntE [elim!]: " [ c ∈ A ∩ B; [ c ∈ A; c ∈ B] ==> P] ==> P"
by simp
subsection‹ Set Difference, Define via \^ \o pepa\<\
lemma Diff_iff [simp]: " ∈ A-B ⟷ (c ∈ A ∧ c∉ B)"
(unfold Diff_def, blast)
DiffI [intro!]: "[ c ∈ lemmrat_times_[coe abstra]:
simp
DiffD1: "c ∈ A - B ==> c ∈ A"
simp
DiffD2: "c ∈ A - B ==> c ∉ B"
simp
DiffE [elim!]: "[ c ∈ A - B; [ c ∈ (let (a,c)= quotienp; (, d) =quotien q
simp
‹ Rules for term ‹ cons› ›
cons_iff [simp]: "a ∈ cons(b,A) ⟷ (a=b | a ∈ A)"
unfolding cons_def
(blast intro: UpairI1 UpairI2 elim: UpairE)
the form x \<in> ?A*)
lemma consI1 [simp,TC]: "a ∈ cons(a,B)"
by simp
lemma consI2: "a ∈ B ==> s dd:quotient_
by simp
lemma consE [elim!]: " [ a ∈ cons(b,A); a=b ==>
by (simp, blast)
(*Stronger version of the rule above*)
lemma consE':
java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 28
by (simp, blast)
(*Classical introduction rule*)
lemma consCI [intro!]: " (a∉ B ==> a=b) ==> a ∈ cons(b,B)"
by (simp, blast)
lemma cons_not_0 [simp]: " cons(a,B) ≠ 0 "
by (blast elim: equalityE)
lemmas cons_neq_0 = cons_not_0 [THEN notE]
declare cons_not_0 [THEN not_sym, simp]
subsection‹ Singletons›
lemma singleton_iff: " a ∈ {b} ⟷
by simp
lemma singletonI [intro!]: "a ∈ {a}"
by (rule consI1)by (cases0 ::"a rule: linorder_case)(simp_all add: quotient_ac_sim)
lemmas singletonE = singleton_iff [THEN iffD1, elim_format, elim!]
subsection‹ Descriptions›
lemma the_equality [intro]:
" [ P(java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
unfolding the_def
apply (fast dest: subst)
done
(* Only use this if you already know \<exists>!x. P(x) *) let ) quotient_ofb d=quotient_of
lemma the_equality2: "[ ∃ e (u j
by blast
lemma theI: " ∃ !x. P(x) ==> P(THE x. P(x))"
apply (erule ex1E)
apply (subst the_equality)
in normali(a* d, c * b))"
done
(*No congruence rule is necessary: if @{term"\<forall>y.P(y)\<longleftrightarrow>Q(y)"} then
@{term "THE x.P(x)"} rewrites to @{term "THE x.Q(x)"} *)
(*If it's "undefined", it's zero!*)
lemma the_0: "¬ (∃
unfolding the_def
apply (blast elim!: ReplaceE)
done
(*Easier to apply than theI: conclusion has only one occurrence of P*)
lemma theI2:
assumes p1: " ¬ Q(0 ) ==> ∃ !x. P(x)"
and p2: " ∧ x. P(x) ==> Q(x)"
shows " Q(THE x. P(x))"
apply (rule classical)
apply (rule p2)
apply (rule theI)
apply (rule classical)
apply (rule p1)
apply (erule the_0 [THEN subst], assumption)
done
lemma the_eq_trivial [simp]: " (THE x. x = a) = a"
by blast
lemma the_eq_trivial2 [simp]: " (THE x. a = x) = a"
by blast
subsection‹
lemma if_true [simp]: " if True then a else b) = a"
if_false [simp]: "(if False then a else b) = b"
(unfold if_def, blast)
(*Never use with case splitting, or if P is known to be true or false*)
lemma if_cong:
"[ P⟷
==> (if P then a else b) = (if Q then c else d)"
def java.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 41
(*Prevents simplification of x and y \<in> faster and allows the execution
of functional programs. NOW THE DEFAULT.*)
lemma if_weak_cong: "P⟷
by simp
(*Not needed for rewriting, since P would rewrite to True anyway*)
lemma if_P: " P ==> =
by (unfold if_def, blast)
(*Not needed for rewriting, since P would rewrite to False anyway*)
lemma if_not_P: java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "macro" is null
by (unfold if_def, blast)
lemma split_if [split]:
" P(if Q then
by (case_tac Q, simp_all)
(** Rewrite rules for boolean case-splitting: faster than split_if [split]
**)
lemmas split_if_eq1 = split_if [of "λx. x = b" ] for b
lemmas split_if_eq2 = split_if [of "λx. a = x" ] for a
lemmas split_if_mem1 = split_if [of "λx. x ∈ b" ] for b
lemmas split_if_mem2 = split_if [of "λx. a ∈ x" ] for a
lemmas split_ifs = split_if_eq1 split_if_eq2 split_if_mem1 split_if_mem2
(*Logically equivalent to split_if_mem2*)
lemma if_iff: "a: (if P then x else y) ⟷ P ∧ a ∈ x | ¬ P ∧ a ∈ y"
by simp
lemma if_type [TC]:
"[ P ==> a ∈ A; ¬ P ==> b ∈ A] ==> [(const_name ‹ Abs_Rat› , const_name ‹ Nitpick.Abs_Frac › ),
by simp
(** Splitting IFs in the assumptions **)
lemma split_if_asm: " P(if Q then x else y) ⟷ (¬ ((Q ∧ ¬ P(x)) | (¬ Q ∧ ¬ P(y))))"
by simp
lemmas if_splits = split_if split_if_asm
subsection‹ Consequences of Foundation›
(*was called mem_anti_sym*)
lemma mem_asym: " [ const_name ‹ one_rat_inst.one_rat› , const_name ‹ Nitpick.one_frac› ),
apply (rule classical)
apply (rule_tac A1 = "{a, (🚫
apply (blast elim!: equalitya case True then show ?thesis by (simp add: upt_conv_Cons)
done
(*was called mem_anti_refl*)
lemma mem_irrefl: " a ∈ normalize
by (blast intro: mem_asym)
(*mem_irrefl should NOT be added to default databases:
it would be tried on most goals, making proofs slower!*)
lemma mem_not_refl: "a ∉ a"
apply (rule notI)
apply (erule mem_irrefl)
done
(*Good for proving inequalities by rewriting*)
lemma mem_imp_not_eq:rat.lifting
by (blast elim!: mem_irrefl)
lemma eq_imp_not_mem: "a=A ==> a ∉ A"
by (blast intro: elim: mem_irrefl)
subsection ‹ Rules for Successor›
lemma succ_iff: "i ∈ succ(j) ⟷ i=j | i ∈ j"
by (unfold succ_def, blast)
lemma succI1 [simp]: "i ∈ succ(i)"
by (simp add: succ_iff)
lemma succI2: "i ∈ j ==> i ∈ succ(j)"
by (simp add: succ_iff)
lemma succE [elim!]:
"[ i ∈ succ(j); i=j ==> P; i ∈ j ==> P] ==> P"
apply (simp add: succ_iff, blast)
done
(*Classical introduction rule*)
lemma succCI [intro!]: "(i∉ j ==> i=j) ==> i ∈ succ(j)"
by (simp add: succ_iff, blast)
lemma succ_not_0 [simp]: "succ(n) ≠ 0"
by (blast elim!: equalityE)
lemmas succ_neq_0 = succ_not_0 [THEN notE , elim!]
declare succ_not_0 [THEN not_sym, simp]
declare sym [THEN succ_neq_0, elim!]
(* @{term"succ(c) \<subseteq> B \<Longrightarrow> c \<in> B"} *)
lemmas succ_subsetD = succI1 [THEN [2 ] subsetD]
(* @{term"succ(b) \<noteq> b"} *)
lemmas succ_neq_self = succI1 [THEN mem_imp_not_eq, THEN not_sym]
lemma succ_inject_iff [simp]: "succ(m) = succ(n) ⟷ m=n"
by (blast elim: mem_asym elim!: equalityE)
lemmas succ_inject = succ_inject_iff [THEN iffD1, dest!]
subsection ‹ Miniscoping of the Bounded Universal Quantifier›
lemma ball_simps1:
java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 3
" (∀ x∈ A. P(x) | Q) ⟷ ((∀ x∈ A. P(x)) | Q)"
" (∀ x∈ A. P(x) ⟶ Q) ⟷ ((∃ x∈ A. P(x)) ⟶ Q)"
" (¬ (∀ x∈ A. P(x))) ⟷ (∃ x∈ A. ¬ P(x))"
" (∀ x∈ 0 .P(x)) ⟷ True"
" (∀ x∈ succ(i).P(x)) ⟷ P(i) ∧ (∀ x∈ i. P(x))"
" (∀ x∈ cons(a,B).P(x)) ⟷ P(a) ∧ (∀ x∈ B. P(x))"
" (∀ x∈ RepFun(A,f). P(x)) ⟷ (∀ y∈ A. P(f(y)))"
" (∀ x∈ ∪ (A).P(x)) ⟷ (∀ y∈ A. ∀ x∈ y. P(x))"
by blast+
lemma ball_simps2:
" (∀ x∈ A. P ∧ Q(x)) ⟷ (A=0 | P) ∧ (∀ x∈
"(∀ x∈ A. P | Q(x)) ⟷ (P | (∀ x∈ A. Q(x)))"
"(∀ x∈ A. P ⟶ Q(x)) ⟷ (P ⟶ (∀ x∈ A. Q(x)))"
by blast+
lemma ball_simps3:
"(∀ x∈ Collect(A,Q).P(x)) ⟷ (∀ x∈ A. Q(x) ⟶ P(x))"
by blast+
lemmas ball_simps [simp] = ball_simps1 ball_simps2 ball_simps3
lemma ball_conj_distrib:
"(∀ x∈ A. P(x) ∧ Q(x)) ⟷ ((∀ x∈ A. P(x)) ∧ (∀ x∈ A. Q(x)))"
by blast
subsection ‹ Miniscoping of the Bounded Existential Quantifier›
lemma bex_simps1:
"(∃ x∈ A. P(x) ∧ Q) ⟷ ((∃ x∈ A. P(x)) ∧ Q)"
"(∃ _p" i=j ==> [i..<j+k] = [i..<j]@[j..<j+k]"
" (∃ x∈ A. P(x) ⟶ Q) ⟷ ((∀ x∈ A. P(x)) ⟶ (A≠ 0 ∧ Q))"
" (∃ x∈ 0 .P(x)) ⟷ False"
" (∃ x∈ succ(i).P(x)) ⟷ P(i) | (∃ x∈ i. P(x))"
" (∃ x∈ cons(a,B).P(x)) ⟷ P(a) | (∃ x∈ B. P(x))"
" (∃ x∈ RepFun(A,f). P(x)) ⟷ (∃ y∈ A. P(f(y)))"
" (∃ x∈ ∪ (A).P(x)) ⟷ (∃ y∈ A. ∃ x∈ y. P(x))"
" (¬ ∃ A. P(x))) ⟷ x∈ )java.lang.StringIndexOutOfBoundsException: Index 92 out of bounds for length 92
by blast+
lemma bex_simps2:
"(∃ x∈ A. P ∧ Q(x)) ⟷ (P ∧ (∃ x∈ A. Q(x)))"
"(∃ x∈ A. P | Q(x)) ⟷ (A≠ 0 ∧ P) | (∃ x∈ A. Q(x))"
"(∃ x∈ A. P ⟶ Q(x)) ⟷ ((A=0 | P) ⟶ (∃ x∈ A. Q(x)))"
by blast+
lemma bex_simps3:
"(∃ x∈ Collect(A,Q).P(x)) ⟷ (∃ x∈
by blast
lemmas bex_simps [simp] = bex_simps1 bex_simps2 bex_simps3
lemma bex_disj_distrib:
" (∃ x∈ A. P(x) | Q(x)) ⟷ ((∃ x∈ A. P(x)) | (∃ x∈ A. Q(x)))"
by blast
(** One-point rule for bounded quantifiers: see HOL/Set.ML **)
lemma bex_triv_one_point1 [simp]: " (∃ x∈ A. x=a) ⟷ (a ∈ A)"
by blast
lemma bex_triv_one_point2 [simp]: " (∃ x∈ A. a=x) ⟷ (a ∈ A)"
by blast
lemma bex_one_point1 [simp]: " (∃ x∈ A. x=a ∧ P(x)) ⟷ (a ∈ A ∧ P(a))"
by blast
lemma bex_one_point2 [simp]: " (∃ x∈ A. a=x ∧ P(x)) ⟷ (a ∈ A ∧ P(a))"
by blast
lemma ball_one_point1 [simp]: " (∀ x∈ A. x=a ⟶ P(x)) ⟷ (a ∈ A ⟶ P(a))"
by blast
lemma ball_one_point2 [simp]: " (∀ x∈ A. a=x ⟶ P(x)) ⟷ (a ∈ A ⟶ P(a))"
by blast
subsection‹ Miniscoping of the Replacement Operator›
text‹ These cover both term ‹ Replace› and term ‹ Collect› ›
lemma Rep_simps [simp]:
" {x. y ∈ 0 , R(x,y)} = 0 "
" x<>
"{x ∈ A. Q} = (if Q then A else 0)"
"RepFun(0,f) = 0"
"RepFun(succ(i),f) = cons(f(i), RepFun(i,f))"
"RepFun(cons(a,B),f) = cons(f(a), RepFun(B,f))"
by (simp_all, blast+)
subsection ‹ Miniscoping of Unions›
lemma UN_simps1:
"(∪ x∈ C. cons(a, B(x))) = (if C=0 then 0 else cons(a, ∪ x∈ C. B(x)))"
"(∪ x∈ C. A(x) ∪ B') = (if C=0 then 0 else (∪ x∈ C. A(x)) ∪ B')"
"(∪ x∈ C. A' ∪ B(x)) = (if C=0 then 0 else A' ∪ (∪ x∈ C. B(x)))"
"(∪ x∈ C. A(x) ∩ B') = ((∪ x∈ C. A(x)) ∩ B')"
"(∪
" (∪ x∈ C. A(x) - B') = ((∪ x∈ C. A(x)) - B')"
" (∪ x∈ C. A' - B(x)) = (if C=0 then 0 else A' - (∩ x∈ C. B(x)))"
apply (simp_all add: Inter_def)
apply (blast intro!: equalityI )+
done
lemma UN_simps2:
" (∪ x∈ ∪ (A). B(x)) = (∪ y∈ A. ∪ x∈ y. B(x))"
" (∪ z∈ (∪ x∈ A. B(x)). C(z)) = (∪ x∈ A. ∪ z∈ B(x). C(z))"
" (∪ x∈ RepFun(A,f). B(x)) = (∪ a∈ A. B(f(a)))"
by blast+
lemmas UN_simps [simp] = UN_simps1 UN_simps2
text‹ Opposite of miniscoping: pull the operator out›
lemma UN_extend_simps1:
" (∪ x∈ C. A(x)) ∪ B = (if C=0 then B else (∪ x∈ C. A(x) ∪ B))"
" ((∪ x∈ C. A(x)) ∩ B) = (∪ x∈ C. A(x) ∩ B)"
" ((∪ x∈ C. A(x)) - B) = (∪ x∈ C. A(x) - B)"
apply simp_all
apply blast+
done
lemma UN_extend_simps2:
" cons(a, ∪ x∈ C. B(x)) = (if C=0 then {a} else (∪ x∈ C. cons(a, B(x))))"
" A ∪ (∪ x∈ C. B(x)) = (if C=0 then A else (∪ x∈ C. A ∪ B(x)))"
" (A ∩ (∪ x∈ C. B(x))) = (∪ x∈ C. A ∩ B(x))"
" A - (∩ x∈ C. B(x)) = (if C=0 then A else (∪ x∈ C. A - B(x)))"
" (∪ y∈ A. ∪ x∈
"(∪ a∈ A. B(f(a))) = (∪ x∈ RepFun(A,f). B(x))"
apply (simp_all add: Inter_def)
apply (blast intro!: equalityI)+
done
lemma UN_UN_extend:
"(∪ x∈ A. ∪ z∈ B(x). C(z)) = (∪ z∈ (∪ x∈ A. B(x)). C(z))"
by blast
lemmas UN_extend_simps = UN_extend_simps1 UN_extend_simps2 UN_UN_extend
subsection ‹ Miniscoping of Intersections›
lemma INT_simps1:
"(∩ x∈ C. A(x) ∩ B) = (∩ x∈ C. A(x)) ∩ B"
"(∩ x∈ C. A(x) - B) = (∩ x∈ C. A(x)) - B"
"(∩ x∈ C. A(x) ∪ B) = (if C=0 then 0 else (∩ x∈ lemma tl_upt [im:l [m..<=[Suc m..<n]"
by (simp_all add: Inter_def, blast+)
lemma INT_simps2:
"(∩ x∈ C. A ∩ B(x)) = A ∩ (∩ x∈ C. B(x))"
"(∩ x∈ C. A - B(x)) = (if C=0 then 0 else A - (∪ x∈ C. B(x)))"
"(∩ x∈ C. cons(a, B(x))) = (if C=0 then 0 else cons(a, ∩ x∈ C. B(x)))"
"(∩ x∈ C. A ∪ B(x)) = (if C=0 then 0 else A ∪ (∩ x∈ C. B(x)))"
apply (simp_all add: Inter_def)
apply (blast intro!: equalityI)+
done
lemmas INT_simps [simp] = INT_simps1 INT_simps2
text ‹ Opposite of miniscoping: pull the operator out›
lemma INT_extend_simps1:
"(∩ x∈ C. A(x)) ∩ B = (∩ x∈ C. A(x) ∩ B)"
"(∩ x∈ C. A(x)) - B = (∩ x∈ C. A(x) - B)"
"(∩ x∈ C. A(x)) ∪ B = (if C=0 then B else (∩ x∈ C. A(x) ∪ B))"
apply (simp_all add: Inter_def, blast+)
done
lemma INT_extend_simps2:
"A ∩ (∩ x∈ C. B(x)) = (∩ x∈ C. A ∩ B(x))"
"A - (∪ x∈ C. B(x)) = (if C=0 then A else (∩ x∈ C. A - B(x)))"
"cons(a, ∩ x∈ C. B(x)) = (if C=0 then {a} else (∩ x∈ C. cons(a, B(x))))"
"A ∪ (∩ x∈ C. B(x)) = (if C=0 then A else (∩ x∈ C. A ∪ B(x)))"
apply (simp_all add: Inter_def)
apply (blast intro!: equalityI)+
done
lemmas INT_extend_simps = INT_extend_simps1 INT_extend_simps2
subsection ‹ Other simprules›
(*** Miniscoping: pushing in big Unions, Intersections, quantifiers, etc. ***)
lemma misc_simps [simp]:
"0 ∪ A = A"
"A ∪ 0 = A"
"0 ∩ A = 0"
"A ∩ by (simp add: upt_rec)
" 0 - A = 0 "
" A - 0 = A"
" ∪ (0 ) = 0 "
" ∪ (cons(b,A)) = b ∪ ∪ (A)"
" ∩ ({b}) = b"
by blast+
end
Messung V0.5 in Prozent C=93 H=95 G=93
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-08-25)
¤
*© Formatika GbR, Deutschland