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 にそれを納得させることはできないようです。誰も私ができる方法を知っていますか?