Ich mache ein paar Übungen über die Formalisierung von einfach-typisierten Lambda-Kalkül in Coq und möchte meine Beweise mit Ltac automatisieren. Während Fortschritte Theorembeweisen:Matching auf unäre Datenkonstruktoren in Ltac
Theorem progress : forall t T,
empty |-- t \in T -> value t \/ exists t', t ==> t'.
kam ich mit diesem Stück LTAC Code up:
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.
==>
einen einzigen Schritt der Auswertung bezeichnet (via kleinen Schritt Semantik). Die Absicht für jeden der Partie Fälle:
- Spiel jeden binären Konstruktor, wenn wir eine Hypothese haben, die besagen, dass der erste Ausdruck in den Konstruktor Schritten.
- Spiel jeden binärer Konstruktor wenn wir eine Hypothese, die besagt, dass der zweite Term in den Konstruktor Schritten und ersten Term im Konstruktor ist bereits ein Wert
- Spiel jeden einstelliger Konstruktor wenn wir eine Hypothese, die besagt, dass der Begriff im Konstruktor schreitet.
jedoch das Verhalten dieses Codes suchen sieht es aus, dass der dritte Fall auch binären Konstrukteurs entspricht. Wie schränke ich es ein, nur unäre Konstruktoren zu entsprechen?
Dies entspricht auch einem Ziel, bei dem sich der Konstruktor in einem komplexen Kontext befindet, was eine Menge falsch positiver Ergebnisse (z. B. unter einer Negation) bedeutet. – Gilles
@Gilles Du hast Recht. Ich frage mich, ob das für den Fortschrittssatz funktioniert, d. H. In diesem speziellen Fall. –