One of the hurdles in using Coq is finding the suitable lemmas from the standard library. There are lots of them and while the naming is consistent, it’s hard to remember all of them. Luckily Coq has search commands to help you out.
Note: The following commands work only on modules you have required. If a
lemma exists, but you haven’t required its module, you’re out of luck. Also,
before Coq 8.5 Search
was called SearchAbout
and SearchHead
was called
Search
.
The simplest way to search is to search by name. This is one of the things
Search
command does:
Coq < Search "len".
length: forall A : Type, list A -> nat
You can also search for theorems (or other objects) whose statement contains a given identifier.
Coq < Search False.
False_rect: forall P : Type, False -> P
False_ind: forall P : Prop, False -> P
(* ... *)
Coq < Search 0.
nat_rect:
forall P : nat -> Type,
P 0 -> (forall n : nat, P n -> P (S n)) -> forall n : nat, P n
nat_ind:
forall P : nat -> Prop,
P 0 -> (forall n : nat, P n -> P (S n)) -> forall n : nat, P n
(* ... *)
Another thing you can do is to search for patterns with holes _
:
Coq < Search (S _ <= _).
le_S_n: forall n m : nat, S n <= S m -> n <= m
le_n_S: forall n m : nat, n <= m -> S n <= S m
When searching for a pattern, Search
matches anywhere in the statement. If you
only want to search for the pattern in the conclusion, use
SearchPattern
:
Coq < SearchPattern (S _ <= _).
le_n_S: forall n m : nat, n <= m -> S n <= S m
If you’re looking for a rewrite, there’s SearchRewrite
. It
finds conclusions of type _ = _
where one of the sides matches the given
pattern.
Coq < SearchRewrite (_ + 0).
plus_n_O: forall n : nat, n = n + 0
As always, see the manual for details. Coq’s manual looks intimidating, but it does contain a lot of good information.