Форма intros n [H | [H | []]]
является сокращением для
intros n H. destruct H as [H | [H | []]].
. Далее вы можете переписать доказательство как
intros n H. destruct H as [H2 | H4F].
- (* H2 : 2 = n *)
exists 1. rewrite <- H2. reflexivity.
- (* H4F : 4 = n \/ False *)
destruct H4F as [H4 | HF].
+ (* H4 : 4 = n *)
exists 2. rewrite <- H4. reflexivity.
+ (* HF : False *)
destruct HF. (* No more subgoals here *)
Два доказательства логически эквивалентны, но первое из них короче(и легче читать, когда вы привыкнете к синтаксису).
Вообще говоря, тактика destruct x as [...]
принимает выражение x
и генерирует одну подцель для каждого конструктора, который мог бы быть использован для создания x
.Аргументы для конструкторов именуются в соответствии с шаблоном [...]
, а части, соответствующие различным конструкторам, разделяются вертикальными чертами.
Предложение в форме A \/ B \/ C
следует читать как A \/ (B \/ C)
,Таким образом, когда вы впервые вызываете destruct
в расширенной форме, приведенной выше, вы получаете два случая: когда выполняется A
, когда выполняется B \/ C
.Вам нужно вызвать destruct
во второй раз, чтобы проанализировать внутреннюю или, поэтому у вас были вложенные скобки в исходном выражении.Что касается последней ветви, False
определяется как предложение без конструкторов, поэтому, как только вы разрушите гипотезу HF : False
, доказательство завершено.
(Здесь " en passant * 1027"* " эквивалентно английскому" попутно ", что примерно означает" случайно ". Это относится к тому факту, что мы выписываем последний случай как побочный продукт проведения анализа случая по гипотезе или.)