Let [yl1,...,yln] represent a list of variable lists,
each of length zero or more, and xl1,...,xln each represent a
vector of zero or more variables, so that the variables in each of
yl1...yln have the same types as the corresponding xli.
X_CASES_THEN expects such a list of variable lists, [yl1,...,yln], a tactic
generating function f:thm->tactic, and a disjunctive theorem,
where each disjunct may be existentially quantified:
   th = |-(?xl1.B1)  \/...\/  (?xln.Bn)
 
each disjunct having the form (?xi1 ... xim. Bi). If
applying f to the theorem obtained by introducing witness variables yli
for the objects xli whose existence is asserted by each disjunct, typically
({Bi[yli/xli]} |- Bi[yli/xli]), produce the following results when
applied to a goal (A ?- t):
    A ?- t
   ========= f ({B1[yl1/xl1]} |- B1[yl1/xl1])
    A ?- t1
    ...
    A ?- t
   =========  f ({Bn[yln/xln]} |- Bn[yln/xln])
    A ?- tn
 
then applying (X_CHOOSE_THEN [yl1,...,yln] f th)
to the goal (A ?- t) produces n subgoals.
           A ?- t
   =======================  X_CHOOSE_THEN [yl1,...,yln] f th
    A ?- t1  ...  A ?- tn