假設我們有一個清單:你如何證明遞歸列表長度的終止?
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
(或等價的,定義更好的謂詞)列表上終止並且是非負數?
我在這裏錯過了一個重要的概念嗎?
我同意除最後一段。終止對於證明程序至關重要。否則這裏是一個錯誤的證明:'f:true - > false:= {return f();}' – Necto