如何在Coq中重复证明策略?

时间:2017-05-06 17:22:18

标签: coq coq-tactic

我想在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.案例证明(所以我只有两个 - 或类似的东西,所以我不必重复自己)?或者我只是以错误的方式完全证明这个证据?

1 个答案:

答案 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)分组策略t1t2
  • t1 | t2t1 || t2t1 + 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"),了解这些以及许多其他有用结构的详细说明。