Потужність множин

Аналіз I, Розділ 3.6: Кардинальність множин

Я (пр.перекл. Терренс Тао) намагався зробити переклад якомога точнішим перефразуванням оригінального тексту. Коли є вибір між більш ідіоматичним рішенням Lean та більш точним перекладом, я зазвичай обирав останній. Зокрема, будуть місця, де код Lean можна було б "підбуцнути", щоб зробити його більш елегантним та ідіоматичним, але я свідомо уникав цього вибору.

Основні конструкції та результати цього розділу:

  • Потужність множини

  • Скінченні та нескінченні множини

  • Зв'язки з Mathlib-івськіми еквівалентами

Після цього розділу ці нотації будуть вважатися застарілими на користь їхніх еквівалентів із Mathlib.

Підказки від попередніх користувачів

Користувачі супровідного матеріалу, які виконали вправи в цьому розділі, можуть надсилати свої поради майбутнім користувачам цього розділу як PRи.

  • (Додайте підказку тут)

namespace Chapter3export SetTheory (Set Object nat)variable [SetTheory]

Визначення 3.6.1 (Рівна потужність)

abbrev SetTheory.Set.EqualCard (X Y:Set) : Prop := f : X Y, Function.Bijective f

Приклад 3.6.2

theorem SetTheory.Set.Example_3_6_2 : EqualCard {0,1,2} {3,4,5} := inst✝:SetTheory{0, 1, 2}.EqualCard {3, 4, 5} use open Classical in fun x if x.val = 0 then 3 else if x.val = 1 then 4 else 5, inst✝:SetTheoryx:{0, 1, 2}.toSubtype(if x = 0 then 3 else if x = 1 then 4 else 5) {3, 4, 5} All goals completed! 🐙 inst✝:SetTheoryFunction.Injective fun x => if x = 0 then 3 else if x = 1 then 4 else 5, inst✝:SetTheoryFunction.Surjective fun x => if x = 0 then 3 else if x = 1 then 4 else 5, inst✝:SetTheoryFunction.Injective fun x => if x = 0 then 3 else if x = 1 then 4 else 5, inst✝:SetTheorya₁✝:{0, 1, 2}.toSubtype a₂ : {0, 1, 2}.toSubtype⦄, (fun x => if x = 0 then 3 else if x = 1 then 4 else 5, ) a₁✝ = (fun x => if x = 0 then 3 else if x = 1 then 4 else 5, ) a₂ a₁✝ = a₂; All goals completed! 🐙 inst✝:SetTheoryy:{3, 4, 5}.toSubtype a, (fun x => if x = 0 then 3 else if x = 1 then 4 else 5, ) a = y have : y = (3: Object) y = (4: Object) y = (5: Object) := inst✝:SetTheory{0, 1, 2}.EqualCard {3, 4, 5} inst✝:SetTheoryy:{3, 4, 5}.toSubtypethis:?_mvar.79743 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)y = 3 y = 4 y = 5 All goals completed! 🐙 inst✝:SetTheoryy:{3, 4, 5}.toSubtypeh✝:y = 3 a, (fun x => if x = 0 then 3 else if x = 1 then 4 else 5, ) a = yinst✝:SetTheoryy:{3, 4, 5}.toSubtypeh✝:y = 4 a, (fun x => if x = 0 then 3 else if x = 1 then 4 else 5, ) a = yinst✝:SetTheoryy:{3, 4, 5}.toSubtypeh✝:y = 5 a, (fun x => if x = 0 then 3 else if x = 1 then 4 else 5, ) a = y inst✝:SetTheoryy:{3, 4, 5}.toSubtypeh✝:y = 3 a, (fun x => if x = 0 then 3 else if x = 1 then 4 else 5, ) a = y use 0, inst✝:SetTheoryy:{3, 4, 5}.toSubtypeh✝:y = 30 {0, 1, 2} All goals completed! 🐙; All goals completed! 🐙 inst✝:SetTheoryy:{3, 4, 5}.toSubtypeh✝:y = 4 a, (fun x => if x = 0 then 3 else if x = 1 then 4 else 5, ) a = y use 1, inst✝:SetTheoryy:{3, 4, 5}.toSubtypeh✝:y = 41 {0, 1, 2} All goals completed! 🐙; All goals completed! 🐙 inst✝:SetTheoryy:{3, 4, 5}.toSubtypeh✝:y = 5 a, (fun x => if x = 0 then 3 else if x = 1 then 4 else 5, ) a = y use 2, inst✝:SetTheoryy:{3, 4, 5}.toSubtypeh✝:y = 52 {0, 1, 2} All goals completed! 🐙; All goals completed! 🐙

Приклад 3.6.3

theorem declaration uses 'sorry'SetTheory.Set.Example_3_6_3 : EqualCard nat (nat.specify (fun x Even (x:))) := inst✝:SetTheorynat.EqualCard (nat.specify fun x => Even (nat_equiv.symm x)) All goals completed! 🐙
@[refl] theorem declaration uses 'sorry'SetTheory.Set.EqualCard.refl (X:Set) : EqualCard X X := inst✝:SetTheoryX:SetX.EqualCard X All goals completed! 🐙@[symm] theorem declaration uses 'sorry'SetTheory.Set.EqualCard.symm {X Y:Set} (h: EqualCard X Y) : EqualCard Y X := inst✝:SetTheoryX:SetY:Seth:X.EqualCard YY.EqualCard X All goals completed! 🐙@[trans] theorem declaration uses 'sorry'SetTheory.Set.EqualCard.trans {X Y Z:Set} (h1: EqualCard X Y) (h2: EqualCard Y Z) : EqualCard X Z := inst✝:SetTheoryX:SetY:SetZ:Seth1:X.EqualCard Yh2:Y.EqualCard ZX.EqualCard Z All goals completed! 🐙

Твердження 3.6.4 / Вправа 3.6.1

instance SetTheory.Set.EqualCard.inst_setoid : Setoid SetTheory.Set := EqualCard, {refl, symm, trans}

Визначення 3.6.5

abbrev SetTheory.Set.has_card (X:Set) (n:) : Prop := X Fin n
theorem SetTheory.Set.has_card_iff (X:Set) (n:) : X.has_card n f: X Fin n, Function.Bijective f := inst✝:SetTheoryX:Setn:X.has_card n f, Function.Bijective f All goals completed! 🐙

Ремарка 3.6.6

theorem declaration uses 'sorry'SetTheory.Set.Remark_3_6_6 (n:) : (nat.specify (fun x 1 (x:) (x:) n)).has_card n := inst✝:SetTheoryn:(nat.specify fun x => 1 nat_equiv.symm x nat_equiv.symm x n).has_card n All goals completed! 🐙

Приклад 3.6.7

