2022-05-07 23:41:32 -04:00
|
|
|
module TermImpls
|
|
|
|
|
|
|
|
import Quox.Syntax
|
2023-01-08 14:44:25 -05:00
|
|
|
import public Quox.Pretty
|
2022-05-07 23:41:32 -04:00
|
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
eqShift : Shift from1 to -> Shift from2 to -> Maybe (from1 = from2)
|
|
|
|
eqShift SZ SZ = Just Refl
|
|
|
|
eqShift (SS by) (SS bz) = eqShift by bz
|
|
|
|
eqShift SZ (SS by) = Nothing
|
|
|
|
eqShift (SS by) SZ = Nothing
|
|
|
|
|
|
|
|
private
|
|
|
|
eqSubst : Subst tm1 from1 to -> Subst tm2 from2 to -> Maybe (from1 = from2)
|
|
|
|
eqSubst (Shift by) (Shift bz) = eqShift by bz
|
|
|
|
eqSubst (_ ::: th) (_ ::: ph) = cong S <$> eqSubst th ph
|
|
|
|
eqSubst (Shift _) (_ ::: _) = Nothing
|
|
|
|
eqSubst (_ ::: _) (Shift _) = Nothing
|
|
|
|
-- maybe from1 = from2 in the last two cases, but this is for
|
|
|
|
-- (==), and they're not equal, so who cares
|
|
|
|
|
|
|
|
mutual
|
|
|
|
export covering
|
2023-01-08 14:44:25 -05:00
|
|
|
Eq q => Eq (Term q d n) where
|
2022-05-07 23:41:32 -04:00
|
|
|
TYPE k == TYPE l = k == l
|
|
|
|
TYPE _ == _ = False
|
|
|
|
|
|
|
|
Pi qty1 _ arg1 res1 == Pi qty2 _ arg2 res2 =
|
|
|
|
qty1 == qty2 && arg1 == arg2 && res1 == res2
|
|
|
|
Pi {} == _ = False
|
|
|
|
|
|
|
|
Lam _ body1 == Lam _ body2 = body1 == body2
|
|
|
|
Lam {} == _ = False
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
Eq _ ty1 l1 r1 == Eq _ ty2 l2 r2 =
|
|
|
|
ty1 == ty2 && l1 == l2 && r1 == r2
|
|
|
|
Eq {} == _ = False
|
|
|
|
|
|
|
|
DLam _ body1 == DLam _ body2 = body1 == body2
|
|
|
|
DLam {} == _ = False
|
|
|
|
|
2022-05-07 23:41:32 -04:00
|
|
|
E e == E f = e == f
|
|
|
|
E _ == _ = False
|
|
|
|
|
|
|
|
CloT tm1 th1 == CloT tm2 th2 =
|
|
|
|
case eqSubst th1 th2 of
|
|
|
|
Just Refl => tm1 == tm2 && th1 == th2
|
|
|
|
Nothing => False
|
|
|
|
CloT {} == _ = False
|
|
|
|
|
|
|
|
DCloT tm1 th1 == DCloT tm2 th2 =
|
|
|
|
case eqSubst th1 th2 of
|
|
|
|
Just Refl => tm1 == tm2 && th1 == th2
|
|
|
|
Nothing => False
|
|
|
|
DCloT {} == _ = False
|
|
|
|
|
|
|
|
export covering
|
2023-01-08 14:44:25 -05:00
|
|
|
Eq q => Eq (Elim q d n) where
|
2022-05-07 23:41:32 -04:00
|
|
|
F x == F y = x == y
|
|
|
|
F _ == _ = False
|
|
|
|
|
|
|
|
B i == B j = i == j
|
|
|
|
B _ == _ = False
|
|
|
|
|
|
|
|
(fun1 :@ arg1) == (fun2 :@ arg2) = fun1 == fun2 && arg1 == arg2
|
|
|
|
(_ :@ _) == _ = False
|
|
|
|
|
|
|
|
(tm1 :# ty1) == (tm2 :# ty2) = tm1 == tm2 && ty1 == ty2
|
|
|
|
(_ :# _) == _ = False
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
(fun1 :% dim1) == (fun2 :% dim2) = fun1 == fun2 && dim1 == dim2
|
|
|
|
(_ :% _) == _ = False
|
|
|
|
|
2022-05-07 23:41:32 -04:00
|
|
|
CloE el1 th1 == CloE el2 th2 =
|
|
|
|
case eqSubst th1 th2 of
|
|
|
|
Just Refl => el1 == el2 && th1 == th2
|
|
|
|
Nothing => False
|
|
|
|
CloE {} == _ = False
|
|
|
|
|
|
|
|
DCloE el1 th1 == DCloE el2 th2 =
|
|
|
|
case eqSubst th1 th2 of
|
|
|
|
Just Refl => el1 == el2 && th1 == th2
|
|
|
|
Nothing => False
|
|
|
|
DCloE {} == _ = False
|
|
|
|
|
|
|
|
export covering
|
2023-01-08 14:44:25 -05:00
|
|
|
Eq q => Eq (ScopeTerm q d n) where
|
2022-05-07 23:41:32 -04:00
|
|
|
TUsed s == TUsed t = s == t
|
|
|
|
TUnused s == TUnused t = s == t
|
|
|
|
TUsed _ == TUnused _ = False
|
|
|
|
TUnused _ == TUsed _ = False
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
export covering
|
|
|
|
Eq q => Eq (DScopeTerm q d n) where
|
|
|
|
DUsed s == DUsed t = s == t
|
|
|
|
DUnused s == DUnused t = s == t
|
|
|
|
DUsed _ == DUnused _ = False
|
|
|
|
DUnused _ == DUsed _ = False
|
|
|
|
|
2022-05-07 23:41:32 -04:00
|
|
|
export covering
|
2023-01-08 14:44:25 -05:00
|
|
|
PrettyHL q => Show (Term q d n) where
|
2022-05-07 23:41:32 -04:00
|
|
|
showPrec d t = showParens (d /= Open) $ prettyStr True t
|
|
|
|
|
|
|
|
export covering
|
2023-01-08 14:44:25 -05:00
|
|
|
PrettyHL q => Show (Elim q d n) where
|
2022-05-07 23:41:32 -04:00
|
|
|
showPrec d e = showParens (d /= Open) $ prettyStr True e
|