Guest User

Untitled

a guest
Jul 22nd, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. module Msort2 where
  2.  
  3. open import Level renaming (zero to lzero)
  4. open import Data.Bool
  5. open import Data.Nat renaming (ℕ to nat)
  6. open import Data.List renaming (_∷_ to _::_)
  7. open import Relation.Binary using (Rel)
  8. open import Induction.WellFounded as WF
  9. open import Induction.Nat
  10.  
  11. _<l_ : Rel (List (List nat)) lzero
  12. xs <l ys = length xs <′ length ys
  13.  
  14. <l-well-founded : Well-founded _<l_
  15. <l-well-founded xs = f xs (<-well-founded(length xs))
  16. where
  17. f : forall xs -> Acc _<′_ (length xs) -> Acc _<l_ xs
  18. f xs (acc rs) = acc (\ys h -> f ys (rs (length ys) h))
  19.  
  20. open WF.All <l-well-founded public
  21.  
  22. merge : (nat -> nat -> Bool) -> List nat -> List nat -> List nat
  23. merge _ [] ys = ys
  24. merge _ xs [] = xs
  25. merge _<?_ (x :: xs) (y :: ys) = if x <? y then x :: merge _<?_ xs (y :: ys) else y :: merge _<?_ (x :: xs) ys
  26.  
  27. msort' : (nat -> nat -> Bool) -> List (List nat) -> List (List nat)
  28. msort' _<?_ [] = []
  29. msort' _<?_ (xs :: []) = xs :: []
  30. msort' _<?_ (xs :: ys :: zss) = merge _<?_ xs ys :: msort' _<?_ zss
  31.  
  32. msort'_ind : (p : nat -> nat -> Bool) -> (P : List (List nat) -> List (List nat) -> Set) -> P [] [] -> (forall {x : List nat} -> P (x :: []) (x :: [])) ->
  33. (forall (x y : List nat)(zs : List (List nat)) -> P zs zs -> P (x :: y :: zs) (x :: y :: zs)) -> forall (l : List (List nat)) -> P l l
  34. msort'_ind p P Pnn Poo Pi [] = Pnn
  35. msort'_ind p P Pnn Poo Pi (x :: []) = Poo
  36. msort'_ind p P Pnn Poo Pi (x :: y :: zs) = Pi x y zs (msort'_ind p P Pnn Poo Pi zs)
  37.  
  38. <-step2 : {n m : nat} -> n ≤′ m -> suc n ≤′ suc m
  39. <-step2 ≤′-refl = ≤′-refl
  40. <-step2 (≤′-step p) = ≤′-step (<-step2 p)
  41.  
  42. helper : (p : nat -> nat -> Bool)(x y z w : List nat)(zs : List (List nat)) -> msort' p (z :: w :: zs) <l ( z :: w :: zs) ->
  43. (merge p x y :: (msort' p (z :: w :: zs))) <l ( x :: y :: z :: w :: zs )
  44. helper p x y z w zs Pzs = <-step2 (≤′-step Pzs)
  45.  
  46. msort'len : (x x' : List nat) (p : nat -> nat -> Bool) -> (xs : List (List nat)) -> msort' p (x :: x' :: xs) <l (x :: x' :: xs)
  47. msort'len x y p zs = msort'_ind p (\l l' -> msort' p ( x :: y :: l' ) <l ( x :: y :: l )) ≤′-refl ≤′-refl (helper p x y) zs
  48.  
  49. checker : (nat -> nat -> Bool) -> List (List nat) -> List (List nat)
  50. checker p = wfRec (\_ -> List (List nat)) checker'
  51. where
  52. checker' : (xs : List (List nat)) -> ((ys : List (List nat)) -> ys <l xs -> List (List nat)) -> List (List nat)
  53. checker' [] _ = []
  54. checker' (x :: []) _ = x :: []
  55. checker' (x :: x' :: xs) f = f (msort' p (x :: x' :: xs)) (msort'len x x' p xs)
  56.  
  57. msort : (nat -> nat -> Bool) -> List nat -> List nat
  58. msort _<?_ xs = concat (checker _<?_ (map [_] xs))
Add Comment
Please, Sign In to add comment