2016-05-06 9 views
3

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:

  1. Spiel jeden binären Konstruktor, wenn wir eine Hypothese haben, die besagen, dass der erste Ausdruck in den Konstruktor Schritten.
  2. 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
  3. 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?

Antwort

2

Das Problem ist, dass ?C entspricht einem Ausdruck des Formulars ?C0 ?t0. Sie können einen sekundären Abgleich durchführen, um diesen Fall auszuschließen.

0

Es scheint, wie die context ident [ term ] Konstruktion funktionieren würde:

Es ist eine besondere Form von Mustern eine Subterm mit dem Muster übereinstimmen: context ident [cpattern]. Es entspricht einem beliebigen Begriff mit einem Unterbegriff übereinstimmenden cpattern. Wenn es eine Übereinstimmung gibt, wird dem optionalen Ident der "übereinstimmende Kontext" zugewiesen, d. H. Der ursprüngliche Ausdruck, bei dem der abgeglichene Unterbegriff durch ein Loch ersetzt wird. ...

Aus historischen Gründen context verwendet n-ary Anwendungen wie (f 1 2) als Ganze zu betrachten und nicht als eine Abfolge von einstelligen Anwendungen ((f 1) 2). Daher würde context [f ?x] keinen passenden Unterbegriff in (f 1 2) finden: Wenn das Muster eine partielle Anwendung wäre, wären die übereinstimmenden Unterbegriffe notwendigerweise Anwendungen mit genau der gleichen Anzahl von Argumenten gewesen.

Also, ich denke dies funktionieren würde (zumindest auf einem minimalen künstlichen Beispiel arbeitet ich zusammengebraut haben):

... 
    | [ H : _ -> value _ \/ exists _, ?t1 ==> _ 
    |- context [exists _, ?C ?t1 ==> _ ]] => induction H; auto 
... 
+0

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

+0

@Gilles Du hast Recht. Ich frage mich, ob das für den Fortschrittssatz funktioniert, d. H. In diesem speziellen Fall. –