refactor core syntax slightly to derive Eq/Show
add a new `WithSubst tm env to` record that packages a `tm from` with a `Subst env from to`, and write instances for just that. the rest of the AST can be derived
This commit is contained in:
parent
7e079a9668
commit
30fa93ab4e
13 changed files with 184 additions and 269 deletions
|
@ -1,158 +0,0 @@
|
|||
module TermImpls
|
||||
|
||||
import Quox.Syntax
|
||||
import public Quox.Pretty
|
||||
|
||||
|
||||
private
|
||||
eqShiftLen : Shift from1 to -> Shift from2 to -> Maybe (from1 = from2)
|
||||
eqShiftLen SZ SZ = Just Refl
|
||||
eqShiftLen (SS by) (SS bz) = eqShiftLen by bz
|
||||
eqShiftLen _ _ = Nothing
|
||||
|
||||
private
|
||||
eqSubstLen : Subst tm1 from1 to -> Subst tm2 from2 to -> Maybe (from1 = from2)
|
||||
eqSubstLen (Shift by) (Shift bz) = eqShiftLen by bz
|
||||
eqSubstLen (_ ::: th) (_ ::: ph) = cong S <$> eqSubstLen th ph
|
||||
eqSubstLen _ _ = Nothing
|
||||
-- maybe from1 = from2 in the last case, but this is for
|
||||
-- (==), and the substs aren't equal, so who cares
|
||||
|
||||
mutual
|
||||
export covering
|
||||
Eq (Term d n) where
|
||||
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
|
||||
|
||||
Sig fst1 snd1 == Sig fst2 snd2 =
|
||||
fst1 == fst2 && snd1 == snd2
|
||||
Sig {} == _ = False
|
||||
|
||||
Pair fst1 snd1 == Pair fst2 snd2 = fst1 == fst2 && snd1 == snd2
|
||||
Pair {} == _ = False
|
||||
|
||||
Enum ts1 == Enum ts2 = ts1 == ts2
|
||||
Enum _ == _ = False
|
||||
|
||||
Tag t1 == Tag t2 = t1 == t2
|
||||
Tag _ == _ = False
|
||||
|
||||
Eq ty1 l1 r1 == Eq ty2 l2 r2 =
|
||||
ty1 == ty2 && l1 == l2 && r1 == r2
|
||||
Eq {} == _ = False
|
||||
|
||||
DLam body1 == DLam body2 = body1 == body2
|
||||
DLam {} == _ = False
|
||||
|
||||
Nat == Nat = True
|
||||
Nat == _ = False
|
||||
|
||||
Zero == Zero = True
|
||||
Zero == _ = False
|
||||
|
||||
Succ m == Succ n = m == n
|
||||
Succ _ == _ = False
|
||||
|
||||
BOX q1 ty1 == BOX q2 ty2 = q1 == q2 && ty1 == ty2
|
||||
BOX {} == _ = False
|
||||
|
||||
Box val1 == Box val2 = val1 == val2
|
||||
Box _ == _ = False
|
||||
|
||||
E e == E f = e == f
|
||||
E _ == _ = False
|
||||
|
||||
CloT tm1 th1 == CloT tm2 th2 =
|
||||
case eqSubstLen th1 th2 of
|
||||
Just Refl => tm1 == tm2 && th1 == th2
|
||||
Nothing => False
|
||||
CloT {} == _ = False
|
||||
|
||||
DCloT tm1 th1 == DCloT tm2 th2 =
|
||||
case eqSubstLen th1 th2 of
|
||||
Just Refl => tm1 == tm2 && th1 == th2
|
||||
Nothing => False
|
||||
DCloT {} == _ = False
|
||||
|
||||
export covering
|
||||
Eq (Elim d n) where
|
||||
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
|
||||
|
||||
CasePair q1 p1 r1 b1 == CasePair q2 p2 r2 b2 =
|
||||
q1 == q2 && p1 == p2 && r1 == r2 && b1 == b2
|
||||
CasePair {} == _ = False
|
||||
|
||||
CaseEnum q1 t1 r1 a1 == CaseEnum q2 t2 r2 a2 =
|
||||
q1 == q2 && t1 == t2 && r1 == r2 && a1 == a2
|
||||
CaseEnum {} == _ = False
|
||||
|
||||
CaseNat q1 q1' n1 r1 z1 s1 == CaseNat q2 q2' n2 r2 z2 s2 =
|
||||
q1 == q2 && q1' == q2' && n1 == n2 &&
|
||||
r1 == r2 && z1 == z2 && s1 == s2
|
||||
CaseNat {} == _ = False
|
||||
|
||||
CaseBox q1 x1 r1 b1 == CaseBox q2 x2 r2 b2 =
|
||||
q1 == q2 && x1 == x2 && r1 == r2 && b1 == b2
|
||||
CaseBox {} == _ = False
|
||||
|
||||
(fun1 :% dim1) == (fun2 :% dim2) = fun1 == fun2 && dim1 == dim2
|
||||
(_ :% _) == _ = False
|
||||
|
||||
(tm1 :# ty1) == (tm2 :# ty2) = tm1 == tm2 && ty1 == ty2
|
||||
(_ :# _) == _ = False
|
||||
|
||||
Coe ty1 p1 q1 val1 == Coe ty2 p2 q2 val2 =
|
||||
ty1 == ty2 && p1 == p2 && q1 == q2 && val1 == val2
|
||||
Coe {} == _ = False
|
||||
|
||||
Comp ty1 p1 q1 val1 r1 zero1 one1 == Comp ty2 p2 q2 val2 r2 zero2 one2 =
|
||||
ty1 == ty2 && p1 == p2 && q1 == q2 &&
|
||||
val1 == val2 && r1 == r2 && zero1 == zero2 && one1 == one2
|
||||
Comp {} == _ = False
|
||||
|
||||
TypeCase ty1 ret1 arms1 def1 == TypeCase ty2 ret2 arms2 def2 =
|
||||
ty1 == ty2 && ret1 == ret2 &&
|
||||
arms1 == arms2 && def1 == def2
|
||||
TypeCase {} == _ = False
|
||||
|
||||
CloE el1 th1 == CloE el2 th2 =
|
||||
case eqSubstLen th1 th2 of
|
||||
Just Refl => el1 == el2 && th1 == th2
|
||||
Nothing => False
|
||||
CloE {} == _ = False
|
||||
|
||||
DCloE el1 th1 == DCloE el2 th2 =
|
||||
case eqSubstLen th1 th2 of
|
||||
Just Refl => el1 == el2 && th1 == th2
|
||||
Nothing => False
|
||||
DCloE {} == _ = False
|
||||
|
||||
export covering
|
||||
{s : Nat} -> Eq (ScopeTermN s d n) where
|
||||
b1 == b2 = b1.term == b2.term
|
||||
|
||||
export covering
|
||||
{s : Nat} -> Eq (DScopeTermN s d n) where
|
||||
b1 == b2 = b1.term == b2.term
|
||||
|
||||
export covering
|
||||
Show (Term d n) where
|
||||
showPrec d t = showParens (d /= Open) $ prettyStr True t
|
||||
|
||||
export covering
|
||||
Show (Elim d n) where
|
||||
showPrec d e = showParens (d /= Open) $ prettyStr True e
|
|
@ -237,27 +237,27 @@ tests = "equality & subtyping" :- [
|
|||
testEq "[#0]{} = [#0] : A" $
|
||||
equalT (extendTy Any "x" (FT "A") empty)
|
||||
(FT "A")
|
||||
(CloT (BVT 0) id)
|
||||
(CloT (Sub (BVT 0) id))
|
||||
(BVT 0),
|
||||
testEq "[#0]{a} = [a] : A" $
|
||||
equalT empty (FT "A")
|
||||
(CloT (BVT 0) (F "a" ::: id))
|
||||
(CloT (Sub (BVT 0) (F "a" ::: id)))
|
||||
(FT "a"),
|
||||
testEq "[#0]{a,b} = [a] : A" $
|
||||
equalT empty (FT "A")
|
||||
(CloT (BVT 0) (F "a" ::: F "b" ::: id))
|
||||
(CloT (Sub (BVT 0) (F "a" ::: F "b" ::: id)))
|
||||
(FT "a"),
|
||||
testEq "[#1]{a,b} = [b] : A" $
|
||||
equalT empty (FT "A")
|
||||
(CloT (BVT 1) (F "a" ::: F "b" ::: id))
|
||||
(CloT (Sub (BVT 1) (F "a" ::: F "b" ::: id)))
|
||||
(FT "b"),
|
||||
testEq "(λy ⇒ [#1]){a} = λy ⇒ [a] : B ⇾ A (N)" $
|
||||
equalT empty (Arr Zero (FT "B") (FT "A"))
|
||||
(CloT (Lam $ S [< "y"] $ N $ BVT 0) (F "a" ::: id))
|
||||
(CloT (Sub (Lam $ S [< "y"] $ N $ BVT 0) (F "a" ::: id)))
|
||||
(Lam $ S [< "y"] $ N $ FT "a"),
|
||||
testEq "(λy ⇒ [#1]){a} = λy ⇒ [a] : B ⇾ A (Y)" $
|
||||
equalT empty (Arr Zero (FT "B") (FT "A"))
|
||||
(CloT ([< "y"] :\\ BVT 1) (F "a" ::: id))
|
||||
(CloT (Sub ([< "y"] :\\ BVT 1) (F "a" ::: id)))
|
||||
([< "y"] :\\ FT "a")
|
||||
],
|
||||
|
||||
|
@ -265,12 +265,12 @@ tests = "equality & subtyping" :- [
|
|||
testEq "★₀‹𝟎› = ★₀ : ★₁" $
|
||||
equalTD 1
|
||||
(extendDim "𝑗" empty)
|
||||
(TYPE 1) (DCloT (TYPE 0) (K Zero ::: id)) (TYPE 0),
|
||||
(TYPE 1) (DCloT (Sub (TYPE 0) (K Zero ::: id))) (TYPE 0),
|
||||
testEq "(δ i ⇒ a)‹𝟎› = (δ i ⇒ a) : (a ≡ a : A)" $
|
||||
equalTD 1
|
||||
(extendDim "𝑗" empty)
|
||||
(Eq0 (FT "A") (FT "a") (FT "a"))
|
||||
(DCloT ([< "i"] :\\% FT "a") (K Zero ::: id))
|
||||
(DCloT (Sub ([< "i"] :\\% FT "a") (K Zero ::: id)))
|
||||
([< "i"] :\\% FT "a"),
|
||||
note "it is hard to think of well-typed terms with big dctxs"
|
||||
],
|
||||
|
@ -504,10 +504,10 @@ tests = "equality & subtyping" :- [
|
|||
|
||||
"elim closure" :- [
|
||||
testEq "#0{a} = a" $
|
||||
equalE empty (CloE (BV 0) (F "a" ::: id)) (F "a"),
|
||||
equalE empty (CloE (Sub (BV 0) (F "a" ::: id))) (F "a"),
|
||||
testEq "#1{a} = #0" $
|
||||
equalE (extendTy Any "x" (FT "A") empty)
|
||||
(CloE (BV 1) (F "a" ::: id)) (BV 0)
|
||||
(CloE (Sub (BV 1) (F "a" ::: id))) (BV 0)
|
||||
],
|
||||
|
||||
"elim d-closure" :- [
|
||||
|
@ -515,41 +515,42 @@ tests = "equality & subtyping" :- [
|
|||
testEq "(eq-AB #0)‹𝟎› = eq-AB 𝟎" $
|
||||
equalED 1
|
||||
(extendDim "𝑖" empty)
|
||||
(DCloE (F "eq-AB" :% BV 0) (K Zero ::: id))
|
||||
(DCloE (Sub (F "eq-AB" :% BV 0) (K Zero ::: id)))
|
||||
(F "eq-AB" :% K Zero),
|
||||
testEq "(eq-AB #0)‹𝟎› = A" $
|
||||
equalED 1
|
||||
(extendDim "𝑖" empty)
|
||||
(DCloE (F "eq-AB" :% BV 0) (K Zero ::: id)) (F "A"),
|
||||
(DCloE (Sub (F "eq-AB" :% BV 0) (K Zero ::: id))) (F "A"),
|
||||
testEq "(eq-AB #0)‹𝟏› = B" $
|
||||
equalED 1
|
||||
(extendDim "𝑖" empty)
|
||||
(DCloE (F "eq-AB" :% BV 0) (K One ::: id)) (F "B"),
|
||||
(DCloE (Sub (F "eq-AB" :% BV 0) (K One ::: id))) (F "B"),
|
||||
testNeq "(eq-AB #0)‹𝟏› ≠ A" $
|
||||
equalED 1
|
||||
(extendDim "𝑖" empty)
|
||||
(DCloE (F "eq-AB" :% BV 0) (K One ::: id)) (F "A"),
|
||||
(DCloE (Sub (F "eq-AB" :% BV 0) (K One ::: id))) (F "A"),
|
||||
testEq "(eq-AB #0)‹#0,𝟎› = (eq-AB #0)" $
|
||||
equalED 2
|
||||
(extendDim "𝑗" $ extendDim "𝑖" empty)
|
||||
(DCloE (F "eq-AB" :% BV 0) (BV 0 ::: K Zero ::: id))
|
||||
(DCloE (Sub (F "eq-AB" :% BV 0) (BV 0 ::: K Zero ::: id)))
|
||||
(F "eq-AB" :% BV 0),
|
||||
testNeq "(eq-AB #0)‹𝟎› ≠ (eq-AB 𝟎)" $
|
||||
equalED 2
|
||||
(extendDim "𝑗" $ extendDim "𝑖" empty)
|
||||
(DCloE (F "eq-AB" :% BV 0) (BV 0 ::: K Zero ::: id))
|
||||
(DCloE (Sub (F "eq-AB" :% BV 0) (BV 0 ::: K Zero ::: id)))
|
||||
(F "eq-AB" :% K Zero),
|
||||
testEq "#0‹𝟎› = #0 # term and dim vars distinct" $
|
||||
equalED 1
|
||||
(extendTy Any "x" (FT "A") $ extendDim "𝑖" empty)
|
||||
(DCloE (BV 0) (K Zero ::: id)) (BV 0),
|
||||
(DCloE (Sub (BV 0) (K Zero ::: id))) (BV 0),
|
||||
testEq "a‹𝟎› = a" $
|
||||
equalED 1 (extendDim "𝑖" empty) (DCloE (F "a") (K Zero ::: id)) (F "a"),
|
||||
equalED 1 (extendDim "𝑖" empty)
|
||||
(DCloE (Sub (F "a") (K Zero ::: id))) (F "a"),
|
||||
testEq "(f [a])‹𝟎› = f‹𝟎› [a]‹𝟎›" $
|
||||
let th = K Zero ::: id in
|
||||
equalED 1 (extendDim "𝑖" empty)
|
||||
(DCloE (F "f" :@ FT "a") th)
|
||||
(DCloE (F "f") th :@ DCloT (FT "a") th)
|
||||
(DCloE (Sub (F "f" :@ FT "a") th))
|
||||
(DCloE (Sub (F "f") th) :@ DCloT (Sub (FT "a") th))
|
||||
],
|
||||
|
||||
"clashes" :- [
|
||||
|
|
|
@ -2,7 +2,6 @@ module Tests.FromPTerm
|
|||
|
||||
import Quox.Parser.FromParser
|
||||
import Quox.Parser
|
||||
import TermImpls
|
||||
import TypingImpls
|
||||
import Tests.Parser as TParser
|
||||
import TAP
|
||||
|
|
|
@ -2,7 +2,6 @@ module Tests.Reduce
|
|||
|
||||
import Quox.Syntax as Lib
|
||||
import Quox.Equal
|
||||
import TermImpls
|
||||
import TypingImpls
|
||||
import TAP
|
||||
|
||||
|
@ -67,34 +66,34 @@ tests = "whnf" :- [
|
|||
|
||||
"elim closure" :- [
|
||||
testWhnf "x{}" (ctx [< ("A", Nat)])
|
||||
(CloE (BV 0) id)
|
||||
(CloE (Sub (BV 0) id))
|
||||
(BV 0),
|
||||
testWhnf "x{a/x}" empty
|
||||
(CloE (BV 0) (F "a" ::: id))
|
||||
(CloE (Sub (BV 0) (F "a" ::: id)))
|
||||
(F "a"),
|
||||
testWhnf "x{x/x,a/y}" (ctx [< ("A", Nat)])
|
||||
(CloE (BV 0) (BV 0 ::: F "a" ::: id))
|
||||
(CloE (Sub (BV 0) (BV 0 ::: F "a" ::: id)))
|
||||
(BV 0),
|
||||
testWhnf "x{(y{a/y})/x}" empty
|
||||
(CloE (BV 0) ((CloE (BV 0) (F "a" ::: id)) ::: id))
|
||||
(CloE (Sub (BV 0) ((CloE (Sub (BV 0) (F "a" ::: id))) ::: id)))
|
||||
(F "a"),
|
||||
testWhnf "(x y){f/x,a/y}" empty
|
||||
(CloE (BV 0 :@ BVT 1) (F "f" ::: F "a" ::: id))
|
||||
(CloE (Sub (BV 0 :@ BVT 1) (F "f" ::: F "a" ::: id)))
|
||||
(F "f" :@ FT "a"),
|
||||
testWhnf "([y] ∷ [x]){A/x}" (ctx [< ("A", Nat)])
|
||||
(CloE (BVT 1 :# BVT 0) (F "A" ::: id))
|
||||
(CloE (Sub (BVT 1 :# BVT 0) (F "A" ::: id)))
|
||||
(BV 0),
|
||||
testWhnf "([y] ∷ [x]){A/x,a/y}" empty
|
||||
(CloE (BVT 1 :# BVT 0) (F "A" ::: F "a" ::: id))
|
||||
(CloE (Sub (BVT 1 :# BVT 0) (F "A" ::: F "a" ::: id)))
|
||||
(F "a")
|
||||
],
|
||||
|
||||
"term closure" :- [
|
||||
testWhnf "(λy. x){a/x}" empty
|
||||
(CloT (Lam $ S [< "y"] $ N $ BVT 0) (F "a" ::: id))
|
||||
(CloT (Sub (Lam $ S [< "y"] $ N $ BVT 0) (F "a" ::: id)))
|
||||
(Lam $ S [< "y"] $ N $ FT "a"),
|
||||
testWhnf "(λy. y){a/x}" empty
|
||||
(CloT ([< "y"] :\\ BVT 0) (F "a" ::: id))
|
||||
(CloT (Sub ([< "y"] :\\ BVT 0) (F "a" ::: id)))
|
||||
([< "y"] :\\ BVT 0)
|
||||
],
|
||||
|
||||
|
@ -112,8 +111,8 @@ tests = "whnf" :- [
|
|||
F "a" :@
|
||||
E ((([< "x"] :\\ BVT 0) :# Arr One (FT "A") (FT "A")) :@ FT "a"),
|
||||
testNoStep "λx. [y [x]]{x/x,a/y}" (ctx [< ("A", Nat)]) $
|
||||
[< "x"] :\\ CloT (E $ BV 1 :@ BVT 0) (BV 0 ::: F "a" ::: id),
|
||||
[< "x"] :\\ CloT (Sub (E $ BV 1 :@ BVT 0) (BV 0 ::: F "a" ::: id)),
|
||||
testNoStep "f ([y [x]]{x/x,a/y})" (ctx [< ("A", Nat)]) $
|
||||
F "f" :@ CloT (E $ BV 1 :@ BVT 0) (BV 0 ::: F "a" ::: id)
|
||||
F "f" :@ CloT (Sub (E $ BV 1 :@ BVT 0) (BV 0 ::: F "a" ::: id))
|
||||
]
|
||||
]
|
||||
|
|
|
@ -3,7 +3,6 @@ module TypingImpls
|
|||
import TAP
|
||||
import public Quox.Typing
|
||||
import public Quox.Pretty
|
||||
import public TermImpls
|
||||
|
||||
import Derive.Prelude
|
||||
%language ElabReflection
|
||||
|
|
|
@ -5,7 +5,6 @@ depends = base, contrib, elab-util, snocvect, quox-lib, tap, eff
|
|||
executable = quox-tests
|
||||
main = Tests
|
||||
modules =
|
||||
TermImpls,
|
||||
TypingImpls,
|
||||
PrettyExtra,
|
||||
Tests.DimEq,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue