open tactic bool
universe variables u
constant foo {A : Type u} [inhabited A] (a b : A) : a = default A → a = b

example (a b : nat) : a = 0 → a = b :=
by do
  intro `H,
  apply (expr.const `foo [level.of_nat 1]),
  trace_state,
  assumption

definition ex : inhabited (nat × nat × bool) :=
by apply_instance

set_option pp.all true
print ex

set_option pp.all false

example (a b : nat) : a = 0 → a = b :=
by do
  intro `H,
  apply_core semireducible tt ff (expr.const `foo [level.of_nat 1]),
  trace_state,
  a ← get_local `a,
  trace_state,
  mk_app `inhabited.mk [a] >>= exact,
  trace "--------",
  trace_state,
  reflexivity

print "----------------"
set_option pp.all true

example (a b : nat) : a = 0 → a = b :=
by do
  intro `H,
  foo ← mk_const `foo,
  trace foo,
  apply foo,
  trace_state,
  assumption
