At the top you can see the goal state that grind got stuck on.
If there are several open goals, it only displays the first one.
You can see here that we are in a case generated by a case split somewhere.
To see how we got there we can set the option trace.grind.split to true to get
Here we can see the statement grind has split on, which is h applied to X ∪ Y.
Question: What does the asserted facts section actually do?
The next thing to understand is that grind doesn't work by rewriting with terms that it considers to be equal.
Instead, it maintains equivalence classes.
This is also a way to discover contradictions.
If two different constructors of the same type (e.g. True and False or some a and none) are put in the same equivalence class, grind has found a contradiction and finishes the proof.
The two main equivalence classes are those of true and false propositions which you can see as output in the error message.
It can also show other equivalence classes.
That isn't the case in our example but it is here:
You can see that here we have more equivalence classes than just those of true and false propositions.
Next, our error message from the beginning of this section has a section on cases.
Here you can see on which terms case splits were performed.
We will get into case splits in the next section.
Afterwards there is a section called "ematch".
E-matching is how grind uses tagged lemmas.
We will discuss this in detail in a later section.
Then both error messages feature sections called cutsat and the later error message in this section has a section about ring.
These are two examples of satellite solvers that grind employs to solve problems of specific types.
They are different from the Mathlib tactics of the same names because grind is supposed to work Mathlib-free.
You can however imagine them to work similarly.