递归选择排序正确性证明

时间:2019-05-12 21:25:45

标签: haskell induction proof-of-correctness

我需要证明以下selection sort代码(在Haskell中)始终在排序:

import Data.List (minimum, delete)

ssort :: Ord t => [t] -> [t]
ssort [] = []
ssort xs = let { x = minimum xs } in  x : ssort (delete x xs)

我们可以假设我们有一个名为“ 已排序”的函数,用于检查列表的排序时间。

通过结构归纳证明的声明: sorted(ssort xs)

我尝试了以下操作,但无法完成证明。您能帮我完成举证吗?


基本情况:xs = []

  

sorted(ssort xs)=

     

sorted(ssort []])=

     

sorted([[]])

     

正确,因为sorted([])总是被排序


归纳步骤

IH(归纳假设)= sorted(ssort xs)

显示:sorted(sort y#xs)

  

情况I:x = y =最小值

     

sorted(sort y#xs)=

     

sorted(let {x = x中的最小值(y#xs)}:ssort(删除x(y#xs)))=   (根据定义)

     

sorted(let {y = y中的最小值(y#xs)}:ssort(删除y(y#xs)))=   (通过替换)

     

sorted(y:ssort(删除y(y#xs)))=

     

sorted(y:ssort(xs))=(通过删除定义)

     

sorted(y:ssort(xs))

     

通过IH,我们知道sort(xs)已排序,y也是最小值   所以先走

     

情况二:y不是最小值

     

sorted(sort y#xs)=

     

sorted(let {x = x中的最小值(y#xs)}:ssort(删除x(y#xs)))=   (根据定义)

     

.....

     

不知道

1 个答案:

答案 0 :(得分:6)

您的归纳假设太弱了。您应该假设ssort在长度为{{1}的任何列表上正确工作,而不是长度为{{1 }}。

因此,假设k在长度为xs的任何列表中都是正确的,并且让k为长度为ssort的任何列表,

k