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 instantiate the notation classes HasAnd, HasOr, HasImpl and HasNot for Proposition Atom
to give access to, respectively, the notations ∧, ∨, → and ¬ for propositional connectives.
In the case that Atom has a bottom element (respectively, is inhabited) we give instances
HasBot (Proposition Atom) and (respectively, HasTop (Proposition Atom)).
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
- imp
{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.imp 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.imp 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.imp b_1) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.imp b) (Cslib.Logic.PL.Proposition.atom x_2) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.imp b) (a_1.and b_1) = isFalse ⋯
- Cslib.Logic.PL.instDecidableEqProposition.decEq (a.imp b) (a_1.or b_1) = isFalse ⋯
Instances For
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.imp a_1) (b.imp 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
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
Equations
Equations
Equations
Equations
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.HasAnd.and (Cslib.Logic.PL.Proposition.subst f A) (Cslib.Logic.PL.Proposition.subst f B)
- Cslib.Logic.PL.Proposition.subst f (A.or B) = Cslib.Logic.HasOr.or (Cslib.Logic.PL.Proposition.subst f A) (Cslib.Logic.PL.Proposition.subst f B)
- Cslib.Logic.PL.Proposition.subst f (A.imp B) = Cslib.Logic.HasImp.imp (Cslib.Logic.PL.Proposition.subst f A) (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
- Cslib.Logic.PL.Theory.IPL Atom = {x : Cslib.Logic.PL.Proposition Atom | ∃ (A : Cslib.Logic.PL.Proposition Atom), Cslib.Logic.HasImp.imp ⊥ A = x}
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
- One or more equations did not get rendered due to their size.
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 (HasImp.imp ⊥ 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 (HasImp.imp (HasNot.not (HasNot.not A)) A)
Double-negation elimination.