diff --git a/Invariant.lean b/Invariant.lean
index c298ab1..edb75cf 100644
--- a/Invariant.lean
+++ b/Invariant.lean
@@ -1,20 +1,116 @@
-inductive StrictlyIncreasing : List Nat → Prop
-| empty     : StrictlyIncreasing []
-| singleton : StrictlyIncreasing [x]
-| cons : (∀a, a ∈ xs → a > x) → StrictlyIncreasing xs → StrictlyIncreasing (x::xs)
+import Mathlib.Data.List.Sort
 
--- sorted set of natural numbers
-abbrev NatSet := { xs : List Nat // StrictlyIncreasing xs }
+abbrev NatSet := { xs : List ℕ // List.Sorted (·<·) xs }
 
 namespace NatSet
 
-def empty : NatSet := ⟨[], .empty⟩
-def singleton (x : Nat) : NatSet := ⟨[x], .singleton⟩
+def empty : NatSet := ⟨[], List.sorted_nil⟩
+def singleton (x : ℕ) : NatSet := ⟨[x], List.sorted_singleton x⟩
 
-def remove (x : Nat) : NatSet → NatSet
+def remove (x : ℕ) : NatSet → NatSet
 | ⟨[], _⟩ => empty
-| ⟨a::xs, h⟩ =>
-  let tail := ⟨xs, by simp⟩
-  if a = x then tail
+| ⟨n::ns, h⟩ =>
+  let tail := ⟨ns, List.Sorted.of_cons h⟩
+  if n = x
+  then tail
+  else ⟨n::tail, h⟩
+
+def list_insert (x : ℕ) : List ℕ → List ℕ
+| [] => [x]
+| a::as =>
+  if x = a
+  then as
+  else if x < a
+  then x::a::as
+  else a::(list_insert x as)
+
+theorem list_insert_mem : b ∈ list_insert x xs → b = x ∨ b ∈ xs := by
+  induction xs with simp [list_insert]
+  | cons a as ih =>
+    split
+    next heq =>
+      intro hmem
+      right; right
+      assumption
+    next hne =>
+      split
+      · simp
+      · next hnlt =>
+          simp [*]
+          intro h
+          cases h
+          · right; left; assumption
+          cases ih ‹_›
+          · left; assumption
+          · right; right; assumption
+
+theorem list_insert_sorted (hs : List.Sorted (·<·) xs) : List.Sorted (·<·) (list_insert x xs) := by
+  induction xs with simp [list_insert]
+  | cons a as ih =>
+    split
+    · exact List.Sorted.of_cons hs
+    · split
+      · rename_i hnlt
+        exact List.Sorted.cons hnlt hs
+
+      have : a < x := by
+        rename_i hne hnlt
+        apply Nat.lt_of_le_of_ne
+        exact Nat.le_of_not_lt hnlt
+        exact fun a_1 => hne (Eq.symm a_1)
+
+      have h : List.Sorted (·<·) as := List.Sorted.of_cons hs
+
+      have := ih h
+      sorry
+
+def insert (x : ℕ) : NatSet → NatSet
+| ⟨[], _⟩ => singleton x
+| ⟨n::ns, h⟩ =>
+  if heq : x = n
+  then ⟨n::ns, h⟩
+  else if hlt : x < n
+  then ⟨x::n::ns, List.Sorted.cons hlt h⟩
   else
-    ⟨a::xs, h⟩
+    let tail : NatSet := ⟨ns, List.Sorted.of_cons h⟩
+    let ⟨tail, h₂⟩ := tail.insert x
+    ⟨
+      n::tail,
+      by
+        have : ∀b ∈ tail, b = x ∨ b ∈ ns := by
+          intro b h
+          induction tail
+          · contradiction
+          · simp [*] at *
+
+            sorry
+        have : ∀b ∈ ns, n < b := by
+          simp only [List.sorted_cons] at h
+          exact h.left
+        simp only [List.sorted_cons]
+        constructor
+        · assumption
+
+        -- have : n < x := by
+        --   rw [Nat.lt_iff_le_and_ne]
+        --   constructor
+        --   · simp at hlt
+        --     assumption
+        --   · intro h
+        --     exact heq h.symm
+        sorry
+
+    ⟩
+
+instance : EmptyCollection NatSet where
+  emptyCollection := empty
+
+instance : Singleton ℕ NatSet where
+  singleton := singleton
+
+instance : Insert ℕ NatSet where
+  insert := insert
+
+instance : LawfulSingleton ℕ NatSet where
+  insert_empty_eq := by simp [Insert.insert, EmptyCollection.emptyCollection, empty, insert,
+    Singleton.singleton, implies_true]
diff --git a/lake-manifest.json b/lake-manifest.json
index f08e15f..3fb7027 100644
--- a/lake-manifest.json
+++ b/lake-manifest.json
@@ -1,7 +1,77 @@
 {"version": "1.1.0",
  "packagesDir": ".lake/packages",
  "packages":
- [{"url": "https://github.com/leanprover-community/batteries",
+ [{"url": "https://github.com/leanprover-community/mathlib4",
+   "type": "git",
+   "subDir": null,
+   "scope": "leanprover-community",
+   "rev": "37f686cf27093bcbde5a9eb2f1519ef730de1828",
+   "name": "mathlib",
+   "manifestFile": "lake-manifest.json",
+   "inputRev": "master",
+   "inherited": false,
+   "configFile": "lakefile.lean"},
+  {"url": "https://github.com/leanprover-community/plausible",
+   "type": "git",
+   "subDir": null,
+   "scope": "leanprover-community",
+   "rev": "4dfba8b20a5ce570b9ef8bae969dd163782f9793",
+   "name": "plausible",
+   "manifestFile": "lake-manifest.json",
+   "inputRev": "nightly-testing",
+   "inherited": true,
+   "configFile": "lakefile.toml"},
+  {"url": "https://github.com/leanprover-community/LeanSearchClient",
+   "type": "git",
+   "subDir": null,
+   "scope": "leanprover-community",
+   "rev": "8d29bc2c3ebe1f863c2f02df816b4f3dd1b65226",
+   "name": "LeanSearchClient",
+   "manifestFile": "lake-manifest.json",
+   "inputRev": "main",
+   "inherited": true,
+   "configFile": "lakefile.toml"},
+  {"url": "https://github.com/leanprover-community/import-graph",
+   "type": "git",
+   "subDir": null,
+   "scope": "leanprover-community",
+   "rev": "c20832d6f0b3186a97ea9361cec0a5b87dd152a3",
+   "name": "importGraph",
+   "manifestFile": "lake-manifest.json",
+   "inputRev": "main",
+   "inherited": true,
+   "configFile": "lakefile.toml"},
+  {"url": "https://github.com/leanprover-community/ProofWidgets4",
+   "type": "git",
+   "subDir": null,
+   "scope": "leanprover-community",
+   "rev": "ea953247aac573c9b5adea60bacd3e085f58aca4",
+   "name": "proofwidgets",
+   "manifestFile": "lake-manifest.json",
+   "inputRev": "v0.0.56",
+   "inherited": true,
+   "configFile": "lakefile.lean"},
+  {"url": "https://github.com/leanprover-community/aesop",
+   "type": "git",
+   "subDir": null,
+   "scope": "leanprover-community",
+   "rev": "57185dfad68d78356f9462af984882d6f262aa5d",
+   "name": "aesop",
+   "manifestFile": "lake-manifest.json",
+   "inputRev": "master",
+   "inherited": true,
+   "configFile": "lakefile.toml"},
+  {"url": "https://github.com/leanprover-community/quote4",
+   "type": "git",
+   "subDir": null,
+   "scope": "leanprover-community",
+   "rev": "aa4c87abed970d9dfad2506000d99d30b02f476b",
+   "name": "Qq",
+   "manifestFile": "lake-manifest.json",
+   "inputRev": "master",
+   "inherited": true,
+   "configFile": "lakefile.toml"},
+  {"url": "https://github.com/leanprover-community/batteries",
    "type": "git",
    "subDir": null,
    "scope": "leanprover-community",
@@ -10,6 +80,16 @@
    "manifestFile": "lake-manifest.json",
    "inputRev": "main",
    "inherited": false,
+   "configFile": "lakefile.toml"},
+  {"url": "https://github.com/leanprover/lean4-cli",
+   "type": "git",
+   "subDir": null,
+   "scope": "leanprover",
+   "rev": "aff4176e5c41737a0d73be74ad9feb6a889bfa98",
+   "name": "Cli",
+   "manifestFile": "lake-manifest.json",
+   "inputRev": "main",
+   "inherited": true,
    "configFile": "lakefile.toml"}],
  "name": "invariant",
  "lakeDir": ".lake"}
diff --git a/lakefile.toml b/lakefile.toml
index 4db9bc3..bd78094 100644
--- a/lakefile.toml
+++ b/lakefile.toml
@@ -4,3 +4,7 @@ defaultTargets = ["Invariant"]
 
 [[lean_lib]]
 name = "Invariant"
+
+[[require]]
+name = "mathlib"
+scope = "leanprover-community"
diff --git a/lean-toolchain b/lean-toolchain
index c7e245c..9565de3 100644
--- a/lean-toolchain
+++ b/lean-toolchain
@@ -1 +1 @@
-leanprover/lean4:v4.19.0-rc2
\ No newline at end of file
+leanprover/lean4:v4.19.0-rc2