theorem SetTheory.Set.Example_3_6_7a (a:Object) : ({a}:Set).has_card 1 := inst✝:SetTheorya:Object{a}.has_card 1 inst✝:SetTheorya:Object f, Function.Bijective f use fun _ Fin_mk _ 0 (inst✝:SetTheorya:Objectx✝:{a}.toSubtype0 < 1 All goals completed! 🐙) inst✝:SetTheorya:ObjectFunction.Injective fun x => Fin_mk 1 0 inst✝:SetTheorya:ObjectFunction.Surjective fun x => Fin_mk 1 0 inst✝:SetTheorya:ObjectFunction.Injective fun x => Fin_mk 1 0 inst✝:SetTheorya:Objectx1:{a}.toSubtypex2:{a}.toSubtypehf:(fun x => Fin_mk 1 0 ) x1 = (fun x => Fin_mk 1 0 ) x2x1 = x2; All goals completed! 🐙 inst✝:SetTheorya:Objecty:(Fin 1).toSubtype a_1, (fun x => Fin_mk 1 0 ) a_1 = y use a, inst✝:SetTheorya:Objecty:(Fin 1).toSubtypea {a} All goals completed! 🐙 inst✝:SetTheorya:Objecty:(Fin 1).toSubtypethis:?_mvar.134821 := Chapter3.SetTheory.Set.Fin.toNat_lt _fvar.134684(fun x => Fin_mk 1 0 ) a, = y All goals completed! 🐙
theorem SetTheory.Set.Example_3_6_7b {a b c d:Object} (hab: a b) (hac: a c) (had: a d) (hbc: b c) (hbd: b d) (hcd: c d) : ({a,b,c,d}:Set).has_card 4 := inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c d{a, b, c, d}.has_card 4 inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c d f, Function.Bijective f use open Classical in fun x Fin_mk _ ( if x.val = a then 0 else if x.val = b then 1 else if x.val = c then 2 else 3 ) (inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dx:{a, b, c, d}.toSubtype(if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) < 4 All goals completed! 🐙) inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dFunction.Injective fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dFunction.Surjective fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dFunction.Injective fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dx1:{a, b, c, d}.toSubtypex2:{a, b, c, d}.toSubtypehf:(fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) x1 = (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) x2x1 = x2; All goals completed! 🐙 inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtype a_1, (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) a_1 = y have : y = (0:) y = (1:) y = (2:) y = (3:) := inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c d{a, b, c, d}.has_card 4 inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypethis:?_mvar.233132 := Chapter3.SetTheory.Set.Fin.toNat_lt _fvar.215234y = 0 y = 1 y = 2 y = 3 All goals completed! 🐙 inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 0 a_1, (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) a_1 = yinst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 1 a_1, (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) a_1 = yinst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 2 a_1, (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) a_1 = yinst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 3 a_1, (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) a_1 = y inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 0 a_1, (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) a_1 = y use a, inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 0a {a, b, c, d} All goals completed! 🐙; All goals completed! 🐙 inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 1 a_1, (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) a_1 = y use b, inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 1b {a, b, c, d} All goals completed! 🐙; All goals completed! 🐙 inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 2 a_1, (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) a_1 = y use c, inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 2c {a, b, c, d} All goals completed! 🐙; All goals completed! 🐙 inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 3 a_1, (fun x => Fin_mk 4 (if x = a then 0 else if x = b then 1 else if x = c then 2 else 3) ) a_1 = y use d, inst✝:SetTheorya:Objectb:Objectc:Objectd:Objecthab:a bhac:a chad:a dhbc:b chbd:b dhcd:c dy:(Fin 4).toSubtypeh✝:y = 3d {a, b, c, d} All goals completed! 🐙; All goals completed! 🐙

Лема 3.6.9

theorem declaration uses 'sorry'SetTheory.Set.pos_card_nonempty {n:} (h: n 1) {X:Set} (hX: X.has_card n) : X := inst✝:SetTheoryn:h:n 1X:SethX:X.has_card nX -- цей доказ написан так, щоб співпадати із структурою орігінального тексту. inst✝:SetTheoryn:h:n 1X:SethX:X.has_card nthis:X = False have hnon : Fin n := inst✝:SetTheoryn:h:n 1X:SethX:X.has_card nX inst✝:SetTheoryn:h:n 1X:SethX:X.has_card nthis:X = 0 Fin n; inst✝:SetTheoryn:h:n 1X:SethX:X.has_card nthis:X = m < n, 0 = m; use 0, (inst✝:SetTheoryn:h:n 1X:SethX:X.has_card nthis:X = 0 < n All goals completed! 🐙); All goals completed! 🐙 inst✝:SetTheoryn:h:n 1X:SethX: f, Function.Bijective fthis:X = hnon:Fin n False inst✝:SetTheoryn:h:n 1X:Setthis:X = hnon:Fin n f:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fFalse All goals completed! 🐙
-- отримай протиріччя із того факту, що `f` є біекцією -- з порожньої множини на непорожню множину

Вправа 3.6.2a

theorem declaration uses 'sorry'SetTheory.Set.has_card_zero {X:Set} : X.has_card 0 X = := inst✝:SetTheoryX:SetX.has_card 0 X = All goals completed! 🐙

Лема 3.6.9

