autoproof-0.0.0.0: Propositional logic library
Copyright(c) Artem Mavrin 2021
LicenseBSD3
Maintainerartemvmavrin@gmail.com
Stabilityexperimental
PortabilityPOSIX
Safe HaskellSafe
LanguageHaskell2010

AutoProof.Internal.Intuitionistic.Proof

Description

Intuitionistic proofs in propositional logic.

Synopsis

Proof search for judgements and formulas

prove :: Ord a => Judgement a -> Maybe (Proof a) Source #

Find an intuitionistic proof of a judgement, if a proof exists.

proveTautology :: Ord a => Formula a -> Maybe (Proof a) Source #

Find an intuitionistic proof of a formula, if a proof exists.

Specific proof search algorithms

proveImp :: Ord a => Judgement a -> Maybe (Proof a) Source #

(proveImp (g |- a)) finds an intuitionistic proof of a judgement \(g \vdash a\) in the implicational fragment of propositional logic, if such a proof exists.

The algorithm is adapted from section 2.4 of

  • Samuel Mimram (2020) PROGRAM = PROOF.

Examples

Expand
>>> proveImp $ [Var 'a', Imp (Var 'a') (Var 'b')] |- Var 'b'
Just (ImpElim ([Var 'a',Imp (Var 'a') (Var 'b')] |- Var 'b') (Axiom ([Var 'a',Imp (Var 'a') (Var 'b')] |- Imp (Var 'a') (Var 'b'))) (Axiom ([Var 'a',Imp (Var 'a') (Var 'b')] |- Var 'a')))
>>> proveImp $ [Imp (Var 'a') (Var 'b'), Imp (Var 'b') (Var 'a')] |- Var 'a'
Nothing

proveStatman :: Ord a => Judgement a -> Maybe (Proof a) Source #

Find an intuitionistic proof of a judgement, if one exists, using Statman's algorithm.

  • Richard Statman (1979) "Intuitionistic propositional logic is polynomial-space complete." Theoretical Computer Science, Volume 9, Issue 1, pp. 67–72. DOI.

The judgement to be proved is converted to an implicational judgement as described in toImp and proved (if possible) using proveImp. The resulting proof is then converted into a proof of the original judgement.

Provability checking

isProvable :: Ord a => Judgement a -> Bool Source #

Determine whether a judgement is intuitionistically valid.

Examples

Expand
>>> isProvable $ [Var "a", Var "b"] |- And (Var "a") (Var "b")
True
>>> isProvable $ [] |- Or (Var "a") (Not (Var "a"))
False

isTautology :: Ord a => Formula a -> Bool Source #

Determine whether a formula is an intuitionistic tautology.

Examples

Expand
>>> isTautology $ Imp (And (Var 'a') (Var 'b')) (Var 'a')
True
>>> isTautology $ Or (Var 'a') (Not (Var 'a'))
False
>>> isTautology $ Not (Not (Or (Var 'a') (Not (Var 'a'))))
True

Cuts

findCut :: Proof a -> Maybe (Proof a) Source #

Find the cut nearest the root of a proof, if any. This functions assumes the proof is valid.

hasCut :: Proof a -> Bool Source #

Check if a proof has a cut.

Proof correctness

correct :: Ord a => Judgement a -> Proof a -> Bool Source #

Check whether a proof is a correct proof of a given judgement

valid :: Ord a => Proof a -> Bool Source #

Check whether a proof is valid.

debug :: Ord a => Proof a -> Either (Proof a) () Source #

Return an invalid inference node (on the Left), if there is one. Otherwise, return Right ().