Я пытался решить следующую теорему и застрял на последнем simpl.
:
Lemma nonzeros_app : forall l1 l2 : natlist,
nonzeros (l1 ++ l2) = (nonzeros l1) ++ (nonzeros l2).
Proof.
intros l1 l2. induction l1 as [| n' l' IHl'].
-simpl. reflexivity.
-simpl.
Qed.
в этот момент Coq меняет цель с:
1 subgoal (ID 170)
n' : nat
l', l2 : natlist
IHl' : nonzeros (l' ++ l2) = nonzeros l' ++ nonzeros l2
============================
nonzeros ((n' :: l') ++ l2) = nonzeros (n' :: l') ++ nonzeros l2
до:
1 subgoal (ID 185)
n' : nat
l', l2 : natlist
IHl' : nonzeros (l' ++ l2) = nonzeros l' ++ nonzeros l2
============================
match n' with
| 0 => nonzeros (l' ++ l2)
| S _ => n' :: nonzeros (l' ++ l2)
end =
match n' with
| 0 => nonzeros l'
| S _ => n' :: nonzeros l'
end ++ nonzeros l2
, что мне кажется совершенно загадочным. Что это значит, когда Coq просто копирует, вставляет определение функции в мою цель? Что мне с этим делать?
Контекст вопроса:
Кто-то сказал мне, что решение:
Lemma nonzeros_app : forall l1 l2 : natlist,
nonzeros (l1 ++ l2) = (nonzeros l1) ++ (nonzeros l2).
Proof.
intros l1 l2. induction l1.
- simpl. reflexivity.
- simpl. { induction n.
- ...
- ... }
Qed.
, что заставило меня захотеть понять, почему они используют индукцию на n
, поскольку мне кажется, что никогда не пришло бы в голову использовать индукцию там. Поэтому я спрашиваю, почему? Но я понял, что прежде чем я мог спросить, почему я даже не понимал состояние доказательства до этого, поскольку казалось, что он просто копирует, вставляет функцию в состояние проверки (что для меня не имеет смысла). Поэтому, прежде чем я спросил, зачем использовать индукцию там, я должен спросить, что говорит до этого доказательство, может быть, это поможет понять, почему индукция на n
.