Support arbitrary string types in IPM tactics
The design uses a canonical structure to map types into Coq's string type. As an example, here's a canonical instance for BlueRock's byte strings (bs):
About BS.to_string. (* BS.to_string : bs → string *)
Canonical Structure bsTS : to_str := ToStr BS.to_string.
This now allows us to call iApply "H" even when string_scope is not open or if our bs_scope takes priority over it.
This is trying to work around a missing feature in Coq: tactic notations cannot annotate their arguments with scopes. IPM relies on string_scope being opened and being on top of other string notations. We have about a hundred #[local] Open Scope string_scope in our code base because we rely heavily on byte strings for efficiency in everything that is not IPM. With this MR those can all be removed.
I think the way I engineered this there should not be a trace of the exact string type being used in the final proof term. But I have not checked that super carefully.
As a bonus, here's a performance summary (in billion instructions) for this change on our code base without removing #[local] Open Scope string_scope., i.e. just the overhead of the default to_str instance for string. The fact that the change is negative is a bit confusing and comes from lia caches. What matters is the fact there is no visible regression.
| Relative | Master | MR | Change | Files |
|---|---|---|---|---|
| -0.04% | 123983.2 | 123936.0 | -47.2 |