miscelleaneous

Random Lean experiments

  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
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
import Mathlib

inductive Vect (α : Type u) : Nat  Type u where
   | nil : Vect α 0
   | cons : α  Vect α n  Vect α (n + 1)

def Vect.zip : Vect α n  Vect β n  Vect (α × β) n
  | .nil, .nil => .nil
  | .cons x xs, .cons y ys => .cons (x, y) (zip xs ys)

-- #eval (Vect.cons "Hello" (Vect.cons "world" Vect.nil))
-- .zip (Vect.cons "Hello" (Vect.cons "world" Vect.nil))

def hi : Vect String 2 := Vect.cons "Hello" (Vect.cons "world" Vect.nil)

-- #eval hi.zip hi

-- def main : IO Unit := IO.println "Hello, world!"

-- #eval main

-- structure Pos where
--   succ ::
--   pred : Nat



def merge [Ord α] (xs : List α) (ys : List α) : List α :=
  match xs, ys with
  | [], _ => ys
  | _, [] => xs
  | x'::xs', y'::ys' =>
    match Ord.compare x' y' with
    | .lt | .eq => x' :: merge xs' (y' :: ys')
    | .gt => y' :: merge (x'::xs') ys'



def lsb (i : ) :  :=
  if i = 0 then 0 else if i % 2 == 1 then 1 else 2 * lsb (i / 2)
termination_by i
decreasing_by
  if h : i = 0 then
    simp
    contradiction
  else
    exact Nat.bitwise_rec_lemma h

theorem lsb_le_i (i : ) : lsb i  i := by
  if h₁ : i = 0 then
    simp [h₁, lsb]
  else if h₂ : i % 2 == 1 then
    simp [h₁, h₂, lsb]
    omega
  else
    calc
      lsb i = 2 * lsb (i / 2) := by rw [lsb]; simp [h₁, h₂]
      _  2 * (i / 2) := by simp [lsb_le_i (i / 2)]
      _  i := Nat.mul_div_le i 2;


#check fun (α β γ : Type) (g : β  γ) (f : α  β) (x : α) => g (f x)


universe u
def ident {α : Type u} (x : α) := x


#check @ident

#print lsb_le_i

open Classical

theorem dne {p : Prop} (h : ¬¬p) : p :=
  Or.elim (Classical.em p)
    (fun hp : p => hp)
    (fun hnp : ¬p => absurd hnp h)

def main := IO.println "Hello, world!"