abbreviation
RESPECTS ::"[i==>i, i] ==> o" (infixr‹respects› 80) where "f respects r ≡ congruent(r,f)"
abbreviation
RESPECTS2 ::"[i==>i==>i, i] ==> o" (infixr‹respects2 › 80) where "f respects2 r ≡ congruent2(r,r,f)" 🍋‹Abbreviation for the common case where the relations are identical›
subsection‹Suppes, Theorem 70: 🍋‹r› i
(** first half: equiv(A,r) \<Longrightarrow> converse(r) O r = r **)
lemma sym_trans_comp_subset: "[sym(r); trans(r)]==> converse(r) O r ⊆ r" by (unfold trans_def sym_def, blast)
lemma refl_comp_subset: "[refl(A,r); r ⊆ A*A]==> r ⊆ converse(r) O r" by (unfold refl_def, blast)
lemma equiv_comp_eq: "equiv(A,r) ==> converse(r) O r = r" unfolding equiv_def apply (blast del: subsetI intro!: sym_trans_comp_subset refl_comp_subset) done
(*second half*) lemma comp_equivI: "[converse(r) O r = r; domain(r) = A]==> equiv(A,r)" unfolding equiv_def refl_def sym_def trans_def apply (erule equalityE) apply (subgoal_tac "∀x y. ⟨x,y⟩∈ r ⟶⟨y,x⟩∈ r", blast+) done
(** Equivalence classes **)
(*Lemma for the next result*) lemma equiv_class_subset: "[sym(r); trans(r); ⟨a,b⟩: r]==> r``{a} ⊆ r``{b}" by (unfold trans_def sym_def, blast)
(*type checking of @{term"\<Union>x\<in>r``{a}. b(x)"} *) lemma UN_equiv_class_type: "[equiv(A,r); b respects r; X ∈ A//r; ∧x. x ∈ A ==> b(x) ∈ B] ==> (∪x∈X. b(x)) ∈ B" apply (unfold quotient_def, safe) apply (simp (no_asm_simp) add: UN_equiv_class) done
(*Sufficient conditions for injectiveness. Could weaken premises! major premise could be an inclusion; bcong could be ∧y. y ∈ A ==> b(y):B *) lemma UN_equiv_class_inject: "[equiv(A,r); b respects r; (∪x∈X. b(x))=(∪y∈Y. b(y)); X ∈ A//r; Y ∈ A//r; ∧x y. [x ∈ A; y ∈ A; b(x)=b(y)]==>⟨x,y⟩:r] ==> X=Y" apply (unfold quotient_def, safe) apply (rule equiv_class_eq, assumption) apply (simp add: UN_equiv_class [of A r b]) done
subsection‹Defining Binary Operations upon Equivalence Classes›
lemma congruent2_implies_congruent: "[equiv(A,r1); congruent2(r1,r2,b); a ∈ A]==> congruent(r2,b(a))" by (unfold congruent_def congruent2_def equiv_def refl_def, blast)
(*Suggested by John Harrison -- the two subproofs may be MUCH simpler than the direct proof*) lemma congruent2I: "[equiv(A1,r1); equiv(A2,r2); ∧y z w. [w ∈ A2; ⟨y,z⟩∈ r1]==> b(y,w) = b(z,w); ∧y z w. [w ∈ A1; ⟨y,z⟩∈ r2]==> b(w,y) = b(w,z) \==> congruent2(r1,r2,b)" apply (unfold congruent2_def equiv_def refl_def, safe) apply (blast intro: trans) done
lemma congruent2_commuteI: assumes equivA: "equiv(A,r)" and commute: "∧y z. [y ∈ A; z ∈ A]==> b(y,z) = b(z,y)" and congt: "∧y z w. [w ∈ A; ⟨y,z⟩: r]==> b(w,y) = b(w,z)" shows"b respects2 r" apply (insert equivA [THEN equiv_type, THEN subsetD]) apply (rule congruent2I [OF equivA equivA]) apply (rule commute [THEN trans]) apply (rule_tac [3] commute [THEN trans, symmetric]) apply (rule_tac [5] sym) apply (blast intro: congt)+ done
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.