-- Advanced Functional Programming course 2016 Chalmers/GU
--
-- 2016-02-25 Guest lecture by Andreas Abel
--
-- Introduction to Agda
--
-- File 2: insertion sort preserves length
module LengthIsortRewrite where
open import InsertionSortBool
-- We import the equality type from the standard library.
-- Equality is the smallest equivalence relation
--
-- refl : ∀{x} → x ≡ x
-- sym : ∀{x y} → x ≡ y → y ≡ x
-- trans : ∀{x y z} → x ≡ y → y ≡ z → x ≡ z
-- cong : ∀{x y} f → x ≡ y → f x ≡ f y
open import Relation.Binary.PropositionalEquality
-- Lemma: insertion increases the length of a list by one.
--
-- The logical statement is simply a type signature.
-- The proof is a terminating program of the correct type
length-insert : ∀ x ys → length (insert x ys) ≡ suc (length ys)
-- Case: empty list
-- Show: length (insert x []) ≡ 1
length-insert x [] = refl
-- Case: cons list (y ∷ ys)
-- Show: length (insert x (y ∷ ys)) = suc (suc (length ys))
length-insert x (y ∷ ys) with x <= y
-- Subcase: x <= y is true
-- Show: length (x ∷ y ∷ ys) = suc (suc (length ys))
... | true = refl
-- Subcase: x <= y is false
-- Show: length (y ∷ insert x ys) = suc (suc (length ys))
... | false rewrite length-insert x ys = refl
-- We use the induction hypothesis
-- length-insert x ys : length (insert x ys) ≡ suc (length ys)
-- Theorem: sorting preserves the length
-- By induction on the list.
length-isort : ∀ xs → length (isort xs) ≡ length xs
-- Case empty list
-- Show: length [] ≡ length []
length-isort []
= refl
-- Case cons list (x ∷ xs)
-- Show: length (insert x (isort xs) ≡ suc (length xs)
length-isort (x ∷ xs)
rewrite length-insert x (isort xs) -- length (insert x (isort xs)) = suc (length (isort xs))
| length-isort xs -- induction hypothesis
= refl
-- Without comments, it is hard to understand the proof.
-- One only gets an idea what has been used to show the theorem.