证明长度(h :: l)= 1 +长度l

时间:2015-11-25 07:47:42

标签: ocaml proof induction proof-of-correctness

我在使用这些证据时遇到了麻烦,这些证据看起来几乎是显而易见的。

例如,在归纳案例中,如果我假设标题中的属性并且我想显示:

length (h'::h::l) = 1 + length (h::l)

我从哪里开始?这显然是真的,但我不知道在没有证明某种引理的情况下我可以采取什么步骤。比如我可以说

length ([h']@(h::l)) = 1 + length (h::l)

但现在我必须按照

的方式证明一些事情
length (l1@l2) = length l1 + length l2

当我需要证明lemmas时,我很难理解,特别是在看起来几乎无足轻重的证据中。

2 个答案:

答案 0 :(得分:2)

当您证明程序正确性时,您通常会使用某些实现。如果您将采用一个简单的实现,那么证明也将是微不足道的。假设我们有以下实现:

 public interface temp {
     int add(int a,int b);
}

我们有证明义务:

java 8

我们使用结构诱导来证明这一点。我假设,该列表定义为

let rec length = function
  | [] -> 0
  | x::xs -> 1 + length xs

length (x::xs) = 1 + length xs type 'a list = | Nil | Cons ('a,'a list) 的语法糖,而[]Nil的语法糖

因此我们逐案分析。我们只有一个适用的案例,所以我们 案例

x::xs

右侧重写Cons (x,xs),我们得到:

  | x::xs -> 1 + length xs

这可以通过length (x::xs)运算符的反身性来证明。 (如果你的逻辑是反身的。)

注意:上面的实现很简单。在OCaml中,标准库 1 + legnth xs = 1 + length xs 实现如下:

=

此处,证明义务List.length有义务证明let rec length_aux len = function [] -> len | a::l -> length_aux (len + 1) l let length l = length_aux 0 l 。这不是那么简单。

答案 1 :(得分:1)

我首先要说的是,长度是由感应定义的,void的长度是0,长度(h :: l)= 1 +长度(l)。

然后,连接也由indu,[] @ l = l和[h] @l = h :: l定义。

length是将@映射到+的函数:证明是使用上述属性的感应证明。 在l1上进行归纳:当l1为空(归纳公理)时,属性长度(l1 @ l2)=长度(l1)+长度(l2)。 然后假设该属性对于l1的长度为n,你想要证明它对于n + 1是正确的。 length(h :: l1 @ l2)= 1 + length(l1 @ l2)(thx到length definition)。然后通过归纳假设,你得出结论长度(l1 @ l2)=长度(l1)+长度(l2)。