Ich habe Coq für eine sehr kurze Zeit verwendet und ich stoße immer noch mit einigen Dingen in Wände. Ich habe ein Set mit einer Record-Konstruktion definiert. Jetzt muss ich einen Mustervergleich durchführen, um es zu benutzen, aber ich habe Probleme, es richtig zu benutzen. Erstens, das sind meine Elemente.Verwirrt über Mustervergleich in Record Konstruktionen in Coq
Inductive element : Set :=
| empty : element
.
.
.
| fun_m : element -> element -> element
| n_fun : nat -> element -> element
.
Ich hebe die Elemente mit bestimmtem Merkmale eine Teilmenge von ihnen den nächsten Weg zu machen:
Inductive esp_char : elements -> Prop :=
| esp1 : esp_char empty
| esp2 : forall (n : nat)(E : element), esp_char E -> esp_char (n_fun n E).
Record especial : Set := mk_esp{ E : element ; C : (esp_char E)}.
Nun, ich brauche Definition zu verwenden und beheben Punkt auf den ‚especial‘ Elemente, nur die zwei, die ich ausgewählt habe. Ich habe die Dokumentation zu verlesen und was ich bekommen ist, dass ich so etwas tun bräuchten:
Fixpoint Size (E : especial): nat :=
match E with
|{|E := empty |} => 0
|{|E := n_fun n E0|} => (Size E0) + 1
end.
Natürlich ist dies sagt mir, dass ich alles, was auf dem induktiven Teil der Elemente fehlt bin so ich hinzufügen {|E := _ |}=> 0
, oder irgendetwas, nur um die Induktion voll zu machen. Auch dies zu tun, finde ich dann dieses Problem:
|{|E := n_fun n E0|} => (Size E0) + 1
Error:
In environment
Size : especial -> nat
E : especial
f : element
i : esp_char f
n : nat
E0 : element
The term "E0" has type "element" while it is expected to have type "especial".
Was ich nicht in der Lage gewesen zu tun, ist das letzte, was zu beheben, ich habe einen Lemma zu beweisen, dass, wenn n_fun n E0
‚especial‘ ist dann E0
besonders ist, aber ich kann baue es nicht so im Fixpoint. Ich habe auch die Größe für "alle Elemente" definiert und dann einfach die "besonderen" in einer Definition ausgewählt, aber ich möchte direkten Mustervergleich direkt auf dem Set "besonders" vornehmen können. Danke für deinen Beitrag.
EDIT: Vergaß zu erwähnen, dass ich auch einen Zwang habe, immer besondere Elemente zu senden.
EDIT: Dies ist der Ansatz, den ich vor der Veröffentlichung hatte:
Fixpoint ElementSize (E : element): nat :=
match E with
| n_fun n E0 => (ElementSize E0) + 1
| _ => 0
end.
Definition Size (E : especial) := ElementSize E.
Sicherlich sind die Dinge hier nicht in Ordnung und die Typen sind falsch (Tipp, versuchen Sie 'Über C'.Ich schlage vor, dass Sie zunächst die Funktion size für "element" definieren und dann mit dem Record Accessor eine Größe für "especial" (sic) erstellen. – ejgallego
Ich habe genau das gemacht, was Sie vorgeschlagen haben, scheint der natürlichste Weg zu sein, aber ich wurde aufgefordert, es mit nur einem Fixpoint zu machen, wo ich stecken geblieben bin. Ich habe bearbeitet, um ein paar Tippfehler zu beheben und einige Details hinzuzufügen. – Sara
Oh, das scheint eine seltsame Forderung zu sein, siehe die Antwort, da ich hier keinen vollständigen Code kopieren kann. – ejgallego