在Agda中证明语言的连接是相关联的

时间:2017-04-23 16:22:58

标签: regular-language agda dependent-type formal-languages

我是Agda语言的新手,我正在使用Agda编写正式语言。

当证明语言的连接是关联的时候,我遇到了一些问题。由于Agda在以下代码中找不到“++ Assoc”的字样,因此该校样将以黄色突出显示:

LangAssoc : ∀{Σ}{l1 l2 l3 : Language Σ}{w : Word Σ} → (LangConc l1 (LangConc l2 l3)) w → (LangConc (LangConc l1 l2) l3) w
LangAssoc {l1 = l1} (conc x (conc y z)) = conc (conc (subst l1 (++Assoc _ _ _) x) y) z

“++ Assoc”是证明列表串联的相关性。

语言和连接定义如下:

Language : ℕ → Set₁
Language a = Word a → Set

data LangConc {Σ} (l1 l2 : Language Σ) : Language Σ where
  conc : ∀{w1 w2} → l1 w1 → l2 w2 → (LangConc l1 l2) (w1 ++ w2)

所以我想问一下是否有人可以解释我在这种情况下做错了什么,并给我一些如何解决问题的提示。

编辑1:我在连接之外使用subst尝试了另一种方法,但是我遇到了这种情况:

LangAssoc : ∀{Σ} {l1 l2 l3 : Language Σ} {w : Word Σ} → (LangConc l1 (LangConc l2 l3)) w → (LangConc (LangConc l1 l2) l3) w
LangAssoc {Σ} {l1 = l1} {l2 = l2} {l3 = l3} (conc x (conc y z)) = subst {!!} (++Assoc {Σ} _ _ _) (conc {Σ} (conc {Σ} x y) z)

编辑2:我刚刚尝试使用以下代码并导致错误消息。

LangAssoc : ∀{Σ} {l1 l2 l3 : Language Σ} {w : Word Σ} → (LangConc l1 (LangConc l2 l3)) w → (LangConc (LangConc l1 l2) l3) w
LangAssoc {l1 = l1} {w = w} (conc x (conc y z)) =  ?
w1 ++ w2 != w of type List (Fin Σ)
when checking that the pattern conc x (conc y z) has type
LangConc l1 (LangConc l2 l3) w

编辑3:按照建议将w一词分为三个部分再试一次。

LangAssoc : ∀{Σ : ℕ}{l1 l2 l3 : Language Σ}{w1 w2 w3 : Word Σ} 
             → (LangConc l1 (LangConc l2 l3)) (w1 ++ w2 ++ w3)
             → (LangConc (LangConc l1 l2) l3) ((w1 ++ w2) ++ w3)
LangAssoc (conc {w1} x (conc {w2} {w3} y z))
   = subst (LangConc (LangConc _ _) _) (++Assoc w1 w2 w3) (conc (conc x y) z)

错误讯息:

w4 != w1 of type List (Fin Σ)
when checking that the pattern conc {w1} x (conc {w2} {w3} y z) has
type LangConc l1 (LangConc l2 l3) (w1 ++ w2 ++ w3)

其中List(FinΣ)是WordΣ的定义。

1 个答案:

答案 0 :(得分:2)

问题在于x ++ (y ++ z) ?= _1 ++ (_2 ++ _3)不是单射的(即使它是,Agda也不会知道)所以当试图解决_1 = []时,Agda无法选择最普遍的解决方案

例如说_2 = x_3 = y ++ zw可行。

编辑:在LangConc l1 (LangConc l2 l3) w上匹配模式后引入w并不合理:l1已分为3部分(与{{1}相对应的部分},l2l3)。引入这些部分会更有趣:

LangAssoc (conc {w1} x (conc {w2} {w3} y z)) =
  subst (LangConc (LangConc _ _) _) (++Assoc w1 w2 w3) (conc (conc x y) z)