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
-- import Mathlib.Tactic.SplitIfs

-- import data.nat.basic

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 : Nat) : Nat :=
  if i == 0 then 0 else if i % 2 == 1 then 1 else 2 * lsb (i / 2)
termination_by i
decreasing_by
  cases i
  · simp
    contradiction
  · simp_all [Nat.div_lt_self]


-- theorem lsb_le_i : ∀ i : Nat, lsb i ≤ i := by
--   intro i
--   induction i with
--   | zero =>
--     simp [lsb]
--   | succ n ih =>
--     cases n with
--     | zero =>
--       simp [lsb]
--     | succ n =>
--       simp_all [lsb, Nat.div_lt_self]
--       split_ifs <;> simp_all [Nat.mul_le_mul_left]
--       <;> linarith