假设我们有一个列表:
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
) 首先是从 of 的终止而来的Length
。
你如何证明,在(或等效的,更好定义的谓词)列表Length
上终止并且是非负的?NonCircular
我在这里错过了一个重要的概念吗?