消除子证明平等

时间:2012-02-12 05:35:21

标签: gadt agda

我试图将mod-n计数器表示为区间[0, ..., n-1]的一部分,分为两部分:

data Counter : ℕ → Set where
  cut : (i j : ℕ) → Counter (suc (i + j))

使用它,定义两个关键操作很简单(为简洁起见省略了一些证明):

_+1 : ∀ {n} → Counter n → Counter n
cut i zero    +1 = subst Counter {!!} (cut zero i)
cut i (suc j) +1 = subst Counter {!!} (cut (suc i) j)

_-1 : ∀ {n} → Counter n → Counter n
cut zero    j -1 = subst Counter {!!} (cut j zero)
cut (suc i) j -1 = subst Counter {!!} (cut i (suc j))

当试图证明+1-1是反转时,会出现问题。我一直在遇到需要一个消除器来引入这些subst的情况,比如

subst-elim : {A : Set} → {B : A → Set} → {x x′ : A} → {x=x′ : x ≡ x′} → {y : B x} → subst B x=x′ y ≡ y
subst-elim {A} {B} {x} {.x} {refl} = refl

但事实证明(有些)提出了一个问题:类型检查器不接受它,因为subst B x=x' y : B x'y : B x ......

1 个答案:

答案 0 :(得分:4)

如果您使用stdlib中的Relation.Binary.HeterogeneousEquality,则可以声明您的subst-elim的类型。 但是我可能只是在with或rewrite子句中对x≡x'的最终证明进行模式匹配,因此您不必进行明确的消除,因此没有输入问题。