这是书中的代码:
Example In_example_2 :
forall n, In n [2; 4] ->
exists n', n = 2 * n'.
Proof.
(* WORKED IN CLASS *)
simpl.
intros n [H | [H | []]].
- exists 1. rewrite <- H. reflexivity.
- exists 2. rewrite <- H. reflexivity.
Qed.
Aftersimpl.
In
转换为 3 个元素的析取:
============================
forall n : nat, 2 = n \/ 4 = n \/ False -> exists n' : nat, n = n' + (n' + 0)
但我完全不明白如何阅读:
intros n [H | [H | []]].
它产生了这个:
n : nat
H : 2 = n
============================
exists n' : nat, n = n' + (n' + 0)
subgoal 2 (ID 229) is:
exists n' : nat, n = n' + (n' + 0)
我的理解:
- 它将 n from
forall
放入上下文中。 - 它将 3 个元素的析取分解为 2 个子目标,忽略 False:
- 根据拆分的数量创建了 2 个子目标。
底部还有一个提示:
(** (Notice the use of the empty pattern to discharge the last case
_en passant_.) *)
En passant(法语:[ɑ̃ paˈsɑ̃],点燃。顺便说一句)是国际象棋中的一步。这是一种特殊的棋子捕获,只能在棋子从其起始格移动两个格子后立即发生,并且如果它只前进一个格子就可能被敌方棋子捕获。
看着这个:
intros n [H | [H | []]].
有人可以解释一下吗:
- 这种形式的命令应该用于破坏forall吗?这个任务还有别的吗?
- 如何用英文阅读这个命令?
- 为什么要
[H | []]
放在另一对括号中? - 如何
[]
告诉 coq 忽略 False 语句? - 一般什么时候应该使用这个命令?