2016-07-04 15 views
0

Ist es möglich, Quotienten eine Familie von gegenseitig rekursiven Datentypen in Isabelle/HOL den quotient_type Mechanismus mit einer Familie von Äquivalenzbeziehungen mit?eine für beiden Seiten rekursive Familie von Datentypen Quotienting

Wenn ja, ist es ein gutes Beispiel für diese schon irgendwo? Das Durchsuchen der Isabelle-Dokumentation und des Papiers, das den überarbeiteten quotient_type-Mechanismus beschreibt, erweist sich als nicht sehr hilfreich.

Antwort

2

Der Befehl quotient_type kann nur ein Typ zu einer Zeit handhaben. Wenn Sie einen Quotienten über mehrere gemeinsame Typen erstellen möchten, müssen Sie die Codierung und Decodierung manuell durchführen, aber das ist ziemlich einfach.

Angenommen, Ihre zwei Arten t1 und t2 mit den Äquivalenzbeziehungen r1 :: t1 => t1 => bool und r2 :: t2 => t2 => bool sind. Dann

quotient_type q = "t1 + t2"/"rel_sum r1 r2" 

ist der kombinierte Quotienten-Typ. Sie können dann die beiden Quotienten als Projektionen definieren:

lift_definition Abs1 :: "t1 ⇒ q" is "Inl" . 
lift_definition Abs2 :: "t2 ⇒ q" is "Inr" . 

typedef q1 = "range Abs1" by blast 
typedef q2 = "range Abs2" by blast 

Mit setup_lifting Sie q1 und q2 mit dem Hebe Paket registrieren können, auch. Dann erhalten Sie eine anständige Automatisierung zum Heben von Proofs und Definitionen. Sie müssen nur zwei Hebeschritte (zuerst von t1 + t2 bis q und dann von q bis q1 oder q2) für Definitionen und zwei unkontrollierende Schritte für Beweise durchführen.

+0

Danke das ist genau das, was ich suchte. Übrigens könnte dieser Trick vielleicht zur Isabelle-Dokumentation hinzugefügt werden. –