我在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]: ""
),我将非常感谢你的帮助。
答案 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)
已排序。这表明首先证明了关于insertar
和ordenado
lemma ordenado_insertar [simp]:
"ordenado (insertar x xs) = ordenado xs"
...
指出insertar x xs
当且仅当xs
已经排序时才会排序。为了证明这个引理,你将再次需要辅助引理。这一次约menor_igual
以及menor_igual
和insertar
之间的互动。
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
小于等级x
且x
小于等于xs
的所有元素,那么y
会更小 - 等于xs
的所有元素等......
我把证明留作练习;)。
对于你的第二个定理,我建议遵循相同的配方。首先尝试induct
后跟auto
(正如您已经做过的那样),然后找出哪些属性仍然缺失,将它们证明为辅助引理并完成您的证明。