重写并保持模式匹配?

时间:2018-01-06 13:05:34

标签: lambda pattern-matching agda

我有以下定义:

ren-refl′ : ∀ {Γ i t} (ts′ : List Ty) → (e : Tm {i} (Γ <>< ts′) t) → ren (keep* ts′ reflᵣ) e ≡ e
ren-refl′ {Γ} ts′ (var v)  rewrite keep*-refl {Γ} ts′ | ren-var-refl v = refl
ren-refl′ {Γ} ts′ (con e)  rewrite keep*-refl {Γ} ts′ | ren-con-refl e = refl

我想通过keep*-refl {Γ} ts′来重写,因为我们可以在e参数的模式匹配之前做到这一点(并统一地做)。

我最接近的是匹配lambda的模式:

ren-refl′ {Γ} ts′ rewrite keep*-refl {Γ} ts′ = λ
  { (var v) → cong var (ren-var-refl v)
  ; (con e) → cong con (ren-con-refl e)
  }

但是,我不喜欢它,因为它要求我做一些cong改组,我不需要用直线rewrite;我无法在lambda中做rewrite

2 个答案:

答案 0 :(得分:1)

来自case_of_的{​​{1}}和case_return_of_通常在lambdas内工作正常,e。 G:

Function

答案 1 :(得分:1)

您可以尝试我在agda-prelude中创建的Tactic.Reflection.Reright(原文如此)。我想你可以用cong *替换reright s。警告:我已经坚持了几个月,不再使用它了。