异构平等的一致性

时间:2012-02-16 11:30:24

标签: equality proof gadt agda

我正在尝试使用异构相等来证明涉及此索引数据类型的语句:

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

1 个答案:

答案 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′,所以你以后会得到那个错误检查kk′是否合格。

由于Counter n具有完全 n 元素,因此实际上可以证明Counter使用像鸽子原则(并且可能是自然的可判定等式)这样的内容是无效的,所以你可以没有n ≅ n′论证,虽然那会很混乱。

编辑:AFAICT the Het。平等行为仍然是一样的。