Trivalent propositional logic #
Propositional formulas built from atoms by negation, conjunction, disjunction and the conditional
are evaluated into SignType by an interpretation of the binary connectives, the Strong, Weak or
Middle Kleene tables or Cooper's or de Finetti's, with Kleene's negation throughout. A formula is
realized at a designation standard when its value is designated: K3 designates only 1 and LP also
0, so one evaluation yields both logics, and mixed consequence takes premises at one standard and
conclusions at another, as Cobreros, Égré, Ripley and van Rooij do.
Main definitions #
Trivalent.Formula,Trivalent.Formula.eval: formulas and their values under the connectives.Trivalent.Model.ofBool: the Boolean model of a classical valuation of the atoms.Trivalent.Formula.Realize: realization at a designation standard, writtenM ⊨[C, d] φ.Trivalent.Consequence: mixed consequence over designation standards.
Main results #
Trivalent.Formula.realize_neg,Trivalent.Formula.isDual: under any connectives negation swaps the standards.Trivalent.consequence_iff_dual:Γ ⊨ Δin K3 iff¬Δ ⊨ ¬Γin LP.Trivalent.Formula.eval_ofBool: on a Boolean model the Strong Kleene tables are classical.Trivalent.k3_no_tautologies,Trivalent.lp_all_satisfiable: the model sending every atom to0gives Strong Kleene K3 no tautologies and LP no unsatisfiable formula.Trivalent.lp_no_explosion: LP is paraconsistent.
Implementation notes #
The API mirrors Mathlib.ModelTheory (Realize, per-constructor @[simp] lemmas, ⊨ notation),
and consequence is the multiple-conclusion, list-based MixedConsequence rather than theories as
sets. The language has no constants, so ⊤ and ⊥ are p ∨ ¬p and p ∧ ¬p for an atom p, and
the model sending every atom to 0 voids every formula under the Strong Kleene tables.
References #
Propositional formulas over an atom type, built by negation, conjunction, disjunction and the conditional.
- atom {Atom : Type u_1} : Atom → Formula Atom
- neg {Atom : Type u_1} : Formula Atom → Formula Atom
- conj {Atom : Type u_1} : Formula Atom → Formula Atom → Formula Atom
- disj {Atom : Type u_1} : Formula Atom → Formula Atom → Formula Atom
- cond {Atom : Type u_1} : Formula Atom → Formula Atom → Formula Atom
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Trivalent.instDecidableEqFormula.decEq (Trivalent.Formula.atom a) (Trivalent.Formula.atom b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (Trivalent.Formula.atom a) a_1.neg = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (Trivalent.Formula.atom a) (a_1.conj a_2) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (Trivalent.Formula.atom a) (a_1.disj a_2) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (Trivalent.Formula.atom a) (a_1.cond a_2) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq a.neg (Trivalent.Formula.atom a_1) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq a.neg b.neg = if h : a = b then h ▸ have inst := Trivalent.instDecidableEqFormula.decEq a a; isTrue ⋯ else isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq a.neg (a_1.conj a_2) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq a.neg (a_1.disj a_2) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq a.neg (a_1.cond a_2) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.conj a_1) (Trivalent.Formula.atom a_2) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.conj a_1) a_2.neg = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.conj a_1) (a_2.disj a_3) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.conj a_1) (a_2.cond a_3) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.disj a_1) (Trivalent.Formula.atom a_2) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.disj a_1) a_2.neg = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.disj a_1) (a_2.conj a_3) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.disj a_1) (a_2.cond a_3) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.cond a_1) (Trivalent.Formula.atom a_2) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.cond a_1) a_2.neg = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.cond a_1) (a_2.conj a_3) = isFalse ⋯
- Trivalent.instDecidableEqFormula.decEq (a.cond a_1) (a_2.disj a_3) = isFalse ⋯
Instances For
A trivalent model assigns a value to each atom.
Equations
- Trivalent.Model Atom = (Atom → SignType)
Instances For
The Boolean model of a classical valuation of the atoms, which leaves no atom void.
Equations
- Trivalent.Model.ofBool v a = SignType.ofProp (v a = true)
Instances For
The value of a formula under the connectives C in the model M.
Equations
- Trivalent.Formula.eval C M (Trivalent.Formula.atom a) = M a
- Trivalent.Formula.eval C M φ.neg = -Trivalent.Formula.eval C M φ
- Trivalent.Formula.eval C M (φ.conj ψ) = C.conj (Trivalent.Formula.eval C M φ) (Trivalent.Formula.eval C M ψ)
- Trivalent.Formula.eval C M (φ.disj ψ) = C.disj (Trivalent.Formula.eval C M φ) (Trivalent.Formula.eval C M ψ)
- Trivalent.Formula.eval C M (φ.cond ψ) = C.cond (Trivalent.Formula.eval C M φ) (Trivalent.Formula.eval C M ψ)
Instances For
Classical evaluation on a Boolean valuation.
Equations
- Trivalent.Formula.evalBool v (Trivalent.Formula.atom a) = v a
- Trivalent.Formula.evalBool v φ.neg = !Trivalent.Formula.evalBool v φ
- Trivalent.Formula.evalBool v (φ.conj ψ) = (Trivalent.Formula.evalBool v φ && Trivalent.Formula.evalBool v ψ)
- Trivalent.Formula.evalBool v (φ.disj ψ) = (Trivalent.Formula.evalBool v φ || Trivalent.Formula.evalBool v ψ)
- Trivalent.Formula.evalBool v (φ.cond ψ) = (!Trivalent.Formula.evalBool v φ || Trivalent.Formula.evalBool v ψ)
Instances For
On a Boolean model the strong Kleene tables are the classical ones.
A formula is realized at a designation standard when its value under the connectives clears
the threshold, so with the strong Kleene connectives Realize .strongKleene M .k3 is strong Kleene
satisfaction and Realize .strongKleene M .lp is Priest's LP.
Equations
- Trivalent.Formula.Realize C M d φ = (d.threshold ≤ Trivalent.Formula.eval C M φ)
Instances For
A formula is realized at a designation standard when its value under the connectives clears
the threshold, so with the strong Kleene connectives Realize .strongKleene M .k3 is strong Kleene
satisfaction and Realize .strongKleene M .lp is Priest's LP.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Negation swaps the designation standards at the level of formulas, under any connectives.
Each standard is dual to the other along negation ([CERvR12], Definition 20).
On a Boolean model every standard is classical truth, under the strong Kleene connectives.
Strong Kleene realization distributes over conjunction at either standard.
A strong Kleene conditional is realized at d iff its consequent is whenever its antecedent is
realized at the dual standard.
Mixed consequence under the connectives C takes premises at standard m and conclusions at
standard n.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Meta-theorems #
Negation dualizes consequence, so Γ ⊨ Δ at m, n iff ¬Δ ⊨ ¬Γ at the dual standards, and
K3 and LP are each other's duals ([CERvR12], Lemma 6).
In the strong Kleene model sending every atom to 0 every formula evaluates to 0.
K3 has no tautologies, since nothing is designated in the model sending every atom to 0
([CERvR12], Theorem 2).
Every formula is LP-satisfiable, since the model sending every atom to 0 designates
everything ([CERvR12], Theorem 2).
Explosion fails in LP, since {a ∧ ¬a} ⊭ b with countermodel M a = 0 and M b = -1.