1-- Fieldness as a property and a canonical inverse graph, constructed in ZF.2-- 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.Algebra.Field.Construction8import Core910predicate IsField (A add zero neg mul one : Set) :=11 IsCommRing(A, add, zero, neg, mul, one) ∧ Nontrivial(A, zero, one) ∧12 (∀ x ∈ A, x ≠ zero →∃ y, IsInverse(A, mul, one, x, y))1314notationscoped IsField(R) => IsField(R.carrier, R.add, R.zero, R.neg, R.mul, R.one)1516theorem IsField.comm_ring (A add zero neg mul one : Set)17requiresstructure : IsField(A, add, zero, neg, mul, one)18shows IsCommRing(A, add, zero, neg, mul, one)19proof20simp [IsField]2122theorem IsField.nontrivial (A add zero neg mul one : Set)23requiresstructure : IsField(A, add, zero, neg, mul, one)24shows Nontrivial(A, zero, one)25proof26simp [IsField]2728theorem IsField.inverse_exists (A add zero neg mul one x : Set)29requiresstructure : IsField(A, add, zero, neg, mul, one)30requires hx : x ∈ A31requires nonzero : x ≠ zero32shows∃ y, IsInverse(A, mul, one, x, y)33proof34exactstructure.right.right with x, hx, nonzero3536-- The zero branch is normalized to zero. Away from zero, uniqueness37-- follows from the monoid inverse-uniqueness theorem.38defunique fieldInverseValue (A add zero neg mul one x : Set) (y ∈ A) :=39 (x = zero ∧ y = zero) ∨ (x ≠ zero ∧ IsInverse(A, mul, one, x, y))40requiresstructure : IsField(A, add, zero, neg, mul, one)41requires hx : x ∈ A42proof43have nontrivial := IsField.nontrivial withstructure44have alternatives : x = zero ∨ x ≠ zero bytauto45cases alternatives with isZero | nonzero46 . witness zero47refine⟨nontrivial.left, ?_⟩48left49refine⟨isZero, rfl⟩50 . obtain⟨y, inverse⟩:= IsField.inverse_exists at A, add, zero, neg, mul, one, x with*51have yInA : y ∈ A bysimp [IsInverse]52witness y53refine⟨yInA, ?_⟩54right55refine⟨nonzero, inverse⟩56uniqueness57intros y hy propertyY z hz propertyZ58cases propertyY with yZero | yInverse59 . cases propertyZ with zZero | zInverse60 . have yValue := yZero.right61have zValue := zZero.right62cc63 . exfalso64exact zInverse.left with yZero.left65 . cases propertyZ with zZero | zInverse66 . exfalso67exact yInverse.left with zZero.left68 . havering:= IsField.comm_ring withstructure69have ordinary := IsCommRing.ring withring70have monoid := IsRing.multiplicative with ordinary71exact IsInverse.unique with monoid, yInverse.right, zInverse.right7273defgraph fieldInverse (A add zero neg mul one : Set) (x ∈ A) : A := fieldInverseValue(A, add, zero, neg, mul, one, x)74requiresstructure : IsField(A, add, zero, neg, mul, one)75proof76have selected := fieldInverseValue.selected at A, add, zero, neg, mul, one, x with*77exact selected.left7879theorem fieldInverse.inverse (A add zero neg mul one x : Set)80requiresstructure : IsField(A, add, zero, neg, mul, one)81requires hx : x ∈ A82requires nonzero : x ≠ zero83shows IsInverse(A, mul, one, x, (fieldInverse(A, add, zero, neg, mul, one))(x))84proof85have selected := fieldInverseValue.selected at A, add, zero, neg, mul, one, x with*86have inverse : IsInverse(A, mul, one, x, fieldInverseValue(A, add, zero, neg, mul, one, x)) bytauto87have value := fieldInverse.value at A, add, zero, neg, mul, one, x with*88 rwa value8990theorem fieldInverse.zero (A add zero neg mul one : Set)91requiresstructure : IsField(A, add, zero, neg, mul, one)92shows (fieldInverse(A, add, zero, neg, mul, one))(zero) = zero93proof94have nontrivial := IsField.nontrivial withstructure95have hz := nontrivial.left96have selected := fieldInverseValue.selected at A, add, zero, neg, mul, one, zero with*97have reflexive : zero = zero byrfl98have chosen : fieldInverseValue(A, add, zero, neg, mul, one, zero) = zero bytauto99have value := fieldInverse.value at A, add, zero, neg, mul, one, zero with*100cc101102theorem IsField.field (A add zero neg mul one : Set)103requiresstructure : IsField(A, add, zero, neg, mul, one)104shows IsFieldWithInverse(A, add, zero, neg, mul, one, fieldInverse(A, add, zero, neg, mul, one))105proof106havering:= IsField.comm_ring withstructure107have nontrivial := IsField.nontrivial withstructure108have function := fieldInverse.function at A, add, zero, neg, mul, one with*109unfold IsFieldWithInverse110refine⟨ring, nontrivial, ?_⟩111unfold MultiplicativeInverse112refine⟨function, ?_⟩113intros x hx nonzero114have inverse := fieldInverse.inverse with*115exact inverse.right.right116117theorem IsFieldWithInverse.is_field (A add zero neg mul one inv : Set)118requires field : IsFieldWithInverse(A, add, zero, neg, mul, one, inv)119shows IsField(A, add, zero, neg, mul, one)120proof121havering:= IsFieldWithInverse.comm_ring with field122have nontrivial := IsFieldWithInverse.nontrivial with field123unfold IsField124refine⟨ring, nontrivial, ?_⟩125intros x hx nonzero126have closed := IsFieldWithInverse.inverse_closed with*127haveleft:= IsFieldWithInverse.inverse_left with*128haveright:= IsFieldWithInverse.inverse_right with*129witness inv(x)130unfold IsInverse131refine⟨hx, closed, left, right⟩132133theorem IsField.iff_exists_inverse (A add zero neg mul one : Set)134shows IsField(A, add, zero, neg, mul, one) ↔∃ inv, IsFieldWithInverse(A, add, zero, neg, mul, one, inv)135proof136constructor137 . introstructure138have field := IsField.field withstructure139refine⟨fieldInverse(A, add, zero, neg, mul, one), field⟩140 . intro existence141obtain⟨inv, field⟩:= existence142exact IsFieldWithInverse.is_field with field143144section Domains145variable (A add zero neg mul one : Set)146notationring R := (A, add, zero, neg, mul, one)147hypothesis field : IsField(R)148149theorem IsField.no_zero_divisors150shows NoZeroDivisors(A, mul, zero)151proof152havering:= IsField.comm_ring with field153have ordinary := IsCommRing.ring withring154intros x hx y hy equation155have alternatives : x = zero ∨ x ≠ zero bytauto156cases alternatives with isZero | nonzero157 . left158exact isZero159 . obtain⟨v, inverse⟩:= IsField.inverse_exists with field, hx, nonzero160have inV := inverse.right.left161have cancels := inverse.right.right.left162right163have associate : R[v * (x * y)] = R[(v * x) * y] byring164rw [equation, cancels] at associate165have zeroProduct : R[v *0] = zero byring166have oneProduct : R[1* y] = y byring167cc168169theorem IsField.integral_domain170shows IsIntegralDomain(A, add, zero, neg, mul, one)171proof172havering:= IsField.comm_ring with field173have nontrivial := IsField.nontrivial with field174have noZero := IsField.no_zero_divisors with field175unfold IsIntegralDomain176refine⟨ring, nontrivial, noZero⟩177178end Domains179