Структурная рекурсия по зависимому параметру
Я пытаюсь написать сито Эратосфена в Coq. У меня есть функцияcrossout : forall {n:nat}, vector bool n -> nat -> vector bool n
, Когда сито находит простое число, оно используетcrossout
отметить все числа, которые не являются простыми, а затем повторяется на результирующем векторе. Сито, очевидно, можетне может быть структурно рекурсивным по самому вектору, но он является структурно рекурсивным по длине вектора. Я хочу сделать что-то вроде этого:
Fixpoint sieve {n:nat} (v:vector bool n) (acc:nat) {struct n} : list nat :=
match v with
| [] => Datatypes.nil
| false :: v' => sieve v' (S acc)
| true :: v' => Datatypes.cons acc (sieve (crossout v' acc) (S acc))
end.
Но если я напишу это так, Coq жалуется, что длинаv'
не является субтермомn
, Я знаю, что это так, но независимо от того, как я структурирую функцию, я могуКажется, это убедило Coq. Кто-нибудь знает, как я могу?