def filter (p : α → Prop) [inst : DecidablePred p] (xs : List α) : List α := match xs with | [] => [] | x :: xs' => if p x then -- Trying to confuse `omega` by creating subterms that are structurally different -- but definitionally equal. x :: @filter α p (fun x => inst x) xs' else @filter α p inst xs' def filter_length (p : α → Prop) [DecidablePred p] : (filter p xs).length ≤ xs.length := by induction xs with | nil => simp [filter] | cons x xs ih => simp only [filter] split <;> simp only [List.length] <;> omega inductive Op where | bla | foo (a : Nat) def Op.fooData (o : Op) (h : o.ctorIdx = 1) : Nat := match o, h with | .foo a, _ => a theorem ex (o₁ o₂ o₃ : Op) (h₁ : o₁.ctorIdx = 1) (h₂ : o₁.ctorIdx = o₂.ctorIdx) (h₃ : o₂.ctorIdx = o₃.ctorIdx) (h₄ : o₂.ctorIdx = 1) (_ : o₁.fooData h₁ < o₂.fooData h₄) (_ : o₂.fooData (h₂ ▸ h₁) < o₃.fooData (h₃ ▸ h₄)) : o₁.fooData h₁ < o₃.fooData (h₃ ▸ h₄) := by omega