Three-Valued Truth #
@cite{kleene-1952}
Three-valued truth type for trivalent semantics across linglib. Used for:
- Plural predication: homogeneity gaps (all satisfy → true, none → false, some but not all → gap). @cite{kriz-2016}, @cite{kriz-spector-2021}
- Conditionals: indeterminacy under supervaluation when selection functions disagree. @cite{ramotowska-santorio-2025}
- Presupposition: undefined when presupposition fails.
- Duality: existential vs universal aggregation over three-valued lists.
Main definitions #
Equations
- Core.Duality.instReprTruth3 = { reprPrec := Core.Duality.instReprTruth3.repr }
Equations
- Core.Duality.instReprTruth3.repr Core.Duality.Truth3.true prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Core.Duality.Truth3.true")).group prec✝
- Core.Duality.instReprTruth3.repr Core.Duality.Truth3.false prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Core.Duality.Truth3.false")).group prec✝
- Core.Duality.instReprTruth3.repr Core.Duality.Truth3.indet prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Core.Duality.Truth3.indet")).group prec✝
Instances For
Equations
- Core.Duality.instBEqTruth3.beq x✝ y✝ = (x✝.ctorIdx == y✝.ctorIdx)
Instances For
Equations
Instances For
Equations
Alias for indet, used in homogeneity contexts where the third value
represents a truth-value gap (some but not all atoms satisfy the predicate).
Instances For
Kleene strong negation.
Equations
Instances For
Existential aggregation (Strong Kleene disjunction).
Equations
Instances For
Universal aggregation (Strong Kleene conjunction).
Equations
Instances For
Lattice ordering: false < indet < true.
Equations
Instances For
Equations
- Core.Duality.Truth3.instLE = { le := fun (a b : Core.Duality.Truth3) => a.le b = true }
Equations
- One or more equations did not get rendered due to their size.
Equations
- Core.Duality.Truth3.instPartialOrder = { toPreorder := Core.Duality.Truth3.instPreorder, le_antisymm := Core.Duality.Truth3.instPartialOrder._proof_1 }
Equations
- One or more equations did not get rendered due to their size.
Equations
- One or more equations did not get rendered due to their size.
Equations
- Core.Duality.Truth3.instLattice = { toSemilatticeSup := inferInstanceAs (SemilatticeSup Core.Duality.Truth3), inf := SemilatticeInf.inf, inf_le_left := ⋯, inf_le_right := ⋯, le_inf := ⋯ }
Equations
Equations
Equations
Equations
Equations
- Core.Duality.Truth3.instBoundedOrder = { toOrderTop := inferInstanceAs (OrderTop Core.Duality.Truth3), toOrderBot := inferInstanceAs (OrderBot Core.Duality.Truth3) }
Convert Bool to Truth3.
Equations
Instances For
Check if defined (not indet).
Equations
Instances For
Convert to Bool if defined, else default to false.
Equations
Instances For
Strong Kleene exclusive disjunction.
True when exactly one operand is true; false when both or neither; undefined when either operand is undefined.
Unlike inclusive disjunction (join), XOR cannot "see past" an
undefined operand: join .true .indet = .true (the true operand
settles the result), but xor .true .indet = .indet (we need to
know the other's value to determine XOR).
@cite{wang-davidson-2026} Figure 2.
Equations
- Core.Duality.Truth3.true.xor Core.Duality.Truth3.false = Core.Duality.Truth3.true
- Core.Duality.Truth3.false.xor Core.Duality.Truth3.true = Core.Duality.Truth3.true
- Core.Duality.Truth3.true.xor Core.Duality.Truth3.true = Core.Duality.Truth3.false
- Core.Duality.Truth3.false.xor Core.Duality.Truth3.false = Core.Duality.Truth3.false
- x✝¹.xor x✝ = Core.Duality.Truth3.indet
Instances For
Uniform projection under XOR: XOR returns undefined iff at least one operand is undefined. This is the semantic core of @cite{wang-davidson-2026}'s prediction: exclusive disjunction does not filter presuppositions.
Contrast with inclusive disjunction (join), where
join .true .indet = .true — a true first disjunct "filters"
the second's presupposition failure.
Weak Kleene disjunction: indet is absorbing (both operands must be defined).
Equations
- Core.Duality.Truth3.true.joinWeak Core.Duality.Truth3.true = Core.Duality.Truth3.true
- Core.Duality.Truth3.true.joinWeak Core.Duality.Truth3.false = Core.Duality.Truth3.true
- Core.Duality.Truth3.false.joinWeak Core.Duality.Truth3.true = Core.Duality.Truth3.true
- Core.Duality.Truth3.false.joinWeak Core.Duality.Truth3.false = Core.Duality.Truth3.false
- x✝¹.joinWeak x✝ = Core.Duality.Truth3.indet
Instances For
Weak Kleene conjunction: indet is absorbing.
Equations
- Core.Duality.Truth3.true.meetWeak Core.Duality.Truth3.true = Core.Duality.Truth3.true
- Core.Duality.Truth3.true.meetWeak Core.Duality.Truth3.false = Core.Duality.Truth3.false
- Core.Duality.Truth3.false.meetWeak Core.Duality.Truth3.true = Core.Duality.Truth3.false
- Core.Duality.Truth3.false.meetWeak Core.Duality.Truth3.false = Core.Duality.Truth3.false
- x✝¹.meetWeak x✝ = Core.Duality.Truth3.indet
Instances For
Meta-assertion operator: maps indet to false. Makes any trivalent value bivalent by treating undefinedness as falsity.
Equations
Instances For
Meta-assertion always produces a defined value.
Meta-assertion is idempotent.
Meta-assertion preserves defined values.
Middle Kleene conjunction: left-undefined absorbs; left-defined
follows Strong Kleene. Asymmetric: false ∧ # = false but
# ∧ false = #.
This captures left-to-right evaluation for conjunction (@cite{peters-1979}, @cite{beaver-krahmer-2001}, @cite{spector-2025}): if the first conjunct is undefined, the result is undefined regardless of the second. If the first conjunct is defined, Strong Kleene applies.
| meetMiddle | true | false | indet |
|---|---|---|---|
| true | true | false | indet |
| false | false | false | false |
| indet | indet | indet | indet |
Equations
- Core.Duality.Truth3.indet.meetMiddle x✝ = Core.Duality.Truth3.indet
- x✝¹.meetMiddle x✝ = x✝¹.meet x✝
Instances For
Middle Kleene disjunction: left-undefined absorbs; left-defined
follows Strong Kleene. Asymmetric: true ∨ # = true but
# ∨ true = #.
This captures left-to-right presupposition filtering (@cite{peters-1979}): if the first disjunct is defined, its truth value can settle the result even when the second is undefined. But if the first is undefined, the whole disjunction is undefined regardless of the second.
| joinMiddle | true | false | indet |
|---|---|---|---|
| true | true | true | true |
| false | true | false | indet |
| indet | indet | indet | indet |
Equations
- Core.Duality.Truth3.indet.joinMiddle x✝ = Core.Duality.Truth3.indet
- x✝¹.joinMiddle x✝ = x✝¹.join x✝
Instances For
Middle Kleene conjunction is NOT commutative.
meetMiddle false indet = false but meetMiddle indet false = indet.
When the left operand is defined, Middle Kleene conjunction equals Strong Kleene conjunction.
Middle Kleene disjunction is NOT commutative.
joinMiddle true indet = true but joinMiddle indet true = indet.
Left-undefined absorbs Middle Kleene conjunction.
Left-undefined absorbs Middle Kleene disjunction.
Middle Kleene conjunction agrees with Bool on defined inputs.
Middle Kleene disjunction agrees with Bool on defined inputs.
When the left operand is defined, Middle Kleene disjunction equals Strong Kleene disjunction.
Weak Kleene refines Middle Kleene disjunction: when Weak Kleene gives a defined answer, Middle Kleene agrees.
Middle Kleene refines Strong Kleene disjunction: when Middle Kleene gives a defined answer, Strong Kleene agrees.
Belnap conjunction: undefined operands are skipped.
If one operand is undefined, the result equals the other.
If both are undefined, the result is undefined.
This models @cite{belnap-1970}'s (8): conjunction is assertive iff
at least one conjunct is assertive; what it asserts = conjunction
of assertive conjuncts only. indet is the identity element.
| meetBelnap | true | false | indet |
|---|---|---|---|
| true | true | false | true |
| false | false | false | false |
| indet | true | false | indet |
Contrast: Strong Kleene meet (indet propagates unless dominated),
Weak Kleene meetWeak (indet always propagates).
Equations
- Core.Duality.Truth3.indet.meetBelnap x✝ = x✝
- x✝.meetBelnap Core.Duality.Truth3.indet = x✝
- x✝¹.meetBelnap x✝ = x✝¹.meet x✝
Instances For
Belnap disjunction: undefined operands are skipped.
Models @cite{belnap-1970}'s (9): disjunction is assertive iff at
least one disjunct is assertive; what it asserts = disjunction of
assertive disjuncts only. indet is the identity element.
Equations
- Core.Duality.Truth3.indet.joinBelnap x✝ = x✝
- x✝.joinBelnap Core.Duality.Truth3.indet = x✝
- x✝¹.joinBelnap x✝ = x✝¹.join x✝
Instances For
indet is left identity for Belnap conjunction.
indet is right identity for Belnap conjunction.
Belnap conjunction is commutative.
indet is left identity for Belnap disjunction.
indet is right identity for Belnap disjunction.
Belnap disjunction is commutative.
Belnap conjunction agrees with Bool on defined inputs.
Belnap disjunction agrees with Bool on defined inputs.
How undefined/gap values behave under logical connectives.
Four truth-functional systems for three-valued logic:
- Strong Kleene: gap propagates unless the defined operand forces the result (false ∧ _ = false, true ∨ _ = true)
- Middle Kleene: left-gap absorbs; left-defined uses Strong Kleene. Both conjunction and disjunction are asymmetric. (@cite{peters-1979}, @cite{beaver-krahmer-2001})
- Weak Kleene: gap always propagates (both operands must be defined)
- Belnap: gap is skipped (only defined operands contribute; gap is the identity element for both ∧ and ∨)
| Policy | gap ∧ T | gap ∧ F | F ∧ gap | T ∨ gap | gap ∨ T |
|---|---|---|---|---|---|
| Strong | gap | F | F | T | T |
| Middle | gap | gap | F | T | gap |
| Weak | gap | gap | gap | gap | gap |
| Belnap | T | F | F | T | T |
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
- Core.Duality.Truth3.instBEqGapPolicy.beq x✝ y✝ = (x✝.ctorIdx == y✝.ctorIdx)
Instances For
Parametric conjunction indexed by gap policy.
Equations
- Core.Duality.Truth3.meet3 Core.Duality.Truth3.GapPolicy.strongKleene = Core.Duality.Truth3.meet
- Core.Duality.Truth3.meet3 Core.Duality.Truth3.GapPolicy.middleKleene = Core.Duality.Truth3.meetMiddle
- Core.Duality.Truth3.meet3 Core.Duality.Truth3.GapPolicy.weakKleene = Core.Duality.Truth3.meetWeak
- Core.Duality.Truth3.meet3 Core.Duality.Truth3.GapPolicy.belnap = Core.Duality.Truth3.meetBelnap
Instances For
Parametric disjunction indexed by gap policy.
Equations
- Core.Duality.Truth3.join3 Core.Duality.Truth3.GapPolicy.strongKleene = Core.Duality.Truth3.join
- Core.Duality.Truth3.join3 Core.Duality.Truth3.GapPolicy.middleKleene = Core.Duality.Truth3.joinMiddle
- Core.Duality.Truth3.join3 Core.Duality.Truth3.GapPolicy.weakKleene = Core.Duality.Truth3.joinWeak
- Core.Duality.Truth3.join3 Core.Duality.Truth3.GapPolicy.belnap = Core.Duality.Truth3.joinBelnap
Instances For
Strong Kleene refines Belnap: when Strong Kleene gives a defined answer, Belnap agrees.
The definedness hierarchy #
The four gap policies form a hierarchy in terms of how often they
produce defined (non-#) results:
Weak Kleene ≤ Middle Kleene ≤ Strong Kleene ≤ Belnap
- Weak Kleene:
#is absorbing — both operands must be defined. - Middle Kleene:
#absorbs from the left; if left is defined, Strong Kleene applies. The left-to-right asymmetry captures presupposition filtering (@cite{peters-1979}, @cite{beaver-krahmer-2001}, @cite{spector-2025}). - Strong Kleene:
#propagates unless the defined operand forces the result (false ∧ # = false,true ∨ # = true). - Belnap:
#is the identity — undefined operands are skipped entirely (@cite{belnap-1970}).
The refinement property: if a weaker system produces a defined result,
every stronger system agrees on that result. The systems only disagree
on cases where the weaker one yields # but the stronger one rescues
a defined value.
Weak Kleene refines Middle Kleene conjunction.
Middle Kleene refines Strong Kleene conjunction.
Strong Kleene refines Belnap disjunction.
Weak → Belnap conjunction (full chain).
Weak → Belnap disjunction (full chain).
Middle → Belnap conjunction (two-step chain).
Middle → Belnap disjunction (two-step chain).
How truth values aggregate through an operator. Conjunctive (universal-like): all must succeed. Disjunctive (existential-like): one must succeed.
- conjunctive : ProjectionType
- disjunctive : ProjectionType
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Distributivity operator with homogeneity presupposition. TRUE if all satisfy, FALSE if none satisfy, GAP if mixed.
Shared structure of DIST (for plural individuals) and DIST_π (for conditional alternatives, @cite{santorio-2018}).
Equations
- Core.Duality.dist results = if results.all id = true then Core.Duality.Truth3.true else if (results.all fun (x : Bool) => !x) = true then Core.Duality.Truth3.false else Core.Duality.Truth3.gap
Instances For
dist agrees with Truth3.ofBool on singletons.
Three-valued propositions: functions from worlds to Truth3.
Equations
- Core.Duality.Prop3 W = (W → Core.Duality.Truth3)
Instances For
Always true.
Equations
Instances For
Always false.
Equations
Instances For
Always undefined.
Equations
Instances For
Convert BProp to Prop3 (always defined).
Equations
Instances For
Pointwise Belnap conjunction. @cite{belnap-1970}
Equations
- p.andBelnap q w = (p w).meetBelnap (q w)
Instances For
Pointwise Belnap disjunction. @cite{belnap-1970}
Equations
- p.orBelnap q w = (p w).joinBelnap (q w)
Instances For
Pointwise Middle Kleene conjunction. @cite{peters-1979} @cite{beaver-krahmer-2001} @cite{spector-2025}
Equations
- p.andMiddle q w = (p w).meetMiddle (q w)
Instances For
Pointwise Middle Kleene disjunction (asymmetric: left-to-right). @cite{peters-1979} @cite{beaver-krahmer-2001} @cite{spector-2025}
Equations
- p.orMiddle q w = (p w).joinMiddle (q w)