我试图用异质平等,以证明涉及此索引的数据类型声明:相合的异质平等
data Counter : ℕ → Set where
cut : (i j : ℕ) → Counter (suc i + j)
我能够使用Relation.Binary.HeterogenousEquality.≅推理给我写的证明,但只通过假定下面的一致性属性:
Counter-cong : ∀ {n n′} {k : Counter n} {k′ : Counter n′} →
{A : ℕ → Set} → (f : ∀{n} → Counter n → A n) →
k ≅ k′ → f k ≅ f k′
Counter-cong f k≅k′ = {!!}
然而,我不能k≅k′
是refl
不脱离类型检查得到以下错误消息模式匹配:
Refuse to solve heterogeneous constraint
k : Counter n =?= k′ : Counter n′
并且如果我试图对k≅k′
进行案例分析。通过使用C-c C-c
从Emacs的前端),以确保所有的隐含参数是否正确相对于由refl
强加自己的约束相匹配,我得到
Cannot decide whether there should be a case for the constructor
refl, since the unification gets stuck on unifying the
inferred indices
[{.Level.zero}, {Counter n}, k]
with the expected indices
[{.Level.zero}, {Counter n′}, k′]
(如果你有兴趣,这里有一些不相关背景:Eliminating subst to prove equality)
作为一种解决方法,我目前使用的是参数化类型而不是索引化类型,并且携带了一个证明: '数据计数器(n:ℕ):设置其中 切割:(ij:ℕ)→(i + j + 1 = n:suc(i + j)≡n)→计数器n' – Cactus 2012-02-17 13:43:06