Can you please provide me with high-level explanation on which usecases dependent induction / dependent destruct tactics have, and how they work (I would be grateful for explanation high-level enough for a beginner to understand).
Everything I found on it so far is extremely overcomplicated.
Well, we know inductive data types are often indexed by indices, a basic example that you may have seen is the vector that is indexed by a Type and its size.
Given an example of a vector
t A (S n), since we know that the vector has a size higher than 0, we know there is a value of type A in this vector. It would be simply written as :but if you tried to prove this using the usual destruct/induction, you end up with two cases:
Even though we know the vector has a size equal/higher than one, Coq still gives you a goal that is related when the vector is null. We can abuse from remembering indices and we can catch these cases by hand.
That is good but would be cooler if there is a tactic that already does it for you and eliminates the impossible clauses?