Мне нужно доказать, что следующий код сортировки выбора (в 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 = []
отсортировано (ssort xs) =
отсортировано (ssort []]) =
отсортировано ([]])
правильно, так как sorted ([]) всегда отсортирован
Индуктивный шаг
IH (индуктивная гипотеза) = отсортировано (ssort xs)
показать: отсортировано (сортировка y # xs)
случай I: x = y = минимум
отсортировано (ssort y # xs) =
отсортировано (let {x = minimum (y # xs)} in x: ssort (delete x (y # xs))) = (по определению)
sorted (let {y = minimum (y # xs)} in y: ssort (delete y (y # xs))) = (путем подстановки)
отсортировано (y: ssort (delete y (y # xs))) =
sorted (y: ssort (xs)) = (по определению удаления)
отсортировано (y: ssort (xs))
по IH мы знаем, что ssort (xs) сортируется, также y - минимальное значение, поэтому оно идет первым
случай II: y не минимально
отсортировано (ssort y # xs) =
отсортировано (let {x = minimum (y # xs)} in x: ssort (delete x (y # xs))) = (по определению)
.....
без понятия
n
какssort
, завершающуюся правильным выводом (т. Е. Отсортированной перестановкой) любого ввода длиныn
. Да, мы предполагаем, что существуют некоторые законы классов типов, связывающие экземплярыeq
,ord
, некоторые свойстваdelete
и, возможно, пару других вещей, но основная структура доказательства не нуждается в изменении для учета этих деталей? - person moonGoose   schedule 13.05.2019