当您证明程序的正确性时,您通常会使用一些实现。如果您将采用简单的实现,那么证明也将是微不足道的。假设我们有以下实现:
let rec length = function
| [] -> 0
| x::xs -> 1 + length xs
我们有证明义务:
length (x::xs) = 1 + length xs
我们使用结构归纳来证明这一点。我假设,该列表定义为
type 'a list =
| Nil
| Cons ('a,'a list)
and[]
是 的语法糖Nil
,whilex::xs
是 的语法糖Cons (x,xs)
所以我们逐案分析。我们只有一个适用的案例,所以我们采取案例
| x::xs -> 1 + length xs
length (x::xs)
用右手边重写,我们得到:
1 + legnth xs = 1 + length xs
这可以通过=
算子的反身性来证明。(如果它在您的逻辑中是自反的)。
注意:上面的实现是微不足道的。在 OCaml 标准库List.length
中实现如下:
let rec length_aux len = function
[] -> len
| a::l -> length_aux (len + 1) l
let length l = length_aux 0 l
在这里,证明义务length (x::xs) = 1 + length xs
产生了证明这一点的义务length_aux 0 (x::xs) = 1 + length_aux 0 xs
。这是不那么微不足道的。