theorem declaration uses 'sorry'SetTheory.Set.card_erase {n:} (h: n 1) {X:Set} (hX: X.has_card n) (x:X) : (X \ {x.val}).has_card (n-1) := inst✝:SetTheoryn:h:n 1X:SethX:X.has_card nx:X.toSubtype(X \ {x}).has_card (n - 1) -- Цей доказ був переписний із оригінального тексту, щоб зробити його -- більш дружним для формалізації в Lean inst✝:SetTheoryn:h:n 1X:SethX: f, Function.Bijective fx:X.toSubtype(X \ {x}).has_card (n - 1); inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective f(X \ {x}).has_card (n - 1) inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)X'.has_card (n - 1) set ι : X' X := fun y, hy y, inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)x✝:X'.toSubtypey:Objecthy:y X'y X All goals completed! 🐙 inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = aX'.has_card (n - 1) inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nhm₀f:(f x) = m₀X'.has_card (n - 1) set g : X' Fin (n-1) := fun x' let := Fin.toNat_lt (f (ι x')) let : (f (ι x'):) m₀ := inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nhm₀f:(f x) = m₀x':X'.toSubtypethis:(@_fvar.271986 (@_fvar.274488 _fvar.275348)) < _fvar.271942 := Chapter3.SetTheory.Set.Fin.toNat_lt (@_fvar.271986 (@_fvar.274488 _fvar.275348))(f (ι x')) m₀ inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nhm₀f:(f x) = m₀x':X'.toSubtypethis✝:(@_fvar.271986 (@_fvar.274488 _fvar.275348)) < _fvar.271942 := Chapter3.SetTheory.Set.Fin.toNat_lt (@_fvar.271986 (@_fvar.274488 _fvar.275348))this:(f (ι x')) = m₀False; inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nx':X'.toSubtypethis✝:(@_fvar.271986 (@_fvar.274488 _fvar.275348)) < _fvar.271942 := Chapter3.SetTheory.Set.Fin.toNat_lt (@_fvar.271986 (@_fvar.274488 _fvar.275348))this:(f (ι x')) = m₀hm₀f:x = x', False inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nx':X'.toSubtypethis✝¹:(@_fvar.271986 (@_fvar.274488 _fvar.275348)) < _fvar.271942 := Chapter3.SetTheory.Set.Fin.toNat_lt (@_fvar.271986 (@_fvar.274488 _fvar.275348))this✝:(f (ι x')) = m₀hm₀f:x = x', this:?_mvar.282467 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)False; All goals completed! 🐙 if h' : f (ι x') < m₀ then Fin_mk _ (f (ι x')) (inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nhm₀f:(f x) = m₀x':X'.toSubtypethis✝:(@_fvar.271986 (@_fvar.274488 _fvar.275348)) < _fvar.271942 := Chapter3.SetTheory.Set.Fin.toNat_lt (@_fvar.271986 (@_fvar.274488 _fvar.275348))this:(@_fvar.271986 (@_fvar.274488 _fvar.275348)) _fvar.275218 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)h':(f (ι x')) < m₀(f (ι x')) < n - 1 All goals completed! 🐙) else Fin_mk _ (f (ι x') - 1) (inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nhm₀f:(f x) = m₀x':X'.toSubtypethis✝:(@_fvar.271986 (@_fvar.274488 _fvar.275348)) < _fvar.271942 := Chapter3.SetTheory.Set.Fin.toNat_lt (@_fvar.271986 (@_fvar.274488 _fvar.275348))this:(@_fvar.271986 (@_fvar.274488 _fvar.275348)) _fvar.275218 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)h':¬(f (ι x')) < m₀(f (ι x')) - 1 < n - 1 All goals completed! 🐙) have hg_def (x':X') : if (f (ι x'):) < m₀ then (g x':) = f (ι x') else (g x':) = f (ι x') - 1 := inst✝:SetTheoryn:h:n 1X:SethX:X.has_card nx:X.toSubtype(X \ {x}).has_card (n - 1) inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nhm₀f:(f x) = m₀g:Chapter3.SetTheory.Set.toSubtype _fvar.272097 (Chapter3.SetTheory.Set.Fin (_fvar.271942 - 1)).toSubtype := fun x' => let this := ; let this := ; if h' : (@_fvar.271986 (@_fvar.274488 x')) < _fvar.275218 then Chapter3.SetTheory.Set.Fin_mk (_fvar.271942 - 1) (@_fvar.271986 (@_fvar.274488 x')) else Chapter3.SetTheory.Set.Fin_mk (_fvar.271942 - 1) ((@_fvar.271986 (@_fvar.274488 x')) - 1) x':X'.toSubtypeh':(f (ι x')) < m₀(g x') = (f (ι x'))inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nhm₀f:(f x) = m₀g:Chapter3.SetTheory.Set.toSubtype _fvar.272097 (Chapter3.SetTheory.Set.Fin (_fvar.271942 - 1)).toSubtype := fun x' => let this := ; let this := ; if h' : (@_fvar.271986 (@_fvar.274488 x')) < _fvar.275218 then Chapter3.SetTheory.Set.Fin_mk (_fvar.271942 - 1) (@_fvar.271986 (@_fvar.274488 x')) else Chapter3.SetTheory.Set.Fin_mk (_fvar.271942 - 1) ((@_fvar.271986 (@_fvar.274488 x')) - 1) x':X'.toSubtypeh':¬(f (ι x')) < m₀(g x') = (f (ι x')) - 1 inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nhm₀f:(f x) = m₀g:Chapter3.SetTheory.Set.toSubtype _fvar.272097 (Chapter3.SetTheory.Set.Fin (_fvar.271942 - 1)).toSubtype := fun x' => let this := ; let this := ; if h' : (@_fvar.271986 (@_fvar.274488 x')) < _fvar.275218 then Chapter3.SetTheory.Set.Fin_mk (_fvar.271942 - 1) (@_fvar.271986 (@_fvar.274488 x')) else Chapter3.SetTheory.Set.Fin_mk (_fvar.271942 - 1) ((@_fvar.271986 (@_fvar.274488 x')) - 1) x':X'.toSubtypeh':(f (ι x')) < m₀(g x') = (f (ι x'))inst✝:SetTheoryn:h:n 1X:Setx:X.toSubtypef:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fX':Chapter3.Set := @sdiff Chapter3.Set Chapter3.SetTheory.Set.instSDiff _fvar.271944 (@singleton Chapter3.Object Chapter3.Set Chapter3.SetTheory.Set.instSingleton _fvar.271972)ι:Chapter3.SetTheory.Set.toSubtype _fvar.272097 Chapter3.SetTheory.Set.toSubtype _fvar.271944 := fun x => match x with | y, hy => y, : (a : X'.toSubtype), (ι a) = am₀:hm₀:m₀ < nhm₀f:(f x) = m₀g:Chapter3.SetTheory.Set.toSubtype _fvar.272097 (Chapter3.SetTheory.Set.Fin (_fvar.271942 - 1)).toSubtype := fun x' => let this := ; let this := ; if h' : (@_fvar.271986 (@_fvar.274488 x')) < _fvar.275218 then Chapter3.SetTheory.Set.Fin_mk (_fvar.271942 - 1) (@_fvar.271986 (@_fvar.274488 x')) else Chapter3.SetTheory.Set.Fin_mk (_fvar.271942 - 1) ((@_fvar.271986 (@_fvar.274488 x')) - 1) x':X'.toSubtypeh':¬(f (ι x')) < m₀(g x') = (f (ι x')) - 1 All goals completed! 🐙 have hg : Function.Bijective g := inst✝:SetTheoryn:h:n 1X:SethX:X.has_card nx:X.toSubtype(X \ {x}).has_card (n - 1) All goals completed! 🐙 All goals completed! 🐙

Твердження 3.6.8 (Унікальність потужності)

theorem SetTheory.Set.card_uniq {X:Set} {n m:} (h1: X.has_card n) (h2: X.has_card m) : n = m := inst✝:SetTheoryX:Setn:m:h1:X.has_card nh2:X.has_card mn = m -- цей доказ написан так, щоб співпадати із структурою орігінального тексту. inst✝:SetTheoryn: {X : Set} {m : }, X.has_card n X.has_card m n = m; inst✝:SetTheory {X : Set} {m : }, X.has_card 0 X.has_card m 0 = minst✝:SetTheoryn:hn: {X : Set} {m : }, X.has_card n X.has_card m n = m {X : Set} {m : }, X.has_card (n + 1) X.has_card m n + 1 = m inst✝:SetTheory {X : Set} {m : }, X.has_card 0 X.has_card m 0 = m inst✝:SetTheoryX✝:Setm✝:h1:X✝.has_card 0h2:X✝.has_card m✝0 = m✝; inst✝:SetTheoryX✝:Setm✝:h1:X✝ = h2:X✝.has_card m✝0 = m✝; inst✝:SetTheoryX✝:Setm✝:h2:X✝.has_card m✝h1:0 m✝X✝ inst✝:SetTheoryX✝:Setm✝:h2:X✝.has_card m✝h1:0 m✝m✝ 1; All goals completed! 🐙 inst✝:SetTheoryn:hn: {X : Set} {m : }, X.has_card n X.has_card m n = mX:Setm:h1:X.has_card (n + 1)h2:X.has_card mn + 1 = m have : X := pos_card_nonempty (inst✝:SetTheoryn:hn: {X : Set} {m : }, X.has_card n X.has_card m n = mX:Setm:h1:X.has_card (n + 1)h2:X.has_card mn + 1 1 All goals completed! 🐙) h1 inst✝:SetTheoryn:hn: {X : Set} {m : }, X.has_card n X.has_card m n = mX:Setm:h1:X.has_card (n + 1)h2:X.has_card mthis:_fvar.301234 := Chapter3.SetTheory.Set.pos_card_nonempty ?_mvar.301360 _fvar.301240x:Objecthx:x Xn + 1 = m have : m 0 := inst✝:SetTheoryX:Setn:m:h1:X.has_card nh2:X.has_card mn = m inst✝:SetTheoryn:hn: {X : Set} {m : }, X.has_card n X.has_card m n = mX:Setm:h1:X.has_card (n + 1)h2:X.has_card mx:Objecthx:x Xthis:m = 0X = ; All goals completed! 🐙 inst✝:SetTheoryn:hn: {X : Set} {m : }, X.has_card n X.has_card m n = mX:Setm:h1:X.has_card (n + 1)h2:X.has_card mthis✝:_fvar.301234 := Chapter3.SetTheory.Set.pos_card_nonempty ?_mvar.301360 _fvar.301240x:Objecthx:x Xthis:_fvar.301237 0 := ?_mvar.301519n + 1 1inst✝:SetTheoryn:hn: {X : Set} {m : }, X.has_card n X.has_card m n = mX:Setm:h1:X.has_card (n + 1)h2:X.has_card mthis✝:_fvar.301234 := Chapter3.SetTheory.Set.pos_card_nonempty ?_mvar.301360 _fvar.301240x:Objecthx:x Xthis:_fvar.301237 0 := ?_mvar.301519m 1inst✝:SetTheoryn:X:Setm:h1:X.has_card (n + 1)h2:X.has_card mthis✝:_fvar.301234 := Chapter3.SetTheory.Set.pos_card_nonempty ?_mvar.301360 _fvar.301240x:Objecthx:x Xthis:_fvar.301237 0 := ?_mvar.301519hn:n = m - 1n + 1 = m inst✝:SetTheoryn:hn: {X : Set} {m : }, X.has_card n X.has_card m n = mX:Setm:h1:X.has_card (n + 1)h2:X.has_card mthis✝:_fvar.301234 := Chapter3.SetTheory.Set.pos_card_nonempty ?_mvar.301360 _fvar.301240x:Objecthx:x Xthis:_fvar.301237 0 := ?_mvar.301519n + 1 1inst✝:SetTheoryn:hn: {X : Set} {m : }, X.has_card n X.has_card m n = mX:Setm:h1:X.has_card (n + 1)h2:X.has_card mthis✝:_fvar.301234 := Chapter3.SetTheory.Set.pos_card_nonempty ?_mvar.301360 _fvar.301240x:Objecthx:x Xthis:_fvar.301237 0 := ?_mvar.301519m 1inst✝:SetTheoryn:X:Setm:h1:X.has_card (n + 1)h2:X.has_card mthis✝:_fvar.301234 := Chapter3.SetTheory.Set.pos_card_nonempty ?_mvar.301360 _fvar.301240x:Objecthx:x Xthis:_fvar.301237 0 := ?_mvar.301519hn:n = m - 1n + 1 = m All goals completed! 🐙
lemma SetTheory.Set.Example_3_6_8_a: ({0,1,2}:Set).has_card 3 := inst✝:SetTheory{0, 1, 2}.has_card 3 inst✝:SetTheory f, Function.Bijective f have : ({0, 1, 2}: Set) = SetTheory.Set.Fin 3 := inst✝:SetTheory{0, 1, 2}.has_card 3 inst✝:SetTheoryx:Objectx {0, 1, 2} x Fin 3 inst✝:SetTheoryx:Objectx = 0 x = 1 x = 2 m < 3, x = m inst✝:SetTheoryx:Objectx = 0 x = 1 x = 2 m < 3, x = minst✝:SetTheoryx:Object(∃ m < 3, x = m) x = 0 x = 1 x = 2 inst✝:SetTheoryx:Objectx = 0 x = 1 x = 2 m < 3, x = m All goals completed! 🐙 inst✝:SetTheoryx:left✝:x < 3x = 0 x = 1 x = 2 inst✝:SetTheoryx:left✝:x < 3x = 0 x = 1 x = 2 All goals completed! 🐙 inst✝:SetTheorythis:{0, 1, 2} = Chapter3.SetTheory.Set.Fin 3 := ?_mvar.302860 f, Function.Bijective f inst✝:SetTheorythis:{0, 1, 2} = Chapter3.SetTheory.Set.Fin 3 := ?_mvar.302860Function.Bijective id All goals completed! 🐙lemma SetTheory.Set.Example_3_6_8_b: ({3,4}:Set).has_card 2 := inst✝:SetTheory{3, 4}.has_card 2 inst✝:SetTheory f, Function.Bijective f use open Classical in fun x Fin_mk _ (if x = (3:Object) then 0 else 1) (inst✝:SetTheoryx:{3, 4}.toSubtype(if x = 3 then 0 else 1) < 2 All goals completed! 🐙) inst✝:SetTheoryFunction.Injective fun x => Fin_mk 2 (if x = 3 then 0 else 1) inst✝:SetTheoryFunction.Surjective fun x => Fin_mk 2 (if x = 3 then 0 else 1) inst✝:SetTheoryFunction.Injective fun x => Fin_mk 2 (if x = 3 then 0 else 1) inst✝:SetTheoryx1:{3, 4}.toSubtypex2:{3, 4}.toSubtype(fun x => Fin_mk 2 (if x = 3 then 0 else 1) ) x1 = (fun x => Fin_mk 2 (if x = 3 then 0 else 1) ) x2 x1 = x2 All goals completed! 🐙 inst✝:SetTheoryy:(Fin 2).toSubtype a, (fun x => Fin_mk 2 (if x = 3 then 0 else 1) ) a = y inst✝:SetTheoryy:(Fin 2).toSubtypethis:?_mvar.328400 := Chapter3.SetTheory.Set.Fin.toNat_lt _fvar.328396 a, (fun x => Fin_mk 2 (if x = 3 then 0 else 1) ) a = y have : y = (0:) y = (1:) := inst✝:SetTheory{3, 4}.has_card 2 All goals completed! 🐙 All goals completed! 🐙lemma SetTheory.Set.Example_3_6_8_c : ¬({0,1,2}:Set) ({3,4}:Set) := inst✝:SetTheory¬{0, 1, 2} {3, 4} inst✝:SetTheoryh:{0, 1, 2} {3, 4}False inst✝:SetTheoryh:{0, 1, 2} {3, 4}h1:Chapter3.SetTheory.Set.Fin 3 Chapter3.SetTheory.Set.Fin 2 := Chapter3.SetTheory.Set.EqualCard.trans (Chapter3.SetTheory.Set.EqualCard.trans (Chapter3.SetTheory.Set.EqualCard.symm Chapter3.SetTheory.Set.Example_3_6_8_a) _fvar.373641) Chapter3.SetTheory.Set.Example_3_6_8_bFalse have h2 : Fin 3 Fin 3 := inst✝:SetTheory¬{0, 1, 2} {3, 4} All goals completed! 🐙 inst✝:SetTheoryh:{0, 1, 2} {3, 4}h1:Chapter3.SetTheory.Set.Fin 3 Chapter3.SetTheory.Set.Fin 2 := Chapter3.SetTheory.Set.EqualCard.trans (Chapter3.SetTheory.Set.EqualCard.trans (Chapter3.SetTheory.Set.EqualCard.symm Chapter3.SetTheory.Set.Example_3_6_8_a) _fvar.373641) Chapter3.SetTheory.Set.Example_3_6_8_bh2:Chapter3.SetTheory.Set.Fin 3 Chapter3.SetTheory.Set.Fin 3 := ?_mvar.373795this:?_mvar.373823 := Chapter3.SetTheory.Set.card_uniq _fvar.373755 _fvar.373796False All goals completed! 🐙abbrev SetTheory.Set.finite (X:Set) : Prop := n:, X.has_card nabbrev SetTheory.Set.infinite (X:Set) : Prop := ¬ finite X

Вправа 3.6.3, сформульовано з використанням натуральних чисел Mathlib

theorem declaration uses 'sorry'SetTheory.Set.bounded_on_finite {n:} (f: Fin n nat) : M, i, (f i:) M := inst✝:SetTheoryn:f:(Fin n).toSubtype nat.toSubtype M, (i : (Fin n).toSubtype), nat_equiv.symm (f i) M All goals completed! 🐙

Теорема 3.6.12

theorem SetTheory.Set.nat_infinite : infinite nat := inst✝:SetTheorynat.infinite -- цей доказ написан так, щоб співпадати із структурою орігінального тексту. inst✝:SetTheorythis:nat.finiteFalse; inst✝:SetTheoryn:hn:nat.has_card nFalse inst✝:SetTheoryn:hn:nat Fin nFalse; inst✝:SetTheoryn:hn:Fin n natFalse; inst✝:SetTheoryn:hn: f, Function.Bijective fFalse inst✝:SetTheoryn:f:(Fin n).toSubtype nat.toSubtypehf:Function.Bijective fFalse; inst✝:SetTheoryn:f:(Fin n).toSubtype nat.toSubtypehf:Function.Bijective fM:hM: (i : (Fin n).toSubtype), nat_equiv.symm (f i) MFalse inst✝:SetTheoryn:f:(Fin n).toSubtype nat.toSubtypeM:hM: (i : (Fin n).toSubtype), nat_equiv.symm (f i) Mhf:?_mvar.381182 := Function.Bijective.surjective _fvar.381158 (_fvar.381174 + 1)False; inst✝:SetTheoryn:f:(Fin n).toSubtype nat.toSubtypeM:hM: (i : (Fin n).toSubtype), nat_equiv.symm (f i) Mhf:¬False (a : (Fin n).toSubtype), f a (M + 1) inst✝:SetTheoryn:f:(Fin n).toSubtype nat.toSubtypeM:hM: (i : (Fin n).toSubtype), nat_equiv.symm (f i) Mhf:¬Falsea✝:(Fin n).toSubtypehi:nat_equiv.symm (f a✝) Mf a✝ (M + 1); inst✝:SetTheoryn:f:(Fin n).toSubtype nat.toSubtypeM:hM: (i : (Fin n).toSubtype), nat_equiv.symm (f i) Mhf:¬Falsea✝:(Fin n).toSubtypehi:f a✝ = (M + 1)M < nat_equiv.symm (f a✝) inst✝:SetTheoryn:f:(Fin n).toSubtype nat.toSubtypeM:hM: (i : (Fin n).toSubtype), nat_equiv.symm (f i) Mhf:¬Falsea✝:(Fin n).toSubtypehi:nat_equiv.symm (f a✝) = nat_equiv.symm (M + 1)M < nat_equiv.symm (f a✝); All goals completed! 🐙
open Classical in /-- Для цілей Lean зручно надавати нескінченним множинам ``сміттєву`` потужність як нуль. -/ noncomputable def SetTheory.Set.card (X:Set) : := if h:X.finite then h.choose else 0theorem SetTheory.Set.has_card_card {X:Set} (hX: X.finite) : X.has_card (SetTheory.Set.card X) := inst✝:SetTheoryX:SethX:X.finiteX.has_card X.card All goals completed! 🐙theorem SetTheory.Set.has_card_to_card {X:Set} {n: }: X.has_card n X.card = n := inst✝:SetTheoryX:Setn:X.has_card n X.card = n inst✝:SetTheoryX:Setn:h:X.has_card nX.card = n; inst✝:SetTheoryX:Setn:h:X.has_card n(∀ (x : ), ¬X.has_card x) 0 = n; All goals completed! 🐙theorem SetTheory.Set.card_to_has_card {X:Set} {n: } (hn: n 0): X.card = n X.has_card n := inst✝:SetTheoryX:Setn:hn:n 0X.card = n X.has_card n All goals completed! 🐙theorem SetTheory.Set.card_fin_eq (n:): (Fin n).has_card n := (has_card_iff _ _).mp id, Function.bijective_id theorem SetTheory.Set.Fin_card (n:): (Fin n).card = n := has_card_to_card (card_fin_eq n)theorem SetTheory.Set.Fin_finite (n:): (Fin n).finite := n, card_fin_eq ntheorem SetTheory.Set.EquivCard_to_has_card_eq {X Y:Set} {n: } (h: X Y): X.has_card n Y.has_card n := inst✝:SetTheoryX:SetY:Setn:h:X YX.has_card n Y.has_card n inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fX.has_card n Y.has_card n; inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071X.has_card n Y.has_card n inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071X.has_card n Y.has_card ninst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071Y.has_card n X.has_card n inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071X.has_card n Y.has_card ninst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071Y.has_card n X.has_card n (inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071h':Y.has_card nX.has_card n; inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071h': f, Function.Bijective f f, Function.Bijective f; inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071g:Y.toSubtype (Fin n).toSubtypehg:Function.Bijective g f, Function.Bijective f) inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071g:X.toSubtype (Fin n).toSubtypehg:Function.Bijective g f, Function.Bijective f inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071g:X.toSubtype (Fin n).toSubtypehg:Function.Bijective gFunction.Bijective (e.symm.trans (Equiv.ofBijective g hg)); All goals completed! 🐙 inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071g:Y.toSubtype (Fin n).toSubtypehg:Function.Bijective g f, Function.Bijective f inst✝:SetTheoryX:SetY:Setn:f:X.toSubtype Y.toSubtypehf:Function.Bijective fe:?_mvar.421075 := Equiv.ofBijective _fvar.421066 _fvar.421071g:Y.toSubtype (Fin n).toSubtypehg:Function.Bijective gFunction.Bijective (e.trans (Equiv.ofBijective g hg)); All goals completed! 🐙theorem SetTheory.Set.EquivCard_to_card_eq {X Y:Set} (h: X Y): X.card = Y.card := inst✝:SetTheoryX:SetY:Seth:X YX.card = Y.card inst✝:SetTheoryX:SetY:Seth:X YhX:X.finiteX.card = Y.cardinst✝:SetTheoryX:SetY:Seth:X YhX:¬X.finiteX.card = Y.card inst✝:SetTheoryX:SetY:Seth:X YhX:X.finiteX.card = Y.cardinst✝:SetTheoryX:SetY:Seth:X YhX:¬X.finiteX.card = Y.card inst✝:SetTheoryX:SetY:Seth:X YhX:¬X.finitehY:Y.finiteX.card = Y.cardinst✝:SetTheoryX:SetY:Seth:X YhX:¬X.finitehY:¬Y.finiteX.card = Y.card inst✝:SetTheoryX:SetY:Seth:X YhX:X.finitehY:Y.finiteX.card = Y.cardinst✝:SetTheoryX:SetY:Seth:X YhX:X.finitehY:¬Y.finiteX.card = Y.cardinst✝:SetTheoryX:SetY:Seth:X YhX:¬X.finitehY:Y.finiteX.card = Y.cardinst✝:SetTheoryX:SetY:Seth:X YhX:¬X.finitehY:¬Y.finiteX.card = Y.card try inst✝:SetTheoryX:SetY:Seth:X YhX:¬ n, X.has_card nhY:¬ n, Y.has_card nX.card = Y.card inst✝:SetTheoryX:SetY:Seth:X YhX: n, X.has_card nhY: n, Y.has_card nX.card = Y.card inst✝:SetTheoryX:SetY:Seth:X YhY: n, Y.has_card nnX:hXn:X.has_card nXX.card = Y.card; inst✝:SetTheoryX:SetY:Seth:X YnX:hXn:X.has_card nXnY:hYn:Y.has_card nYX.card = Y.card inst✝:SetTheoryX:SetY:Seth:X YnX:nY:hYn:Y.has_card nYhXn:Y.has_card nXnX = nY All goals completed! 🐙 inst✝:SetTheoryX:SetY:Seth:X YhX: n, X.has_card nhY:¬ n, Y.has_card nX.card = Y.card inst✝:SetTheoryX:SetY:Seth:X YhY:¬ n, Y.has_card nnX:hXn:X.has_card nXX.card = Y.card; inst✝:SetTheoryX:SetY:Seth:X YhY:¬ n, Y.has_card nnX:hXn:Y.has_card nXX.card = Y.card; All goals completed! 🐙 inst✝:SetTheoryX:SetY:Seth:X YhX:¬ n, X.has_card nhY: n, Y.has_card nX.card = Y.card inst✝:SetTheoryX:SetY:Seth:X YhX:¬ n, X.has_card nnY:hYn:Y.has_card nYX.card = Y.card; inst✝:SetTheoryX:SetY:Seth:X YhX:¬ n, X.has_card nnY:hYn:X.has_card nYX.card = Y.card; All goals completed! 🐙 All goals completed! 🐙

Вправа 3.6.2

theorem declaration uses 'sorry'SetTheory.Set.empty_iff_card_eq_zero {X:Set} : X = X.finite X.card = 0 := inst✝:SetTheoryX:SetX = X.finite X.card = 0 All goals completed! 🐙
lemma SetTheory.Set.empty_of_card_eq_zero {X:Set} (hX : X.finite) : X.card = 0 X = := inst✝:SetTheoryX:SethX:X.finiteX.card = 0 X = inst✝:SetTheoryX:SethX:X.finiteh:X.card = 0X = inst✝:SetTheoryX:SethX:X.finiteh:X.card = 0X.finite X.card = 0 All goals completed! 🐙lemma SetTheory.Set.finite_of_empty {X:Set} : X = X.finite := inst✝:SetTheoryX:SetX = X.finite inst✝:SetTheoryX:Seth:X = X.finite inst✝:SetTheoryX:Seth:X.finite X.card = 0X.finite All goals completed! 🐙lemma SetTheory.Set.card_eq_zero_of_empty {X:Set} : X = X.card = 0 := inst✝:SetTheoryX:SetX = X.card = 0 inst✝:SetTheoryX:Seth:X = X.card = 0 inst✝:SetTheoryX:Seth:X.finite X.card = 0X.card = 0 All goals completed! 🐙@[simp] lemma SetTheory.Set.empty_finite : (: Set).finite := finite_of_empty rfl@[simp] lemma SetTheory.Set.empty_card_eq_zero : (: Set).card = 0 := card_eq_zero_of_empty rfl

Твердження 3.6.14 (a) / Вправа 3.6.4

theorem declaration uses 'sorry'SetTheory.Set.card_insert {X:Set} (hX: X.finite) {x:Object} (hx: x X) : (X {x}).finite (X {x}).card = X.card + 1 := inst✝:SetTheoryX:SethX:X.finitex:Objecthx:x X(X {x}).finite (X {x}).card = X.card + 1 All goals completed! 🐙

Твердження 3.6.14 (b) / Вправа 3.6.4

theorem declaration uses 'sorry'SetTheory.Set.card_union {X Y:Set} (hX: X.finite) (hY: Y.finite) : (X Y).finite (X Y).card X.card + Y.card := inst✝:SetTheoryX:SetY:SethX:X.finitehY:Y.finite(X Y).finite (X Y).card X.card + Y.card All goals completed! 🐙

Твердження 3.6.14 (b) / Вправа 3.6.4

theorem declaration uses 'sorry'SetTheory.Set.card_union_disjoint {X Y:Set} (hX: X.finite) (hY: Y.finite) (hdisj: Disjoint X Y) : (X Y).card = X.card + Y.card := inst✝:SetTheoryX:SetY:SethX:X.finitehY:Y.finitehdisj:Disjoint X Y(X Y).card = X.card + Y.card All goals completed! 🐙

Твердження 3.6.14 (c) / Вправа 3.6.4

theorem declaration uses 'sorry'SetTheory.Set.card_subset {X Y:Set} (hX: X.finite) (hY: Y X) : Y.finite Y.card X.card := inst✝:SetTheoryX:SetY:SethX:X.finitehY:Y XY.finite Y.card X.card All goals completed! 🐙

Твердження 3.6.14 (c) / Вправа 3.6.4

theorem declaration uses 'sorry'SetTheory.Set.card_ssubset {X Y:Set} (hX: X.finite) (hY: Y X) : Y.card < X.card := inst✝:SetTheoryX:SetY:SethX:X.finitehY:Y XY.card < X.card All goals completed! 🐙

Твердження 3.6.14 (d) / Вправа 3.6.4

theorem declaration uses 'sorry'SetTheory.Set.card_image {X Y:Set} (hX: X.finite) (f: X Y) : (image f X).finite (image f X).card X.card := inst✝:SetTheoryX:SetY:SethX:X.finitef:X.toSubtype Y.toSubtype(image f X).finite (image f X).card X.card All goals completed! 🐙

Твердження 3.6.14 (d) / Вправа 3.6.4

theorem declaration uses 'sorry'SetTheory.Set.card_image_inj {X Y:Set} (hX: X.finite) {f: X Y} (hf: Function.Injective f) : (image f X).card = X.card := inst✝:SetTheoryX:SetY:SethX:X.finitef:X.toSubtype Y.toSubtypehf:Function.Injective f(image f X).card = X.card All goals completed! 🐙

Твердження 3.6.14 (e) / Вправа 3.6.4

theorem declaration uses 'sorry'SetTheory.Set.card_prod {X Y:Set} (hX: X.finite) (hY: Y.finite) : (X ×ˢ Y).finite (X ×ˢ Y).card = X.card * Y.card := inst✝:SetTheoryX:SetY:SethX:X.finitehY:Y.finite(X ×ˢ Y).finite (X ×ˢ Y).card = X.card * Y.card All goals completed! 🐙
noncomputable def declaration uses 'sorry'declaration uses 'sorry'declaration uses 'sorry'SetTheory.Set.pow_fun_equiv {A B : Set} : (A ^ B) (B A) where toFun := sorry invFun := sorry left_inv := sorry right_inv := sorrylemma SetTheory.Set.pow_fun_eq_iff {A B : Set} (x y : (A ^ B)) : x = y pow_fun_equiv x = pow_fun_equiv y := inst✝:SetTheoryA:SetB:Setx:(A ^ B).toSubtypey:(A ^ B).toSubtypex = y pow_fun_equiv x = pow_fun_equiv y All goals completed! 🐙

Твердження 3.6.14 (f) / Вправа 3.6.4

theorem declaration uses 'sorry'SetTheory.Set.card_pow {X Y:Set} (hY: Y.finite) (hX: X.finite) : (Y ^ X).finite (Y ^ X).card = Y.card ^ X.card := inst✝:SetTheoryX:SetY:SethY:Y.finitehX:X.finite(Y ^ X).finite (Y ^ X).card = Y.card ^ X.card All goals completed! 🐙

Вправа 3.6.5. You might find Chapter3.SetTheory.Set.prod_commutator.{u_1, u_2} [SetTheory] (X Y : Set) : (X ×ˢ Y).toSubtype (Y ×ˢ X).toSubtypeSetTheory.Set.prod_commutator useful.

theorem declaration uses 'sorry'SetTheory.Set.prod_EqualCard_prod (A B:Set) : EqualCard (A ×ˢ B) (B ×ˢ A) := inst✝:SetTheoryA:SetB:Set(A ×ˢ B).EqualCard (B ×ˢ A) All goals completed! 🐙
noncomputable abbrev SetTheory.Set.pow_fun_equiv' (A B : Set) : (A ^ B) (B A) := pow_fun_equiv (A:=A) (B:=B)

Вправа 3.6.6. Вам може знагодитися Chapter3.SetTheory.Set.curry_equiv.{u_1, u_2} [SetTheory] {X Y Z : Set} : (X.toSubtype Y.toSubtype Z.toSubtype) ((X ×ˢ Y).toSubtype Z.toSubtype)SetTheory.Set.curry_equiv.

theorem declaration uses 'sorry'SetTheory.Set.pow_pow_EqualCard_pow_prod (A B C:Set) : EqualCard ((A ^ B) ^ C) (A ^ (B ×ˢ C)) := inst✝:SetTheoryA:SetB:SetC:Set((A ^ B) ^ C).EqualCard (A ^ B ×ˢ C) All goals completed! 🐙
theorem declaration uses 'sorry'SetTheory.Set.pow_pow_eq_pow_mul (a b c:): (a^b)^c = a^(b*c) := inst✝:SetTheorya:b:c:(a ^ b) ^ c = a ^ (b * c) All goals completed! 🐙theorem declaration uses 'sorry'SetTheory.Set.pow_prod_pow_EqualCard_pow_union (A B C:Set) (hd: Disjoint B C) : EqualCard ((A ^ B) ×ˢ (A ^ C)) (A ^ (B C)) := inst✝:SetTheoryA:SetB:SetC:Sethd:Disjoint B C((A ^ B) ×ˢ (A ^ C)).EqualCard (A ^ (B C)) All goals completed! 🐙theorem declaration uses 'sorry'SetTheory.Set.pow_mul_pow_eq_pow_add (a b c:): (a^b) * a^c = a^(b+c) := inst✝:SetTheorya:b:c:a ^ b * a ^ c = a ^ (b + c) All goals completed! 🐙

Вправа 3.6.7

theorem declaration uses 'sorry'SetTheory.Set.injection_iff_card_le {A B:Set} (hA: A.finite) (hB: B.finite) : ( f:A B, Function.Injective f) A.card B.card := sorry

Вправа 3.6.8

theorem declaration uses 'sorry'SetTheory.Set.surjection_from_injection {A B:Set} (hA: A ) (f: A B) (hf: Function.Injective f) : g:B A, Function.Surjective g := inst✝:SetTheoryA:SetB:SethA:A f:A.toSubtype B.toSubtypehf:Function.Injective f g, Function.Surjective g All goals completed! 🐙

Вправа 3.6.9

theorem declaration uses 'sorry'SetTheory.Set.card_union_add_card_inter {A B:Set} (hA: A.finite) (hB: B.finite) : A.card + B.card = (A B).card + (A B).card := inst✝:SetTheoryA:SetB:SethA:A.finitehB:B.finiteA.card + B.card = (A B).card + (A B).card All goals completed! 🐙

Вправа 3.6.10

theorem declaration uses 'sorry'SetTheory.Set.pigeonhole_principle {n:} {A: Fin n Set} (hA: i, (A i).finite) (hAcard: (iUnion _ A).card > n) : i, (A i).card 2 := inst✝:SetTheoryn:A:(Fin n).toSubtype SethA: (i : (Fin n).toSubtype), (A i).finitehAcard:((Fin n).iUnion A).card > n i, (A i).card 2 All goals completed! 🐙

Вправа 3.6.11

theorem declaration uses 'sorry'SetTheory.Set.two_to_two_iff {X Y:Set} (f: X Y): Function.Injective f S X, S.card = 2 (image f S).card = 2 := inst✝:SetTheoryX:SetY:Setf:X.toSubtype Y.toSubtypeFunction.Injective f S X, S.card = 2 (image f S).card = 2 All goals completed! 🐙

Вправа 3.6.12

def SetTheory.Set.Permutations (n: ): Set := (Fin n ^ Fin n).specify (fun F Function.Bijective (pow_fun_equiv F))

Вправа 3.6.12 (i), перша частина

theorem declaration uses 'sorry'SetTheory.Set.Permutations_finite (n: ): (Permutations n).finite := inst✝:SetTheoryn:(Permutations n).finite All goals completed! 🐙
/- Щоб продовжити Вправу 3.6.12 (i), спершу розв’яжемо деяку теорію про `Permutations` та `Fin`. -/ noncomputable def SetTheory.Set.Permutations_toFun {n: } (p: Permutations n) : (Fin n) (Fin n) := inst✝:SetTheoryn:p:(Permutations n).toSubtype(Fin n).toSubtype (Fin n).toSubtype inst✝:SetTheoryn:p:(Permutations n).toSubtypethis:?_mvar.431578 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)(Fin n).toSubtype (Fin n).toSubtype inst✝:SetTheoryn:p:(Permutations n).toSubtypethis: (h : f, f = p), Function.Bijective (pow_fun_equiv p, )(Fin n).toSubtype (Fin n).toSubtype All goals completed! 🐙theorem declaration uses 'sorry'SetTheory.Set.Permutations_bijective {n: } (p: Permutations n) : Function.Bijective (Permutations_toFun p) := inst✝:SetTheoryn:p:(Permutations n).toSubtypeFunction.Bijective (Permutations_toFun p) All goals completed! 🐙theorem declaration uses 'sorry'SetTheory.Set.Permutations_inj {n: } (p1 p2: Permutations n) : Permutations_toFun p1 = Permutations_toFun p2 p1 = p2 := inst✝:SetTheoryn:p1:(Permutations n).toSubtypep2:(Permutations n).toSubtypePermutations_toFun p1 = Permutations_toFun p2 p1 = p2 All goals completed! 🐙

Це пов'язує нашу концепцію перестановки з Mathlib-им Equiv.{u_1, u_2} (α : Sort u_1) (β : Sort u_2) : Sort (max (max 1 u_1) u_2)Equiv між Fin sorry : TypeFin Unknown identifier `n`n та Fin sorry : TypeFin Unknown identifier `n`n.

noncomputable def declaration uses 'sorry'declaration uses 'sorry'declaration uses 'sorry'SetTheory.Set.perm_equiv_equiv {n : } : Permutations n (Fin n Fin n) := { toFun := fun p => Equiv.ofBijective (Permutations_toFun p) (Permutations_bijective p) invFun := sorry left_inv := sorry right_inv := sorry }
/- Вправа 3.6.12 включає багато переходів між `Fin n` та `Fin (n + 1}`, тому додамо деякі зручності. -/

Будь-який Fin sorry : TypeFin Unknown identifier `n`n можна перетворити на Fin (sorry + 1) : TypeFin (Unknown identifier `n`n + 1). Порівняйте з Mathlib Fin.castSucc {n : } : Fin n Fin (n + 1)Fin.castSucc.

def SetTheory.Set.Fin.castSucc {n} (x : Fin n) : Fin (n + 1) := Fin_embed _ _ (inst✝:SetTheoryn:x:(Fin n).toSubtypen n + 1 All goals completed! 🐙) x
@[simp] lemma declaration uses 'sorry'SetTheory.Set.Fin.castSucc_inj {n} {x y : Fin n} : castSucc x = castSucc y x = y := inst✝:SetTheoryn:x:(Fin n).toSubtypey:(Fin n).toSubtypecastSucc x = castSucc y x = y All goals completed! 🐙@[simp] theorem declaration uses 'sorry'SetTheory.Set.Fin.castSucc_ne {n} (x : Fin n) : castSucc x n := inst✝:SetTheoryn:x:(Fin n).toSubtype(castSucc x) n All goals completed! 🐙

Будь-який Fin (sorry + 1) : TypeFin (Unknown identifier `n`n + 1), крім Unknown identifier `n`n, можна перетворити на Fin sorry : TypeFin Unknown identifier `n`n. Порівняйте з Mathlib Fin.castPred {n : } (i : Fin (n + 1)) (h : i Fin.last n) : Fin nFin.castPred.

noncomputable def SetTheory.Set.Fin.castPred {n} (x : Fin (n + 1)) (h : (x : ) n) : Fin n := Fin_mk _ (x : ) (inst✝:SetTheoryn:x:(Fin (n + 1)).toSubtypeh:x nx < n inst✝:SetTheoryn:x:(Fin (n + 1)).toSubtypeh:x nthis:?_mvar.438826 := Chapter3.SetTheory.Set.Fin.toNat_lt _fvar.438609x < n; All goals completed! 🐙)
@[simp] theorem declaration uses 'sorry'SetTheory.Set.Fin.castSucc_castPred {n} (x : Fin (n + 1)) (h : (x : ) n) : castSucc (castPred x h) = x := inst✝:SetTheoryn:x:(Fin (n + 1)).toSubtypeh:x ncastSucc (castPred x h) = x All goals completed! 🐙@[simp] theorem declaration uses 'sorry'SetTheory.Set.Fin.castPred_castSucc {n} (x : Fin n) (h : ((castSucc x : Fin (n + 1)) : ) n) : castPred (castSucc x) h = x := inst✝:SetTheoryn:x:(Fin n).toSubtypeh:(castSucc x) ncastPred (castSucc x) h = x All goals completed! 🐙

Будь-яке натуральне число Unknown identifier `n`n можна перетворити на Fin (sorry + 1) : TypeFin (Unknown identifier `n`n + 1). Порівняйте з Mathlib Fin.last (n : ) : Fin (n + 1)Fin.last.

def SetTheory.Set.Fin.last (n : ) : Fin (n + 1) := Fin_mk _ n (inst✝:SetTheoryn:n < n + 1 All goals completed! 🐙)

Зараз хороший час, щоб довести цей результат, який буде корисним для виконання вправи 3.6.12 (i).

theorem declaration uses 'sorry'SetTheory.Set.card_iUnion_card_disjoint {n m: } {S : Fin n Set} (hSc : i, (S i).has_card m) (hSd : Pairwise fun i j => Disjoint (S i) (S j)) : ((Fin n).iUnion S).finite ((Fin n).iUnion S).card = n * m := inst✝:SetTheoryn:m:S:(Fin n).toSubtype SethSc: (i : (Fin n).toSubtype), (S i).has_card mhSd:Pairwise fun i j => Disjoint (S i) (S j)((Fin n).iUnion S).finite ((Fin n).iUnion S).card = n * m All goals completed! 🐙
/- Нарешті, ми організуємо спосіб зменшити `Fin (n + 1)` до `Fin n` (або розширити останнє), створюючи "дірку". -/

Якщо деякий ніколи не дорівнює Unknown identifier `i`i, ми можемо зменшити його до Fin sorry : TypeFin Unknown identifier `n`n, зсунувши всі Unknown identifier `x`sorry > sorry : Propx > Unknown identifier `i`i на один вниз. Порівняйте з Mathlib Fin.predAbove {n : } (p : Fin n) (i : Fin (n + 1)) : Fin nFin.predAbove.

noncomputable def declaration uses 'sorry'declaration uses 'sorry'SetTheory.Set.Fin.predAbove {n} (i : Fin (n + 1)) (x : Fin (n + 1)) (h : x i) : Fin n := if hx : (x:) < i then Fin_mk _ (x:) (inst✝:SetTheoryn:i:(Fin (n + 1)).toSubtypex:(Fin (n + 1)).toSubtypeh:x ihx:x < ix < n All goals completed! 🐙) else Fin_mk _ ((x:) - 1) (inst✝:SetTheoryn:i:(Fin (n + 1)).toSubtypex:(Fin (n + 1)).toSubtypeh:x ihx:¬x < ix - 1 < n All goals completed! 🐙)

Ми можемо розширити до , зсуваючи всі Unknown identifier `x`sorry sorry : Propx Unknown identifier `i`i на один вверх. Результат ніколи не дорівнює Unknown identifier `i`i, тому він утворює обернений процес до зменшення, виконаного Unknown identifier `predAbove`predAbove. Порівняйте з Mathlib Fin.succAbove {n : } (p : Fin (n + 1)) (i : Fin n) : Fin (n + 1)Fin.succAbove.

noncomputable def declaration uses 'sorry'SetTheory.Set.Fin.succAbove {n} (i : Fin (n + 1)) (x : Fin n) : Fin (n + 1) := if (x:) < i then Fin_embed _ _ (inst✝:SetTheoryn:i:(Fin (n + 1)).toSubtypex:(Fin n).toSubtypen n + 1 All goals completed! 🐙) x else Fin_mk _ ((x:) + 1) (inst✝:SetTheoryn:i:(Fin (n + 1)).toSubtypex:(Fin n).toSubtypex + 1 < n + 1 All goals completed! 🐙)
@[simp] theorem declaration uses 'sorry'SetTheory.Set.Fin.succAbove_ne {n} (i : Fin (n + 1)) (x : Fin n) : succAbove i x i := inst✝:SetTheoryn:i:(Fin (n + 1)).toSubtypex:(Fin n).toSubtypesuccAbove i x i All goals completed! 🐙@[simp] theorem declaration uses 'sorry'SetTheory.Set.Fin.succAbove_predAbove {n} (i : Fin (n + 1)) (x : Fin (n + 1)) (h : x i) : (succAbove i) (predAbove i x h) = x := inst✝:SetTheoryn:i:(Fin (n + 1)).toSubtypex:(Fin (n + 1)).toSubtypeh:x isuccAbove i (predAbove i x h) = x All goals completed! 🐙@[simp] theorem declaration uses 'sorry'SetTheory.Set.Fin.predAbove_succAbove {n} (i : Fin (n + 1)) (x : Fin n) : (predAbove i) (succAbove i x) (succAbove_ne i x) = x := inst✝:SetTheoryn:i:(Fin (n + 1)).toSubtypex:(Fin n).toSubtypepredAbove i (succAbove i x) = x All goals completed! 🐙

Вправа 3.6.12 (i), друга частина

theorem declaration uses 'sorry'SetTheory.Set.Permutations_ih (n: ): (Permutations (n + 1)).card = (n + 1) * (Permutations n).card := inst✝:SetTheoryn:(Permutations (n + 1)).card = (n + 1) * (Permutations n).card inst✝:SetTheoryn:S:(@Chapter3.SetTheory.Set.Fin _fvar.443015 (_fvar.443242 + 1)).toSubtype Chapter3.Set := fun i => @Chapter3.SetTheory.Set.specify _fvar.443015 (@Chapter3.SetTheory.Set.Permutations _fvar.443015 (_fvar.443242 + 1)) fun p => (Chapter3.SetTheory.Set.perm_equiv_equiv p) (Chapter3.SetTheory.Set.Fin.last _fvar.443242) = i(Permutations (n + 1)).card = (n + 1) * (Permutations n).card have hSe : i, S i Permutations n := inst✝:SetTheoryn:(Permutations (n + 1)).card = (n + 1) * (Permutations n).card inst✝:SetTheoryn:S:(@Chapter3.SetTheory.Set.Fin _fvar.443015 (_fvar.443242 + 1)).toSubtype Chapter3.Set := fun i => @Chapter3.SetTheory.Set.specify _fvar.443015 (@Chapter3.SetTheory.Set.Permutations _fvar.443015 (_fvar.443242 + 1)) fun p => (Chapter3.SetTheory.Set.perm_equiv_equiv p) (Chapter3.SetTheory.Set.Fin.last _fvar.443242) = ii:(Fin (n + 1)).toSubtypeS i Permutations n -- Підказка: вам можуть стати в нагоді `perm_equiv_equiv`, `Fin.succAbove` та `Fin.predAbove`. inst✝:SetTheoryn:S:(@Chapter3.SetTheory.Set.Fin _fvar.443015 (_fvar.443242 + 1)).toSubtype Chapter3.Set := fun i => @Chapter3.SetTheory.Set.specify _fvar.443015 (@Chapter3.SetTheory.Set.Permutations _fvar.443015 (_fvar.443242 + 1)) fun p => (Chapter3.SetTheory.Set.perm_equiv_equiv p) (Chapter3.SetTheory.Set.Fin.last _fvar.443242) = ii:(Fin (n + 1)).toSubtypeequiv:Chapter3.SetTheory.Set.toSubtype (@_fvar.443511 _fvar.443566) (@Chapter3.SetTheory.Set.Permutations _fvar.443015 _fvar.443242).toSubtype := sorryS i Permutations n All goals completed! 🐙 -- Підказка: вам можуть стати в нагоді `card_iUnion_card_disjoint` та `Permutations_finite`. All goals completed! 🐙

Вправа 3.6.12 (ii)

theorem declaration uses 'sorry'SetTheory.Set.Permutations_card (n: ): (Permutations n).card = n.factorial := inst✝:SetTheoryn:(Permutations n).card = n.factorial All goals completed! 🐙

Зв'язки іх Mathlib-ім Finite.{u_3} (α : Sort u_3) : PropFinite

theorem SetTheory.Set.finite_iff_finite {X:Set} : X.finite Finite X := inst✝:SetTheoryX:SetX.finite Finite X.toSubtype inst✝:SetTheoryX:Set(∃ n, X.has_card n) n, Nonempty (X.toSubtype _root_.Fin n) inst✝:SetTheoryX:Set(∃ n, X.has_card n) n, Nonempty (X.toSubtype _root_.Fin n)inst✝:SetTheoryX:Set(∃ n, Nonempty (X.toSubtype _root_.Fin n)) n, X.has_card n inst✝:SetTheoryX:Set(∃ n, X.has_card n) n, Nonempty (X.toSubtype _root_.Fin n) inst✝:SetTheoryX:Setn:hn:X.has_card n n, Nonempty (X.toSubtype _root_.Fin n) inst✝:SetTheoryX:Setn:hn:X.has_card nNonempty (X.toSubtype _root_.Fin n) inst✝:SetTheoryX:Setn:f:X.toSubtype (Fin n).toSubtypehf:Function.Bijective fNonempty (X.toSubtype _root_.Fin n) inst✝:SetTheoryX:Setn:f:X.toSubtype (Fin n).toSubtypehf:Function.Bijective feq:?_mvar.444529 := (Equiv.ofBijective _fvar.444523 _fvar.444524).trans (Chapter3.SetTheory.Set.Fin.Fin_equiv_Fin _fvar.444468)Nonempty (X.toSubtype _root_.Fin n) All goals completed! 🐙 inst✝:SetTheoryX:Setn:hn:Nonempty (X.toSubtype _root_.Fin n) n, X.has_card n inst✝:SetTheoryX:Setn:hn:Nonempty (X.toSubtype _root_.Fin n)X.has_card n inst✝:SetTheoryX:Setn:hn:Nonempty (X.toSubtype _root_.Fin n)eq:?_mvar.444627 := Equiv.trans (Nonempty.some _fvar.444590) (Chapter3.SetTheory.Set.Fin.Fin_equiv_Fin _fvar.444589).symmX.has_card n All goals completed! 🐙

Зв'язки іх Mathlib-ім Set.Finite.{u} {α : Type u} (s : _root_.Set α) : PropSet.Finite

theorem SetTheory.Set.finite_iff_set_finite {X:Set} : X.finite (X :_root_.Set Object).Finite := inst✝:SetTheoryX:SetX.finite {x | x X}.Finite inst✝:SetTheoryX:SetFinite X.toSubtype {x | x X}.Finite All goals completed! 🐙

Зв'язки із Mathlib-овським Nat.card.{u_3} (α : Type u_3) : Nat.card

theorem SetTheory.Set.card_eq_nat_card {X:Set} : X.card = Nat.card X := inst✝:SetTheoryX:SetX.card = Nat.card X.toSubtype inst✝:SetTheoryX:Sethf:X.finiteX.card = Nat.card X.toSubtypeinst✝:SetTheoryX:Sethf:¬X.finiteX.card = Nat.card X.toSubtype inst✝:SetTheoryX:Sethf:X.finiteX.card = Nat.card X.toSubtype inst✝:SetTheoryX:Sethf:X.finitehz:X.card = 0X.card = Nat.card X.toSubtypeinst✝:SetTheoryX:Sethf:X.finitehz:¬X.card = 0X.card = Nat.card X.toSubtype inst✝:SetTheoryX:Sethf:X.finitehz:X.card = 0X.card = Nat.card X.toSubtype inst✝:SetTheoryX:Sethf:X.finitehz:X.card = 00 = Nat.card X.toSubtype; inst✝:SetTheoryX:Sethf:X.finitehz:X.card = 0Nat.card X.toSubtype = 0 inst✝:SetTheoryX:Sethf:X.finitehz:X.card = 0this:_fvar.445131 = := Chapter3.SetTheory.Set.empty_of_card_eq_zero _fvar.445470 _fvar.445550Nat.card X.toSubtype = 0 inst✝:SetTheoryX:Sethf:X.finitehz:X.card = 0this:_fvar.445131 = := Chapter3.SetTheory.Set.empty_of_card_eq_zero _fvar.445470 _fvar.445550(∀ (a : .toSubtype), False) Infinite .toSubtype All goals completed! 🐙 inst✝:SetTheoryX:Sethf:X.finitehz:¬X.card = 0Nat.card X.toSubtype = X.card inst✝:SetTheoryX:Sethf:X.finitehz:¬X.card = 0hc:?_mvar.454775 := Chapter3.SetTheory.Set.has_card_card _fvar.445470Nat.card X.toSubtype = X.card inst✝:SetTheoryX:Sethf✝:X.finitehz:¬X.card = 0f:X.toSubtype (Fin X.card).toSubtypehf:Function.Bijective fNat.card X.toSubtype = X.card inst✝:SetTheoryX:Sethf✝:X.finitehz:¬X.card = 0f:X.toSubtype (Fin X.card).toSubtypehf:Function.Bijective fX.toSubtype _root_.Fin X.card All goals completed! 🐙 inst✝:SetTheoryX:Sethf:¬X.finite0 = Nat.card X.toSubtype; inst✝:SetTheoryX:Sethf:¬X.finiteNat.card X.toSubtype = 0 inst✝:SetTheoryX:Sethf:¬X.finiteIsEmpty X.toSubtype ¬Finite X.toSubtype inst✝:SetTheoryX:Sethf:¬X.finite¬Finite X.toSubtype rwa [finite_iff_set_finiteinst✝:SetTheoryX:Sethf:¬{x | x X}.Finite¬Finite X.toSubtype at hf

Зв'язки із Mathlib-овським Set.ncard.{u_1} {α : Type u_1} (s : _root_.Set α) : Set.ncard

theorem SetTheory.Set.card_eq_ncard {X:Set} : X.card = (X: _root_.Set Object).ncard := inst✝:SetTheoryX:SetX.card = {x | x X}.ncard inst✝:SetTheoryX:SetNat.card X.toSubtype = {x | x X}.ncard All goals completed! 🐙
end Chapter3