exit
set_option blast.strategy "core_grind"

example (a b c : nat) : a = b ∨ a = c → b = c → b = a :=
by blast

example (f : nat → nat) (a b c : nat) : f a = f b ∨ f a = f c → f b = f c → f b = f a :=
by blast

definition ex1 (a : nat) : a = 0 → (λ x, x + a) = (λ x, x + 0) :=
by blast

print ex1

attribute Exists.intro [intro!] -- core_grind only process [intro!] declarations

example (p q : nat → Prop) : (∃ x, p x ∧ q x) → (∃ x, q x) ∧ (∃ x, p x) :=
by blast

set_option blast.strategy "core_grind"

example (a b c : nat) : a = b ∨ a = c → b = c → b = a :=
by blast

example (f : nat → nat) (a b c : nat) : f a = f b ∨ f a = f c → f b = f c → f b = f a :=
by blast

example (a : nat) : a = 0 → (λ x, x + a) = (λ x, x + 0) :=
by blast

set_option trace.blast true
example (p q : nat → Prop) : (∃ x, p x ∧ q x) → (∃ x, q x) ∧ (∃ x, p x) :=
by blast
