我在使用这些证据时遇到了麻烦,这些证据看起来几乎是显而易见的。
例如,在归纳案例中,如果我假设标题中的属性并且我想显示:
length (h'::h::l) = 1 + length (h::l)
我从哪里开始?这显然是真的,但我不知道在没有证明某种引理的情况下我可以采取什么步骤。比如我可以说
length ([h']@(h::l)) = 1 + length (h::l)
但现在我必须按照
的方式证明一些事情length (l1@l2) = length l1 + length l2
当我需要证明lemmas时,我很难理解,特别是在看起来几乎无足轻重的证据中。
答案 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)。