model_theory.finitely_generated
⟷
Mathlib.ModelTheory.FinitelyGenerated
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -120,7 +120,7 @@ theorem FG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L
rw [← h, map_closure, embedding.coe_to_hom, image_preimage_eq_of_subset]
intro x hx
have h' := subset_closure hx
- rw [h] at h'
+ rw [h] at h'
exact hom.map_le_range h'
#align first_order.language.substructure.fg.of_map_embedding FirstOrder.Language.Substructure.FG.of_map_embedding
-/
@@ -218,7 +218,7 @@ theorem CG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L
rw [← h2, map_closure, embedding.coe_to_hom, image_preimage_eq_of_subset]
intro x hx
have h' := subset_closure hx
- rw [h2] at h'
+ rw [h2] at h'
exact hom.map_le_range h'
#align first_order.language.substructure.cg.of_map_embedding FirstOrder.Language.Substructure.CG.of_map_embedding
-/
@@ -282,7 +282,7 @@ theorem FG.range {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N) : f.
theorem FG.map_of_surjective {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N)
(hs : Function.Surjective f) : FG L N :=
by
- rw [← hom.range_eq_top] at hs
+ rw [← hom.range_eq_top] at hs
rw [fg_def, ← hs]
exact h.range f
#align first_order.language.Structure.fg.map_of_surjective FirstOrder.Language.Structure.FG.map_of_surjective
@@ -313,7 +313,7 @@ theorem CG.range {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N) : f.
theorem CG.map_of_surjective {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N)
(hs : Function.Surjective f) : CG L N :=
by
- rw [← hom.range_eq_top] at hs
+ rw [← hom.range_eq_top] at hs
rw [cg_def, ← hs]
exact h.range f
#align first_order.language.Structure.cg.map_of_surjective FirstOrder.Language.Structure.CG.map_of_surjective
@@ -355,7 +355,7 @@ theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.FG ↔ Struc
· rw [← hom.range_eq_map, range_subtype]
exact h
· have h := h.map S.subtype.to_hom
- rw [← hom.range_eq_map, range_subtype] at h
+ rw [← hom.range_eq_map, range_subtype] at h
exact h
#align first_order.language.substructure.fg_iff_Structure_fg FirstOrder.Language.Substructure.fg_iff_structure_fg
-/
@@ -376,7 +376,7 @@ theorem Substructure.cg_iff_structure_cg (S : L.Substructure M) : S.CG ↔ Struc
· rw [← hom.range_eq_map, range_subtype]
exact h
· have h := h.map S.subtype.to_hom
- rw [← hom.range_eq_map, range_subtype] at h
+ rw [← hom.range_eq_map, range_subtype] at h
exact h
#align first_order.language.substructure.cg_iff_Structure_cg FirstOrder.Language.Substructure.cg_iff_structure_cg
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,7 +3,7 @@ Copyright (c) 2022 Aaron Anderson. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Aaron Anderson
-/
-import Mathbin.ModelTheory.Substructures
+import ModelTheory.Substructures
#align_import model_theory.finitely_generated from "leanprover-community/mathlib"@"dbdf71cee7bb20367cb7e37279c08b0c218cf967"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,14 +2,11 @@
Copyright (c) 2022 Aaron Anderson. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Aaron Anderson
-
-! This file was ported from Lean 3 source module model_theory.finitely_generated
-! leanprover-community/mathlib commit dbdf71cee7bb20367cb7e37279c08b0c218cf967
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.ModelTheory.Substructures
+#align_import model_theory.finitely_generated from "leanprover-community/mathlib"@"dbdf71cee7bb20367cb7e37279c08b0c218cf967"
+
/-!
# Finitely Generated First-Order Structures
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -53,6 +53,7 @@ def FG (N : L.Substructure M) : Prop :=
#align first_order.language.substructure.fg FirstOrder.Language.Substructure.FG
-/
+#print FirstOrder.Language.Substructure.fg_def /-
theorem fg_def {N : L.Substructure M} : N.FG ↔ ∃ S : Set M, S.Finite ∧ closure L S = N :=
⟨fun ⟨t, h⟩ => ⟨_, Finset.finite_toSet t, h⟩,
by
@@ -60,7 +61,9 @@ theorem fg_def {N : L.Substructure M} : N.FG ↔ ∃ S : Set M, S.Finite ∧ clo
rcases finite.exists_finset_coe h with ⟨t, rfl⟩
exact ⟨t, rfl⟩⟩
#align first_order.language.substructure.fg_def FirstOrder.Language.Substructure.fg_def
+-/
+#print FirstOrder.Language.Substructure.fg_iff_exists_fin_generating_family /-
theorem fg_iff_exists_fin_generating_family {N : L.Substructure M} :
N.FG ↔ ∃ (n : ℕ) (s : Fin n → M), closure L (range s) = N :=
by
@@ -72,31 +75,43 @@ theorem fg_iff_exists_fin_generating_family {N : L.Substructure M} :
· rintro ⟨n, s, hs⟩
refine' ⟨range s, finite_range s, hs⟩
#align first_order.language.substructure.fg_iff_exists_fin_generating_family FirstOrder.Language.Substructure.fg_iff_exists_fin_generating_family
+-/
+#print FirstOrder.Language.Substructure.fg_bot /-
theorem fg_bot : (⊥ : L.Substructure M).FG :=
⟨∅, by rw [Finset.coe_empty, closure_empty]⟩
#align first_order.language.substructure.fg_bot FirstOrder.Language.Substructure.fg_bot
+-/
+#print FirstOrder.Language.Substructure.fg_closure /-
theorem fg_closure {s : Set M} (hs : s.Finite) : FG (closure L s) :=
⟨hs.toFinset, by rw [hs.coe_to_finset]⟩
#align first_order.language.substructure.fg_closure FirstOrder.Language.Substructure.fg_closure
+-/
+#print FirstOrder.Language.Substructure.fg_closure_singleton /-
theorem fg_closure_singleton (x : M) : FG (closure L ({x} : Set M)) :=
fg_closure (finite_singleton x)
#align first_order.language.substructure.fg_closure_singleton FirstOrder.Language.Substructure.fg_closure_singleton
+-/
+#print FirstOrder.Language.Substructure.FG.sup /-
theorem FG.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.FG) (hN₂ : N₂.FG) : (N₁ ⊔ N₂).FG :=
let ⟨t₁, ht₁⟩ := fg_def.1 hN₁
let ⟨t₂, ht₂⟩ := fg_def.1 hN₂
fg_def.2 ⟨t₁ ∪ t₂, ht₁.1.union ht₂.1, by rw [closure_union, ht₁.2, ht₂.2]⟩
#align first_order.language.substructure.fg.sup FirstOrder.Language.Substructure.FG.sup
+-/
+#print FirstOrder.Language.Substructure.FG.map /-
theorem FG.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.FG) :
(s.map f).FG :=
let ⟨t, ht⟩ := fg_def.1 hs
fg_def.2 ⟨f '' t, ht.1.image _, by rw [closure_image, ht.2]⟩
#align first_order.language.substructure.fg.map FirstOrder.Language.Substructure.FG.map
+-/
+#print FirstOrder.Language.Substructure.FG.of_map_embedding /-
theorem FG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
(hs : (s.map f.toHom).FG) : s.FG :=
by
@@ -111,6 +126,7 @@ theorem FG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L
rw [h] at h'
exact hom.map_le_range h'
#align first_order.language.substructure.fg.of_map_embedding FirstOrder.Language.Substructure.FG.of_map_embedding
+-/
#print FirstOrder.Language.Substructure.CG /-
/-- A substructure of `M` is countably generated if it is the closure of a countable subset of `M`.
@@ -120,16 +136,21 @@ def CG (N : L.Substructure M) : Prop :=
#align first_order.language.substructure.cg FirstOrder.Language.Substructure.CG
-/
+#print FirstOrder.Language.Substructure.cg_def /-
theorem cg_def {N : L.Substructure M} : N.CG ↔ ∃ S : Set M, S.Countable ∧ closure L S = N :=
Iff.refl _
#align first_order.language.substructure.cg_def FirstOrder.Language.Substructure.cg_def
+-/
+#print FirstOrder.Language.Substructure.FG.cg /-
theorem FG.cg {N : L.Substructure M} (h : N.FG) : N.CG :=
by
obtain ⟨s, hf, rfl⟩ := fg_def.1 h
refine' ⟨s, hf.countable, rfl⟩
#align first_order.language.substructure.fg.cg FirstOrder.Language.Substructure.FG.cg
+-/
+#print FirstOrder.Language.Substructure.cg_iff_empty_or_exists_nat_generating_family /-
theorem cg_iff_empty_or_exists_nat_generating_family {N : L.Substructure M} :
N.CG ↔ ↑N = (∅ : Set M) ∨ ∃ s : ℕ → M, closure L (range s) = N :=
by
@@ -152,31 +173,43 @@ theorem cg_iff_empty_or_exists_nat_generating_family {N : L.Substructure M} :
· obtain ⟨f, rfl⟩ := h
exact ⟨range f, countable_range _, rfl⟩
#align first_order.language.substructure.cg_iff_empty_or_exists_nat_generating_family FirstOrder.Language.Substructure.cg_iff_empty_or_exists_nat_generating_family
+-/
+#print FirstOrder.Language.Substructure.cg_bot /-
theorem cg_bot : (⊥ : L.Substructure M).CG :=
fg_bot.CG
#align first_order.language.substructure.cg_bot FirstOrder.Language.Substructure.cg_bot
+-/
+#print FirstOrder.Language.Substructure.cg_closure /-
theorem cg_closure {s : Set M} (hs : s.Countable) : CG (closure L s) :=
⟨s, hs, rfl⟩
#align first_order.language.substructure.cg_closure FirstOrder.Language.Substructure.cg_closure
+-/
+#print FirstOrder.Language.Substructure.cg_closure_singleton /-
theorem cg_closure_singleton (x : M) : CG (closure L ({x} : Set M)) :=
(fg_closure_singleton x).CG
#align first_order.language.substructure.cg_closure_singleton FirstOrder.Language.Substructure.cg_closure_singleton
+-/
+#print FirstOrder.Language.Substructure.CG.sup /-
theorem CG.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.CG) (hN₂ : N₂.CG) : (N₁ ⊔ N₂).CG :=
let ⟨t₁, ht₁⟩ := cg_def.1 hN₁
let ⟨t₂, ht₂⟩ := cg_def.1 hN₂
cg_def.2 ⟨t₁ ∪ t₂, ht₁.1.union ht₂.1, by rw [closure_union, ht₁.2, ht₂.2]⟩
#align first_order.language.substructure.cg.sup FirstOrder.Language.Substructure.CG.sup
+-/
+#print FirstOrder.Language.Substructure.CG.map /-
theorem CG.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.CG) :
(s.map f).CG :=
let ⟨t, ht⟩ := cg_def.1 hs
cg_def.2 ⟨f '' t, ht.1.image _, by rw [closure_image, ht.2]⟩
#align first_order.language.substructure.cg.map FirstOrder.Language.Substructure.CG.map
+-/
+#print FirstOrder.Language.Substructure.CG.of_map_embedding /-
theorem CG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
(hs : (s.map f.toHom).CG) : s.CG :=
by
@@ -191,7 +224,9 @@ theorem CG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L
rw [h2] at h'
exact hom.map_le_range h'
#align first_order.language.substructure.cg.of_map_embedding FirstOrder.Language.Substructure.CG.of_map_embedding
+-/
+#print FirstOrder.Language.Substructure.cg_iff_countable /-
theorem cg_iff_countable [Countable (Σ l, L.Functions l)] {s : L.Substructure M} :
s.CG ↔ Countable s :=
by
@@ -199,6 +234,7 @@ theorem cg_iff_countable [Countable (Σ l, L.Functions l)] {s : L.Substructure M
rintro ⟨s, h, rfl⟩
exact h.substructure_closure L
#align first_order.language.substructure.cg_iff_countable FirstOrder.Language.Substructure.cg_iff_countable
+-/
end Substructure
@@ -224,21 +260,28 @@ class CG : Prop where
variable {L M}
+#print FirstOrder.Language.Structure.fg_def /-
theorem fg_def : FG L M ↔ (⊤ : L.Substructure M).FG :=
⟨fun h => h.1, fun h => ⟨h⟩⟩
#align first_order.language.Structure.fg_def FirstOrder.Language.Structure.fg_def
+-/
+#print FirstOrder.Language.Structure.fg_iff /-
/-- An equivalent expression of `Structure.fg` in terms of `set.finite` instead of `finset`. -/
theorem fg_iff : FG L M ↔ ∃ S : Set M, S.Finite ∧ closure L S = (⊤ : L.Substructure M) := by
rw [fg_def, substructure.fg_def]
#align first_order.language.Structure.fg_iff FirstOrder.Language.Structure.fg_iff
+-/
+#print FirstOrder.Language.Structure.FG.range /-
theorem FG.range {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N) : f.range.FG :=
by
rw [hom.range_eq_map]
exact (fg_def.1 h).map f
#align first_order.language.Structure.fg.range FirstOrder.Language.Structure.FG.range
+-/
+#print FirstOrder.Language.Structure.FG.map_of_surjective /-
theorem FG.map_of_surjective {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N)
(hs : Function.Surjective f) : FG L N :=
by
@@ -246,22 +289,30 @@ theorem FG.map_of_surjective {N : Type _} [L.Structure N] (h : FG L M) (f : M
rw [fg_def, ← hs]
exact h.range f
#align first_order.language.Structure.fg.map_of_surjective FirstOrder.Language.Structure.FG.map_of_surjective
+-/
+#print FirstOrder.Language.Structure.cg_def /-
theorem cg_def : CG L M ↔ (⊤ : L.Substructure M).CG :=
⟨fun h => h.1, fun h => ⟨h⟩⟩
#align first_order.language.Structure.cg_def FirstOrder.Language.Structure.cg_def
+-/
+#print FirstOrder.Language.Structure.cg_iff /-
/-- An equivalent expression of `Structure.cg`. -/
theorem cg_iff : CG L M ↔ ∃ S : Set M, S.Countable ∧ closure L S = (⊤ : L.Substructure M) := by
rw [cg_def, substructure.cg_def]
#align first_order.language.Structure.cg_iff FirstOrder.Language.Structure.cg_iff
+-/
+#print FirstOrder.Language.Structure.CG.range /-
theorem CG.range {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N) : f.range.CG :=
by
rw [hom.range_eq_map]
exact (cg_def.1 h).map f
#align first_order.language.Structure.cg.range FirstOrder.Language.Structure.CG.range
+-/
+#print FirstOrder.Language.Structure.CG.map_of_surjective /-
theorem CG.map_of_surjective {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N)
(hs : Function.Surjective f) : CG L N :=
by
@@ -269,14 +320,19 @@ theorem CG.map_of_surjective {N : Type _} [L.Structure N] (h : CG L M) (f : M
rw [cg_def, ← hs]
exact h.range f
#align first_order.language.Structure.cg.map_of_surjective FirstOrder.Language.Structure.CG.map_of_surjective
+-/
+#print FirstOrder.Language.Structure.cg_iff_countable /-
theorem cg_iff_countable [Countable (Σ l, L.Functions l)] : CG L M ↔ Countable M := by
rw [cg_def, cg_iff_countable, top_equiv.to_equiv.countable_iff]
#align first_order.language.Structure.cg_iff_countable FirstOrder.Language.Structure.cg_iff_countable
+-/
+#print FirstOrder.Language.Structure.FG.cg /-
theorem FG.cg (h : FG L M) : CG L M :=
cg_def.2 (fg_def.1 h).CG
#align first_order.language.Structure.fg.cg FirstOrder.Language.Structure.FG.cg
+-/
#print FirstOrder.Language.Structure.cg_of_fg /-
instance (priority := 100) cg_of_fg [h : FG L M] : CG L M :=
@@ -286,12 +342,15 @@ instance (priority := 100) cg_of_fg [h : FG L M] : CG L M :=
end Structure
+#print FirstOrder.Language.Equiv.fg_iff /-
theorem Equiv.fg_iff {N : Type _} [L.Structure N] (f : M ≃[L] N) :
Structure.FG L M ↔ Structure.FG L N :=
⟨fun h => h.mapOfSurjective f.toHom f.toEquiv.Surjective, fun h =>
h.mapOfSurjective f.symm.toHom f.toEquiv.symm.Surjective⟩
#align first_order.language.equiv.fg_iff FirstOrder.Language.Equiv.fg_iff
+-/
+#print FirstOrder.Language.Substructure.fg_iff_structure_fg /-
theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.FG ↔ Structure.FG L S :=
by
rw [Structure.fg_def]
@@ -302,13 +361,17 @@ theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.FG ↔ Struc
rw [← hom.range_eq_map, range_subtype] at h
exact h
#align first_order.language.substructure.fg_iff_Structure_fg FirstOrder.Language.Substructure.fg_iff_structure_fg
+-/
+#print FirstOrder.Language.Equiv.cg_iff /-
theorem Equiv.cg_iff {N : Type _} [L.Structure N] (f : M ≃[L] N) :
Structure.CG L M ↔ Structure.CG L N :=
⟨fun h => h.mapOfSurjective f.toHom f.toEquiv.Surjective, fun h =>
h.mapOfSurjective f.symm.toHom f.toEquiv.symm.Surjective⟩
#align first_order.language.equiv.cg_iff FirstOrder.Language.Equiv.cg_iff
+-/
+#print FirstOrder.Language.Substructure.cg_iff_structure_cg /-
theorem Substructure.cg_iff_structure_cg (S : L.Substructure M) : S.CG ↔ Structure.CG L S :=
by
rw [Structure.cg_def]
@@ -319,6 +382,7 @@ theorem Substructure.cg_iff_structure_cg (S : L.Substructure M) : S.CG ↔ Struc
rw [← hom.range_eq_map, range_subtype] at h
exact h
#align first_order.language.substructure.cg_iff_Structure_cg FirstOrder.Language.Substructure.cg_iff_structure_cg
+-/
end Language
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -62,7 +62,7 @@ theorem fg_def {N : L.Substructure M} : N.FG ↔ ∃ S : Set M, S.Finite ∧ clo
#align first_order.language.substructure.fg_def FirstOrder.Language.Substructure.fg_def
theorem fg_iff_exists_fin_generating_family {N : L.Substructure M} :
- N.FG ↔ ∃ (n : ℕ)(s : Fin n → M), closure L (range s) = N :=
+ N.FG ↔ ∃ (n : ℕ) (s : Fin n → M), closure L (range s) = N :=
by
rw [fg_def]
constructor
@@ -108,7 +108,7 @@ theorem FG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L
rw [← h, map_closure, embedding.coe_to_hom, image_preimage_eq_of_subset]
intro x hx
have h' := subset_closure hx
- rw [h] at h'
+ rw [h] at h'
exact hom.map_le_range h'
#align first_order.language.substructure.fg.of_map_embedding FirstOrder.Language.Substructure.FG.of_map_embedding
@@ -188,11 +188,11 @@ theorem CG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L
rw [← h2, map_closure, embedding.coe_to_hom, image_preimage_eq_of_subset]
intro x hx
have h' := subset_closure hx
- rw [h2] at h'
+ rw [h2] at h'
exact hom.map_le_range h'
#align first_order.language.substructure.cg.of_map_embedding FirstOrder.Language.Substructure.CG.of_map_embedding
-theorem cg_iff_countable [Countable (Σl, L.Functions l)] {s : L.Substructure M} :
+theorem cg_iff_countable [Countable (Σ l, L.Functions l)] {s : L.Substructure M} :
s.CG ↔ Countable s :=
by
refine' ⟨_, fun h => ⟨s, h.to_set, s.closure_eq⟩⟩
@@ -242,7 +242,7 @@ theorem FG.range {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N) : f.
theorem FG.map_of_surjective {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N)
(hs : Function.Surjective f) : FG L N :=
by
- rw [← hom.range_eq_top] at hs
+ rw [← hom.range_eq_top] at hs
rw [fg_def, ← hs]
exact h.range f
#align first_order.language.Structure.fg.map_of_surjective FirstOrder.Language.Structure.FG.map_of_surjective
@@ -265,12 +265,12 @@ theorem CG.range {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N) : f.
theorem CG.map_of_surjective {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N)
(hs : Function.Surjective f) : CG L N :=
by
- rw [← hom.range_eq_top] at hs
+ rw [← hom.range_eq_top] at hs
rw [cg_def, ← hs]
exact h.range f
#align first_order.language.Structure.cg.map_of_surjective FirstOrder.Language.Structure.CG.map_of_surjective
-theorem cg_iff_countable [Countable (Σl, L.Functions l)] : CG L M ↔ Countable M := by
+theorem cg_iff_countable [Countable (Σ l, L.Functions l)] : CG L M ↔ Countable M := by
rw [cg_def, cg_iff_countable, top_equiv.to_equiv.countable_iff]
#align first_order.language.Structure.cg_iff_countable FirstOrder.Language.Structure.cg_iff_countable
@@ -299,7 +299,7 @@ theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.FG ↔ Struc
· rw [← hom.range_eq_map, range_subtype]
exact h
· have h := h.map S.subtype.to_hom
- rw [← hom.range_eq_map, range_subtype] at h
+ rw [← hom.range_eq_map, range_subtype] at h
exact h
#align first_order.language.substructure.fg_iff_Structure_fg FirstOrder.Language.Substructure.fg_iff_structure_fg
@@ -316,7 +316,7 @@ theorem Substructure.cg_iff_structure_cg (S : L.Substructure M) : S.CG ↔ Struc
· rw [← hom.range_eq_map, range_subtype]
exact h
· have h := h.map S.subtype.to_hom
- rw [← hom.range_eq_map, range_subtype] at h
+ rw [← hom.range_eq_map, range_subtype] at h
exact h
#align first_order.language.substructure.cg_iff_Structure_cg FirstOrder.Language.Substructure.cg_iff_structure_cg
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -32,7 +32,7 @@ this definition of finite generation to define the others.
-/
-open FirstOrder
+open scoped FirstOrder
open Set
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -53,12 +53,6 @@ def FG (N : L.Substructure M) : Prop :=
#align first_order.language.substructure.fg FirstOrder.Language.Substructure.FG
-/
-/- warning: first_order.language.substructure.fg_def -> FirstOrder.Language.Substructure.fg_def is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N) (Exists.{succ u3} (Set.{u3} M) (fun (S : Set.{u3} M) => And (Set.Finite.{u3} M S) (Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) S) N)))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N) (Exists.{succ u1} (Set.{u1} M) (fun (S : Set.{u1} M) => And (Set.Finite.{u1} M S) (Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) S) N)))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_def FirstOrder.Language.Substructure.fg_defₓ'. -/
theorem fg_def {N : L.Substructure M} : N.FG ↔ ∃ S : Set M, S.Finite ∧ closure L S = N :=
⟨fun ⟨t, h⟩ => ⟨_, Finset.finite_toSet t, h⟩,
by
@@ -67,12 +61,6 @@ theorem fg_def {N : L.Substructure M} : N.FG ↔ ∃ S : Set M, S.Finite ∧ clo
exact ⟨t, rfl⟩⟩
#align first_order.language.substructure.fg_def FirstOrder.Language.Substructure.fg_def
-/- warning: first_order.language.substructure.fg_iff_exists_fin_generating_family -> FirstOrder.Language.Substructure.fg_iff_exists_fin_generating_family is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N) (Exists.{1} Nat (fun (n : Nat) => Exists.{succ u3} ((Fin n) -> M) (fun (s : (Fin n) -> M) => Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) (Set.range.{u3, 1} M (Fin n) s)) N)))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N) (Exists.{1} Nat (fun (n : Nat) => Exists.{succ u1} ((Fin n) -> M) (fun (s : (Fin n) -> M) => Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) (Set.range.{u1, 1} M (Fin n) s)) N)))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_iff_exists_fin_generating_family FirstOrder.Language.Substructure.fg_iff_exists_fin_generating_familyₓ'. -/
theorem fg_iff_exists_fin_generating_family {N : L.Substructure M} :
N.FG ↔ ∃ (n : ℕ)(s : Fin n → M), closure L (range s) = N :=
by
@@ -85,66 +73,30 @@ theorem fg_iff_exists_fin_generating_family {N : L.Substructure M} :
refine' ⟨range s, finite_range s, hs⟩
#align first_order.language.substructure.fg_iff_exists_fin_generating_family FirstOrder.Language.Substructure.fg_iff_exists_fin_generating_family
-/- warning: first_order.language.substructure.fg_bot -> FirstOrder.Language.Substructure.fg_bot is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (Bot.bot.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (CompleteLattice.toHasBot.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u1, u2, u3} L M _inst_1)))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 (Bot.bot.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toBot.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_bot FirstOrder.Language.Substructure.fg_botₓ'. -/
theorem fg_bot : (⊥ : L.Substructure M).FG :=
⟨∅, by rw [Finset.coe_empty, closure_empty]⟩
#align first_order.language.substructure.fg_bot FirstOrder.Language.Substructure.fg_bot
-/- warning: first_order.language.substructure.fg_closure -> FirstOrder.Language.Substructure.fg_closure is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {s : Set.{u3} M}, (Set.Finite.{u3} M s) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) s))
-but is expected to have type
- forall {L : FirstOrder.Language.{u2, u1}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u2, u1, u3} L M] {s : Set.{u3} M}, (Set.Finite.{u3} M s) -> (FirstOrder.Language.Substructure.FG.{u2, u1, u3} L M _inst_1 (LowerAdjoint.toFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.instCompleteBooleanAlgebraSet.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u2, u1, u3} L M _inst_1)))) (SetLike.coe.{u3, u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u2, u1, u3} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u2, u1, u3} L M _inst_1) s))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_closure FirstOrder.Language.Substructure.fg_closureₓ'. -/
theorem fg_closure {s : Set M} (hs : s.Finite) : FG (closure L s) :=
⟨hs.toFinset, by rw [hs.coe_to_finset]⟩
#align first_order.language.substructure.fg_closure FirstOrder.Language.Substructure.fg_closure
-/- warning: first_order.language.substructure.fg_closure_singleton -> FirstOrder.Language.Substructure.fg_closure_singleton is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] (x : M), FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) (Singleton.singleton.{u3, u3} M (Set.{u3} M) (Set.hasSingleton.{u3} M) x))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] (x : M), FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) (Singleton.singleton.{u1, u1} M (Set.{u1} M) (Set.instSingletonSet.{u1} M) x))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_closure_singleton FirstOrder.Language.Substructure.fg_closure_singletonₓ'. -/
theorem fg_closure_singleton (x : M) : FG (closure L ({x} : Set M)) :=
fg_closure (finite_singleton x)
#align first_order.language.substructure.fg_closure_singleton FirstOrder.Language.Substructure.fg_closure_singleton
-/- warning: first_order.language.substructure.fg.sup -> FirstOrder.Language.Substructure.FG.sup is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N₁ : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1} {N₂ : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N₁) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N₂) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (Sup.sup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SemilatticeSup.toHasSup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Lattice.toSemilatticeSup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (ConditionallyCompleteLattice.toLattice.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u1, u2, u3} L M _inst_1))))) N₁ N₂))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N₁ : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1} {N₂ : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N₁) -> (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N₂) -> (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 (Sup.sup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SemilatticeSup.toSup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (Lattice.toSemilatticeSup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1))))) N₁ N₂))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg.sup FirstOrder.Language.Substructure.FG.supₓ'. -/
theorem FG.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.FG) (hN₂ : N₂.FG) : (N₁ ⊔ N₂).FG :=
let ⟨t₁, ht₁⟩ := fg_def.1 hN₁
let ⟨t₂, ht₂⟩ := fg_def.1 hN₂
fg_def.2 ⟨t₁ ∪ t₂, ht₁.1.union ht₂.1, by rw [closure_union, ht₁.2, ht₂.2]⟩
#align first_order.language.substructure.fg.sup FirstOrder.Language.Substructure.FG.sup
-/- warning: first_order.language.substructure.fg.map -> FirstOrder.Language.Substructure.FG.map is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N] (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 s) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f s))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N] (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 s) -> (FirstOrder.Language.Substructure.FG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f s))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg.map FirstOrder.Language.Substructure.FG.mapₓ'. -/
theorem FG.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.FG) :
(s.map f).FG :=
let ⟨t, ht⟩ := fg_def.1 hs
fg_def.2 ⟨f '' t, ht.1.image _, by rw [closure_image, ht.2]⟩
#align first_order.language.substructure.fg.map FirstOrder.Language.Substructure.FG.map
-/- warning: first_order.language.substructure.fg.of_map_embedding -> FirstOrder.Language.Substructure.FG.of_map_embedding is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N] (f : FirstOrder.Language.Embedding.{u1, u2, u3, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u1, u2, u3, u4} L M N _inst_1 _inst_2 (FirstOrder.Language.Embedding.toHom.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f) s)) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 s)
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N] (f : FirstOrder.Language.Embedding.{u3, u2, u1, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u3, u2, u1, u4} L M N _inst_1 _inst_2 (FirstOrder.Language.Embedding.toHom.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f) s)) -> (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 s)
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg.of_map_embedding FirstOrder.Language.Substructure.FG.of_map_embeddingₓ'. -/
theorem FG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
(hs : (s.map f.toHom).FG) : s.FG :=
by
@@ -168,34 +120,16 @@ def CG (N : L.Substructure M) : Prop :=
#align first_order.language.substructure.cg FirstOrder.Language.Substructure.CG
-/
-/- warning: first_order.language.substructure.cg_def -> FirstOrder.Language.Substructure.cg_def is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N) (Exists.{succ u3} (Set.{u3} M) (fun (S : Set.{u3} M) => And (Set.Countable.{u3} M S) (Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) S) N)))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N) (Exists.{succ u1} (Set.{u1} M) (fun (S : Set.{u1} M) => And (Set.Countable.{u1} M S) (Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) S) N)))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_def FirstOrder.Language.Substructure.cg_defₓ'. -/
theorem cg_def {N : L.Substructure M} : N.CG ↔ ∃ S : Set M, S.Countable ∧ closure L S = N :=
Iff.refl _
#align first_order.language.substructure.cg_def FirstOrder.Language.Substructure.cg_def
-/- warning: first_order.language.substructure.fg.cg -> FirstOrder.Language.Substructure.FG.cg is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N)
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N)
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg.cg FirstOrder.Language.Substructure.FG.cgₓ'. -/
theorem FG.cg {N : L.Substructure M} (h : N.FG) : N.CG :=
by
obtain ⟨s, hf, rfl⟩ := fg_def.1 h
refine' ⟨s, hf.countable, rfl⟩
#align first_order.language.substructure.fg.cg FirstOrder.Language.Substructure.FG.cg
-/- warning: first_order.language.substructure.cg_iff_empty_or_exists_nat_generating_family -> FirstOrder.Language.Substructure.cg_iff_empty_or_exists_nat_generating_family is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N) (Or (Eq.{succ u3} (Set.{u3} M) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))) N) (EmptyCollection.emptyCollection.{u3} (Set.{u3} M) (Set.hasEmptyc.{u3} M))) (Exists.{succ u3} (Nat -> M) (fun (s : Nat -> M) => Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) (Set.range.{u3, 1} M Nat s)) N)))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N) (Or (Eq.{succ u1} (Set.{u1} M) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1) N) (EmptyCollection.emptyCollection.{u1} (Set.{u1} M) (Set.instEmptyCollectionSet.{u1} M))) (Exists.{succ u1} (Nat -> M) (fun (s : Nat -> M) => Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) (Set.range.{u1, 1} M Nat s)) N)))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_iff_empty_or_exists_nat_generating_family FirstOrder.Language.Substructure.cg_iff_empty_or_exists_nat_generating_familyₓ'. -/
theorem cg_iff_empty_or_exists_nat_generating_family {N : L.Substructure M} :
N.CG ↔ ↑N = (∅ : Set M) ∨ ∃ s : ℕ → M, closure L (range s) = N :=
by
@@ -219,66 +153,30 @@ theorem cg_iff_empty_or_exists_nat_generating_family {N : L.Substructure M} :
exact ⟨range f, countable_range _, rfl⟩
#align first_order.language.substructure.cg_iff_empty_or_exists_nat_generating_family FirstOrder.Language.Substructure.cg_iff_empty_or_exists_nat_generating_family
-/- warning: first_order.language.substructure.cg_bot -> FirstOrder.Language.Substructure.cg_bot is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (Bot.bot.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (CompleteLattice.toHasBot.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u1, u2, u3} L M _inst_1)))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 (Bot.bot.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toBot.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_bot FirstOrder.Language.Substructure.cg_botₓ'. -/
theorem cg_bot : (⊥ : L.Substructure M).CG :=
fg_bot.CG
#align first_order.language.substructure.cg_bot FirstOrder.Language.Substructure.cg_bot
-/- warning: first_order.language.substructure.cg_closure -> FirstOrder.Language.Substructure.cg_closure is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {s : Set.{u3} M}, (Set.Countable.{u3} M s) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) s))
-but is expected to have type
- forall {L : FirstOrder.Language.{u2, u1}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u2, u1, u3} L M] {s : Set.{u3} M}, (Set.Countable.{u3} M s) -> (FirstOrder.Language.Substructure.CG.{u2, u1, u3} L M _inst_1 (LowerAdjoint.toFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.instCompleteBooleanAlgebraSet.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u2, u1, u3} L M _inst_1)))) (SetLike.coe.{u3, u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u2, u1, u3} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u2, u1, u3} L M _inst_1) s))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_closure FirstOrder.Language.Substructure.cg_closureₓ'. -/
theorem cg_closure {s : Set M} (hs : s.Countable) : CG (closure L s) :=
⟨s, hs, rfl⟩
#align first_order.language.substructure.cg_closure FirstOrder.Language.Substructure.cg_closure
-/- warning: first_order.language.substructure.cg_closure_singleton -> FirstOrder.Language.Substructure.cg_closure_singleton is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] (x : M), FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) (Singleton.singleton.{u3, u3} M (Set.{u3} M) (Set.hasSingleton.{u3} M) x))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] (x : M), FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) (Singleton.singleton.{u1, u1} M (Set.{u1} M) (Set.instSingletonSet.{u1} M) x))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_closure_singleton FirstOrder.Language.Substructure.cg_closure_singletonₓ'. -/
theorem cg_closure_singleton (x : M) : CG (closure L ({x} : Set M)) :=
(fg_closure_singleton x).CG
#align first_order.language.substructure.cg_closure_singleton FirstOrder.Language.Substructure.cg_closure_singleton
-/- warning: first_order.language.substructure.cg.sup -> FirstOrder.Language.Substructure.CG.sup is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N₁ : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1} {N₂ : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N₁) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N₂) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (Sup.sup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SemilatticeSup.toHasSup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Lattice.toSemilatticeSup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (ConditionallyCompleteLattice.toLattice.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u1, u2, u3} L M _inst_1))))) N₁ N₂))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N₁ : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1} {N₂ : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N₁) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N₂) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 (Sup.sup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SemilatticeSup.toSup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (Lattice.toSemilatticeSup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1))))) N₁ N₂))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg.sup FirstOrder.Language.Substructure.CG.supₓ'. -/
theorem CG.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.CG) (hN₂ : N₂.CG) : (N₁ ⊔ N₂).CG :=
let ⟨t₁, ht₁⟩ := cg_def.1 hN₁
let ⟨t₂, ht₂⟩ := cg_def.1 hN₂
cg_def.2 ⟨t₁ ∪ t₂, ht₁.1.union ht₂.1, by rw [closure_union, ht₁.2, ht₂.2]⟩
#align first_order.language.substructure.cg.sup FirstOrder.Language.Substructure.CG.sup
-/- warning: first_order.language.substructure.cg.map -> FirstOrder.Language.Substructure.CG.map is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N] (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 s) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f s))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N] (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 s) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f s))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg.map FirstOrder.Language.Substructure.CG.mapₓ'. -/
theorem CG.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.CG) :
(s.map f).CG :=
let ⟨t, ht⟩ := cg_def.1 hs
cg_def.2 ⟨f '' t, ht.1.image _, by rw [closure_image, ht.2]⟩
#align first_order.language.substructure.cg.map FirstOrder.Language.Substructure.CG.map
-/- warning: first_order.language.substructure.cg.of_map_embedding -> FirstOrder.Language.Substructure.CG.of_map_embedding is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N] (f : FirstOrder.Language.Embedding.{u1, u2, u3, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u1, u2, u3, u4} L M N _inst_1 _inst_2 (FirstOrder.Language.Embedding.toHom.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f) s)) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 s)
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N] (f : FirstOrder.Language.Embedding.{u3, u2, u1, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u3, u2, u1, u4} L M N _inst_1 _inst_2 (FirstOrder.Language.Embedding.toHom.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f) s)) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 s)
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg.of_map_embedding FirstOrder.Language.Substructure.CG.of_map_embeddingₓ'. -/
theorem CG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
(hs : (s.map f.toHom).CG) : s.CG :=
by
@@ -294,12 +192,6 @@ theorem CG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L
exact hom.map_le_range h'
#align first_order.language.substructure.cg.of_map_embedding FirstOrder.Language.Substructure.CG.of_map_embedding
-/- warning: first_order.language.substructure.cg_iff_countable -> FirstOrder.Language.Substructure.cg_iff_countable is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] [_inst_2 : Countable.{succ u1} (Sigma.{0, u1} Nat (fun (l : Nat) => FirstOrder.Language.Functions.{u1, u2} L l))] {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 s) (Countable.{succ u3} (coeSort.{succ u3, succ (succ u3)} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) Type.{u3} (SetLike.hasCoeToSort.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)) s))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] [_inst_2 : Countable.{succ u3} (Sigma.{0, u3} Nat (fun (l : Nat) => FirstOrder.Language.Functions.{u3, u2} L l))] {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 s) (Countable.{succ u1} (Subtype.{succ u1} M (fun (x : M) => Membership.mem.{u1, u1} M (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SetLike.instMembership.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) x s)))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_iff_countable FirstOrder.Language.Substructure.cg_iff_countableₓ'. -/
theorem cg_iff_countable [Countable (Σl, L.Functions l)] {s : L.Substructure M} :
s.CG ↔ Countable s :=
by
@@ -332,45 +224,21 @@ class CG : Prop where
variable {L M}
-/- warning: first_order.language.Structure.fg_def -> FirstOrder.Language.Structure.fg_def is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], Iff (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (Top.top.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u1, u2, u3} L M _inst_1)))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], Iff (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 (Top.top.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u3, u2, u1} L M _inst_1)))
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg_def FirstOrder.Language.Structure.fg_defₓ'. -/
theorem fg_def : FG L M ↔ (⊤ : L.Substructure M).FG :=
⟨fun h => h.1, fun h => ⟨h⟩⟩
#align first_order.language.Structure.fg_def FirstOrder.Language.Structure.fg_def
-/- warning: first_order.language.Structure.fg_iff -> FirstOrder.Language.Structure.fg_iff is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], Iff (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) (Exists.{succ u3} (Set.{u3} M) (fun (S : Set.{u3} M) => And (Set.Finite.{u3} M S) (Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) S) (Top.top.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u1, u2, u3} L M _inst_1)))))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], Iff (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) (Exists.{succ u1} (Set.{u1} M) (fun (S : Set.{u1} M) => And (Set.Finite.{u1} M S) (Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) S) (Top.top.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u3, u2, u1} L M _inst_1)))))
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg_iff FirstOrder.Language.Structure.fg_iffₓ'. -/
/-- An equivalent expression of `Structure.fg` in terms of `set.finite` instead of `finset`. -/
theorem fg_iff : FG L M ↔ ∃ S : Set M, S.Finite ∧ closure L S = (⊤ : L.Substructure M) := by
rw [fg_def, substructure.fg_def]
#align first_order.language.Structure.fg_iff FirstOrder.Language.Structure.fg_iff
-/- warning: first_order.language.Structure.fg.range -> FirstOrder.Language.Structure.FG.range is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2), FirstOrder.Language.Substructure.FG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Hom.range.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2), FirstOrder.Language.Substructure.FG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Hom.range.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f))
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg.range FirstOrder.Language.Structure.FG.rangeₓ'. -/
theorem FG.range {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N) : f.range.FG :=
by
rw [hom.range_eq_map]
exact (fg_def.1 h).map f
#align first_order.language.Structure.fg.range FirstOrder.Language.Structure.FG.range
-/- warning: first_order.language.Structure.fg.map_of_surjective -> FirstOrder.Language.Structure.FG.map_of_surjective is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2), (Function.Surjective.{succ u3, succ u4} M N (coeFn.{max (succ u3) (succ u4), max (succ u3) (succ u4)} (FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) (fun (_x : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) => M -> N) (FirstOrder.Language.Hom.hasCoeToFun.{u1, u2, u3, u4} L M N _inst_1 _inst_2) f)) -> (FirstOrder.Language.Structure.FG.{u1, u2, u4} L N _inst_2))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2), (Function.Surjective.{succ u1, succ u4} M N (FunLike.coe.{max (succ u1) (succ u4), succ u1, succ u4} (FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2) M (fun (_x : M) => (fun (a._@.Mathlib.ModelTheory.Basic._hyg.5742 : M) => N) _x) (FirstOrder.Language.Hom.funLike.{u3, u2, u1, u4} L M N _inst_1 _inst_2) f)) -> (FirstOrder.Language.Structure.FG.{u3, u2, u4} L N _inst_2))
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg.map_of_surjective FirstOrder.Language.Structure.FG.map_of_surjectiveₓ'. -/
theorem FG.map_of_surjective {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N)
(hs : Function.Surjective f) : FG L N :=
by
@@ -379,45 +247,21 @@ theorem FG.map_of_surjective {N : Type _} [L.Structure N] (h : FG L M) (f : M
exact h.range f
#align first_order.language.Structure.fg.map_of_surjective FirstOrder.Language.Structure.FG.map_of_surjective
-/- warning: first_order.language.Structure.cg_def -> FirstOrder.Language.Structure.cg_def is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], Iff (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (Top.top.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u1, u2, u3} L M _inst_1)))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], Iff (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 (Top.top.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u3, u2, u1} L M _inst_1)))
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg_def FirstOrder.Language.Structure.cg_defₓ'. -/
theorem cg_def : CG L M ↔ (⊤ : L.Substructure M).CG :=
⟨fun h => h.1, fun h => ⟨h⟩⟩
#align first_order.language.Structure.cg_def FirstOrder.Language.Structure.cg_def
-/- warning: first_order.language.Structure.cg_iff -> FirstOrder.Language.Structure.cg_iff is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], Iff (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) (Exists.{succ u3} (Set.{u3} M) (fun (S : Set.{u3} M) => And (Set.Countable.{u3} M S) (Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) S) (Top.top.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u1, u2, u3} L M _inst_1)))))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], Iff (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) (Exists.{succ u1} (Set.{u1} M) (fun (S : Set.{u1} M) => And (Set.Countable.{u1} M S) (Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) S) (Top.top.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u3, u2, u1} L M _inst_1)))))
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg_iff FirstOrder.Language.Structure.cg_iffₓ'. -/
/-- An equivalent expression of `Structure.cg`. -/
theorem cg_iff : CG L M ↔ ∃ S : Set M, S.Countable ∧ closure L S = (⊤ : L.Substructure M) := by
rw [cg_def, substructure.cg_def]
#align first_order.language.Structure.cg_iff FirstOrder.Language.Structure.cg_iff
-/- warning: first_order.language.Structure.cg.range -> FirstOrder.Language.Structure.CG.range is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2), FirstOrder.Language.Substructure.CG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Hom.range.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2), FirstOrder.Language.Substructure.CG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Hom.range.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f))
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg.range FirstOrder.Language.Structure.CG.rangeₓ'. -/
theorem CG.range {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N) : f.range.CG :=
by
rw [hom.range_eq_map]
exact (cg_def.1 h).map f
#align first_order.language.Structure.cg.range FirstOrder.Language.Structure.CG.range
-/- warning: first_order.language.Structure.cg.map_of_surjective -> FirstOrder.Language.Structure.CG.map_of_surjective is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2), (Function.Surjective.{succ u3, succ u4} M N (coeFn.{max (succ u3) (succ u4), max (succ u3) (succ u4)} (FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) (fun (_x : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) => M -> N) (FirstOrder.Language.Hom.hasCoeToFun.{u1, u2, u3, u4} L M N _inst_1 _inst_2) f)) -> (FirstOrder.Language.Structure.CG.{u1, u2, u4} L N _inst_2))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2), (Function.Surjective.{succ u1, succ u4} M N (FunLike.coe.{max (succ u1) (succ u4), succ u1, succ u4} (FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2) M (fun (_x : M) => (fun (a._@.Mathlib.ModelTheory.Basic._hyg.5742 : M) => N) _x) (FirstOrder.Language.Hom.funLike.{u3, u2, u1, u4} L M N _inst_1 _inst_2) f)) -> (FirstOrder.Language.Structure.CG.{u3, u2, u4} L N _inst_2))
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg.map_of_surjective FirstOrder.Language.Structure.CG.map_of_surjectiveₓ'. -/
theorem CG.map_of_surjective {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N)
(hs : Function.Surjective f) : CG L N :=
by
@@ -426,22 +270,10 @@ theorem CG.map_of_surjective {N : Type _} [L.Structure N] (h : CG L M) (f : M
exact h.range f
#align first_order.language.Structure.cg.map_of_surjective FirstOrder.Language.Structure.CG.map_of_surjective
-/- warning: first_order.language.Structure.cg_iff_countable -> FirstOrder.Language.Structure.cg_iff_countable is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] [_inst_2 : Countable.{succ u1} (Sigma.{0, u1} Nat (fun (l : Nat) => FirstOrder.Language.Functions.{u1, u2} L l))], Iff (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) (Countable.{succ u3} M)
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] [_inst_2 : Countable.{succ u3} (Sigma.{0, u3} Nat (fun (l : Nat) => FirstOrder.Language.Functions.{u3, u2} L l))], Iff (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) (Countable.{succ u1} M)
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg_iff_countable FirstOrder.Language.Structure.cg_iff_countableₓ'. -/
theorem cg_iff_countable [Countable (Σl, L.Functions l)] : CG L M ↔ Countable M := by
rw [cg_def, cg_iff_countable, top_equiv.to_equiv.countable_iff]
#align first_order.language.Structure.cg_iff_countable FirstOrder.Language.Structure.cg_iff_countable
-/- warning: first_order.language.Structure.fg.cg -> FirstOrder.Language.Structure.FG.cg is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) -> (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1)
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) -> (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1)
-Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg.cg FirstOrder.Language.Structure.FG.cgₓ'. -/
theorem FG.cg (h : FG L M) : CG L M :=
cg_def.2 (fg_def.1 h).CG
#align first_order.language.Structure.fg.cg FirstOrder.Language.Structure.FG.cg
@@ -454,24 +286,12 @@ instance (priority := 100) cg_of_fg [h : FG L M] : CG L M :=
end Structure
-/- warning: first_order.language.equiv.fg_iff -> FirstOrder.Language.Equiv.fg_iff is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Equiv.{u1, u2, u3, u4} L M N _inst_1 _inst_2) -> (Iff (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Structure.FG.{u1, u2, u4} L N _inst_2))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Equiv.{u3, u2, u1, u4} L M N _inst_1 _inst_2) -> (Iff (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Structure.FG.{u3, u2, u4} L N _inst_2))
-Case conversion may be inaccurate. Consider using '#align first_order.language.equiv.fg_iff FirstOrder.Language.Equiv.fg_iffₓ'. -/
theorem Equiv.fg_iff {N : Type _} [L.Structure N] (f : M ≃[L] N) :
Structure.FG L M ↔ Structure.FG L N :=
⟨fun h => h.mapOfSurjective f.toHom f.toEquiv.Surjective, fun h =>
h.mapOfSurjective f.symm.toHom f.toEquiv.symm.Surjective⟩
#align first_order.language.equiv.fg_iff FirstOrder.Language.Equiv.fg_iff
-/- warning: first_order.language.substructure.fg_iff_Structure_fg -> FirstOrder.Language.Substructure.fg_iff_structure_fg is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] (S : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1), Iff (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 S) (FirstOrder.Language.Structure.FG.{u1, u2, u3} L (coeSort.{succ u3, succ (succ u3)} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) Type.{u3} (SetLike.hasCoeToSort.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)) S) (FirstOrder.Language.Substructure.inducedStructure.{u1, u2, u3} L M _inst_1 S))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] (S : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1), Iff (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 S) (FirstOrder.Language.Structure.FG.{u3, u2, u1} L (Subtype.{succ u1} M (fun (x : M) => Membership.mem.{u1, u1} M (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SetLike.instMembership.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) x S)) (FirstOrder.Language.Substructure.inducedStructure.{u3, u2, u1} L M _inst_1 S))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_iff_Structure_fg FirstOrder.Language.Substructure.fg_iff_structure_fgₓ'. -/
theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.FG ↔ Structure.FG L S :=
by
rw [Structure.fg_def]
@@ -483,24 +303,12 @@ theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.FG ↔ Struc
exact h
#align first_order.language.substructure.fg_iff_Structure_fg FirstOrder.Language.Substructure.fg_iff_structure_fg
-/- warning: first_order.language.equiv.cg_iff -> FirstOrder.Language.Equiv.cg_iff is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Equiv.{u1, u2, u3, u4} L M N _inst_1 _inst_2) -> (Iff (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Structure.CG.{u1, u2, u4} L N _inst_2))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Equiv.{u3, u2, u1, u4} L M N _inst_1 _inst_2) -> (Iff (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Structure.CG.{u3, u2, u4} L N _inst_2))
-Case conversion may be inaccurate. Consider using '#align first_order.language.equiv.cg_iff FirstOrder.Language.Equiv.cg_iffₓ'. -/
theorem Equiv.cg_iff {N : Type _} [L.Structure N] (f : M ≃[L] N) :
Structure.CG L M ↔ Structure.CG L N :=
⟨fun h => h.mapOfSurjective f.toHom f.toEquiv.Surjective, fun h =>
h.mapOfSurjective f.symm.toHom f.toEquiv.symm.Surjective⟩
#align first_order.language.equiv.cg_iff FirstOrder.Language.Equiv.cg_iff
-/- warning: first_order.language.substructure.cg_iff_Structure_cg -> FirstOrder.Language.Substructure.cg_iff_structure_cg is a dubious translation:
-lean 3 declaration is
- forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] (S : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1), Iff (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 S) (FirstOrder.Language.Structure.CG.{u1, u2, u3} L (coeSort.{succ u3, succ (succ u3)} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) Type.{u3} (SetLike.hasCoeToSort.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)) S) (FirstOrder.Language.Substructure.inducedStructure.{u1, u2, u3} L M _inst_1 S))
-but is expected to have type
- forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] (S : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1), Iff (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 S) (FirstOrder.Language.Structure.CG.{u3, u2, u1} L (Subtype.{succ u1} M (fun (x : M) => Membership.mem.{u1, u1} M (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SetLike.instMembership.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) x S)) (FirstOrder.Language.Substructure.inducedStructure.{u3, u2, u1} L M _inst_1 S))
-Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_iff_Structure_cg FirstOrder.Language.Substructure.cg_iff_structure_cgₓ'. -/
theorem Substructure.cg_iff_structure_cg (S : L.Substructure M) : S.CG ↔ Structure.CG L S :=
by
rw [Structure.cg_def]
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Aaron Anderson
! This file was ported from Lean 3 source module model_theory.finitely_generated
-! leanprover-community/mathlib commit 0602c59878ff3d5f71dea69c2d32ccf2e93e5398
+! leanprover-community/mathlib commit dbdf71cee7bb20367cb7e37279c08b0c218cf967
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -12,6 +12,9 @@ import Mathbin.ModelTheory.Substructures
/-!
# Finitely Generated First-Order Structures
+
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
This file defines what it means for a first-order (sub)structure to be finitely or countably
generated, similarly to other finitely-generated objects in the algebra library.
mathlib commit https://github.com/leanprover-community/mathlib/commit/403190b5419b3f03f1a2893ad9352ca7f7d8bff6
@@ -43,12 +43,20 @@ variable {L : Language} {M : Type _} [L.Structure M]
namespace Substructure
+#print FirstOrder.Language.Substructure.FG /-
/-- A substructure of `M` is finitely generated if it is the closure of a finite subset of `M`. -/
-def Fg (N : L.Substructure M) : Prop :=
+def FG (N : L.Substructure M) : Prop :=
∃ S : Finset M, closure L ↑S = N
-#align first_order.language.substructure.fg FirstOrder.Language.Substructure.Fg
+#align first_order.language.substructure.fg FirstOrder.Language.Substructure.FG
+-/
-theorem fg_def {N : L.Substructure M} : N.Fg ↔ ∃ S : Set M, S.Finite ∧ closure L S = N :=
+/- warning: first_order.language.substructure.fg_def -> FirstOrder.Language.Substructure.fg_def is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N) (Exists.{succ u3} (Set.{u3} M) (fun (S : Set.{u3} M) => And (Set.Finite.{u3} M S) (Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) S) N)))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N) (Exists.{succ u1} (Set.{u1} M) (fun (S : Set.{u1} M) => And (Set.Finite.{u1} M S) (Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) S) N)))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_def FirstOrder.Language.Substructure.fg_defₓ'. -/
+theorem fg_def {N : L.Substructure M} : N.FG ↔ ∃ S : Set M, S.Finite ∧ closure L S = N :=
⟨fun ⟨t, h⟩ => ⟨_, Finset.finite_toSet t, h⟩,
by
rintro ⟨t', h, rfl⟩
@@ -56,8 +64,14 @@ theorem fg_def {N : L.Substructure M} : N.Fg ↔ ∃ S : Set M, S.Finite ∧ clo
exact ⟨t, rfl⟩⟩
#align first_order.language.substructure.fg_def FirstOrder.Language.Substructure.fg_def
+/- warning: first_order.language.substructure.fg_iff_exists_fin_generating_family -> FirstOrder.Language.Substructure.fg_iff_exists_fin_generating_family is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N) (Exists.{1} Nat (fun (n : Nat) => Exists.{succ u3} ((Fin n) -> M) (fun (s : (Fin n) -> M) => Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) (Set.range.{u3, 1} M (Fin n) s)) N)))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N) (Exists.{1} Nat (fun (n : Nat) => Exists.{succ u1} ((Fin n) -> M) (fun (s : (Fin n) -> M) => Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) (Set.range.{u1, 1} M (Fin n) s)) N)))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_iff_exists_fin_generating_family FirstOrder.Language.Substructure.fg_iff_exists_fin_generating_familyₓ'. -/
theorem fg_iff_exists_fin_generating_family {N : L.Substructure M} :
- N.Fg ↔ ∃ (n : ℕ)(s : Fin n → M), closure L (range s) = N :=
+ N.FG ↔ ∃ (n : ℕ)(s : Fin n → M), closure L (range s) = N :=
by
rw [fg_def]
constructor
@@ -68,32 +82,68 @@ theorem fg_iff_exists_fin_generating_family {N : L.Substructure M} :
refine' ⟨range s, finite_range s, hs⟩
#align first_order.language.substructure.fg_iff_exists_fin_generating_family FirstOrder.Language.Substructure.fg_iff_exists_fin_generating_family
-theorem fg_bot : (⊥ : L.Substructure M).Fg :=
+/- warning: first_order.language.substructure.fg_bot -> FirstOrder.Language.Substructure.fg_bot is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (Bot.bot.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (CompleteLattice.toHasBot.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u1, u2, u3} L M _inst_1)))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 (Bot.bot.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toBot.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_bot FirstOrder.Language.Substructure.fg_botₓ'. -/
+theorem fg_bot : (⊥ : L.Substructure M).FG :=
⟨∅, by rw [Finset.coe_empty, closure_empty]⟩
#align first_order.language.substructure.fg_bot FirstOrder.Language.Substructure.fg_bot
-theorem fg_closure {s : Set M} (hs : s.Finite) : Fg (closure L s) :=
+/- warning: first_order.language.substructure.fg_closure -> FirstOrder.Language.Substructure.fg_closure is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {s : Set.{u3} M}, (Set.Finite.{u3} M s) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) s))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u2, u1}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u2, u1, u3} L M] {s : Set.{u3} M}, (Set.Finite.{u3} M s) -> (FirstOrder.Language.Substructure.FG.{u2, u1, u3} L M _inst_1 (LowerAdjoint.toFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.instCompleteBooleanAlgebraSet.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u2, u1, u3} L M _inst_1)))) (SetLike.coe.{u3, u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u2, u1, u3} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u2, u1, u3} L M _inst_1) s))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_closure FirstOrder.Language.Substructure.fg_closureₓ'. -/
+theorem fg_closure {s : Set M} (hs : s.Finite) : FG (closure L s) :=
⟨hs.toFinset, by rw [hs.coe_to_finset]⟩
#align first_order.language.substructure.fg_closure FirstOrder.Language.Substructure.fg_closure
-theorem fg_closure_singleton (x : M) : Fg (closure L ({x} : Set M)) :=
+/- warning: first_order.language.substructure.fg_closure_singleton -> FirstOrder.Language.Substructure.fg_closure_singleton is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] (x : M), FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) (Singleton.singleton.{u3, u3} M (Set.{u3} M) (Set.hasSingleton.{u3} M) x))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] (x : M), FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) (Singleton.singleton.{u1, u1} M (Set.{u1} M) (Set.instSingletonSet.{u1} M) x))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_closure_singleton FirstOrder.Language.Substructure.fg_closure_singletonₓ'. -/
+theorem fg_closure_singleton (x : M) : FG (closure L ({x} : Set M)) :=
fg_closure (finite_singleton x)
#align first_order.language.substructure.fg_closure_singleton FirstOrder.Language.Substructure.fg_closure_singleton
-theorem Fg.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.Fg) (hN₂ : N₂.Fg) : (N₁ ⊔ N₂).Fg :=
+/- warning: first_order.language.substructure.fg.sup -> FirstOrder.Language.Substructure.FG.sup is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N₁ : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1} {N₂ : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N₁) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N₂) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (Sup.sup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SemilatticeSup.toHasSup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Lattice.toSemilatticeSup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (ConditionallyCompleteLattice.toLattice.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u1, u2, u3} L M _inst_1))))) N₁ N₂))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N₁ : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1} {N₂ : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N₁) -> (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N₂) -> (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 (Sup.sup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SemilatticeSup.toSup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (Lattice.toSemilatticeSup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1))))) N₁ N₂))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg.sup FirstOrder.Language.Substructure.FG.supₓ'. -/
+theorem FG.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.FG) (hN₂ : N₂.FG) : (N₁ ⊔ N₂).FG :=
let ⟨t₁, ht₁⟩ := fg_def.1 hN₁
let ⟨t₂, ht₂⟩ := fg_def.1 hN₂
fg_def.2 ⟨t₁ ∪ t₂, ht₁.1.union ht₂.1, by rw [closure_union, ht₁.2, ht₂.2]⟩
-#align first_order.language.substructure.fg.sup FirstOrder.Language.Substructure.Fg.sup
-
-theorem Fg.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.Fg) :
- (s.map f).Fg :=
+#align first_order.language.substructure.fg.sup FirstOrder.Language.Substructure.FG.sup
+
+/- warning: first_order.language.substructure.fg.map -> FirstOrder.Language.Substructure.FG.map is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N] (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 s) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f s))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N] (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 s) -> (FirstOrder.Language.Substructure.FG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f s))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg.map FirstOrder.Language.Substructure.FG.mapₓ'. -/
+theorem FG.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.FG) :
+ (s.map f).FG :=
let ⟨t, ht⟩ := fg_def.1 hs
fg_def.2 ⟨f '' t, ht.1.image _, by rw [closure_image, ht.2]⟩
-#align first_order.language.substructure.fg.map FirstOrder.Language.Substructure.Fg.map
-
-theorem Fg.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
- (hs : (s.map f.toHom).Fg) : s.Fg :=
+#align first_order.language.substructure.fg.map FirstOrder.Language.Substructure.FG.map
+
+/- warning: first_order.language.substructure.fg.of_map_embedding -> FirstOrder.Language.Substructure.FG.of_map_embedding is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N] (f : FirstOrder.Language.Embedding.{u1, u2, u3, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u1, u2, u3, u4} L M N _inst_1 _inst_2 (FirstOrder.Language.Embedding.toHom.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f) s)) -> (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 s)
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N] (f : FirstOrder.Language.Embedding.{u3, u2, u1, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u3, u2, u1, u4} L M N _inst_1 _inst_2 (FirstOrder.Language.Embedding.toHom.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f) s)) -> (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 s)
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg.of_map_embedding FirstOrder.Language.Substructure.FG.of_map_embeddingₓ'. -/
+theorem FG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
+ (hs : (s.map f.toHom).FG) : s.FG :=
by
rcases hs with ⟨t, h⟩
rw [fg_def]
@@ -105,26 +155,46 @@ theorem Fg.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L
have h' := subset_closure hx
rw [h] at h'
exact hom.map_le_range h'
-#align first_order.language.substructure.fg.of_map_embedding FirstOrder.Language.Substructure.Fg.of_map_embedding
+#align first_order.language.substructure.fg.of_map_embedding FirstOrder.Language.Substructure.FG.of_map_embedding
+#print FirstOrder.Language.Substructure.CG /-
/-- A substructure of `M` is countably generated if it is the closure of a countable subset of `M`.
-/
-def Cg (N : L.Substructure M) : Prop :=
+def CG (N : L.Substructure M) : Prop :=
∃ S : Set M, S.Countable ∧ closure L S = N
-#align first_order.language.substructure.cg FirstOrder.Language.Substructure.Cg
+#align first_order.language.substructure.cg FirstOrder.Language.Substructure.CG
+-/
-theorem cg_def {N : L.Substructure M} : N.Cg ↔ ∃ S : Set M, S.Countable ∧ closure L S = N :=
+/- warning: first_order.language.substructure.cg_def -> FirstOrder.Language.Substructure.cg_def is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N) (Exists.{succ u3} (Set.{u3} M) (fun (S : Set.{u3} M) => And (Set.Countable.{u3} M S) (Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) S) N)))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N) (Exists.{succ u1} (Set.{u1} M) (fun (S : Set.{u1} M) => And (Set.Countable.{u1} M S) (Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) S) N)))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_def FirstOrder.Language.Substructure.cg_defₓ'. -/
+theorem cg_def {N : L.Substructure M} : N.CG ↔ ∃ S : Set M, S.Countable ∧ closure L S = N :=
Iff.refl _
#align first_order.language.substructure.cg_def FirstOrder.Language.Substructure.cg_def
-theorem Fg.cg {N : L.Substructure M} (h : N.Fg) : N.Cg :=
+/- warning: first_order.language.substructure.fg.cg -> FirstOrder.Language.Substructure.FG.cg is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 N) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N)
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 N) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N)
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg.cg FirstOrder.Language.Substructure.FG.cgₓ'. -/
+theorem FG.cg {N : L.Substructure M} (h : N.FG) : N.CG :=
by
obtain ⟨s, hf, rfl⟩ := fg_def.1 h
refine' ⟨s, hf.countable, rfl⟩
-#align first_order.language.substructure.fg.cg FirstOrder.Language.Substructure.Fg.cg
-
+#align first_order.language.substructure.fg.cg FirstOrder.Language.Substructure.FG.cg
+
+/- warning: first_order.language.substructure.cg_iff_empty_or_exists_nat_generating_family -> FirstOrder.Language.Substructure.cg_iff_empty_or_exists_nat_generating_family is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N) (Or (Eq.{succ u3} (Set.{u3} M) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))) N) (EmptyCollection.emptyCollection.{u3} (Set.{u3} M) (Set.hasEmptyc.{u3} M))) (Exists.{succ u3} (Nat -> M) (fun (s : Nat -> M) => Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) (Set.range.{u3, 1} M Nat s)) N)))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N) (Or (Eq.{succ u1} (Set.{u1} M) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1) N) (EmptyCollection.emptyCollection.{u1} (Set.{u1} M) (Set.instEmptyCollectionSet.{u1} M))) (Exists.{succ u1} (Nat -> M) (fun (s : Nat -> M) => Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) (Set.range.{u1, 1} M Nat s)) N)))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_iff_empty_or_exists_nat_generating_family FirstOrder.Language.Substructure.cg_iff_empty_or_exists_nat_generating_familyₓ'. -/
theorem cg_iff_empty_or_exists_nat_generating_family {N : L.Substructure M} :
- N.Cg ↔ ↑N = (∅ : Set M) ∨ ∃ s : ℕ → M, closure L (range s) = N :=
+ N.CG ↔ ↑N = (∅ : Set M) ∨ ∃ s : ℕ → M, closure L (range s) = N :=
by
rw [cg_def]
constructor
@@ -146,32 +216,68 @@ theorem cg_iff_empty_or_exists_nat_generating_family {N : L.Substructure M} :
exact ⟨range f, countable_range _, rfl⟩
#align first_order.language.substructure.cg_iff_empty_or_exists_nat_generating_family FirstOrder.Language.Substructure.cg_iff_empty_or_exists_nat_generating_family
-theorem cg_bot : (⊥ : L.Substructure M).Cg :=
- fg_bot.Cg
+/- warning: first_order.language.substructure.cg_bot -> FirstOrder.Language.Substructure.cg_bot is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (Bot.bot.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (CompleteLattice.toHasBot.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u1, u2, u3} L M _inst_1)))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 (Bot.bot.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toBot.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_bot FirstOrder.Language.Substructure.cg_botₓ'. -/
+theorem cg_bot : (⊥ : L.Substructure M).CG :=
+ fg_bot.CG
#align first_order.language.substructure.cg_bot FirstOrder.Language.Substructure.cg_bot
-theorem cg_closure {s : Set M} (hs : s.Countable) : Cg (closure L s) :=
+/- warning: first_order.language.substructure.cg_closure -> FirstOrder.Language.Substructure.cg_closure is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {s : Set.{u3} M}, (Set.Countable.{u3} M s) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) s))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u2, u1}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u2, u1, u3} L M] {s : Set.{u3} M}, (Set.Countable.{u3} M s) -> (FirstOrder.Language.Substructure.CG.{u2, u1, u3} L M _inst_1 (LowerAdjoint.toFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.instCompleteBooleanAlgebraSet.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u2, u1, u3} L M _inst_1)))) (SetLike.coe.{u3, u3} (FirstOrder.Language.Substructure.{u2, u1, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u2, u1, u3} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u2, u1, u3} L M _inst_1) s))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_closure FirstOrder.Language.Substructure.cg_closureₓ'. -/
+theorem cg_closure {s : Set M} (hs : s.Countable) : CG (closure L s) :=
⟨s, hs, rfl⟩
#align first_order.language.substructure.cg_closure FirstOrder.Language.Substructure.cg_closure
-theorem cg_closure_singleton (x : M) : Cg (closure L ({x} : Set M)) :=
- (fg_closure_singleton x).Cg
+/- warning: first_order.language.substructure.cg_closure_singleton -> FirstOrder.Language.Substructure.cg_closure_singleton is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] (x : M), FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) (Singleton.singleton.{u3, u3} M (Set.{u3} M) (Set.hasSingleton.{u3} M) x))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] (x : M), FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) (Singleton.singleton.{u1, u1} M (Set.{u1} M) (Set.instSingletonSet.{u1} M) x))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_closure_singleton FirstOrder.Language.Substructure.cg_closure_singletonₓ'. -/
+theorem cg_closure_singleton (x : M) : CG (closure L ({x} : Set M)) :=
+ (fg_closure_singleton x).CG
#align first_order.language.substructure.cg_closure_singleton FirstOrder.Language.Substructure.cg_closure_singleton
-theorem Cg.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.Cg) (hN₂ : N₂.Cg) : (N₁ ⊔ N₂).Cg :=
+/- warning: first_order.language.substructure.cg.sup -> FirstOrder.Language.Substructure.CG.sup is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N₁ : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1} {N₂ : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N₁) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 N₂) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (Sup.sup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SemilatticeSup.toHasSup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Lattice.toSemilatticeSup.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (ConditionallyCompleteLattice.toLattice.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u1, u2, u3} L M _inst_1))))) N₁ N₂))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N₁ : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1} {N₂ : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N₁) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 N₂) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 (Sup.sup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SemilatticeSup.toSup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (Lattice.toSemilatticeSup.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1))))) N₁ N₂))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg.sup FirstOrder.Language.Substructure.CG.supₓ'. -/
+theorem CG.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.CG) (hN₂ : N₂.CG) : (N₁ ⊔ N₂).CG :=
let ⟨t₁, ht₁⟩ := cg_def.1 hN₁
let ⟨t₂, ht₂⟩ := cg_def.1 hN₂
cg_def.2 ⟨t₁ ∪ t₂, ht₁.1.union ht₂.1, by rw [closure_union, ht₁.2, ht₂.2]⟩
-#align first_order.language.substructure.cg.sup FirstOrder.Language.Substructure.Cg.sup
-
-theorem Cg.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.Cg) :
- (s.map f).Cg :=
+#align first_order.language.substructure.cg.sup FirstOrder.Language.Substructure.CG.sup
+
+/- warning: first_order.language.substructure.cg.map -> FirstOrder.Language.Substructure.CG.map is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N] (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 s) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f s))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N] (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 s) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f s))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg.map FirstOrder.Language.Substructure.CG.mapₓ'. -/
+theorem CG.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.CG) :
+ (s.map f).CG :=
let ⟨t, ht⟩ := cg_def.1 hs
cg_def.2 ⟨f '' t, ht.1.image _, by rw [closure_image, ht.2]⟩
-#align first_order.language.substructure.cg.map FirstOrder.Language.Substructure.Cg.map
-
-theorem Cg.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
- (hs : (s.map f.toHom).Cg) : s.Cg :=
+#align first_order.language.substructure.cg.map FirstOrder.Language.Substructure.CG.map
+
+/- warning: first_order.language.substructure.cg.of_map_embedding -> FirstOrder.Language.Substructure.CG.of_map_embedding is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N] (f : FirstOrder.Language.Embedding.{u1, u2, u3, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u1, u2, u3, u4} L M N _inst_1 _inst_2 (FirstOrder.Language.Embedding.toHom.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f) s)) -> (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 s)
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N] (f : FirstOrder.Language.Embedding.{u3, u2, u1, u4} L M N _inst_1 _inst_2) {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, (FirstOrder.Language.Substructure.CG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Substructure.map.{u3, u2, u1, u4} L M N _inst_1 _inst_2 (FirstOrder.Language.Embedding.toHom.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f) s)) -> (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 s)
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg.of_map_embedding FirstOrder.Language.Substructure.CG.of_map_embeddingₓ'. -/
+theorem CG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
+ (hs : (s.map f.toHom).CG) : s.CG :=
by
rcases hs with ⟨t, h1, h2⟩
rw [cg_def]
@@ -183,10 +289,16 @@ theorem Cg.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L
have h' := subset_closure hx
rw [h2] at h'
exact hom.map_le_range h'
-#align first_order.language.substructure.cg.of_map_embedding FirstOrder.Language.Substructure.Cg.of_map_embedding
-
+#align first_order.language.substructure.cg.of_map_embedding FirstOrder.Language.Substructure.CG.of_map_embedding
+
+/- warning: first_order.language.substructure.cg_iff_countable -> FirstOrder.Language.Substructure.cg_iff_countable is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] [_inst_2 : Countable.{succ u1} (Sigma.{0, u1} Nat (fun (l : Nat) => FirstOrder.Language.Functions.{u1, u2} L l))] {s : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 s) (Countable.{succ u3} (coeSort.{succ u3, succ (succ u3)} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) Type.{u3} (SetLike.hasCoeToSort.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)) s))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] [_inst_2 : Countable.{succ u3} (Sigma.{0, u3} Nat (fun (l : Nat) => FirstOrder.Language.Functions.{u3, u2} L l))] {s : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1}, Iff (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 s) (Countable.{succ u1} (Subtype.{succ u1} M (fun (x : M) => Membership.mem.{u1, u1} M (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SetLike.instMembership.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) x s)))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_iff_countable FirstOrder.Language.Substructure.cg_iff_countableₓ'. -/
theorem cg_iff_countable [Countable (Σl, L.Functions l)] {s : L.Substructure M} :
- s.Cg ↔ Countable s :=
+ s.CG ↔ Countable s :=
by
refine' ⟨_, fun h => ⟨s, h.to_set, s.closure_eq⟩⟩
rintro ⟨s, h, rfl⟩
@@ -201,85 +313,163 @@ namespace Structure
variable (L) (M)
+#print FirstOrder.Language.Structure.FG /-
/-- A structure is finitely generated if it is the closure of a finite subset. -/
-class Fg : Prop where
- out : (⊤ : L.Substructure M).Fg
-#align first_order.language.Structure.fg FirstOrder.Language.Structure.Fg
+class FG : Prop where
+ out : (⊤ : L.Substructure M).FG
+#align first_order.language.Structure.fg FirstOrder.Language.Structure.FG
+-/
+#print FirstOrder.Language.Structure.CG /-
/-- A structure is countably generated if it is the closure of a countable subset. -/
-class Cg : Prop where
- out : (⊤ : L.Substructure M).Cg
-#align first_order.language.Structure.cg FirstOrder.Language.Structure.Cg
+class CG : Prop where
+ out : (⊤ : L.Substructure M).CG
+#align first_order.language.Structure.cg FirstOrder.Language.Structure.CG
+-/
variable {L M}
-theorem fg_def : Fg L M ↔ (⊤ : L.Substructure M).Fg :=
+/- warning: first_order.language.Structure.fg_def -> FirstOrder.Language.Structure.fg_def is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], Iff (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 (Top.top.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u1, u2, u3} L M _inst_1)))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], Iff (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 (Top.top.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u3, u2, u1} L M _inst_1)))
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg_def FirstOrder.Language.Structure.fg_defₓ'. -/
+theorem fg_def : FG L M ↔ (⊤ : L.Substructure M).FG :=
⟨fun h => h.1, fun h => ⟨h⟩⟩
#align first_order.language.Structure.fg_def FirstOrder.Language.Structure.fg_def
+/- warning: first_order.language.Structure.fg_iff -> FirstOrder.Language.Structure.fg_iff is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], Iff (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) (Exists.{succ u3} (Set.{u3} M) (fun (S : Set.{u3} M) => And (Set.Finite.{u3} M S) (Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) S) (Top.top.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u1, u2, u3} L M _inst_1)))))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], Iff (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) (Exists.{succ u1} (Set.{u1} M) (fun (S : Set.{u1} M) => And (Set.Finite.{u1} M S) (Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) S) (Top.top.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u3, u2, u1} L M _inst_1)))))
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg_iff FirstOrder.Language.Structure.fg_iffₓ'. -/
/-- An equivalent expression of `Structure.fg` in terms of `set.finite` instead of `finset`. -/
-theorem fg_iff : Fg L M ↔ ∃ S : Set M, S.Finite ∧ closure L S = (⊤ : L.Substructure M) := by
+theorem fg_iff : FG L M ↔ ∃ S : Set M, S.Finite ∧ closure L S = (⊤ : L.Substructure M) := by
rw [fg_def, substructure.fg_def]
#align first_order.language.Structure.fg_iff FirstOrder.Language.Structure.fg_iff
-theorem Fg.range {N : Type _} [L.Structure N] (h : Fg L M) (f : M →[L] N) : f.range.Fg :=
+/- warning: first_order.language.Structure.fg.range -> FirstOrder.Language.Structure.FG.range is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2), FirstOrder.Language.Substructure.FG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Hom.range.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2), FirstOrder.Language.Substructure.FG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Hom.range.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f))
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg.range FirstOrder.Language.Structure.FG.rangeₓ'. -/
+theorem FG.range {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N) : f.range.FG :=
by
rw [hom.range_eq_map]
exact (fg_def.1 h).map f
-#align first_order.language.Structure.fg.range FirstOrder.Language.Structure.Fg.range
-
-theorem Fg.map_of_surjective {N : Type _} [L.Structure N] (h : Fg L M) (f : M →[L] N)
- (hs : Function.Surjective f) : Fg L N :=
+#align first_order.language.Structure.fg.range FirstOrder.Language.Structure.FG.range
+
+/- warning: first_order.language.Structure.fg.map_of_surjective -> FirstOrder.Language.Structure.FG.map_of_surjective is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2), (Function.Surjective.{succ u3, succ u4} M N (coeFn.{max (succ u3) (succ u4), max (succ u3) (succ u4)} (FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) (fun (_x : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) => M -> N) (FirstOrder.Language.Hom.hasCoeToFun.{u1, u2, u3, u4} L M N _inst_1 _inst_2) f)) -> (FirstOrder.Language.Structure.FG.{u1, u2, u4} L N _inst_2))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2), (Function.Surjective.{succ u1, succ u4} M N (FunLike.coe.{max (succ u1) (succ u4), succ u1, succ u4} (FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2) M (fun (_x : M) => (fun (a._@.Mathlib.ModelTheory.Basic._hyg.5742 : M) => N) _x) (FirstOrder.Language.Hom.funLike.{u3, u2, u1, u4} L M N _inst_1 _inst_2) f)) -> (FirstOrder.Language.Structure.FG.{u3, u2, u4} L N _inst_2))
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg.map_of_surjective FirstOrder.Language.Structure.FG.map_of_surjectiveₓ'. -/
+theorem FG.map_of_surjective {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N)
+ (hs : Function.Surjective f) : FG L N :=
by
rw [← hom.range_eq_top] at hs
rw [fg_def, ← hs]
exact h.range f
-#align first_order.language.Structure.fg.map_of_surjective FirstOrder.Language.Structure.Fg.map_of_surjective
-
-theorem cg_def : Cg L M ↔ (⊤ : L.Substructure M).Cg :=
+#align first_order.language.Structure.fg.map_of_surjective FirstOrder.Language.Structure.FG.map_of_surjective
+
+/- warning: first_order.language.Structure.cg_def -> FirstOrder.Language.Structure.cg_def is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], Iff (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 (Top.top.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u1, u2, u3} L M _inst_1)))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], Iff (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 (Top.top.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u3, u2, u1} L M _inst_1)))
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg_def FirstOrder.Language.Structure.cg_defₓ'. -/
+theorem cg_def : CG L M ↔ (⊤ : L.Substructure M).CG :=
⟨fun h => h.1, fun h => ⟨h⟩⟩
#align first_order.language.Structure.cg_def FirstOrder.Language.Structure.cg_def
+/- warning: first_order.language.Structure.cg_iff -> FirstOrder.Language.Structure.cg_iff is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], Iff (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) (Exists.{succ u3} (Set.{u3} M) (fun (S : Set.{u3} M) => And (Set.Countable.{u3} M S) (Eq.{succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (coeFn.{succ u3, succ u3} (LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (fun (_x : LowerAdjoint.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) => (Set.{u3} M) -> (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1)) (LowerAdjoint.hasCoeToFun.{u3, u3} (Set.{u3} M) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (PartialOrder.toPreorder.{u3} (Set.{u3} M) (CompleteSemilatticeInf.toPartialOrder.{u3} (Set.{u3} M) (CompleteLattice.toCompleteSemilatticeInf.{u3} (Set.{u3} M) (Order.Coframe.toCompleteLattice.{u3} (Set.{u3} M) (CompleteDistribLattice.toCoframe.{u3} (Set.{u3} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u3} (Set.{u3} M) (Set.completeBooleanAlgebra.{u3} M))))))) (PartialOrder.toPreorder.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (SetLike.partialOrder.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1))) ((fun (a : Type.{u3}) (b : Type.{u3}) [self : HasLiftT.{succ u3, succ u3} a b] => self.0) (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (HasLiftT.mk.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (CoeTCₓ.coe.{succ u3, succ u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (Set.{u3} M) (SetLike.Set.hasCoeT.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)))))) (FirstOrder.Language.Substructure.closure.{u1, u2, u3} L M _inst_1) S) (Top.top.{u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u1, u2, u3} L M _inst_1)))))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], Iff (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) (Exists.{succ u1} (Set.{u1} M) (fun (S : Set.{u1} M) => And (Set.Countable.{u1} M S) (Eq.{succ u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (LowerAdjoint.toFun.{u1, u1} (Set.{u1} M) (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (PartialOrder.toPreorder.{u1} (Set.{u1} M) (CompleteSemilatticeInf.toPartialOrder.{u1} (Set.{u1} M) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Set.{u1} M) (Order.Coframe.toCompleteLattice.{u1} (Set.{u1} M) (CompleteDistribLattice.toCoframe.{u1} (Set.{u1} M) (CompleteBooleanAlgebra.toCompleteDistribLattice.{u1} (Set.{u1} M) (Set.instCompleteBooleanAlgebraSet.{u1} M))))))) (PartialOrder.toPreorder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteSemilatticeInf.toPartialOrder.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (CompleteLattice.toCompleteSemilatticeInf.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instCompleteLattice.{u3, u2, u1} L M _inst_1)))) (SetLike.coe.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) (FirstOrder.Language.Substructure.closure.{u3, u2, u1} L M _inst_1) S) (Top.top.{u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Substructure.instTop.{u3, u2, u1} L M _inst_1)))))
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg_iff FirstOrder.Language.Structure.cg_iffₓ'. -/
/-- An equivalent expression of `Structure.cg`. -/
-theorem cg_iff : Cg L M ↔ ∃ S : Set M, S.Countable ∧ closure L S = (⊤ : L.Substructure M) := by
+theorem cg_iff : CG L M ↔ ∃ S : Set M, S.Countable ∧ closure L S = (⊤ : L.Substructure M) := by
rw [cg_def, substructure.cg_def]
#align first_order.language.Structure.cg_iff FirstOrder.Language.Structure.cg_iff
-theorem Cg.range {N : Type _} [L.Structure N] (h : Cg L M) (f : M →[L] N) : f.range.Cg :=
+/- warning: first_order.language.Structure.cg.range -> FirstOrder.Language.Structure.CG.range is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2), FirstOrder.Language.Substructure.CG.{u1, u2, u4} L N _inst_2 (FirstOrder.Language.Hom.range.{u1, u2, u3, u4} L M N _inst_1 _inst_2 f))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2), FirstOrder.Language.Substructure.CG.{u3, u2, u4} L N _inst_2 (FirstOrder.Language.Hom.range.{u3, u2, u1, u4} L M N _inst_1 _inst_2 f))
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg.range FirstOrder.Language.Structure.CG.rangeₓ'. -/
+theorem CG.range {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N) : f.range.CG :=
by
rw [hom.range_eq_map]
exact (cg_def.1 h).map f
-#align first_order.language.Structure.cg.range FirstOrder.Language.Structure.Cg.range
-
-theorem Cg.map_of_surjective {N : Type _} [L.Structure N] (h : Cg L M) (f : M →[L] N)
- (hs : Function.Surjective f) : Cg L N :=
+#align first_order.language.Structure.cg.range FirstOrder.Language.Structure.CG.range
+
+/- warning: first_order.language.Structure.cg.map_of_surjective -> FirstOrder.Language.Structure.CG.map_of_surjective is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2), (Function.Surjective.{succ u3, succ u4} M N (coeFn.{max (succ u3) (succ u4), max (succ u3) (succ u4)} (FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) (fun (_x : FirstOrder.Language.Hom.{u1, u2, u3, u4} L M N _inst_1 _inst_2) => M -> N) (FirstOrder.Language.Hom.hasCoeToFun.{u1, u2, u3, u4} L M N _inst_1 _inst_2) f)) -> (FirstOrder.Language.Structure.CG.{u1, u2, u4} L N _inst_2))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) -> (forall (f : FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2), (Function.Surjective.{succ u1, succ u4} M N (FunLike.coe.{max (succ u1) (succ u4), succ u1, succ u4} (FirstOrder.Language.Hom.{u3, u2, u1, u4} L M N _inst_1 _inst_2) M (fun (_x : M) => (fun (a._@.Mathlib.ModelTheory.Basic._hyg.5742 : M) => N) _x) (FirstOrder.Language.Hom.funLike.{u3, u2, u1, u4} L M N _inst_1 _inst_2) f)) -> (FirstOrder.Language.Structure.CG.{u3, u2, u4} L N _inst_2))
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg.map_of_surjective FirstOrder.Language.Structure.CG.map_of_surjectiveₓ'. -/
+theorem CG.map_of_surjective {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N)
+ (hs : Function.Surjective f) : CG L N :=
by
rw [← hom.range_eq_top] at hs
rw [cg_def, ← hs]
exact h.range f
-#align first_order.language.Structure.cg.map_of_surjective FirstOrder.Language.Structure.Cg.map_of_surjective
-
-theorem cg_iff_countable [Countable (Σl, L.Functions l)] : Cg L M ↔ Countable M := by
+#align first_order.language.Structure.cg.map_of_surjective FirstOrder.Language.Structure.CG.map_of_surjective
+
+/- warning: first_order.language.Structure.cg_iff_countable -> FirstOrder.Language.Structure.cg_iff_countable is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] [_inst_2 : Countable.{succ u1} (Sigma.{0, u1} Nat (fun (l : Nat) => FirstOrder.Language.Functions.{u1, u2} L l))], Iff (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) (Countable.{succ u3} M)
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] [_inst_2 : Countable.{succ u3} (Sigma.{0, u3} Nat (fun (l : Nat) => FirstOrder.Language.Functions.{u3, u2} L l))], Iff (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) (Countable.{succ u1} M)
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.cg_iff_countable FirstOrder.Language.Structure.cg_iff_countableₓ'. -/
+theorem cg_iff_countable [Countable (Σl, L.Functions l)] : CG L M ↔ Countable M := by
rw [cg_def, cg_iff_countable, top_equiv.to_equiv.countable_iff]
#align first_order.language.Structure.cg_iff_countable FirstOrder.Language.Structure.cg_iff_countable
-theorem Fg.cg (h : Fg L M) : Cg L M :=
- cg_def.2 (fg_def.1 h).Cg
-#align first_order.language.Structure.fg.cg FirstOrder.Language.Structure.Fg.cg
-
-instance (priority := 100) cg_of_fg [h : Fg L M] : Cg L M :=
- h.Cg
+/- warning: first_order.language.Structure.fg.cg -> FirstOrder.Language.Structure.FG.cg is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M], (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) -> (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1)
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M], (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) -> (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1)
+Case conversion may be inaccurate. Consider using '#align first_order.language.Structure.fg.cg FirstOrder.Language.Structure.FG.cgₓ'. -/
+theorem FG.cg (h : FG L M) : CG L M :=
+ cg_def.2 (fg_def.1 h).CG
+#align first_order.language.Structure.fg.cg FirstOrder.Language.Structure.FG.cg
+
+#print FirstOrder.Language.Structure.cg_of_fg /-
+instance (priority := 100) cg_of_fg [h : FG L M] : CG L M :=
+ h.CG
#align first_order.language.Structure.cg_of_fg FirstOrder.Language.Structure.cg_of_fg
+-/
end Structure
+/- warning: first_order.language.equiv.fg_iff -> FirstOrder.Language.Equiv.fg_iff is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Equiv.{u1, u2, u3, u4} L M N _inst_1 _inst_2) -> (Iff (FirstOrder.Language.Structure.FG.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Structure.FG.{u1, u2, u4} L N _inst_2))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Equiv.{u3, u2, u1, u4} L M N _inst_1 _inst_2) -> (Iff (FirstOrder.Language.Structure.FG.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Structure.FG.{u3, u2, u4} L N _inst_2))
+Case conversion may be inaccurate. Consider using '#align first_order.language.equiv.fg_iff FirstOrder.Language.Equiv.fg_iffₓ'. -/
theorem Equiv.fg_iff {N : Type _} [L.Structure N] (f : M ≃[L] N) :
- Structure.Fg L M ↔ Structure.Fg L N :=
+ Structure.FG L M ↔ Structure.FG L N :=
⟨fun h => h.mapOfSurjective f.toHom f.toEquiv.Surjective, fun h =>
h.mapOfSurjective f.symm.toHom f.toEquiv.symm.Surjective⟩
#align first_order.language.equiv.fg_iff FirstOrder.Language.Equiv.fg_iff
-theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.Fg ↔ Structure.Fg L S :=
+/- warning: first_order.language.substructure.fg_iff_Structure_fg -> FirstOrder.Language.Substructure.fg_iff_structure_fg is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] (S : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1), Iff (FirstOrder.Language.Substructure.FG.{u1, u2, u3} L M _inst_1 S) (FirstOrder.Language.Structure.FG.{u1, u2, u3} L (coeSort.{succ u3, succ (succ u3)} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) Type.{u3} (SetLike.hasCoeToSort.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)) S) (FirstOrder.Language.Substructure.inducedStructure.{u1, u2, u3} L M _inst_1 S))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] (S : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1), Iff (FirstOrder.Language.Substructure.FG.{u3, u2, u1} L M _inst_1 S) (FirstOrder.Language.Structure.FG.{u3, u2, u1} L (Subtype.{succ u1} M (fun (x : M) => Membership.mem.{u1, u1} M (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SetLike.instMembership.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) x S)) (FirstOrder.Language.Substructure.inducedStructure.{u3, u2, u1} L M _inst_1 S))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.fg_iff_Structure_fg FirstOrder.Language.Substructure.fg_iff_structure_fgₓ'. -/
+theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.FG ↔ Structure.FG L S :=
by
rw [Structure.fg_def]
refine' ⟨fun h => fg.of_map_embedding S.subtype _, fun h => _⟩
@@ -290,13 +480,25 @@ theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.Fg ↔ Struc
exact h
#align first_order.language.substructure.fg_iff_Structure_fg FirstOrder.Language.Substructure.fg_iff_structure_fg
+/- warning: first_order.language.equiv.cg_iff -> FirstOrder.Language.Equiv.cg_iff is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u1, u2, u4} L N], (FirstOrder.Language.Equiv.{u1, u2, u3, u4} L M N _inst_1 _inst_2) -> (Iff (FirstOrder.Language.Structure.CG.{u1, u2, u3} L M _inst_1) (FirstOrder.Language.Structure.CG.{u1, u2, u4} L N _inst_2))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] {N : Type.{u4}} [_inst_2 : FirstOrder.Language.Structure.{u3, u2, u4} L N], (FirstOrder.Language.Equiv.{u3, u2, u1, u4} L M N _inst_1 _inst_2) -> (Iff (FirstOrder.Language.Structure.CG.{u3, u2, u1} L M _inst_1) (FirstOrder.Language.Structure.CG.{u3, u2, u4} L N _inst_2))
+Case conversion may be inaccurate. Consider using '#align first_order.language.equiv.cg_iff FirstOrder.Language.Equiv.cg_iffₓ'. -/
theorem Equiv.cg_iff {N : Type _} [L.Structure N] (f : M ≃[L] N) :
- Structure.Cg L M ↔ Structure.Cg L N :=
+ Structure.CG L M ↔ Structure.CG L N :=
⟨fun h => h.mapOfSurjective f.toHom f.toEquiv.Surjective, fun h =>
h.mapOfSurjective f.symm.toHom f.toEquiv.symm.Surjective⟩
#align first_order.language.equiv.cg_iff FirstOrder.Language.Equiv.cg_iff
-theorem Substructure.cg_iff_structure_cg (S : L.Substructure M) : S.Cg ↔ Structure.Cg L S :=
+/- warning: first_order.language.substructure.cg_iff_Structure_cg -> FirstOrder.Language.Substructure.cg_iff_structure_cg is a dubious translation:
+lean 3 declaration is
+ forall {L : FirstOrder.Language.{u1, u2}} {M : Type.{u3}} [_inst_1 : FirstOrder.Language.Structure.{u1, u2, u3} L M] (S : FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1), Iff (FirstOrder.Language.Substructure.CG.{u1, u2, u3} L M _inst_1 S) (FirstOrder.Language.Structure.CG.{u1, u2, u3} L (coeSort.{succ u3, succ (succ u3)} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) Type.{u3} (SetLike.hasCoeToSort.{u3, u3} (FirstOrder.Language.Substructure.{u1, u2, u3} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u1, u2, u3} L M _inst_1)) S) (FirstOrder.Language.Substructure.inducedStructure.{u1, u2, u3} L M _inst_1 S))
+but is expected to have type
+ forall {L : FirstOrder.Language.{u3, u2}} {M : Type.{u1}} [_inst_1 : FirstOrder.Language.Structure.{u3, u2, u1} L M] (S : FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1), Iff (FirstOrder.Language.Substructure.CG.{u3, u2, u1} L M _inst_1 S) (FirstOrder.Language.Structure.CG.{u3, u2, u1} L (Subtype.{succ u1} M (fun (x : M) => Membership.mem.{u1, u1} M (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) (SetLike.instMembership.{u1, u1} (FirstOrder.Language.Substructure.{u3, u2, u1} L M _inst_1) M (FirstOrder.Language.Substructure.instSetLike.{u3, u2, u1} L M _inst_1)) x S)) (FirstOrder.Language.Substructure.inducedStructure.{u3, u2, u1} L M _inst_1 S))
+Case conversion may be inaccurate. Consider using '#align first_order.language.substructure.cg_iff_Structure_cg FirstOrder.Language.Substructure.cg_iff_structure_cgₓ'. -/
+theorem Substructure.cg_iff_structure_cg (S : L.Substructure M) : S.CG ↔ Structure.CG L S :=
by
rw [Structure.cg_def]
refine' ⟨fun h => cg.of_map_embedding S.subtype _, fun h => _⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
refine
s (#10762)
I replaced a few "terminal" refine/refine'
s with exact
.
The strategy was very simple-minded: essentially any refine
whose following line had smaller indentation got replaced by exact
and then I cleaned up the mess.
This PR certainly leaves some further terminal refine
s, but maybe the current change is beneficial.
@@ -57,7 +57,7 @@ theorem fg_iff_exists_fin_generating_family {N : L.Substructure M} :
obtain ⟨n, f, rfl⟩ := Sfin.fin_embedding
exact ⟨n, f, hS⟩
· rintro ⟨n, s, hs⟩
- refine' ⟨range s, finite_range s, hs⟩
+ exact ⟨range s, finite_range s, hs⟩
#align first_order.language.substructure.fg_iff_exists_fin_generating_family FirstOrder.Language.Substructure.fg_iff_exists_fin_generating_family
theorem fg_bot : (⊥ : L.Substructure M).FG :=
@@ -110,7 +110,7 @@ theorem cg_def {N : L.Substructure M} : N.CG ↔ ∃ S : Set M, S.Countable ∧
theorem FG.cg {N : L.Substructure M} (h : N.FG) : N.CG := by
obtain ⟨s, hf, rfl⟩ := fg_def.1 h
- refine' ⟨s, hf.countable, rfl⟩
+ exact ⟨s, hf.countable, rfl⟩
#align first_order.language.substructure.fg.cg FirstOrder.Language.Substructure.FG.cg
theorem cg_iff_empty_or_exists_nat_generating_family {N : L.Substructure M} :
cases'
(#9171)
I literally went through and regex'd some uses of cases'
, replacing them with rcases
; this is meant to be a low effort PR as I hope that tools can do this in the future.
rcases
is an easier replacement than cases
, though with better tools we could in future do a second pass converting simple rcases
added here (and existing ones) to cases
.
@@ -118,7 +118,7 @@ theorem cg_iff_empty_or_exists_nat_generating_family {N : L.Substructure M} :
rw [cg_def]
constructor
· rintro ⟨S, Scount, hS⟩
- cases' eq_empty_or_nonempty (N : Set M) with h h
+ rcases eq_empty_or_nonempty (N : Set M) with h | h
· exact Or.intro_left _ h
obtain ⟨f, h'⟩ :=
(Scount.union (Set.countable_singleton h.some)).exists_eq_range
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -33,7 +33,7 @@ namespace Language
open Structure
-variable {L : Language} {M : Type _} [L.Structure M]
+variable {L : Language} {M : Type*} [L.Structure M]
namespace Substructure
@@ -78,13 +78,13 @@ theorem FG.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.FG) (hN₂ : N₂.FG
fg_def.2 ⟨t₁ ∪ t₂, ht₁.1.union ht₂.1, by rw [closure_union, ht₁.2, ht₂.2]⟩
#align first_order.language.substructure.fg.sup FirstOrder.Language.Substructure.FG.sup
-theorem FG.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.FG) :
+theorem FG.map {N : Type*} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.FG) :
(s.map f).FG :=
let ⟨t, ht⟩ := fg_def.1 hs
fg_def.2 ⟨f '' t, ht.1.image _, by rw [closure_image, ht.2]⟩
#align first_order.language.substructure.fg.map FirstOrder.Language.Substructure.FG.map
-theorem FG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
+theorem FG.of_map_embedding {N : Type*} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
(hs : (s.map f.toHom).FG) : s.FG := by
rcases hs with ⟨t, h⟩
rw [fg_def]
@@ -153,13 +153,13 @@ theorem CG.sup {N₁ N₂ : L.Substructure M} (hN₁ : N₁.CG) (hN₂ : N₂.CG
cg_def.2 ⟨t₁ ∪ t₂, ht₁.1.union ht₂.1, by rw [closure_union, ht₁.2, ht₂.2]⟩
#align first_order.language.substructure.cg.sup FirstOrder.Language.Substructure.CG.sup
-theorem CG.map {N : Type _} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.CG) :
+theorem CG.map {N : Type*} [L.Structure N] (f : M →[L] N) {s : L.Substructure M} (hs : s.CG) :
(s.map f).CG :=
let ⟨t, ht⟩ := cg_def.1 hs
cg_def.2 ⟨f '' t, ht.1.image _, by rw [closure_image, ht.2]⟩
#align first_order.language.substructure.cg.map FirstOrder.Language.Substructure.CG.map
-theorem CG.of_map_embedding {N : Type _} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
+theorem CG.of_map_embedding {N : Type*} [L.Structure N] (f : M ↪[L] N) {s : L.Substructure M}
(hs : (s.map f.toHom).CG) : s.CG := by
rcases hs with ⟨t, h1, h2⟩
rw [cg_def]
@@ -211,12 +211,12 @@ theorem fg_iff : FG L M ↔ ∃ S : Set M, S.Finite ∧ closure L S = (⊤ : L.S
rw [fg_def, Substructure.fg_def]
#align first_order.language.Structure.fg_iff FirstOrder.Language.Structure.fg_iff
-theorem FG.range {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N) : f.range.FG := by
+theorem FG.range {N : Type*} [L.Structure N] (h : FG L M) (f : M →[L] N) : f.range.FG := by
rw [Hom.range_eq_map]
exact (fg_def.1 h).map f
#align first_order.language.Structure.fg.range FirstOrder.Language.Structure.FG.range
-theorem FG.map_of_surjective {N : Type _} [L.Structure N] (h : FG L M) (f : M →[L] N)
+theorem FG.map_of_surjective {N : Type*} [L.Structure N] (h : FG L M) (f : M →[L] N)
(hs : Function.Surjective f) : FG L N := by
rw [← Hom.range_eq_top] at hs
rw [fg_def, ← hs]
@@ -232,12 +232,12 @@ theorem cg_iff : CG L M ↔ ∃ S : Set M, S.Countable ∧ closure L S = (⊤ :
rw [cg_def, Substructure.cg_def]
#align first_order.language.Structure.cg_iff FirstOrder.Language.Structure.cg_iff
-theorem CG.range {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N) : f.range.CG := by
+theorem CG.range {N : Type*} [L.Structure N] (h : CG L M) (f : M →[L] N) : f.range.CG := by
rw [Hom.range_eq_map]
exact (cg_def.1 h).map f
#align first_order.language.Structure.cg.range FirstOrder.Language.Structure.CG.range
-theorem CG.map_of_surjective {N : Type _} [L.Structure N] (h : CG L M) (f : M →[L] N)
+theorem CG.map_of_surjective {N : Type*} [L.Structure N] (h : CG L M) (f : M →[L] N)
(hs : Function.Surjective f) : CG L N := by
rw [← Hom.range_eq_top] at hs
rw [cg_def, ← hs]
@@ -258,7 +258,7 @@ instance (priority := 100) cg_of_fg [h : FG L M] : CG L M :=
end Structure
-theorem Equiv.fg_iff {N : Type _} [L.Structure N] (f : M ≃[L] N) :
+theorem Equiv.fg_iff {N : Type*} [L.Structure N] (f : M ≃[L] N) :
Structure.FG L M ↔ Structure.FG L N :=
⟨fun h => h.map_of_surjective f.toHom f.toEquiv.surjective, fun h =>
h.map_of_surjective f.symm.toHom f.toEquiv.symm.surjective⟩
@@ -275,7 +275,7 @@ theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.FG ↔ Struc
set_option linter.uppercaseLean3 false in
#align first_order.language.substructure.fg_iff_Structure_fg FirstOrder.Language.Substructure.fg_iff_structure_fg
-theorem Equiv.cg_iff {N : Type _} [L.Structure N] (f : M ≃[L] N) :
+theorem Equiv.cg_iff {N : Type*} [L.Structure N] (f : M ≃[L] N) :
Structure.CG L M ↔ Structure.CG L N :=
⟨fun h => h.map_of_surjective f.toHom f.toEquiv.surjective, fun h =>
h.map_of_surjective f.symm.toHom f.toEquiv.symm.surjective⟩
@@ -2,14 +2,11 @@
Copyright (c) 2022 Aaron Anderson. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Aaron Anderson
-
-! This file was ported from Lean 3 source module model_theory.finitely_generated
-! leanprover-community/mathlib commit 0602c59878ff3d5f71dea69c2d32ccf2e93e5398
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.ModelTheory.Substructures
+#align_import model_theory.finitely_generated from "leanprover-community/mathlib"@"0602c59878ff3d5f71dea69c2d32ccf2e93e5398"
+
/-!
# Finitely Generated First-Order Structures
This file defines what it means for a first-order (sub)structure to be finitely or countably
@@ -53,7 +53,7 @@ theorem fg_def {N : L.Substructure M} : N.FG ↔ ∃ S : Set M, S.Finite ∧ clo
#align first_order.language.substructure.fg_def FirstOrder.Language.Substructure.fg_def
theorem fg_iff_exists_fin_generating_family {N : L.Substructure M} :
- N.FG ↔ ∃ (n : ℕ)(s : Fin n → M), closure L (range s) = N := by
+ N.FG ↔ ∃ (n : ℕ) (s : Fin n → M), closure L (range s) = N := by
rw [fg_def]
constructor
· rintro ⟨S, Sfin, hS⟩
@@ -28,12 +28,7 @@ this definition of finite generation to define the others.
-/
-
-set_option linter.uppercaseLean3 false
-
-open FirstOrder
-
-open Set
+open FirstOrder Set
namespace FirstOrder
@@ -194,6 +189,8 @@ open Substructure
namespace Structure
+set_option linter.uppercaseLean3 false
+
variable (L) (M)
/-- A structure is finitely generated if it is the closure of a finite subset. -/
@@ -212,7 +209,7 @@ theorem fg_def : FG L M ↔ (⊤ : L.Substructure M).FG :=
⟨fun h => h.1, fun h => ⟨h⟩⟩
#align first_order.language.Structure.fg_def FirstOrder.Language.Structure.fg_def
-/-- An equivalent expression of `Structure.fg` in terms of `Set.Finite` instead of `Finset`. -/
+/-- An equivalent expression of `Structure.FG` in terms of `Set.Finite` instead of `Finset`. -/
theorem fg_iff : FG L M ↔ ∃ S : Set M, S.Finite ∧ closure L S = (⊤ : L.Substructure M) := by
rw [fg_def, Substructure.fg_def]
#align first_order.language.Structure.fg_iff FirstOrder.Language.Structure.fg_iff
@@ -278,6 +275,7 @@ theorem Substructure.fg_iff_structure_fg (S : L.Substructure M) : S.FG ↔ Struc
· have h := h.map S.subtype.toHom
rw [← Hom.range_eq_map, range_subtype] at h
exact h
+set_option linter.uppercaseLean3 false in
#align first_order.language.substructure.fg_iff_Structure_fg FirstOrder.Language.Substructure.fg_iff_structure_fg
theorem Equiv.cg_iff {N : Type _} [L.Structure N] (f : M ≃[L] N) :
@@ -294,6 +292,7 @@ theorem Substructure.cg_iff_structure_cg (S : L.Substructure M) : S.CG ↔ Struc
· have h := h.map S.subtype.toHom
rw [← Hom.range_eq_map, range_subtype] at h
exact h
+set_option linter.uppercaseLean3 false in
#align first_order.language.substructure.cg_iff_Structure_cg FirstOrder.Language.Substructure.cg_iff_structure_cg
end Language
@@ -16,10 +16,10 @@ This file defines what it means for a first-order (sub)structure to be finitely
generated, similarly to other finitely-generated objects in the algebra library.
## Main Definitions
-* `first_order.language.substructure.FG` indicates that a substructure is finitely generated.
-* `first_order.language.Structure.FG` indicates that a structure is finitely generated.
-* `first_order.language.substructure.CG` indicates that a substructure is countably generated.
-* `first_order.language.Structure.CG` indicates that a structure is countably generated.
+* `FirstOrder.Language.Substructure.FG` indicates that a substructure is finitely generated.
+* `FirstOrder.Language.Structure.FG` indicates that a structure is finitely generated.
+* `FirstOrder.Language.Substructure.CG` indicates that a substructure is countably generated.
+* `FirstOrder.Language.Structure.CG` indicates that a structure is countably generated.
## TODO
@@ -212,7 +212,7 @@ theorem fg_def : FG L M ↔ (⊤ : L.Substructure M).FG :=
⟨fun h => h.1, fun h => ⟨h⟩⟩
#align first_order.language.Structure.fg_def FirstOrder.Language.Structure.fg_def
-/-- An equivalent expression of `Structure.fg` in terms of `set.finite` instead of `finset`. -/
+/-- An equivalent expression of `Structure.fg` in terms of `Set.Finite` instead of `Finset`. -/
theorem fg_iff : FG L M ↔ ∃ S : Set M, S.Finite ∧ closure L S = (⊤ : L.Substructure M) := by
rw [fg_def, Substructure.fg_def]
#align first_order.language.Structure.fg_iff FirstOrder.Language.Structure.fg_iff
The unported dependencies are