20.7 History of Ring
First Samuel Boutin designed the tactic ACDSimpl.
This tactic did lot of rewriting. But the proofs
terms generated by rewriting were too big for Coq's type-checker.
Let us see why:
Coq < Goal (x,y,z:Z)`x + 3 + y + y*z = x + 3 + y + z*y`.
1 subgoal
============================
(x,y,z:Z)`x+3+y+y*z = x+3+y+z*y`
Coq < Intros; Rewrite (Zmult_sym y z); Reflexivity.
Coq < Save toto.
Coq < Print toto.
toto =
[x,y,z:Z]
(eq_ind_r Z `z*y` [z0:Z]`x+3+y+z0 = x+3+y+z*y`
(refl_equal Z `x+3+y+z*y`) `y*z` (Zmult_sym y z))
: (x,y,z:Z)`x+3+y+y*z = x+3+y+z*y`
At each step of rewriting, the whole context is duplicated in the proof
term. Then, a tactic that does hundreds of rewriting generates huge proof
terms. Since ACDSimpl was too slow, Samuel Boutin rewrote it
using reflection (see his article in TACS'97 [14]). Later, the
stuff was rewritten by Patrick
Loiseleur: the new tactic does not any more require ACDSimpl
to compile and it makes use of bdi-reduction
not only to replace the rewriting steps, but also to achieve the
interleaving of computation and
reasoning (see 20.8). He also wrote a
few ML code for the Add Ring command, that allow to register
new rings dynamically.
Proofs terms generated by Ring are quite small, they are
linear in the number of Å and Ä operations in the
normalized terms. Type-checking those terms requires some time because it
makes a large use of the conversion rule, but
memory requirements are much smaller.