{-# OPTIONS --cubical-compatible #-}
open import Padova2025.ProgrammingBasics.Lists
open import Padova2025.ProvingBasics.Connectives.Disjunction
module Padova2025.VerifiedAlgorithms.InsertionSort.CorrectByConstruction
(A : Set) (_≤_ : A → A → Set) (-∞ : A) (min! : {x : A} → -∞ ≤ x) (cmp? : (x y : A) → x ≤ y ⊎ y ≤ x) where
Correct by construction#
Ordered output lists#
Let us introduce the type OList l of ascendingly ordered lists where all elements are ≥ l.
In other words, OList l is the type of ordered lists bounded from below by l.
data OList (l : A) : Set where
nil : OList l
cons : (x : A) → l ≤ x → OList x → OList l
insertinsert : {l : A} → (x : A) → l ≤ x → OList l → OList l
insert = {!!}
sortsort : List A → OList -∞
sort = {!!}
An alternative definition of ordered lists is as follows.
open import Padova2025.ProvingBasics.Termination.Gas using (𝟙; tt)
data OList₁ : Set
_≤head_ : A → OList₁ → Set
data OList₁ where
nil : OList₁
cons : (x : A) (xs : OList₁) → x ≤head xs → OList₁
x ≤head nil = 𝟙
x ≤head cons y ys _ = x ≤ y
However, working with this alternative definition is a bit more cumbersome than with OList.
Expand.
Ordered and permuted output lists#
As in the module on post-hoc verification, let us now also ensure in a correct-by-construction way that the output list produced by insertion sort is a permutation of the input list.
The following type declaration is as in the module on post-hoc verification.
data _◂_↝_ : A → List A → List A → Set where
here : {x : A} {xs : List A} → x ◂ xs ↝ (x ∷ xs)
there : {x y : A} {ys xys : List A} → x ◂ ys ↝ xys → x ◂ (y ∷ ys) ↝ (y ∷ xys)
The type OPList l xs is the type of ordered lists whose elements are
bounded from below by l and which are permutations of xs.
data OPList (l : A) : List A → Set where
nil : OPList l []
cons : {ys xys : List A} → (x : A) → OPList x ys → l ≤ x → (x ◂ ys ↝ xys) → OPList l xys
As the outputs are now sufficiently constrained by the types, Agda’s
automatic proof search C-c C-a will be able to correctly fill in several
key terms in the following two definitions.
insert'insert' : {l : A} {ys : List A} → (x : A) → OPList l ys → l ≤ x → OPList l (x ∷ ys)
insert' = {!!}
sort'sort' : (xs : List A) → OPList -∞ xs
sort' = {!!}
Comment on the requirement of -∞.