Coq 如何在抽运引理中分裂长度不等式假设?

Coq 如何在抽运引理中分裂长度不等式假设?,coq,logical-foundations,Coq,Logical Foundations,这是来自软件基金会的五星练习 Lemma pumping : forall T (re : @reg_exp T) s, s =~ re -> pumping_constant re <= length s -> exists s1 s2 s3, s = s1 ++ s2 ++ s3 /\ s2 <> [] /\ forall m, s1 ++ napp m s2 ++ s3 =~ re. Proof. intros T re

这是来自软件基金会的五星练习

Lemma pumping : forall T (re : @reg_exp T) s,
  s =~ re ->
  pumping_constant re <= length s ->
  exists s1 s2 s3,
    s = s1 ++ s2 ++ s3 /\
    s2 <> [] /\
    forall m, s1 ++ napp m s2 ++ s3 =~ re.
Proof.
  intros T re s Hmatch.
  induction Hmatch
    as [ | x | s1 re1 s2 re2 Hmatch1 IH1 Hmatch2 IH2
       | s1 re1 re2 Hmatch IH | re1 s2 re2 Hmatch IH
       | re | s1 s2 re Hmatch1 IH1 Hmatch2 IH2 ]; simpl; intros.
  - omega.
  - omega.
  -
引理泵送:对于所有T(re:@reg_exp T)s,
s=~re->
泵浦光常数re
存在s1 s2 s3,
s=s1++s2++s3/\
s2[]/\
对于所有m,s1++nappms2++s3=~re。
证明。
介绍T-re-s-Hmatch。
感应匹配
as[|x | s1 re1 s2 re2 HMATCH 1 IH1 HMATCH 2 IH2
|s1 re1 re2 Hmatch IH | re1 s2 re2 Hmatch IH
|re | s1 s2 re HMATCH 1 IH1 HMATCH 2 IH2];单纯形;介绍。
-欧米茄。
-欧米茄。
-
1子目标
T:类型
s1:列表T
re1:reg_exp
s2:列表T
re2:reg_exp
Hmatch1:s1=~re1
Hmatch2:s2=~re2
IH1:泵送_常数re1
存在s2 s3 s4:列表T,
s1=s2++s3++s4/\
s3[]/\(对于所有m:nat,s2++napp m s3++s4=~re1)
IH2:泵送_常数re2
存在s1 s3 s4:列表T,
s2=s1++s3++s4/\
s3[]/\(对于所有m:nat,s1++napp m s3++s4=~re2)

H:泵浦光常数re1+泵浦光常数re2是的,您需要拆分
H
才能继续


模糊提示:执行
搜索(+\up>是,您需要拆分
H
才能继续


模糊提示:执行
搜索(u+I和其他软件基金会的作者恳请您不要在公共论坛上讨论SF练习的解决方案。有许多课程依赖这些练习来给学生评分。如果您对这个特定练习有问题,我建议您在网上查找泵送引理的纸质证明,并尝试恶意化。我和其他软件基金会的作者恳请您不要在公共论坛上讨论SF练习的解决方案。有许多课程依赖这些练习来给学生评分。如果您对这个特定练习有问题,我建议您在网上查找泵送引理的纸质证明,并尝试形式化它。完美的答案。昨天我尝试使用
omega
解决这个分裂问题,但失败了,所以我得出结论,这可能是不可能的。昨晚我想出了如何直接使用
泵送
和辅助函数之间的相互递归以一种总的方式进行证明,但这是一个非常重要的问题更好的方法。不,等等,我在这里跳了枪。现在我正在研究它,我意识到我需要把它分成
n+mn实际上,你毕竟是对的。我认为两种归纳情况都是需要的,但只有一个就可以证明MApp分支。@Marko,你的陈述
n+mn完美无误wer.昨天我试着用
omega
解决这个分裂问题,但失败了,所以我得出结论,这很可能是不可能的。昨晚,我想出了如何直接使用
泵送
和辅助函数之间的互递推,以一种总的方式进行证明,但这是一种明显更好的方法。不,等等,我在这里跳了枪。现在我正在研究它,我意识到我需要把它分成
n+mn实际上,你毕竟是对的。我原以为两种归纳情况都需要,但只有一个就可以证明MApp分支。@Marko,你的陈述
n+mn
1 subgoal
T : Type
s1 : list T
re1 : reg_exp
s2 : list T
re2 : reg_exp
Hmatch1 : s1 =~ re1
Hmatch2 : s2 =~ re2
IH1 : pumping_constant re1 <= length s1 ->
      exists s2 s3 s4 : list T,
        s1 = s2 ++ s3 ++ s4 /\
        s3 <> [ ] /\ (forall m : nat, s2 ++ napp m s3 ++ s4 =~ re1)
IH2 : pumping_constant re2 <= length s2 ->
      exists s1 s3 s4 : list T,
        s2 = s1 ++ s3 ++ s4 /\
        s3 <> [ ] /\ (forall m : nat, s1 ++ napp m s3 ++ s4 =~ re2)
H : pumping_constant re1 + pumping_constant re2 <= length (s1 ++ s2)
______________________________________(1/1)
exists s0 s3 s4 : list T,
  s1 ++ s2 = s0 ++ s3 ++ s4 /\
  s3 <> [ ] /\ (forall m : nat, s0 ++ napp m s3 ++ s4 =~ App re1 re2)