1-- Equivalence classes and quotient sets2-- Part of Cumulus, the Grace17 mathematics library.3-- Copyright (c) 2026 Grant Passmore.4-- Released under the Apache License 2.0. See LICENSE in the repository root.5-- Authors: Grant Passmore67module Grace.Cumulus.Relation.Quotient8import Relation9import Set1011-- Equivalence classes and quotients are sets. Both comprehensions12-- are bounded, so these definitions use only Separation and Power Set.13def equivalenceClass (A r x : Set) : Set:= { y ∈ A | relates(r, x, y) }14def quotient (A r : Set) : Set:= { C ∈𝒫(A) |∃ x ∈ A, C = ⟦x⟧[A, r] }15notationinfixl70"⧸"=> quotient1617theorem equivalenceClass.subset (A r x : Set)18shows (⟦x⟧[A, r] ⊆ A)19proof20simp2122theorem equivalenceClass.self (A r x : Set)23requires equivalence : Equivalence(A, r)24requires hx : x ∈ A25shows x ∈ ⟦x⟧[A, r]26proof27apply equivalenceClass.membership.backward28constructor29exact hx30exact Equivalence.reflexive with equivalence, x, hx3132theorem equivalenceClass.eq (A r x y : Set)33requires equivalence : Equivalence(A, r)34requires hx : x ∈ A35requires hy : y ∈ A36requires hxy : relates(r, x, y)37shows ⟦x⟧[A, r] = ⟦y⟧[A, r]38proof39ext z40constructor41intro hzx42apply equivalenceClass.membership.backward43simp [equivalenceClass.membership] at hzx44rcases hzx with⟨hzA, hxz⟩45constructor46exact hzA47have symmetric := Equivalence.symmetric with equivalence, x, hx, y, hy, hxy48exact Equivalence.transitive with equivalence, y, hy, x, hx, z, hzA, symmetric, hxz49intro hzy50apply equivalenceClass.membership.backward51simp [equivalenceClass.membership] at hzy52rcases hzy with⟨hzA, hyz⟩53constructor54exact hzA55exact Equivalence.transitive with equivalence, x, hx, y, hy, z, hzA, hxy, hyz5657theorem equivalenceClass.members_related (A r x y z : Set)58requires equivalence : Equivalence(A, r)59requires hx : x ∈ A60requires hy : y ∈ ⟦x⟧[A, r]61requires hz : z ∈ ⟦x⟧[A, r]62shows relates(r, y, z)63proof64obtain⟨hyA, hxy⟩:= equivalenceClass.membership.forward with hy65obtain⟨hzA, hxz⟩:= equivalenceClass.membership.forward with hz66have symmetric := Equivalence.symmetric with equivalence, x, hx, y, hyA, hxy67exact Equivalence.transitive with equivalence, y, hyA, x, hx, z, hzA, symmetric, hxz6869theorem equivalenceClass.related_of_eq (A r x y : Set)70requires equivalence : Equivalence(A, r)71requires hx : x ∈ A72requires hy : y ∈ A73requires same : ⟦x⟧[A, r] = ⟦y⟧[A, r]74shows relates(r, x, y)75proof76have xSelf := equivalenceClass.self with equivalence, hx77have ySelf := equivalenceClass.self with equivalence, hy78rw← same at ySelf79exact equivalenceClass.members_related with equivalence, hx, xSelf, ySelf8081theorem quotient.contains_class (A r x : Set)82requires equivalence : Equivalence(A, r)83requires hx : x ∈ A84shows ⟦x⟧[A, r] ∈ (A ⧸ r)85proof86apply quotient.membership.backward87constructor88applyset.powerset.backward89exact equivalenceClass.subset at A, r, x90refine⟨x, hx, rfl⟩9192theorem quotient.subset_powerset (A r : Set)93shows ((A ⧸ r) ⊆𝒫(A))94proof95simpwith Subset9697theorem quotient.member_nonempty (C A r : Set)98requires equivalence : Equivalence(A, r)99requires hC : C ∈ (A ⧸ r)100shows Nonempty(C)101proof102simp [quotient.membership] at hC103rcases hC with⟨hCPower, x, hxA, hClass⟩104witness x105rw hClass106exact equivalenceClass.self with equivalence, hxA107108theorem quotient.members_related (C A r y z : Set)109requires equivalence : Equivalence(A, r)110requires hC : C ∈ (A ⧸ r)111requires hy : y ∈ C112requires hz : z ∈ C113shows relates(r, y, z)114proof115obtain⟨powerC, x, hxA, classShape⟩:= quotient.membership.forward with hC116rw classShape at hy117rw classShape at hz118exact equivalenceClass.members_related with equivalence, hxA, hy, hz119120theorem quotient.class_of_member (C A r x : Set)121requires equivalence : Equivalence(A, r)122requires hC : C ∈ (A ⧸ r)123requires hx : x ∈ C124shows C = ⟦x⟧[A, r]125proof126obtain⟨powerC, y, hyA, classShape⟩:= quotient.membership.forward with hC127rw classShape at hx128obtain⟨hxA, related⟩:= equivalenceClass.membership.forward with hx129have classes := equivalenceClass.eq with equivalence, hyA, hxA, related130 rwa classShape131