# HG changeset patch # User nipkow # Date 1541408541 -3600 # Node ID 0e156963b636f135396359a88036a8cb9e83f9e4 # Parent 2dec32c7313f557e9ad8e4783eb8bc09c481355b simplified proof, moved lemma, added lemma diff -r 2dec32c7313f -r 0e156963b636 src/HOL/Finite_Set.thy --- a/src/HOL/Finite_Set.thy Sun Nov 04 17:19:56 2018 +0100 +++ b/src/HOL/Finite_Set.thy Mon Nov 05 10:02:21 2018 +0100 @@ -1872,6 +1872,10 @@ using assms by (force intro: card_mono simp: card_image [symmetric]) qed +lemma inj_on_iff_card_le: + "\ finite A; finite B \ \ (\f. inj_on f A \ f ` A \ B) = (card A \ card B)" +using card_inj_on_le[of _ A B] card_le_inj[of A B] by blast + lemma surj_card_le: "finite A \ B \ f ` A \ card B \ card A" by (blast intro: card_image_le card_mono le_trans) diff -r 2dec32c7313f -r 0e156963b636 src/HOL/Set_Interval.thy --- a/src/HOL/Set_Interval.thy Sun Nov 04 17:19:56 2018 +0100 +++ b/src/HOL/Set_Interval.thy Mon Nov 05 10:02:21 2018 +0100 @@ -1345,25 +1345,6 @@ thus "(\f. bij_betw f A B)" by blast qed (auto simp: bij_betw_same_card) -lemma inj_on_iff_card_le: - assumes FIN: "finite A" and FIN': "finite B" - shows "(\f. inj_on f A \ f ` A \ B) = (card A \ card B)" -proof (safe intro!: card_inj_on_le) - assume *: "card A \ card B" - obtain f where 1: "inj_on f A" and 2: "f ` A = {0 ..< card A}" - using FIN ex_bij_betw_finite_nat unfolding bij_betw_def by force - moreover obtain g where "inj_on g {0 ..< card B}" and 3: "g ` {0 ..< card B} = B" - using FIN' ex_bij_betw_nat_finite unfolding bij_betw_def by force - ultimately have "inj_on g (f ` A)" using subset_inj_on[of g _ "f ` A"] * by force - hence "inj_on (g \ f) A" using 1 comp_inj_on by blast - moreover - {have "{0 ..< card A} \ {0 ..< card B}" using * by force - with 2 have "f ` A \ {0 ..< card B}" by blast - hence "(g \ f) ` A \ B" unfolding comp_def using 3 by force - } - ultimately show "(\f. inj_on f A \ f ` A \ B)" by blast -qed (insert assms, auto) - lemma subset_eq_atLeast0_lessThan_card: fixes n :: nat assumes "N \ {0..Relational version of @{thm [source] card_inj_on_le}:\ +lemma card_le_if_inj_on_rel: +assumes "finite B" + "\a. a \ A \ \b. b\B \ r a b" + "\a1 a2 b. \ a1 \ A; a2 \ A; b \ B; r a1 b; r a2 b \ \ a1 = a2" +shows "card A \ card B" +proof - + let ?P = "\a b. b \ B \ r a b" + let ?f = "\a. SOME b. ?P a b" + have 1: "?f ` A \ B" by (auto intro: someI2_ex[OF assms(2)]) + have "inj_on ?f A" + proof (auto simp: inj_on_def) + fix a1 a2 assume asms: "a1 \ A" "a2 \ A" "?f a1 = ?f a2" + have 0: "?f a1 \ B" using "1" \a1 \ A\ by blast + have 1: "r a1 (?f a1)" using someI_ex[OF assms(2)[OF \a1 \ A\]] by blast + have 2: "r a2 (?f a1)" using someI_ex[OF assms(2)[OF \a2 \ A\]] asms(3) by auto + show "a1 = a2" using assms(3)[OF asms(1,2) 0 1 2] . + qed + with 1 show ?thesis using card_inj_on_le[of ?f A B] assms(1) by simp +qed + subsection \Intervals of integers\