Native numeral and shift formulas #
Exact binary shifts are definable from BIT and the native addition formula. A separate no-lost-bit condition rejects overflow; matching only the visible output bits would instead define a truncated shift. Numeral formulas work even when their numeral is outside the universe: they then have no satisfying value.
Main definitions #
Cslib.Logic.FO.Ordered.addEq: native addition applied to arbitrary terms.Cslib.Logic.FO.Ordered.natEq: equality to a fixed natural numeral.Cslib.Logic.FO.Ordered.scaleEq: multiplication by a fixed syntactic literal.Cslib.Logic.FO.Ordered.powerOfTwo: a numeral containing exactly the specified bit.Cslib.Logic.FO.Ordered.highestBit: the largest set-bit position of a nonzero numeral.Cslib.Logic.FO.Ordered.shiftLeft: exact multiplication by a power of two.
Main results #
Cslib.Logic.FO.Ordered.realize_natEq: exact numeral semantics.Cslib.Logic.FO.Ordered.realize_powerOfTwo: exact power-of-two semantics.Cslib.Logic.FO.Ordered.realize_shiftLeft: exact, nonmodular shift semantics.
References #
- N. Immerman, Descriptive Complexity, Section 1.2.1.
noncomputable def Cslib.Logic.FO.Ordered.addEq (L : FirstOrder.Language) {α : Type u_1} (x y z : (language L).Term α) :
Apply the native PLUS formula to three terms.
Instances For
Equality to a fixed natural numeral, without requiring that numeral to exist.
Instances For
noncomputable def Cslib.Logic.FO.Ordered.powerOfTwo (L : FirstOrder.Language) {α : Type u_1} (p e : (language L).Term α) :
Exactly one set bit, at the specified exponent.
Instances For
noncomputable def Cslib.Logic.FO.Ordered.highestBit (L : FirstOrder.Language) {α : Type u_1} (x h : (language L).Term α) :
The highest set bit of a nonzero numeral.
Instances For
noncomputable def Cslib.Logic.FO.Ordered.shiftLeft (L : FirstOrder.Language) {α : Type u_1} (x e z : (language L).Term α) :
Exact left shift, with every source set bit required to remain representable.
Instances For
@[simp]
theorem Cslib.Logic.FO.Ordered.realize_addEq {L : FirstOrder.Language} {n : ℕ} [Fact (2 ≤ n)] [L.Structure (Fin n)] {α : Type u_1} (x y z : (language L).Term α) (v : α → Fin n) :
(addEq L x y z).Realize v ↔ ↑(FirstOrder.Language.Term.realize v x) + ↑(FirstOrder.Language.Term.realize v y) = ↑(FirstOrder.Language.Term.realize v z)
@[simp]
theorem Cslib.Logic.FO.Ordered.realize_scaleEq {L : FirstOrder.Language} {n : ℕ} [Fact (2 ≤ n)] [L.Structure (Fin n)] {α : Type u_1} (k : ℕ) (x z : (language L).Term α) (v : α → Fin n) :
(scaleEq L k x z).Realize v ↔ k * ↑(FirstOrder.Language.Term.realize v x) = ↑(FirstOrder.Language.Term.realize v z)
@[simp]
theorem Cslib.Logic.FO.Ordered.realize_highestBit {L : FirstOrder.Language} {n : ℕ} [Fact (2 ≤ n)] [L.Structure (Fin n)] {α : Type u_1} (x h : (language L).Term α) (v : α → Fin n) :
(highestBit L x h).Realize v ↔ 2 ^ ↑(FirstOrder.Language.Term.realize v h) ≤ ↑(FirstOrder.Language.Term.realize v x) ∧ ↑(FirstOrder.Language.Term.realize v x) < 2 ^ (↑(FirstOrder.Language.Term.realize v h) + 1)
@[simp]
theorem Cslib.Logic.FO.Ordered.realize_powerOfTwo {L : FirstOrder.Language} {n : ℕ} [Fact (2 ≤ n)] [L.Structure (Fin n)] {α : Type u_1} (p e : (language L).Term α) (v : α → Fin n) :
(powerOfTwo L p e).Realize v ↔ ↑(FirstOrder.Language.Term.realize v p) = 2 ^ ↑(FirstOrder.Language.Term.realize v e)
powerOfTwo L p e holds exactly when p = 2 ^ e.
@[simp]
theorem Cslib.Logic.FO.Ordered.realize_shiftLeft {L : FirstOrder.Language} {n : ℕ} [Fact (2 ≤ n)] [L.Structure (Fin n)] {α : Type u_1} (x e z : (language L).Term α) (v : α → Fin n) :
(shiftLeft L x e z).Realize v ↔ ↑(FirstOrder.Language.Term.realize v x) * 2 ^ ↑(FirstOrder.Language.Term.realize v e) = ↑(FirstOrder.Language.Term.realize v z)
shiftLeft L x e z holds exactly when x * 2 ^ e = z; the product is not reduced modulo
the universe size.