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.
Danke das ist genau das, was ich suchte. Übrigens könnte dieser Trick vielleicht zur Isabelle-Dokumentation hinzugefügt werden. –