Finding that lemma: Coq search commands

No hay in this needlestack.

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.


About the author: My name is Miikka Koskinen. I'm an experienced software engineer and consultant focused on solving problems in storing data in cloud: ingesting the data, storing it efficiently, scaling the processing, and optimizing the costs.

Could you use help with that? Get in touch at miikka@jacksnipe.fi.

Want to get these articles to your inbox? Subscribe to the newsletter: