При работе с такими вещами вам нужно обобщить 1
. Вместо того, чтобы сказать, что я хочу заменить первое 0
на 1
, а затем 2
и т. Д., Вы говорите: я хочу заменить первое 0
на k
, второе на k+1
и т. Д. .
Fixpoint nonzeroes_k (k : nat) (l : list nat) : list nat :=
match l with
| nil => nil
| 0 :: l => k :: nonzeroes_k (S k) l
| h :: l => h :: nonzeroes_k k l
end.
Тогда вам нужна функция, начинающаяся с 1
:
Definition nonzeroes := nonzeroes_k 1.
Вы часто будете делать такие вещи, когда имеете дело со смещениями в рекурсивных функциях.