2 <!-- ============ Tactics ====================== -->
3 <chapter id="sec_tactics">
6 <sect1 id="tactics_quickref">
7 <title>Quick reference card</title>
13 <sect1 id="tac_absurd">
15 <titleabbrev>absurd</titleabbrev>
16 <para><userinput>absurd P</userinput></para>
19 <varlistentry role="tactic.synopsis">
20 <term>Synopsis:</term>
22 <para><emphasis role="bold">absurd</emphasis> &sterm;</para>
26 <term>Pre-conditions:</term>
28 <para><command>P</command> must have type <command>Prop</command>.</para>
34 <para>It closes the current sequent by eliminating an
39 <term>New sequents to prove:</term>
41 <para>It opens two new sequents of conclusion <command>P</command>
42 and <command>¬P</command>.</para>
48 <sect1 id="tac_apply">
50 <titleabbrev>apply</titleabbrev>
51 <para><userinput>apply t</userinput></para>
54 <varlistentry role="tactic.synopsis">
55 <term>Synopsis:</term>
57 <para><emphasis role="bold">apply</emphasis> &sterm;</para>
61 <term>Pre-conditions:</term>
63 <para><command>t</command> must have type
64 <command>T<subscript>1</subscript> → … →
65 T<subscript>n</subscript> → G</command>
66 where <command>G</command> can be unified with the conclusion
67 of the current sequent.</para>
73 <para>It closes the current sequent by applying <command>t</command> to <command>n</command> implicit arguments (that become new sequents).</para>
77 <term>New sequents to prove:</term>
79 <para>It opens a new sequent for each premise
80 <command>T<subscript>i</subscript></command> that is not
81 instantiated by unification. <command>T<subscript>i</subscript></command> is
82 the conclusion of the <command>i</command>-th new sequent to
89 <sect1 id="tac_applyS">
91 <titleabbrev>applyS</titleabbrev>
92 <para><userinput>applyS t auto_params</userinput></para>
95 <varlistentry role="tactic.synopsis">
96 <term>Synopsis:</term>
98 <para><emphasis role="bold">applyS</emphasis> &sterm; &autoparams;</para>
102 <term>Pre-conditions:</term>
104 <para><command>t</command> must have type
105 <command>T<subscript>1</subscript> → ... →
106 T<subscript>n</subscript> → G</command>.</para>
112 <para><command>applyS</command> is useful when
113 <command>apply</command> fails because the current goal
114 and the conclusion of the applied theorems are extensionally
115 equivalent up to instantiation of metavariables, but cannot
116 be unified. E.g. the goal is <command>P(n*O+m)</command> and
117 the theorem to be applied proves <command>∀m.P(m+O)</command>.
120 It tries to automatically rewrite the current goal using
121 <link linkend="tac_auto">auto paramodulation</link>
122 to make it unifiable with <command>G</command>.
123 Then it closes the current sequent by applying
124 <command>t</command> to <command>n</command>
125 implicit arguments (that become new sequents).
126 The <command>auto_params</command> parameters are passed
127 directly to <command>auto paramodulation</command>.
132 <term>New sequents to prove:</term>
134 <para>It opens a new sequent for each premise
135 <command>T<subscript>i</subscript></command> that is not
136 instantiated by unification. <command>T<subscript>i</subscript></command> is
137 the conclusion of the <command>i</command>-th new sequent to
144 <sect1 id="tac_assumption">
145 <title>assumption</title>
146 <titleabbrev>assumption</titleabbrev>
147 <para><userinput>assumption </userinput></para>
150 <varlistentry role="tactic.synopsis">
151 <term>Synopsis:</term>
153 <para><emphasis role="bold">assumption</emphasis></para>
157 <term>Pre-conditions:</term>
159 <para>There must exist an hypothesis whose type can be unified with
160 the conclusion of the current sequent.</para>
166 <para>It closes the current sequent exploiting an hypothesis.</para>
170 <term>New sequents to prove:</term>
178 <sect1 id="tac_auto">
180 <titleabbrev>auto</titleabbrev>
181 <para><userinput>auto params</userinput></para>
184 <varlistentry role="tactic.synopsis">
185 <term>Synopsis:</term>
187 <para><emphasis role="bold">auto</emphasis> &autoparams;. </para>
188 <para><emphasis role="bold">autobatch</emphasis> &autoparams;</para>
192 <term>Pre-conditions:</term>
194 <para>None, but the tactic may fail finding a proof if every
195 proof is in the search space that is pruned away. Pruning is
196 controlled by the optional <command>params</command>.
197 Moreover, only lemmas whose type signature is a subset of the
198 signature of the current sequent are considered. The signature of
199 a sequent is essentially the set of constats appearing in it.
206 <para>It closes the current sequent by repeated application of
207 rewriting steps (unless <command>paramodulation</command> is
208 omitted), hypothesis and lemmas in the library.</para>
212 <term>New sequents to prove:</term>
220 <sect1 id="tac_cases">
222 <titleabbrev>cases</titleabbrev>
228 <varlistentry role="tactic.synopsis">
229 <term>Synopsis:</term>
232 <emphasis role="bold">cases</emphasis>
233 &term; [<emphasis role="bold">(</emphasis>[&id;]…<emphasis role="bold">)</emphasis>]
238 <term>Pre-conditions:</term>
241 <command>t</command> must inhabit an inductive type
249 It proceed by cases on <command>t</command>. The new generated
250 hypothesis in each branch are named according to
251 <command>hyps</command>.
256 <term>New sequents to prove:</term>
258 <para>One new sequent for each constructor of the type of
259 <command>t</command>. Each sequent has a new hypothesis for
260 each argument of the constructor.</para>
266 <sect1 id="tac_clear">
268 <titleabbrev>clear</titleabbrev>
270 clear H<subscript>1</subscript> ... H<subscript>m</subscript>
274 <varlistentry role="tactic.synopsis">
275 <term>Synopsis:</term>
278 <emphasis role="bold">clear</emphasis>
284 <term>Pre-conditions:</term>
288 H<subscript>1</subscript> ... H<subscript>m</subscript>
289 </command> must be hypotheses of the
290 current sequent to prove.
298 It hides the hypotheses
300 H<subscript>1</subscript> ... H<subscript>m</subscript>
301 </command> from the current sequent.
306 <term>New sequents to prove:</term>
314 <sect1 id="tac_clearbody">
315 <title>clearbody</title>
316 <titleabbrev>clearbody</titleabbrev>
317 <para><userinput>clearbody H</userinput></para>
320 <varlistentry role="tactic.synopsis">
321 <term>Synopsis:</term>
323 <para><emphasis role="bold">clearbody</emphasis> &id;</para>
327 <term>Pre-conditions:</term>
329 <para><command>H</command> must be an hypothesis of the
330 current sequent to prove.</para>
336 <para>It hides the definiens of a definition in the current
337 sequent context. Thus the definition becomes an hypothesis.</para>
341 <term>New sequents to prove:</term>
349 <sect1 id="tac_compose">
350 <title>compose</title>
351 <titleabbrev>compose</titleabbrev>
352 <para><userinput>compose n t1 with t2 hyps</userinput></para>
355 <varlistentry role="tactic.synopsis">
356 <term>Synopsis:</term>
358 <para><emphasis role="bold">compose</emphasis> [&nat;] &sterm; [<emphasis role="bold">with</emphasis> &sterm;] [&intros-spec;]</para>
362 <term>Pre-conditions:</term>
370 <para>Composes t1 with t2 in every possible way
371 <command>n</command> times introducing generated terms
372 as if <command>intros hyps</command> was issued.</para>
373 <para>If <command>t1:∀x:A.B[x]</command> and
374 <command>t2:∀x,y:A.B[x]→B[y]→C[x,y]</command> it generates:
377 <para><command>λx,y:A.t2 x y (t1 x) : ∀x,y:A.B[y]→C[x,y]</command></para>
380 <para><command>λx,y:A.λH:B[x].t2 x y H (t1 y) : ∀x,y:A.B[x]→C[x,y]
385 <para>If <command>t2</command> is omitted it composes
386 <command>t1</command>
387 with every hypothesis that can be introduced.
388 <command>n</command> iterates the process.</para>
392 <term>New sequents to prove:</term>
394 <para>The same, but with more hypothesis eventually introduced
395 by the &intros-spec;.</para>
401 <sect1 id="tac_change">
402 <title>change</title>
403 <titleabbrev>change</titleabbrev>
404 <para><userinput>change patt with t</userinput></para>
407 <varlistentry role="tactic.synopsis">
408 <term>Synopsis:</term>
410 <para><emphasis role="bold">change</emphasis> &pattern; <emphasis role="bold">with</emphasis> &sterm;</para>
414 <term>Pre-conditions:</term>
416 <para>Each subterm matched by the pattern must be convertible
417 with the term <command>t</command> disambiguated in the context
418 of the matched subterm.</para>
424 <para>It replaces the subterms of the current sequent matched by
425 <command>patt</command> with the new term <command>t</command>.
426 For each subterm matched by the pattern, <command>t</command> is
427 disambiguated in the context of the subterm.</para>
431 <term>New sequents to prove:</term>
439 <sect1 id="tac_constructor">
440 <title>constructor</title>
441 <titleabbrev>constructor</titleabbrev>
442 <para><userinput>constructor n</userinput></para>
445 <varlistentry role="tactic.synopsis">
446 <term>Synopsis:</term>
448 <para><emphasis role="bold">constructor</emphasis> &nat;</para>
452 <term>Pre-conditions:</term>
454 <para>The conclusion of the current sequent must be
455 an inductive type or the application of an inductive type with
456 at least <command>n</command> constructors.</para>
462 <para>It applies the <command>n</command>-th constructor of the
463 inductive type of the conclusion of the current sequent.</para>
467 <term>New sequents to prove:</term>
469 <para>It opens a new sequent for each premise of the constructor
470 that can not be inferred by unification. For more details,
471 see the <command>apply</command> tactic.</para>
477 <sect1 id="tac_contradiction">
478 <title>contradiction</title>
479 <titleabbrev>contradiction</titleabbrev>
480 <para><userinput>contradiction </userinput></para>
483 <varlistentry role="tactic.synopsis">
484 <term>Synopsis:</term>
486 <para><emphasis role="bold">contradiction</emphasis></para>
490 <term>Pre-conditions:</term>
492 <para>There must be in the current context an hypothesis of type
493 <command>False</command>.</para>
499 <para>It closes the current sequent by applying an hypothesis of
500 type <command>False</command>.</para>
504 <term>New sequents to prove:</term>
514 <titleabbrev>cut</titleabbrev>
515 <para><userinput>cut P as H</userinput></para>
518 <varlistentry role="tactic.synopsis">
519 <term>Synopsis:</term>
521 <para><emphasis role="bold">cut</emphasis> &sterm; [<emphasis role="bold">as</emphasis> &id;]</para>
525 <term>Pre-conditions:</term>
527 <para><command>P</command> must have type <command>Prop</command>.</para>
533 <para>It closes the current sequent.</para>
537 <term>New sequents to prove:</term>
539 <para>It opens two new sequents. The first one has an extra
540 hypothesis <command>H:P</command>. If <command>H</command> is
541 omitted, the name of the hypothesis is automatically generated.
542 The second sequent has conclusion <command>P</command> and
543 hypotheses the hypotheses of the current sequent to prove.</para>
549 <sect1 id="tac_decompose">
550 <title>decompose</title>
551 <titleabbrev>decompose</titleabbrev>
553 decompose as H<subscript>1</subscript> ... H<subscript>m</subscript>
557 <varlistentry role="tactic.synopsis">
558 <term>Synopsis:</term>
561 <emphasis role="bold">decompose</emphasis>
562 [<emphasis role="bold">as</emphasis> &id;…]
567 <term>Pre-conditions:</term>
576 For each each premise <command>H</command> of type
577 <command>T</command> in the current context where
578 <command>T</command> is a non-recursive inductive type without
579 right parameters and of sort Prop or CProp, the tactic runs
581 elim H as H<subscript>1</subscript> ... H<subscript>m</subscript>
582 </command>, clears <command>H</command> and runs itself
583 recursively on each new premise introduced by
584 <command>elim</command> in the opened sequents.
589 <term>New sequents to prove:</term>
592 The ones generated by all the <command>elim</command> tactics run.
599 <sect1 id="tac_demodulate">
600 <title>demodulate</title>
601 <titleabbrev>demodulate</titleabbrev>
602 <para><userinput>demodulate auto_params</userinput></para>
605 <varlistentry role="tactic.synopsis">
606 <term>Synopsis:</term>
608 <para><emphasis role="bold">demodulate</emphasis> &autoparams;</para>
612 <term>Pre-conditions:</term>
624 <term>New sequents to prove:</term>
632 <sect1 id="tac_destruct">
633 <title>destruct</title>
634 <titleabbrev>destruct</titleabbrev>
635 <para><userinput>destruct p</userinput></para>
638 <varlistentry role="tactic.synopsis">
639 <term>Synopsis:</term>
641 <para><emphasis role="bold">destruct</emphasis> &sterm;</para>
645 <term>Pre-conditions:</term>
647 <para><command>p</command> must have type <command>E<subscript>1</subscript> = E<subscript>2</subscript></command> where the two sides of the equality are possibly applied constructors of an inductive type.</para>
653 <para>The tactic recursively compare the two sides of the equality
654 looking for different constructors in corresponding position.
655 If two of them are found, the tactic closes the current sequent
656 by proving the absurdity of <command>p</command>. Otherwise
657 it adds a new hypothesis for each leaf of the formula that
658 states the equality of the subformulae in the corresponding
659 positions on the two sides of the equality.
664 <term>New sequents to prove:</term>
672 <sect1 id="tac_elim">
674 <titleabbrev>elim</titleabbrev>
675 <para><userinput>elim t pattern using th hyps</userinput></para>
678 <varlistentry role="tactic.synopsis">
679 <term>Synopsis:</term>
681 <para><emphasis role="bold">elim</emphasis> &sterm; &pattern; [<emphasis role="bold">using</emphasis> &sterm;] &intros-spec;</para>
685 <term>Pre-conditions:</term>
687 <para><command>t</command> must inhabit an inductive type and
688 <command>th</command> must be an elimination principle for that
689 inductive type. If <command>th</command> is omitted the appropriate
690 standard elimination principle is chosen.</para>
696 <para>It proceeds by cases on the values of <command>t</command>,
697 according to the elimination principle <command>th</command>.
698 The induction predicate is restricted by
699 <command>pattern</command>. In particular, if some hypothesis
700 is listed in <command>pattern</command>, the hypothesis is
701 generalized and cleared before eliminating <command>t</command>
706 <term>New sequents to prove:</term>
708 <para>It opens one new sequent for each case. The names of
709 the new hypotheses are picked by <command>hyps</command>, if
710 provided. If hyps specifies also a number of hypotheses that
711 is less than the number of new hypotheses for a new sequent,
712 then the exceeding hypothesis will be kept as implications in
713 the conclusion of the sequent.</para>
719 <sect1 id="tac_elimType">
720 <title>elimType</title>
721 <titleabbrev>elimType</titleabbrev>
722 <para><userinput>elimType T using th hyps</userinput></para>
725 <varlistentry role="tactic.synopsis">
726 <term>Synopsis:</term>
728 <para><emphasis role="bold">elimType</emphasis> &sterm; [<emphasis role="bold">using</emphasis> &sterm;] &intros-spec;</para>
732 <term>Pre-conditions:</term>
734 <para><command>T</command> must be an inductive type.</para>
740 <para>TODO (severely bugged now).</para>
744 <term>New sequents to prove:</term>
752 <sect1 id="tac_exact">
754 <titleabbrev>exact</titleabbrev>
755 <para><userinput>exact p</userinput></para>
758 <varlistentry role="tactic.synopsis">
759 <term>Synopsis:</term>
761 <para><emphasis role="bold">exact</emphasis> &sterm;</para>
765 <term>Pre-conditions:</term>
767 <para>The type of <command>p</command> must be convertible
768 with the conclusion of the current sequent.</para>
774 <para>It closes the current sequent using <command>p</command>.</para>
778 <term>New sequents to prove:</term>
786 <sect1 id="tac_exists">
787 <title>exists</title>
788 <titleabbrev>exists</titleabbrev>
789 <para><userinput>exists </userinput></para>
792 <varlistentry role="tactic.synopsis">
793 <term>Synopsis:</term>
795 <para><emphasis role="bold">exists</emphasis></para>
799 <term>Pre-conditions:</term>
801 <para>The conclusion of the current sequent must be
802 an inductive type or the application of an inductive type
803 with at least one constructor.</para>
809 <para>Equivalent to <command>constructor 1</command>.</para>
813 <term>New sequents to prove:</term>
815 <para>It opens a new sequent for each premise of the first
816 constructor of the inductive type that is the conclusion of the
817 current sequent. For more details, see the <command>constructor</command> tactic.</para>
823 <sect1 id="tac_fail">
825 <titleabbrev>fail</titleabbrev>
826 <para><userinput>fail</userinput></para>
829 <varlistentry role="tactic.synopsis">
830 <term>Synopsis:</term>
832 <para><emphasis role="bold">fail</emphasis></para>
836 <term>Pre-conditions:</term>
844 <para>This tactic always fail.</para>
848 <term>New sequents to prove:</term>
856 <sect1 id="tac_fold">
858 <titleabbrev>fold</titleabbrev>
859 <para><userinput>fold red t patt</userinput></para>
862 <varlistentry role="tactic.synopsis">
863 <term>Synopsis:</term>
865 <para><emphasis role="bold">fold</emphasis> &reduction-kind; &sterm; &pattern;</para>
869 <term>Pre-conditions:</term>
871 <para>The pattern must not specify the wanted term.</para>
877 <para>First of all it locates all the subterms matched by
878 <command>patt</command>. In the context of each matched subterm
879 it disambiguates the term <command>t</command> and reduces it
880 to its <command>red</command> normal form; then it replaces with
881 <command>t</command> every occurrence of the normal form in the
882 matched subterm.</para>
886 <term>New sequents to prove:</term>
894 <sect1 id="tac_fourier">
895 <title>fourier</title>
896 <titleabbrev>fourier</titleabbrev>
897 <para><userinput>fourier </userinput></para>
900 <varlistentry role="tactic.synopsis">
901 <term>Synopsis:</term>
903 <para><emphasis role="bold">fourier</emphasis></para>
907 <term>Pre-conditions:</term>
909 <para>The conclusion of the current sequent must be a linear
910 inequation over real numbers taken from standard library of
911 Coq. Moreover the inequations in the hypotheses must imply the
912 inequation in the conclusion of the current sequent.</para>
918 <para>It closes the current sequent by applying the Fourier method.</para>
922 <term>New sequents to prove:</term>
932 <titleabbrev>fwd</titleabbrev>
933 <para><userinput>fwd H as H<subscript>0</subscript> ... H<subscript>n</subscript></userinput></para>
936 <varlistentry role="tactic.synopsis">
937 <term>Synopsis:</term>
939 <para><emphasis role="bold">fwd</emphasis> &id; [<emphasis role="bold">as</emphasis> &id; [&id;]…]</para>
943 <term>Pre-conditions:</term>
946 The type of <command>H</command> must be the premise of a
947 forward simplification theorem.
955 This tactic is under development.
956 It simplifies the current context by removing
957 <command>H</command> using the following methods:
958 forward application (by <command>lapply</command>) of a suitable
959 simplification theorem, chosen automatically, of which the type
960 of <command>H</command> is a premise,
961 decomposition (by <command>decompose</command>),
962 rewriting (by <command>rewrite</command>).
963 <command>H<subscript>0</subscript> ... H<subscript>n</subscript></command>
964 are passed to the tactics <command>fwd</command> invokes, as
965 names for the premise they introduce.
970 <term>New sequents to prove:</term>
973 The ones opened by the tactics <command>fwd</command> invokes.
980 <sect1 id="tac_generalize">
981 <title>generalize</title>
982 <titleabbrev>generalize</titleabbrev>
983 <para><userinput>generalize patt as H</userinput></para>
986 <varlistentry role="tactic.synopsis">
987 <term>Synopsis:</term>
989 <para><emphasis role="bold">generalize</emphasis> &pattern; [<emphasis role="bold">as</emphasis> &id;]</para>
993 <term>Pre-conditions:</term>
995 <para>All the terms matched by <command>patt</command> must be
996 convertible and close in the context of the current sequent.</para>
1000 <term>Action:</term>
1002 <para>It closes the current sequent by applying a stronger
1003 lemma that is proved using the new generated sequent.</para>
1007 <term>New sequents to prove:</term>
1009 <para>It opens a new sequent where the current sequent conclusion
1010 <command>G</command> is generalized to
1011 <command>∀x.G{x/t}</command> where <command>{x/t}</command>
1012 is a notation for the replacement with <command>x</command> of all
1013 the occurrences of the term <command>t</command> matched by
1014 <command>patt</command>. If <command>patt</command> matches no
1015 subterm then <command>t</command> is defined as the
1016 <command>wanted</command> part of the pattern.</para>
1024 <titleabbrev>id</titleabbrev>
1025 <para><userinput>id </userinput></para>
1028 <varlistentry role="tactic.synopsis">
1029 <term>Synopsis:</term>
1031 <para><emphasis role="bold">id</emphasis></para>
1035 <term>Pre-conditions:</term>
1041 <term>Action:</term>
1043 <para>This identity tactic does nothing without failing.</para>
1047 <term>New sequents to prove:</term>
1055 <sect1 id="tac_intro">
1056 <title>intro</title>
1057 <titleabbrev>intro</titleabbrev>
1058 <para><userinput>intro H</userinput></para>
1061 <varlistentry role="tactic.synopsis">
1062 <term>Synopsis:</term>
1064 <para><emphasis role="bold">intro</emphasis> [&id;]</para>
1068 <term>Pre-conditions:</term>
1070 <para>The conclusion of the sequent to prove must be an implication
1071 or a universal quantification.</para>
1075 <term>Action:</term>
1077 <para>It applies the right introduction rule for implication,
1078 closing the current sequent.</para>
1082 <term>New sequents to prove:</term>
1084 <para>It opens a new sequent to prove adding to the hypothesis
1085 the antecedent of the implication and setting the conclusion
1086 to the consequent of the implicaiton. The name of the new
1087 hypothesis is <command>H</command> if provided; otherwise it
1088 is automatically generated.</para>
1094 <sect1 id="tac_intros">
1095 <title>intros</title>
1096 <titleabbrev>intros</titleabbrev>
1097 <para><userinput>intros hyps</userinput></para>
1100 <varlistentry role="tactic.synopsis">
1101 <term>Synopsis:</term>
1103 <para><emphasis role="bold">intros</emphasis> &intros-spec;</para>
1107 <term>Pre-conditions:</term>
1109 <para>If <command>hyps</command> specifies a number of hypotheses
1110 to introduce, then the conclusion of the current sequent must
1111 be formed by at least that number of imbricated implications
1112 or universal quantifications.</para>
1116 <term>Action:</term>
1118 <para>It applies several times the right introduction rule for
1119 implication, closing the current sequent.</para>
1123 <term>New sequents to prove:</term>
1125 <para>It opens a new sequent to prove adding a number of new
1126 hypotheses equal to the number of new hypotheses requested.
1127 If the user does not request a precise number of new hypotheses,
1128 it adds as many hypotheses as possible.
1129 The name of each new hypothesis is either popped from the
1130 user provided list of names, or it is automatically generated when
1131 the list is (or becomes) empty.</para>
1137 <sect1 id="tac_inversion">
1138 <title>inversion</title>
1139 <titleabbrev>inversion</titleabbrev>
1140 <para><userinput>inversion t</userinput></para>
1143 <varlistentry role="tactic.synopsis">
1144 <term>Synopsis:</term>
1146 <para><emphasis role="bold">inversion</emphasis> &sterm;</para>
1150 <term>Pre-conditions:</term>
1152 <para>The type of the term <command>t</command> must be an inductive
1153 type or the application of an inductive type.</para>
1157 <term>Action:</term>
1159 <para>It proceeds by cases on <command>t</command> paying attention
1160 to the constraints imposed by the actual "right arguments"
1161 of the inductive type.</para>
1165 <term>New sequents to prove:</term>
1167 <para>It opens one new sequent to prove for each case in the
1168 definition of the type of <command>t</command>. With respect to
1169 a simple elimination, each new sequent has additional hypotheses
1170 that states the equalities of the "right parameters"
1171 of the inductive type with terms originally present in the
1172 sequent to prove.</para>
1178 <sect1 id="tac_lapply">
1179 <title>lapply</title>
1180 <titleabbrev>lapply</titleabbrev>
1182 lapply linear depth=d t
1183 to t<subscript>1</subscript>, ..., t<subscript>n</subscript> as H
1187 <varlistentry role="tactic.synopsis">
1188 <term>Synopsis:</term>
1191 <emphasis role="bold">lapply</emphasis>
1192 [<emphasis role="bold">linear</emphasis>]
1193 [<emphasis role="bold">depth=</emphasis>&nat;]
1195 [<emphasis role="bold">to</emphasis>
1197 [<emphasis role="bold">,</emphasis>&sterm;…]
1199 [<emphasis role="bold">as</emphasis> &id;]
1204 <term>Pre-conditions:</term>
1207 <command>t</command> must have at least <command>d</command>
1208 independent premises and <command>n</command> must not be
1209 greater than <command>d</command>.
1214 <term>Action:</term>
1217 Invokes <command>letin H ≝ (t ? ... ?)</command>
1218 with enough <command>?</command>'s to reach the
1219 <command>d</command>-th independent premise of
1220 <command>t</command>
1221 (<command>d</command> is maximum if unspecified).
1222 Then istantiates (by <command>apply</command>) with
1223 t<subscript>1</subscript>, ..., t<subscript>n</subscript>
1224 the <command>?</command>'s corresponding to the first
1225 <command>n</command> independent premises of
1226 <command>t</command>.
1227 Usually the other <command>?</command>'s preceding the
1228 <command>n</command>-th independent premise of
1229 <command>t</command> are istantiated as a consequence.
1230 If the <command>linear</command> flag is specified and if
1231 <command>t, t<subscript>1</subscript>, ..., t<subscript>n</subscript></command>
1232 are (applications of) premises in the current context, they are
1233 <command>clear</command>ed.
1238 <term>New sequents to prove:</term>
1241 The ones opened by the tactics <command>lapply</command> invokes.
1248 <sect1 id="tac_left">
1250 <titleabbrev>left</titleabbrev>
1251 <para><userinput>left </userinput></para>
1254 <varlistentry role="tactic.synopsis">
1255 <term>Synopsis:</term>
1257 <para><emphasis role="bold">left</emphasis></para>
1261 <term>Pre-conditions:</term>
1263 <para>The conclusion of the current sequent must be
1264 an inductive type or the application of an inductive type
1265 with at least one constructor.</para>
1269 <term>Action:</term>
1271 <para>Equivalent to <command>constructor 1</command>.</para>
1275 <term>New sequents to prove:</term>
1277 <para>It opens a new sequent for each premise of the first
1278 constructor of the inductive type that is the conclusion of the
1279 current sequent. For more details, see the <command>constructor</command> tactic.</para>
1285 <sect1 id="tac_letin">
1286 <title>letin</title>
1287 <titleabbrev>letin</titleabbrev>
1288 <para><userinput>letin x ≝ t</userinput></para>
1291 <varlistentry role="tactic.synopsis">
1292 <term>Synopsis:</term>
1294 <para><emphasis role="bold">letin</emphasis> &id; <emphasis role="bold">≝</emphasis> &sterm;</para>
1298 <term>Pre-conditions:</term>
1304 <term>Action:</term>
1306 <para>It adds to the context of the current sequent to prove a new
1307 definition <command>x ≝ t</command>.</para>
1311 <term>New sequents to prove:</term>
1319 <sect1 id="tac_normalize">
1320 <title>normalize</title>
1321 <titleabbrev>normalize</titleabbrev>
1322 <para><userinput>normalize patt</userinput></para>
1325 <varlistentry role="tactic.synopsis">
1326 <term>Synopsis:</term>
1328 <para><emphasis role="bold">normalize</emphasis> &pattern;</para>
1332 <term>Pre-conditions:</term>
1338 <term>Action:</term>
1340 <para>It replaces all the terms matched by <command>patt</command>
1341 with their βδιζ-normal form.</para>
1345 <term>New sequents to prove:</term>
1353 <sect1 id="tac_reflexivity">
1354 <title>reflexivity</title>
1355 <titleabbrev>reflexivity</titleabbrev>
1356 <para><userinput>reflexivity </userinput></para>
1359 <varlistentry role="tactic.synopsis">
1360 <term>Synopsis:</term>
1362 <para><emphasis role="bold">reflexivity</emphasis></para>
1366 <term>Pre-conditions:</term>
1368 <para>The conclusion of the current sequent must be
1369 <command>t=t</command> for some term <command>t</command></para>
1373 <term>Action:</term>
1375 <para>It closes the current sequent by reflexivity
1380 <term>New sequents to prove:</term>
1388 <sect1 id="tac_replace">
1389 <title>replace</title>
1390 <titleabbrev>change</titleabbrev>
1391 <para><userinput>change patt with t</userinput></para>
1394 <varlistentry role="tactic.synopsis">
1395 <term>Synopsis:</term>
1397 <para><emphasis role="bold">replace</emphasis> &pattern; <emphasis role="bold">with</emphasis> &sterm;</para>
1401 <term>Pre-conditions:</term>
1407 <term>Action:</term>
1409 <para>It replaces the subterms of the current sequent matched by
1410 <command>patt</command> with the new term <command>t</command>.
1411 For each subterm matched by the pattern, <command>t</command> is
1412 disambiguated in the context of the subterm.</para>
1416 <term>New sequents to prove:</term>
1418 <para>For each matched term <command>t'</command> it opens
1419 a new sequent to prove whose conclusion is
1420 <command>t'=t</command>.</para>
1426 <sect1 id="tac_rewrite">
1427 <title>rewrite</title>
1428 <titleabbrev>rewrite</titleabbrev>
1429 <para><userinput>rewrite dir p patt</userinput></para>
1432 <varlistentry role="tactic.synopsis">
1433 <term>Synopsis:</term>
1435 <para><emphasis role="bold">rewrite</emphasis> [<emphasis role="bold"><</emphasis>|<emphasis role="bold">></emphasis>] &sterm; &pattern;</para>
1439 <term>Pre-conditions:</term>
1441 <para><command>p</command> must be the proof of an equality,
1442 possibly under some hypotheses.</para>
1446 <term>Action:</term>
1448 <para>It looks in every term matched by <command>patt</command>
1449 for all the occurrences of the
1450 left hand side of the equality that <command>p</command> proves
1451 (resp. the right hand side if <command>dir</command> is
1452 <command><</command>). Every occurence found is replaced with
1453 the opposite side of the equality.</para>
1457 <term>New sequents to prove:</term>
1459 <para>It opens one new sequent for each hypothesis of the
1460 equality proved by <command>p</command> that is not closed
1461 by unification.</para>
1467 <sect1 id="tac_right">
1468 <title>right</title>
1469 <titleabbrev>right</titleabbrev>
1470 <para><userinput>right </userinput></para>
1473 <varlistentry role="tactic.synopsis">
1474 <term>Synopsis:</term>
1476 <para><emphasis role="bold">right</emphasis></para>
1480 <term>Pre-conditions:</term>
1482 <para>The conclusion of the current sequent must be
1483 an inductive type or the application of an inductive type with
1484 at least two constructors.</para>
1488 <term>Action:</term>
1490 <para>Equivalent to <command>constructor 2</command>.</para>
1494 <term>New sequents to prove:</term>
1496 <para>It opens a new sequent for each premise of the second
1497 constructor of the inductive type that is the conclusion of the
1498 current sequent. For more details, see the <command>constructor</command> tactic.</para>
1504 <sect1 id="tac_ring">
1506 <titleabbrev>ring</titleabbrev>
1507 <para><userinput>ring </userinput></para>
1510 <varlistentry role="tactic.synopsis">
1511 <term>Synopsis:</term>
1513 <para><emphasis role="bold">ring</emphasis></para>
1517 <term>Pre-conditions:</term>
1519 <para>The conclusion of the current sequent must be an
1520 equality over Coq's real numbers that can be proved using
1521 the ring properties of the real numbers only.</para>
1525 <term>Action:</term>
1527 <para>It closes the current sequent veryfying the equality by
1528 means of computation (i.e. this is a reflexive tactic, implemented
1529 exploiting the "two level reasoning" technique).</para>
1533 <term>New sequents to prove:</term>
1541 <sect1 id="tac_simplify">
1542 <title>simplify</title>
1543 <titleabbrev>simplify</titleabbrev>
1544 <para><userinput>simplify patt</userinput></para>
1547 <varlistentry role="tactic.synopsis">
1548 <term>Synopsis:</term>
1550 <para><emphasis role="bold">simplify</emphasis> &pattern;</para>
1554 <term>Pre-conditions:</term>
1560 <term>Action:</term>
1562 <para>It replaces all the terms matched by <command>patt</command>
1563 with other convertible terms that are supposed to be simpler.</para>
1567 <term>New sequents to prove:</term>
1575 <sect1 id="tac_split">
1576 <title>split</title>
1577 <titleabbrev>split</titleabbrev>
1578 <para><userinput>split </userinput></para>
1581 <varlistentry role="tactic.synopsis">
1582 <term>Synopsis:</term>
1584 <para><emphasis role="bold">split</emphasis></para>
1588 <term>Pre-conditions:</term>
1590 <para>The conclusion of the current sequent must be
1591 an inductive type or the application of an inductive type with
1592 at least one constructor.</para>
1596 <term>Action:</term>
1598 <para>Equivalent to <command>constructor 1</command>.</para>
1602 <term>New sequents to prove:</term>
1604 <para>It opens a new sequent for each premise of the first
1605 constructor of the inductive type that is the conclusion of the
1606 current sequent. For more details, see the <command>constructor</command> tactic.</para>
1613 <sect1 id="tac_subst">
1614 <title>subst</title>
1615 <titleabbrev>subst</titleabbrev>
1616 <para><userinput>subst</userinput></para>
1619 <varlistentry role="tactic.synopsis">
1620 <term>Synopsis:</term>
1622 <para><emphasis role="bold">subst</emphasis></para>
1626 <term>Pre-conditions:</term>
1632 <term>Action:</term>
1634 For each premise of the form
1635 <command>H: x = t</command> or <command>H: t = x</command>
1636 where <command>x</command> is a local variable and
1637 <command>t</command> does not depend on <command>x</command>,
1638 the tactic rewrites <command>H</command> wherever
1639 <command>x</command> appears clearing <command>H</command> and
1640 <command>x</command> afterwards.
1644 <term>New sequents to prove:</term>
1646 The one opened by the applied tactics.
1652 <sect1 id="tac_symmetry">
1653 <title>symmetry</title>
1654 <titleabbrev>symmetry</titleabbrev>
1655 <para>The tactic <command>symmetry</command> </para>
1656 <para><userinput>symmetry </userinput></para>
1659 <varlistentry role="tactic.synopsis">
1660 <term>Synopsis:</term>
1662 <para><emphasis role="bold">symmetry</emphasis></para>
1666 <term>Pre-conditions:</term>
1668 <para>The conclusion of the current proof must be an equality.</para>
1672 <term>Action:</term>
1674 <para>It swaps the two sides of the equalityusing the symmetric
1679 <term>New sequents to prove:</term>
1687 <sect1 id="tac_transitivity">
1688 <title>transitivity</title>
1689 <titleabbrev>transitivity</titleabbrev>
1690 <para><userinput>transitivity t</userinput></para>
1693 <varlistentry role="tactic.synopsis">
1694 <term>Synopsis:</term>
1696 <para><emphasis role="bold">transitivity</emphasis> &sterm;</para>
1700 <term>Pre-conditions:</term>
1702 <para>The conclusion of the current proof must be an equality.</para>
1706 <term>Action:</term>
1708 <para>It closes the current sequent by transitivity of the equality.</para>
1712 <term>New sequents to prove:</term>
1714 <para>It opens two new sequents <command>l=t</command> and
1715 <command>t=r</command> where <command>l</command> and <command>r</command> are the left and right hand side of the equality in the conclusion of
1716 the current sequent to prove.</para>
1722 <sect1 id="tac_unfold">
1723 <title>unfold</title>
1724 <titleabbrev>unfold</titleabbrev>
1725 <para><userinput>unfold t patt</userinput></para>
1728 <varlistentry role="tactic.synopsis">
1729 <term>Synopsis:</term>
1731 <para><emphasis role="bold">unfold</emphasis> [&sterm;] &pattern;</para>
1735 <term>Pre-conditions:</term>
1741 <term>Action:</term>
1743 <para>It finds all the occurrences of <command>t</command>
1744 (possibly applied to arguments) in the subterms matched by
1745 <command>patt</command>. Then it δ-expands each occurrence,
1746 also performing β-reduction of the obtained term. If
1747 <command>t</command> is omitted it defaults to each
1748 subterm matched by <command>patt</command>.</para>
1752 <term>New sequents to prove:</term>
1760 <sect1 id="tac_whd">
1762 <titleabbrev>whd</titleabbrev>
1763 <para><userinput>whd patt</userinput></para>
1766 <varlistentry role="tactic.synopsis">
1767 <term>Synopsis:</term>
1769 <para><emphasis role="bold">whd</emphasis> &pattern;</para>
1773 <term>Pre-conditions:</term>
1779 <term>Action:</term>
1781 <para>It replaces all the terms matched by <command>patt</command>
1782 with their βδιζ-weak-head normal form.</para>
1786 <term>New sequents to prove:</term>