Wzór dopasowywania na match
stwierdzeń jest nieco dziwne.
Pierwszą rzeczą, którą powinieneś wiedzieć, jest to, że wewnątrz Coqa nie ma czegoś takiego jak match
dla wielu zmiennych lub z głębokim dopasowaniem: wszystko jest tłumaczone na podstawie prostszych instrukcji match
. Zatem termin napisałeś jest cukier faktycznie składnia następującym cyklu:
match x with
| 0 => 10
| S x' =>
match x' with
| 0 => 5
| S x'' => 10
end
end
co jest, co jest Coq sugerując kiedy drukuje swój stan próbny. Problem polega na tym, że ten cukier składniowy nie działa na wzorcach Ltac: dlatego, pisząc wzór Ltac wymieniający match
, zawsze powinieneś próbować dopasować go tak, jakby był jednopoziomowym match
.
Drugim problemem jest to, że nie można wiązać wzór część match
: coś jak
match goal with
| H : match ?x => _ | ?y => _ end = 5 |- _ => (* ... *)
end
naprawdę nie ma sensu w Ltac.
Masz dwie możliwości rozwiązania problemu, a następnie:
Zapisz match
można oczekiwać z dokładną listą konstruktorów typu ze strony wzór, na przykład
match goal with
| H : match x with 0 => _ | S _ => _ end = 5 |- _ => (* ... *)
end
pomocą specjalnej składni match (* ... *) with _ => _ end
, który pasuje dowolnymatch
cokolwiek:
match goal with
| H : match x with _ => _ end = 5 |- _ => (* ... *)
end
Często, jak w twoim przypadku, jeden nadal chce rozważyć wszystkie gałęzie match
, w tym głębokie. Ten idiom często jest przydatny w tym przypadku:
repeat match goal with
| H : match ?x with _ => _ end = _ |- _ =>
destruct x; try solve [inversion H]
end.