packages feed

hout-0.1.0.0: examples/Hout/Examples.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE KindSignatures, PolyKinds #-}

module Hout.Examples where

import Prelude hiding (True, False, Monad (..), pure)
import Prelude (fail)

import Control.Monad.Indexed
import Language.Haskell.DoNotation

import Hout.Logic.Intuitionistic
import Hout.Logic.FirstOrder
import Hout.Prover.Proofs
import Hout.Prover.Tactics

orComm :: Lemma ((a \/ b) -> (b \/ a))
orComm = Proof do
  a_or_b <- intro
  case a_or_b of
    Left a -> do
      right
      exact a
    Right b -> do
      left
      exact b
  qed

data Implies1 (p :: k -> *) (q :: k -> *) (a :: k) = I1 (p a -> q a)

composition :: Definition ((a -> b) -> (b -> c) -> (a -> c))
composition = Proof do
  a_impl_b <- intro
  b_impl_c <- intro
  a <- intro
  apply b_impl_c
  apply a_impl_b
  exact a

runComposition :: (a -> b) -> (b -> c) -> (a -> c)
runComposition = runProof composition

exists_and_forall_implies_exists :: Theorem (Exists k p -> Forall k (Implies1 p q) -> Exists k q)
exists_and_forall_implies_exists = Proof do
  (Exists witness p_witness) <- intro
  (Forall (I1 forall_implies)) <- intro
  exists witness
  apply forall_implies
  exact p_witness