Agda统一列表

时间:2015-11-06 00:04:04

标签: list agda unification

我正在做一个证明正则表达式的一些属性的项目。 这是我的代码的一部分

这里表示派生,Regexp ⇨ word表示正则表达式可以派生一个单词

Σ : Set
Σ* : List Σ

下面定义了如果e₁ ∙ e₂we₁ ⇨ w₁

,并置e₂ ⇨ w₂可以派生单词w ≡ w₁ ++ w₂的情况
data _⇨_ : RegExp Σ → Σ* → Set where
 con : {e₁ e₂ : RegExp Σ}{w w₁ w₂ : Σ*} → w ≡ w₁ ++ w₂ → e₁ ⇨ w₁ → e₂ ⇨ w₂ → e₁ ∙ e₂ ⇨ w

这证明如果w ≡ w₁ ++ []和(e 1不能得出w 1)而不是(e 1 e 2不能得出w)

¬e₁∙e₂⇨xs[]ˡ : {e₁ e₂ : RegExp Σ}{w w₁ : Σ*} → w ≡ w₁ ++ [] → ¬ (e₁ ⇨ w₁) → ¬ (e₁ ∙ e₂ ⇨ w)
¬e₁∙e₂⇨xs[]ˡ refl ¬e₁⇨w₁ (con {w₂ = []} refl e₁⇨w₁ e₂⇨[]) = ¬e₁⇨w₁ e₁⇨w₁

但是,refl中的con refl e₁⇨w₁ e₂⇨[]未进行类型检查,因为Agda无法将w₁中的¬e₁∙e₂⇨xs[]ˡw₁中的¬ (e₁ ∙ e₂ ⇨ w)统一起来错误信息在这里:

w₁ != w₂ of type List Σ
when checking that the pattern refl has type w₁ ++ [] ≡ w₂ ++ []

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

w ≡ w₁ ++ []上进行模式匹配后,您注定失败,因为ww₁ ++ []统一,e₁ ∙ e₂ ⇨ w变为e₁ ∙ e₂ ⇨ w₁ ++ [],您可以' t模式匹配。

_++_不是单射的,w₁ ++ [] ≡ w₁' ++ w₂'并不需要w₁ ≡ w₁' × [] ≡ w₂' - 通常还有其他方法可以统一这两个表达式。

你的引理与

同构
¬e₁∙e₂⇨xs[]ˡ : {e₁ e₂ : RegExp Σ}{w : Σ*} → ¬ (e₁ ⇨ w) → ¬ (e₁ ∙ e₂ ⇨ w)

对我来说看起来不对。

有关类似问题,请参阅here