У меня есть два списка, один из которых построен непосредственно с помощью рекурсии, а другой - с использованием операции карты. Я пытаюсь показать, что они равны, и удивительно, я застрял.
Require Import Coq.Lists.List.
Import ListNotations.
Fixpoint ls_zeroes n :=
match n with
| 0 => nil
| S n' => 0 :: ls_zeroes n'
end.
Fixpoint ls_ones n := map S (ls_zeroes n).
Fixpoint ls_ones' n :=
match n with
| 0 => nil
| S n' => 1 :: ls_ones' n'
end.
Goal forall n, ls_ones n = ls_ones' n.
Proof.
intros.
induction n.
- reflexivity.
- simpl. f_equal. (* ??? *)
Abort.
Вот как выглядит контекст:
1 subgoal
n : nat
IHn : ls_ones n = ls_ones' n
______________________________________(1/1)
map S (ls_zeroes n) = ls_ones' n
Я думал, fold ls_ones
будет map S (ls_zeroes n)
в ls_ones n
, поскольку это буквально определение ls_ones
, но оно ничего не делает. Если я попытаюсь unfold ls_ones in IHn
, то получу противное рекурсивное выражение вместо дословного определения ls_ones
.
Какой самый простой способ завершить это доказательство?