{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE PatternSynonyms #-} module Syntax where import Data.Text (Text) import Data.Data (Data, Typeable) data Plicity = Im | Ex deriving (Eq, Show, Ord, Data, Typeable) newtype Var = Bound Int deriving (Eq, Show, Ord, Data, Typeable) data BoundDef = BDBound Text | BDDefined Text deriving (Eq, Show, Ord, Data, Typeable) newtype MetaVar = MV { getMV :: Int } deriving (Eq, Show, Ord, Data, Typeable) data Term = Var Var | Con Text | Let Text Term Term Term | Type | Prop | Pi Plicity Text Term Term | Lam Plicity Text Term | App Plicity Term Term | Sigma Text Term Term | Pair Term Term | Proj1 Term | Proj2 Term | Meta MetaVar | NewMeta MetaVar [BoundDef] | Id Term Term Term | Refl | Coe | Cong | Sym | Top | Unit deriving (Eq, Show, Ord, Typeable, Data) pattern Bv :: Int -> Term pattern Bv i = Var (Bound i) data Telescope = End | Ext Telescope Text Term deriving (Eq, Show, Ord) newtype Level = Lvl {unLvl :: Int} deriving (Eq, Show, Ord, Enum) lvl2Ix :: Level -> Level -> Int lvl2Ix (Lvl l) (Lvl x) = l - x - 1