open tactic

print "------- fapply version ----------"

example (a : nat) : ∃ x : nat, x = a :=
by do
  c₁ ← return (expr.const `Exists.intro [level.of_nat 1]),
  fapply c₁, /- fapply adds all unassigned variables -/
  trace_state,
  swap, /- swap witness and ?M = a -/
  a ← get_local `a,
  mk_app `eq.refl [a] >>= exact

print "------- apply version ----------"

example (a : nat) : ∃ x : nat, x = a :=
by do
  c₁ ← return (expr.const `Exists.intro [level.of_nat 1]),
  /- apply does not add the goal |- nat -/
  apply c₁,
  trace_state,
  a ← get_local `a,
  mk_app `eq.refl [a] >>= exact
