Авторы книги предоставили доказательства некоторых модульных тестов для упражнений на ностальтеру. К сожалению, они не дали объяснения, как они работают. Я смог понять все доказательства, кроме одного:
Inductive nostutter {X:Type} : list X -> Prop :=
| ns_nil : nostutter []
| ns_one : forall (x : X), nostutter [x]
| ns_cons: forall (x : X) (h : X) (t : list X), nostutter (h::t) -> x <> h -> nostutter (x::h::t).
Example test_nostutter_4: not (nostutter [3;1;1;4]).
Proof.
intro.
repeat match goal with
h: nostutter _ |- _ => inversion h; clear h; subst
end.
contradiction.
Qed.
После вступления у нас есть следующее:
1 subgoal (ID 454)
H : nostutter [3; 1; 1; 4]
============================
False
Когда я удаляю repeat
и запускаю матч один раз, я получаю это:
1 subgoal (ID 519)
H2 : nostutter [1; 1; 4]
H4 : 3 <> 1
============================
False
Таким образом, он пытается рекурсивно найти, где список в H2 не соответствует ни одному из конструкторов nostutter.
Может кто-нибудь объяснить мне, как этот матч работает шаг за шагом? Что такое goal
переменная и |-
символ?