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.