自动从本地上下文中选择一个假设

时间:2017-05-27 20:56:47

标签: coq coq-tactic

我有一个证明脚本,其中的部分如下所示:

==> grails --version
| Grails Version: 3.2.9
| Groovy Version: 2.4.10
| JVM Version: 1.8.0_77

似乎它是使用 - destruct (IHx1 _ _ H3). subst. destruct (IHx2 _ _ H7). congruence. - destruct (IHx1 _ _ H6). congruence. - destruct (IHx1 _ _ H3). subst. destruct (IHx2 _ _ H7). congruence. - destruct (IHx1 _ _ H6). congruence. - destruct (IHx _ _ H2). congruence. - destruct (IHx _ _ H5). congruence. - destruct (IHx _ _ H2). congruence. - destruct (IHx _ _ H8). congruence. - destruct (IHx _ _ H8). congruence. - destruct (IHx _ _ H8). congruence. - destruct (IHx _ _ H8). congruence. - destruct (IHx _ _ H7). congruence. - destruct (IHx _ _ H4). congruence. - destruct (IHx1 _ _ H8). congruence. - destruct (IHx1 _ _ H5). subst. destruct (IHx2 _ _ H9). 干净地解决的选择候选者,不幸的是假设已经到处都是。如何将各种子样张折叠在一起?

1 个答案:

答案 0 :(得分:2)

我们只有一个归纳假设的情况可以使用以下Ltac解决(参见手册,chapter 9):

match goal with
  IH : forall st2 s2, ?c / ?st \\ s2 / st2 -> _,
  H : ?c / ?st \\ _ / _
  |- _ => now destruct (IH  _ _ H)
end

如果变量以问号为前缀,例如?c?st等是模式匹配的元变量,逗号分开的假设和旋转门符号(|-)将假设与目标分开。在这里,我们正在寻找归纳假设IH和兼容的假设H,以便我们可以将IH应用于H?c / ?st部分确保IHH兼容。

具有两个归纳假设的子目标可以类似地解决:

match goal with
  IH1 : forall st2 s2, ?c1 / ?st \\ s2 / st2 -> _,
  IH2 : forall st2 s2, ?c2 / _ \\ s2 / st2 -> _,
  H1 : ?c1 / ?st \\ _ / ?st'',
  H2 : ?c2 / ?st'' \\ _ / st2
  |- _ => now destruct (IH1  _ _ H1); subst; destruct (IH2 _ _ H2)
end

当然,如果你想要,你可以将名字绑定到那些自定义战术,使用战术等等:

Ltac solve1 :=
  try match goal with
        IH : forall st2 s2, ?c / ?st || s2 / st2 -> _,
        H : ?c / ?st || _ / _
        |- _ => now destruct (IH  _ _ H)
      end.