对Idris

时间:2015-05-14 00:08:08

标签: idris

我正在尝试实施一种玩具常规类型系统,该系统可确保一些良好的成型方面的限制,并允许在其中展开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,我成功地为展开写了一个非常相似的包装器(未显示)。

1 个答案:

答案 0 :(得分:1)

我想问题是行

subst' a1 a2 with (subst a2 a2)

您是不是要在substa1上拨打a2,或者反过来?