使用Isabelle证明插入排序算法

时间:2014-11-23 04:17:28

标签: insertion-sort isabelle theorem-proving theorem

我在Isabelle / HOL中做了一些插入排序算法的实现,用于生成代码(ML,Python等)。我确信相应的函数工作正常,但我需要创建一些定理来证明它并且确定它是否有效。我的职能是:

(* The following functions are used to prove the algorithm works fine *)
fun menor_igual :: "nat ⇒ nat list ⇒ bool" where
"menor_igual n [] = True" |
"menor_igual n (x # xs) = (n ≤ x ∧ menor_igual n xs)"

fun ordenado :: "nat list ⇒ bool" where
"ordenado [] = True" |
"ordenado (x # xs) = (menor_igual x xs ∧ ordenado xs)"

fun cuantos :: "nat list ⇒ nat ⇒ nat" where
"cuantos [] num = 0" |
"cuantos (x # xs) num = (if x = num then Suc (cuantos xs num) else cuantos xs num)"


(* These functions make the algorithm itself *)
fun insertar:: "nat ⇒ nat list ⇒ nat list" where
"insertar num [] = [num]" |
"insertar num (x # xs) = (if (num ≤ x) then (num # x # xs) else x # insertar num xs)"

fun asc :: "nat list ⇒ nat list" where
"asc [] = []" |
"asc (x # xs) = insertar x (asc xs)"

问题是我不知道如何正确地创建定理。我需要证明有序列表与原始列表具有相同的长度,并且两个列表具有相同的元素名称。我的第一个定理是这些:

theorem "ordenado (asc xs)"
apply (induction xs rule: asc.induct)
apply auto

theorem "cuantos (asc xs) x = cuantos xs x"
apply (induction xs rule: asc.induct)
apply auto

第一个定理试图证明列表是正确排序的,第二个定理试图证明两个列表具有相同的长度。

当我应用归纳和自动时,我希望得到0个子目标,这说定理是正确的,算法工作正常,但在那之后我不知道如何删除subgolas,我的意思是我不知道如何要做简化规则(lemma [simp]: ""),我将非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

theorem "ordenado (asc xs)"
apply (induction xs rule: asc.induct)
apply auto

你还需要证明以下子目标:

1. ⋀x xs.
      ordenado (asc xs) ⟹
      ordenado (insertar x (asc xs))

也就是说,假设asc xs已排序,您必须证明insertar x (asc xs)已排序。这表明首先证明了关于insertarordenado

之间相互作用的辅助引理
lemma ordenado_insertar [simp]:
  "ordenado (insertar x xs) = ordenado xs"
 ...

指出insertar x xs当且仅当xs已经排序时才会排序。为了证明这个引理,你将再次需要辅助引理。这一次约menor_igual以及menor_igualinsertar之间的互动。

lemma le_menor_igual [simp]:
  "y ≤ x ⟹ menor_igual x xs ⟹ menor_igual y xs"
  ...

lemma menor_igual_insertar [simp]:
  "menor_igual y (insertar x xs) ⟷ y ≤ x ∧ menor_igual y xs"
  ...

第一个说明如果y小于等级xx小于等于xs的所有元素,那么y会更小 - 等于xs的所有元素等......

我把证明留作练习;)。

对于你的第二个定理,我建议遵循相同的配方。首先尝试induct后跟auto(正如您已经做过的那样),然后找出哪些属性仍然缺失,将它们证明为辅助引理并完成您的证明。