I was working through a simple lemma and came across a situation where neither the contradiction or injection tactics were as powerful as I might have expected.

```
Theorem list_app_single: forall (T : Type) (x : T) (l1 l2 : list T),
   l1++[x] =  l2++[x] -> l1 = l2.
Proof.
intros. generalize dependent l2. induction l1.
  - intros. induction l2.
  --  reflexivity.
  -- inversion H.

```

Stopping here the proof state is:

```
1 subgoal
T : Type
x, x0 : T
l2 : list T
H : [ ] ++ [x] = (x0 :: l2) ++ [x]
IHl2 : [ ] ++ [x] = l2 ++ [x] -> [ ] = l2
H1 : x = x0
H2 : [ ] = l2 ++ [x0]
______________________________________(1/1)
[ ] = x0 :: l2

```

Clearly H2 is not true, but coq doesn't see this when applying the discriminate tactic. Is there a tactic that is more appropriate that can resolve that H2 is in fact false?

Edit: Made the question more focused on a specific tactic to overcome limitations of discriminate.