我正在尝试实施一种玩具常规类型系统,该系统可确保一些良好的成型方面的限制,并允许在其中展开mu绑定。表示这些类型的数据类型包含固定点(Mu
)的构造函数,由最近的封闭Mu绑定项(Var
)替换,以及零和一个参数类型运算符(Nullary
和分别为Unary
。
为了确保某些类型格式正确,他们会跟踪三个Bool
参数,无论他们的头部构造函数是Mu
,还是Var
作为头部构造函数,或者Var
内的任何地方。
data A : Bool -- Is Mu headed?
-> Bool -- Is Var headed?
-> Bool -- Contains any Var's?
-> Type where
Mu : A False False _ -> A True False False
Var : A False True True
Nullary : A False False False
Unary : A _ _ m -> A False False m
要实现Mu-headed类型的展开,我需要执行替换,具体来说我需要实现“Mu x。F ====> F [(Mu x。F)/ x]”。
除了需要一些生成第三个类型参数的证据之外,函数subst
似乎很简单:
total subst : A m1 v1 c1 -> A m2 v2 c2 -> (c3 ** ((A (m2 || (v2 && m1))
(v2 && v1)
c3)
,(c3 = (c2 && c1))))
subst _ Nullary = (_ ** (Nullary,Refl))
subst w (Unary a) with (subst w a)
| (c3** (a',aeq)) = (c3 ** (Unary a',aeq))
subst w Var = (_ ** (w,Refl))
subst w (Mu a) = (_ ** (Mu a,Refl))
我尝试过编写一个可以清理这个返回类型的包装器。
total subst' : A m1 v1 c1 -> A m2 v2 c2 -> A (m2 || (v2 && m1))
(v2 && v1)
(c2 && c1)
subst' a1 a2 with (subst a2 a2)
| (_**(a',aeq)) ?= a'
当我尝试解决这个元变量时,我发现aeq : x = c2 && Delay c2
不是aeq : x = c2 && Delay c1
正如我预期的那样(回想一下(&&
)在第二个参数中是懒惰的。)
我做错了吗?这是预期的行为吗? FWIW,我成功地为展开写了一个非常相似的包装器(未显示)。
答案 0 :(得分:1)
我想问题是行
subst' a1 a2 with (subst a2 a2)
您是不是要在subst
和a1
上拨打a2
,或者反过来?