Propositions and theories #
Main definitions #
Proposition: the type of propositions over a given type of atom. This type has aBotinstance wheneverAtomdoes, and aTopwheneverAtomis inhabited.Theory: set ofProposition.IsIntuitionistic: a theory is intuitionistic if it contains the principle of explosion.IsClassical: an intuitionistic theory is classical if it further contains double negation elimination.Proposition.subst: replaceatom xin aA : Proposition Atomwithf x, for a functionf : Atom → Proposition Atom'. This induces a monad structure onProposition, withpure := Proposition.atom.Theoryis a functor, by mapping each propositionA ∈ Ttof <$> A.Theory.intuitionisticCompletion: the freely generated intuitionistic theory extending a given theory.
Notation #
We introduce notation for the logical connectives: ⊥ ⊤ ∧ ∨ → ¬ for, respectively, falsum, verum,
conjunction, disjunction, implication and negation.
Propositions.
- atom
{Atom : Type u}
(x : Atom)
: Proposition Atom
Propositional atoms
- and
{Atom : Type u}
(a b : Proposition Atom)
: Proposition Atom
Conjunction
- or
{Atom : Type u}
(a b : Proposition Atom)
: Proposition Atom
Disjunction
- impl
{Atom : Type u}
(a b : Proposition Atom)
: Proposition Atom
Implication
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Cslib.Logic.PL.instDecidableEqProposition.decEq (Cslib.Logic.PL.Proposition.atom a) (Cslib.Logic.PL.Proposition.atom b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (Cslib.Logic.PL.Proposition.atom x_2) (a.and b) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (Cslib.Logic.PL.Proposition.atom x_2) (a.or b) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (Cslib.Logic.PL.Proposition.atom x_2) (a.impl b) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.and b) (Cslib.Logic.PL.Proposition.atom x_2) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.and b) (a_1.or b_1) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.and b) (a_1.impl b_1) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.or b) (Cslib.Logic.PL.Proposition.atom x_2) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.or b) (a_1.and b_1) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.or b) (a_1.impl b_1) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.impl b) (Cslib.Logic.PL.Proposition.atom x_2) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.impl b) (a_1.and b_1) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.impl b) (a_1.or b_1) = isFalse ⋯
Instances For
Equations
Equations
- Cslib.Logic.PL.instBEqProposition.beq (Cslib.Logic.PL.Proposition.atom a) (Cslib.Logic.PL.Proposition.atom b) = (a == b)
- Cslib.Logic.PL.instBEqProposition.beq (a.and a_1) (b.and b_1) = (Cslib.Logic.PL.instBEqProposition.beq a b && Cslib.Logic.PL.instBEqProposition.beq a_1 b_1)
- Cslib.Logic.PL.instBEqProposition.beq (a.or a_1) (b.or b_1) = (Cslib.Logic.PL.instBEqProposition.beq a b && Cslib.Logic.PL.instBEqProposition.beq a_1 b_1)
- Cslib.Logic.PL.instBEqProposition.beq (a.impl a_1) (b.impl b_1) = (Cslib.Logic.PL.instBEqProposition.beq a b && Cslib.Logic.PL.instBEqProposition.beq a_1 b_1)
- Cslib.Logic.PL.instBEqProposition.beq x✝¹ x✝ = false
Instances For
Equations
Equations
- Cslib.Logic.PL.instInhabitedOfBot = { default := ⊥ }
We view negation as a defined connective ~A := A → ⊥
Instances For
A fixed choice of a derivable proposition (of course any two are equivalent).
Equations
Instances For
Equations
Conjunction
Equations
- Cslib.Logic.PL.«term_∧_» = Lean.ParserDescr.trailingNode `Cslib.Logic.PL.«term_∧_» 36 37 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " ∧ ") (Lean.ParserDescr.cat `term 37))
Instances For
Disjunction
Equations
- Cslib.Logic.PL.«term_∨_» = Lean.ParserDescr.trailingNode `Cslib.Logic.PL.«term_∨_» 35 36 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " ∨ ") (Lean.ParserDescr.cat `term 36))
Instances For
Implication
Equations
- Cslib.Logic.PL.«term_→_» = Lean.ParserDescr.trailingNode `Cslib.Logic.PL.«term_→_» 30 31 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " → ") (Lean.ParserDescr.cat `term 31))
Instances For
We view negation as a defined connective ~A := A → ⊥
Equations
- Cslib.Logic.PL.«term¬_» = Lean.ParserDescr.node `Cslib.Logic.PL.«term¬_» 40 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " ¬ ") (Lean.ParserDescr.cat `term 40))
Instances For
Substitute each atom in a proposition for a proposition, possibly changing the atomic language.
Equations
- Cslib.Logic.PL.Proposition.subst f (Cslib.Logic.PL.Proposition.atom x_1) = f x_1
- Cslib.Logic.PL.Proposition.subst f (A.and B) = (Cslib.Logic.PL.Proposition.subst f A).and (Cslib.Logic.PL.Proposition.subst f B)
- Cslib.Logic.PL.Proposition.subst f (A.or B) = (Cslib.Logic.PL.Proposition.subst f A).or (Cslib.Logic.PL.Proposition.subst f B)
- Cslib.Logic.PL.Proposition.subst f (A.impl B) = (Cslib.Logic.PL.Proposition.subst f A).impl (Cslib.Logic.PL.Proposition.subst f B)
Instances For
Equations
- One or more equations did not get rendered due to their size.
Theories are arbitrary sets of propositions.
Equations
- Cslib.Logic.PL.Theory Atom = Set (Cslib.Logic.PL.Proposition Atom)
Instances For
Extend a substitution from Proposition to Theory.
Equations
- T.subst f = (fun (x : Cslib.Logic.PL.Proposition Atom) => x >>= f) '' T
Instances For
Equations
- Cslib.Logic.PL.Theory.instFunctor = { map := fun {α β : Type ?u.1} (f : α → β) => Set.image fun (x : Cslib.Logic.PL.Proposition α) => f <$> x }
The empty theory corresponds to minimal propositional logic.
Equations
- Cslib.Logic.PL.Theory.MPL Atom = ∅
Instances For
Intuitionistic propositional logic adds the principle of explosion (ex falso quodlibet).
Equations
Instances For
Attach a bottom element to a theory T, and the principle of explosion for that bottom.
Equations
Instances For
Classical logic further adds double negation elimination.
Equations
Instances For
An inference system is intuitionistic if it derives ex falso quodlibet. TODO: this should be
generalised outside the PL scope, once we have typeclasses to express that a type possesses an
implication connective.
- efq (A : Proposition Atom) : InferenceSystem.derivation S (⊥.impl A)
The principle of explosion (ex falso quolibet).
Instances
An inference system is classical if it validates double-negation elimination. TODO: this should
be generalised outside the PL scope, once we have typeclasses to express that a type possesses an
implication connective.
- dne (A : Proposition Atom) : InferenceSystem.derivation S (A.neg.neg.impl A)
Double-negation elimination.