Jak wspomniał danportin, Coq informuje Cię, że nie wie, jak utworzyć instancję y
. Rzeczywiście, gdy robisz rewrite -> neg_move
, poprosisz go o zastąpienie niektórych negb x
przez y
. Co teraz powinno używać tutaj Coq y
? Nie może tego rozgryźć.
Jedną z opcji jest do wystąpienia y
wyraźnie na przepisanie:
rewrite -> neg_move with (y:=some_term)
ten wykona przepisanie i poprosi, aby udowodnić przesłanki, tu będzie dodać subgoal formularza x = negb some_term
.
Inną opcją jest specjalizują neg_move
na przepisanie:
rewrite -> (neg_move _ _ H)
Tutaj H
musi być określenie typu some_x = negb some_y
. Umieściłem dwa symbole wieloznaczne dla parametrów x
iz neg_move
, ponieważ Coq jest w stanie wywnioskować je odpowiednio z H
jako some_x
i some_y
. Coq spróbuje przepisać wystąpienie negb some_x
w twoim celu za pomocą some_y
. Ale najpierw trzeba uzyskać ten H
termin w swoich hipotez, które mogłyby być jakiś dodatkowy ciężar ...
(Zauważ, że pierwsza opcja dałem powinna być równoważna rewrite -> (neg_move _ some_term)
)
Inną opcją jest erewrite -> negb_move
, która doda niepotrzebne zmienne, które będą wyglądały jak ?x
i ?y
, i spróbuje przepisać. Będziesz musiał udowodnić założenie, które będzie wyglądać jak (evenb (S (S n'))) = negb ?y
, i mam nadzieję, że w procesie rozwiązywania tego subgoalu, Coq dowie się, co powinno być od ?y
(istnieją jednak pewne ograniczenia i mogą pojawić się problemy Coq rozwiązuje ten cel, nie zastanawiając się, co musi być ?y
).
Jednak dla danego problemu, to jest całkiem prosta:
==========
evenb (S n') = negb (evenb (S (S n')))
symmetry.
==========
negb (evenb (S (S n'))) = evenb (S n')
apply neg_move.
==========
evenb (S (S n')) = negb (evenb (S n'))
A to, co chciał (b Dalej, zrób kolejny symmetry.
, jeśli ci na tym zależy.
Wyrażenie "nie można znaleźć instancji dla zmiennej * y *" oznacza, że Coq nie może znaleźć wartości zastępującej zmienną * y * w typie * neg_move *. Możesz rozwiązać ten problem, jawnie tworząc instancję parametrów * neg_move *, w tym poprzednik warunkowego (który zostanie wygenerowany jako subgoal, jeśli pozostanie nieprzygotowany). Jednak instrukcje warunkowe mają na ogół być * stosowane *; w rzeczywistości * neg_move * można zastosować do hipotezy o indukcji, aby uzyskać bardziej użyteczną hipotezę. – danportin