我正在尝试使用异构相等来证明涉及此索引数据类型的语句:
data Counter : ℕ → Set where
cut : (i j : ℕ) → Counter (suc i + j)
我能够使用Relation.Binary.HeterogenousEquality.≅-Reasoning编写我的证明,但只能假设以下同余属性:
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′
进行案例分析(即通过使用Emacs前端中的C-c C-c
)来确保所有隐式参数都与其强加的约束相匹配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)
答案 0 :(得分:5)
你可以做的是另外证明这两个指数相等:
Counter-cong : ∀ {n n′} {k : Counter n} {k′ : Counter n′} →
{A : ℕ → Set} → (f : ∀{n} → Counter n → A n) →
n ≅ n′ → k ≅ k′ → f k ≅ f k′
Counter-cong f refl refl = refl
最初的问题是知道Counter n ≅ Counter n′
并不意味着n ≡ n′
因为类型构造函数不被认为是单射的(对此有一个标记--injective-type-constructors
,这实际上是匹配通过,但它已知与被排除的中间不一致),所以虽然它可以断定这两种类型是相等的,但它不会将n
重写为n′
,所以你以后会得到那个错误检查k
和k′
是否合格。
由于Counter n
具有完全 n 元素,因此实际上可以证明Counter
使用像鸽子原则(并且可能是自然的可判定等式)这样的内容是无效的,所以你可以没有n ≅ n′
论证,虽然那会很混乱。
编辑:AFAICT the Het。平等行为仍然是一样的。