リストがあるとします:
List = nil | Cons(car cdr:List).
変更可能なリストについて話していることに注意してください。そして、自明な再帰的な長さ関数:
recursive Length(List l) = match l with
| nil => 0
| Cons(car cdr) => 1 + Length cdr
end.
当然、リストが非循環の場合にのみ終了します。
inductive NonCircular(List l) = {
empty: NonCircular(nil) |
\forall head, tail: NonCircular(tail) => NonCircular (Cons(head tail))
}
この述語は、再帰関数として実装されているため、循環リストで終了しないことに注意してください。
通常、リストの長さを有界の減少要因として使用するリスト トラバーサル終了の証拠を目にします。Length
彼らはそれが非負であると考えています。しかし、私が見る限り、この事実 ( ) はそもそもLength l >= 0
の終了から導かれます。Length
が終了し、 (または同等の、より適切に定義された述語)リストでLength
非負であることをどのように証明しますか?NonCircular
ここで重要な概念が欠けていますか?