{-# LANGUAGE LambdaCase #-} module Presyntax where data Exp = Var String | App Exp Exp | Lam String Exp | Let String Exp Exp Exp | Sigma String Exp Exp | Pair Exp Exp | Proj1 Exp | Proj2 Exp | Pi String Exp Exp | Type | Typeω | I | I0 | I1 | IAnd Exp Exp | IOr Exp Exp | INot Exp | Path | Cut Exp Exp | Span (Int, Int) (Int, Int) Exp -- Formulas, partial elements, and the type of formulas | Partial [(Formula, Exp)] | PartialT | PartialP -- Compositions | Comp -- Cubical subtypes | SubT -- Glueing | GlueTy | Glue | Unglue -- Bools | Bool | Tt | Ff | If deriving (Eq, Show, Ord) data Formula = Is0 String | Is1 String | And Formula Formula | Or Formula Formula | Top | Bot deriving (Eq, Ord) instance Show Formula where showsPrec p = \case Is1 i -> showString i Is0 i -> showString ('~':i) And x y -> showParen (p > and_prec) $ showsPrec or_prec x . showString " && " . showsPrec or_prec y Or x y -> showParen (p > or_prec) $ showsPrec or_prec x . showString " || " . showsPrec or_prec y Top -> showString "i1" Bot -> showString "i0" where and_prec = 2 or_prec = 1 data Statement = Assume [(String, Exp)] | Declare String Exp Exp | Eval Exp