Если вы используете destruct lst as [ | fst_elnt lst_tl] eqn:H
, вы получите две цели, в первой цели у вас есть нужная вам гипотеза.
H : lst = nil
Во второй цели у вас есть гипотеза в форме
H : lst = fst_elnt :: lst_tl
Это не то, что вы ожидаете от H
, это на самом деле сильнее. Чтобы получить H
с ожидаемым оператором, вы можете набрать следующее:
rename H into H'. (* to free the name H *)
assert (H : lst <> nil).
rewrite H'; discriminate.
discriminate
- это основа c tacti c, которая выражает тот факт, что два разных конструктора типа данных не могут вернуть равные значения.