我有一个证明脚本,其中的部分如下所示:
==> 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).
干净地解决的选择候选者,不幸的是假设已经到处都是。如何将各种子样张折叠在一起?
答案 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
部分确保IH
和H
兼容。
具有两个归纳假设的子目标可以类似地解决:
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.