Coqの単純型ラムダ計算を正式化するための演習をいくつか行い、Ltacを使って私の証明を自動化したいと思います。進捗定理を証明しながら:Ltacの単項データコンストラクタのマッチング
Theorem progress : forall t T,
empty |-- t \in T -> value t \/ exists t', t ==> t'.
私はLTACコードのこの部分を思い付いた:
Ltac progress_when_stepping :=
(* right, because progress statement places stepping on the right of \/ *)
right;
(* use induction hypotheses *)
repeat
match goal with
| [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 _ ==> _ ] =>
induction H; auto
| [ H : _ -> value _ \/ exists _, ?t2 ==> _, H0 : value ?t1 |-
exists _, ?C ?t1 ?t2 ==> _ ] =>
induction H; auto
| [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 ==> _ ] =>
induction H; auto
end.
==>
は(小ステップセマンティクスを経由して)評価の一つのステップです。マッチ例それぞれの意図は次のとおりです。私たちが言う仮説を持って
- マッチ任意のバイナリコンストラクタそのコンストラクタステップの最初の項。
- マッチ任意のバイナリコンストラクタ我々が言う仮説を持っているとき、我々はコンストラクタで、コンストラクタステップと、第1項の第2項は、すでに値
- マッチだという仮説任意の単項コンストラクタを持っていますそれはコンストラクタの段階での用語です。
しかし、このコードの動作を見ると、3番目のケースもバイナリのコンストラクタと一致しているように見えます。どのように私は実際に単体のコンストラクタと一致するように制限するのですか?
また、これは、コンストラクタは(例えば否定下)偽陽性の多くを意味し、いくつかの複雑な状況にある目標を一致します。 – Gilles
@Gillesあなたが正しいです。私はこれが進歩の定理のために働くかどうか、すなわちこの特定の場合には疑問に思います。 –