module Language.Haskell.FreeTheorems.Variations.PolySeq.Syntax where
import Data.Generics(Typeable,Data)
import Language.Haskell.FreeTheorems.Variations.PolySeq.Debug
newtype LabVar = LabVar Int deriving (Show, Eq, Typeable, Data)
data LabVal
= Nbr
| Epsilon
deriving(Show, Eq, Ord, Typeable, Data)
data Label
= LVar LabVar
| LVal LabVal
| Non
deriving(Show, Eq, Typeable, Data)
newtype TypVar = TypVar String deriving (Show, Eq, Typeable, Data)
data Typ = TVar TypVar
| TArrow Label Typ Typ
| TAll Label TypVar Typ
| TList Typ
| TInt
| TBool
deriving (Show, Eq, Typeable, Data)
newtype TermVar = TermVar String deriving (Show, Eq, Ord, Typeable, Data)
type TypedVar = (TermVar,Typ)
data Term
= Var TermVar
| Abs TermVar Typ Term
| App Term Term
| TAbs TypVar Term
| TApp Term Typ
| Nil Typ
| Cons Term Term
| LCase Term Term TermVar TermVar Term
| Fix Term
| LSeq TermVar Term Term
| Let TermVar Term Term
| Seq Term Term
| I Int
| Add Term Term
| T
| F
| BCase Term Term Term
deriving (Show, Eq, Typeable, Data)
data Constraint
= Conj Constraint Constraint
| Impl Constraint Constraint
| Leq Label Label
| Eq Label Label
| Tru
| Fls
deriving(Show, Eq, Typeable, Data)