Coq 8.5pl1 を使用しています。
人為的ではあるが実例となる例を作るために、
(* fix so simpl will automatically unfold. *)
Definition double := fix f n := 2*n.
Theorem contrived n : double (2 + n) = 2 + double (1 + n).
ここで、引数を double に単純化するだけで、それ以外の部分は単純化しません。(たとえば、残りはすでに慎重に正しい形に入れられているためです。)
simpl.
S (S (n + S (S (n + 0)))) = S (S (S (n + S (n + 0))))
これにより、外側の (2 + ...) が (S (S ...)) に変換され、ダブル展開が行われました。
次のようにして、それらの1つに一致させることができます。
match goal with | |- (double ?A) = _ => simpl A end.
double (S (S n)) = 2 + double (1 + n)
それらすべてを単純化したいというのはどうすればよいでしょうか。つまり、手に入れたい
double (S (S n)) = 2 + double (S n)
double への呼び出しごとに個別のパターンを配置する必要はありません。
double 自体を除いて単純化できます
remember double as x; simpl; subst x.
double (S (S n)) = S (S (double (S n)))