evolution

The evolution of a Lean programmer

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
-- This needs Lean v4.24.0 and https://github.com/verse-lab/velvet/ added as a dependency in the lakefile.toml
-- https://github.com/verse-lab/velvet/blob/master/Velvet/Examples/Examples.lean
import Velvet.Std

set_option loom.semantics.termination "total"
set_option loom.semantics.choice "demonic"

attribute [grind] Array.multiset_swap

method insertionSort_total (mut A : Array ) return (u : Unit)
  require 1  A.size
  ensures  i j, 0  i  i  j  j < A.size  A[i]!  A[j]!
  ensures AOld.toMultiset = A.toMultiset
  do
    let A' := A
    let N := A.size
    let mut i := 1
    while i  A.size
    invariant A.size = N
    invariant 1  i  i  A.size
    invariant  i' j', 0  i'  i' < j'  j'  i - 1  A[i']!  A[j']!
    invariant A.toMultiset = A'.toMultiset
    decreasing A.size - i
    do
      let mut j := i
      while j  0
      invariant A.size = N
      invariant j  i
      invariant  i' j', 0  i'  i' < j'  j'  i  j'  j  A[i']!  A[j']!
      invariant A.toMultiset = A'.toMultiset
      decreasing j
      do
        if A[j]! < A[j - 1]! then
          swap! A[j - 1]! A[j]!
        j := j - 1
      i := i + 1
    return
set_option maxHeartbeats 1000000 in
prove_correct insertionSort_total by
  loom_solve