我正在做一个证明正则表达式的一些属性的项目。 这是我的代码的一部分
⇨
这里表示派生,Regexp ⇨ word
表示正则表达式可以派生一个单词
Σ : Set
Σ* : List Σ
下面定义了如果e₁ ∙ e₂
,w
和e₁ ⇨ 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₂ ++ []
任何帮助将不胜感激!
答案 0 :(得分:3)
在w ≡ w₁ ++ []
上进行模式匹配后,您注定失败,因为w
与w₁ ++ []
统一,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。