Global Generalizable All Variables.Global Set Asymmetric Patterns.Global Unset Transparent Obligations.
Even if std++ wants to use these internally, I think we should be careful inflicting them on our users. I certainly think that "Generalizable All Variables" is a misfeature; e.g. it led to completely bogus error messages when PersistentP got renamed to Persistent.
I am not so sure about the others, as I don't know what they do. But am rather sour about ssreflect inflicting its bullet choice on us (lucky enough, the in-Coq version no longer does this), and now I have to discover that std++ does the same. :(
At the very least, there should be comments explaining why changing this option for all users is the right thing to do.
It seems that Generalizable All Variables both enables generalization in `{...} and in Instance. We use the former a lot. I am not sure how I think about that one, but I am not very happy about it for instances.
Thanks for creating an issue for Global Generalizable All Variables. What you write is correct: we only want arguments in `{...} to be implicitly generalized, the other effect is bogus.
As for:
Global Set Asymmetric Patterns.
I think we should get rid of that. They changed the behavior of pattern variables in 8.6 → 8.7, and this enables the old behavior. I just enabled it because I did not want to port anything yet. I don't have time now, but I would welcome a MR that disables this option and adjusts the code accordingly.
As for Global Unset Transparent Obligations: We always use Program to solve logical side-conditions. As such, they should be made Opaque, because otherwise we end up with performance problems.
Note that in most cases we use Next Obligation. (* ... *) Qed., for which this option does not matter. However, sometimes we use things like Solve Obligations with naive_solver (* ... *), and then the obligations should surely be opaque.
Also note that we make more changes to Program, like Obligation Tactic := idtac.. The default is some ad-hoc tactic that performs some arbitrary simplifications.
Talking about options; I would like to enable the following option too:
Global Set Refine Instance Mode.
Right now, when you write something like:
Instance foo : Foo x := bar _.
Then Coq would try to solve the _ by type class resolution, and if it fails to succeed, it opens a goal.
The latter is extremely error prone: it happened to me many times that because of a change, an Instance out of the suddens opened a goal. Usually what happens then is that when closing a section or ending the file, Coq starts complaining that some goals have not been proved.
The option Set Refine Instance Mode makes sure that Instance fails immediately, which is the sensible behavior.