choose tactic #
Performs Skolemization, that is, given h : ∀ a:α, ∃ b:β, p a b |- G produces
f : α → β, hf: ∀ a, p a (f a) |- G.
Given α : Sort u, nonemp : nonempty α, p : α → Prop, a context of local variables
ctxt, and a pair of an element val : α and spec : p val,
mk_sometimes u α nonemp p ctx (val, spec) produces another pair val', spec'
such that val' does not have any free variables from elements of ctxt whose types are
propositions. This is done by applying function.sometimes to abstract over all the propositional
arguments.
Changes (h : ∀xs, ∃a:α, p a) ⊢ g to (d : ∀xs, a) (s : ∀xs, p (d xs)) ⊢ g and
(h : ∀xs, p xs ∧ q xs) ⊢ g to (d : ∀xs, p xs) (s : ∀xs, q xs) ⊢ g.
choose1 returns a pair of the second local constant it introduces,
and the error result (see below).
If nondep is true and α is inhabited, then it will remove the dependency of d on
all propositional assumptions in xs. For example if ys are propositions then
(h : ∀xs ys, ∃a:α, p a) ⊢ g becomes (d : ∀xs, a) (s : ∀xs ys, p (d xs)) ⊢ g.
The second value returned by choose1 is the result of nondep elimination:
Changes (h : ∀xs, ∃as, p as ∧ q as) ⊢ g to a list of functions as,
and a final hypothesis on p as and q as. If nondep is true then the functions will
be made to not depend on propositional arguments, when possible.
The last argument is an internal recursion variable, indicating whether nondep elimination
has been useful so far. The tactic fails if nondep is true, and nondep elimination is
attempted at least once, and it fails every time it is attempted, in which case it returns
an error complaining about the first attempt.
choose a b h h' using hyp takes an hypothesis hyp of the form
∀ (x : X) (y : Y), ∃ (a : A) (b : B), P x y a b ∧ Q x y a b
for some P Q : X → Y → A → B → Prop and outputs
into context a function a : X → Y → A, b : X → Y → B and two assumptions:
h : ∀ (x : X) (y : Y), P x y (a x y) (b x y) and
h' : ∀ (x : X) (y : Y), Q x y (a x y) (b x y). It also works with dependent versions.
choose! a b h h' using hyp does the same, except that it will remove dependency of
the functions on propositional arguments if possible. For example if Y is a proposition
and A and B are nonempty in the above example then we will instead get
a : X → A, b : X → B, and the assumptions
h : ∀ (x : X) (y : Y), P x y (a x) (b x) and
h' : ∀ (x : X) (y : Y), Q x y (a x) (b x).
Examples: