We can instantiate an existential variable with the `exists`

tactic, as long as we have an actual `exists`

in the hypothesis we apply it to. However, tactics like `eapply`

or `eexists`

introduce this other kind of existential. Is there a tactic I can call that sets this existential to whatever I pass it?

Yes, it's the `instantiate`

tactic: https://coq.inria.fr/refman/proof-engine/tactics.html#coq:tacn.instantiate

I'm not sure how to use this? If you have `exists x. x = x`

and you call `eexists`

you get the goal `?x = ?x`

. But `instantiate (?x = ...)`

is not accepted?

`instantiate (1 := t)`

Thanks! I'm guessing the `1`

stands for the first existential, which makes sense if we only have one. If we have more, can I print their order, or figure it out some other way?

instantiate is annoying that way, I would rather use unshelve

To be honest I don't know…

Note that alternatively and more robustly you can also use

```
unshelve eexists.
```

Sometimes named existential variables are also an option:

```
Goal exists n, n = 6.
Proof.
eexists ?[six].
instantiate (six := 6).
```

Thanks for your answers :) Most the existentials I encounter in this way occur because of `eapply H`

and I am trying to avoid typing `eapply (H _ _ _ _ _ _ thing)`

so naming it is not really an option as then I might as well instantiate it in the eapply expression

Then you can use `unshelve eapply`

.

You may want to have a look at library LibHyps, and in particular to the `especialize`

tactic and its variants. https://github.com/Matafou/LibHyps

```
especialize H at *. (* create a subgoal for each (dependent) premise of H. Cf "exploit" from CompCert. *)
especialize H at 2,3,4 (* up to 7 premise number *)
especialize H until 3 (* create goals for the n first (dependent) premises of H. *)
```

H can be a term.

if you need only the `at *`

then you may also look at the `exploit`

tactic in CompCert.

Last updated: Sep 30 2023 at 05:01 UTC