【发布时间】:2015-09-07 17:00:03
【问题描述】:
假设我们有一个列表:
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(或等效的、定义更明确的谓词)列表上终止且为非负数?
我在这里遗漏了一个重要的概念吗?
【问题讨论】:
标签: recursion termination reasoning formal-verification formal-methods