我想在Coq'Art中扩展练习6.10,增加一个不是一月份的定理,即__月将等于假。
我对月份的定义如下:
Inductive month : Set :=
| January : month
| February : month
| March : month
| April : month
| May : month
| June : month
| July : month
| August : month
| September : month
| October : month
| November : month
| December : month
.
Check month_rect.
我对is_January的定义如下:
Definition is_January (m : month) : Prop :=
match m with
| January => True
| other => False
end.
我正在做以下事情以测试它是否正确。
Eval compute in (is_January January).
Eval compute in (is_January December).
Theorem is_January_eq_January :
forall m : month, m = January -> is_January m = True.
Proof.
intros m H.
rewrite H.
compute; reflexivity.
Qed.
我对这个定理的证明不太满意。
Theorem is_January_neq_not_January :
forall m : month, m <> January -> is_January m = False.
Proof.
induction m.
- contradiction.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
- intro H; simpl; reflexivity.
Qed.
在Coq中是否有重复非{1}月的- intro H; simpl; reflexivity.
案例证明(所以我只有两个 - 或类似的东西,所以我不必重复自己)?或者我只是以错误的方式完全证明这个证据?
答案 0 :(得分:5)
这样做的一种方法是
Theorem is_January_neq_not_January :
forall m : month, m <> January -> is_January m = False.
Proof.
induction m; try reflexivity.
contradiction.
Qed.
simpl
隐含在reflexivity
中,因此不必要。t1 ; t2
将策略t2
应用于应用程序创建的所有分支
策略t1
。try t
尝试应用战术t
(顾名思义)或什么都不做
如果t
失败。这样做是像以前一样运行induction
,然后立即在所有分支上运行reflexivity
(除了1月分支以外的所有分支都可以解决)。在那之后,你将留下那个单一的分支,可以像以前一样通过contradiction
来解决。
对于更复杂的情况,其他可能有用的结构是
(t1 ; t2)
分组策略t1
和t2
,t1 | t2
,t1 || t2
,t1 + t2
是“try t1
的变体”
失败/没有做任何有用的事情/ ......,改为t2
, fail
(如果你想取消/重置,这很有用
发生在分支机构的事情)
(作为我的一个证明中的复杂示例,请考虑try (split; unfold not; intro H'; inversion H'; fail)
。这会尝试创建多个子分支(split
),希望它们都是矛盾的,可以通过{{ 1}}。如果这不起作用,inversion H'
只会造成一个大混乱,所以它明确地inversion
以取消战术链的影响。最终结果是许多无聊的案例会自动解决,而有趣的案例在手动解决时保持不变。)
以及更多内容 - 请查看Chapter 9 of the Coq Reference Manual ("The tactic language"),了解这些以及许多其他有用结构的详细说明。