Documentation

InfinitaryLogic.Core

Core: syntax, semantics, Scott analysis, and Karp's theorem #

Import this bundle for the foundational objects of infinitary logic without model-existence machinery, admissible-set theory, or descriptive set theory.

One syntax, fixed at a branching carrier #

The infinitary syntax comes from the pinned Mathlib dependency. It is proposed upstream, not yet accepted — the pin is a fork branch, and names or packaging may change under review. Project-level facades (Lomega1omega/Syntax.lean, Semantics.lean, QuantifierRank.lean, CountableIndex.lean, and Karp/CarrierTheorem.lean) exist so that such a change is absorbed there rather than across the theorem files.

There is a single infinitary syntax, BoundedFormulaInf ι α n, whose iSup/iInf nodes branch over a carrier ι fixed once for the whole formula rather than chosen at each node. L∞ω is that type at an arbitrary carrier; Lω₁ω is the same type at carrier ℕ:

L.BoundedFormulaω α n  =  L.BoundedFormulaInf ℕ α n     -- definitional
L.Sentenceω            =  L.SentenceInf ℕ               -- definitional
LomegaEquiv L M N      =  InfEquivAt L ℕ M N            -- definitional

So embedding Lω₁ω into L∞ω is not an operation: it is specialization at carrier ℕ, and every ω-level statement is already an L∞ω statement. Lomega1omega/ re-exports the ℕ specialization under ω-facing names — @[match_pattern] abbrevs for the constructors, so match/induction keep working — and adds what is genuinely ω-specific (fragments, polarity, quantifier classes, the Encodable adapters).

Transport between carriers is a first-class operation instead: IndexCoding ι κ reindexes a formula from one carrier to another, padding undecodable branches with ⊥/⊤. That is what lets Karp's theorem be stated at an arbitrary common carrier (karp_theorem_at) with the canonical sum carrier as a corollary (karp_theorem_on_sum); see Karp/CarrierTheorem.lean.