Структурная рекурсия по зависимому параметру

Я пытаюсь написать сито Эратосфена в 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. Кто-нибудь знает, как я могу?

Ответы на вопрос(1)

Ваш ответ на вопрос