{-# LANGUAGE GADTs #-}

{-@ LIQUID "--reflection"  @-}

module T1688Lib where

type Vname = Int

{-@ measure propOf :: a -> b @-}
{-@ type ProofOf E = { proofObj:_ | propOf proofObj = E } @-}

data Expr = Bc Bool                   -- True, False
          | Ic Int                    -- 0, 1, 2, ...
          | Lambda Int Expr         -- \x.e          abstractions
          | App Expr Expr             -- e e'          applications

data Basic = TBool         -- Bool
           | TInt          -- Int

data StepProp where
    Step :: Expr -> Expr -> StepProp

data StepProof where
    EFake :: Vname -> Expr -> Expr -> StepProof

{-@ data StepProof where
    EFake :: x:Vname -> e:Expr -> v:_ -> ProofOf( Step (App (Lambda x e) v) e)
  @-}
