import data.list constant f {A : Type} : A → A → A constant g : nat → nat set_option blast.strategy "cc" example (a b c : nat) : a = b → g a == g b := by blast example (a b c : nat) : a = b → c = b → f (f a b) (g c) = f (f c a) (g b) := by blast example (a b c d e x y : nat) : a = b → a = x → b = y → c = d → c = e → c = b → a = e := by blast open perm example (a b c d : list nat) : a ~ b → c ~ b → d ~ c → a ~ d := by blast set_option trace.congruence_closure true example (a b c d : list nat) : a ~ b → c ~ b → d = c → a ~ d := by blast