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

Ocaml 证明长度(h::l)=1+;长度l,ocaml,proof,induction,proof-of-correctness,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 当我需要证明引理时,我很难理解,尤其是在

我对这些似乎微不足道的显而易见的证据感到困惑

例如,在归纳的情况下,如果我假设标题中的属性,我想显示:

length (h'::h::l) = 1 + length (h::l)
我该怎么办?这显然是真的,但我不知道如果不证明某种引理,我能采取什么步骤。比如我可以说

length ([h']@(h::l)) = 1 + length (h::l)
但现在我必须证明一些东西

length (l1@l2) = length l1 + length l2

当我需要证明引理时,我很难理解,尤其是在那些看似微不足道的证明中。

我首先要说,长度是由归纳定义的,空洞的长度是0,长度(h::l)=1+长度(l)

然后,串联也由归纳、[]@l=l和[h]@l=h::l来定义

长度是一个将@to+映射的函数:证明是使用上述属性的归纳证明。 在l1上进行归纳:属性长度(l1@l2)=长度(l1)+l1为空时的长度(l2)(归纳公理)。
然后假设该属性对于长度为n的l1是正确的,您想证明它对于n+1是正确的。长度(h::l1@l2)=1+长度(l1@l2)(thx到长度定义)。然后通过归纳假设,你可以计算出长度(l1@l2)=length(l1)+length(l2),您总结道。

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

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)
,我们得到:

  1 + legnth xs = 1 + length xs
这可以通过
=
运算符的自反性来证明。(如果你的逻辑是反身的)

注意:上面的实现很简单。在OCaml标准库
列表中。长度
实现如下:

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
的义务。这不那么琐碎。

我投票将这个问题作为离题题来结束,因为这是一个数学问题,而不是一个编程问题。它与编程课程有关,是ocaml中程序的证明。我不同意。@wvdz见类型理论:命题是类型,证明是程序。也许加一个Coq标签。