(* Title: HOL/Examples/Records.thy Author: Wolfgang Naraschewski, TU Muenchen Author: Norbert Schirmer, TU Muenchen Author: Norbert Schirmer, Apple, 2022 Author: Markus Wenzel, TU Muenchen
*)
section‹Using extensible records in HOL -- points and coloured points›
theory Records imports Main begin
subsection‹Points›
record point =
xpos :: nat
ypos :: nat
text‹
Apart many other things, above recorddeclaration produces the
following theorems: ›
thm point.simps thm point.iffs thm point.defs
text‹
The set of theorems @{thm [source] point.simps} is added
automatically to the standard simpset, @{thm [source] point.iffs} is
added to the Classical Reasoner and Simplifier context.
🚫Record declarations define new typesand type abbreviations:
@{text [display] ‹point = (xpos :: nat, ypos :: nat) = () point_ext_type 'a point_scheme = \xpos :: nat, ypos :: nat, ... :: 'a) = 'a point_ext_type\} ›
text‹ 🚫 May not apply🍋‹getX›to @{term [source] "\xpos' = 2, ypos' = 0\"}
--- type error. ›
text‹🚫 Polymorphic records.›
record'a point'' = point +
content :: 'a
type_synonym cpoint'' = "colour point''"
text‹Updating a record field with an identical valueis simplified.› lemma"r\xpos := xpos r\ = r" by simp
text‹Only the most recent update to a component survives simplification.› lemma"r\xpos := x, ypos := y, xpos := x'\ = r\ypos := y, xpos := x'\" by simp
text‹ In some cases its convenient to automatically split (quantified) records. For this purpose there is the simproc @{ML [source] "Record.split_simproc"} and the tactic @{ML [source] "Record.split_simp_tac"}. The simplification
procedure only splits the records, whereas the tactic also simplifies the
resulting goal with the standard record simplification rules. A
(generalized) predicate on the recordis passed as parameter that decides
whether or how `deep' to split the record. It can peek on the subterm
starting at the quantified occurrence of the record (including the
quantifier). The value🚫‹0› indicates no split, a value greater 🚫‹0› splits up to the given bound of record extension andfinally the value🚫‹~1› completely splits the record. @{ML [source] "Record.split_simp_tac"} additionally takes a list of equations for
simplification and can also split fixed record variables. ›
text‹
The simprocs that are activated by default are: 🚫 @{ML [source] Record.simproc}: field selection of (nested) record updates. 🚫 @{ML [source] Record.upd_simproc}: nested record updates. 🚫 @{ML [source] Record.eq_simproc}: (componentwise) equality of records. ›
text‹By default record updates are not ordered by simplification.›
schematic_goal "r\b := x, a:= y\ = ?X" by simp
text‹Normalisation towards an update ordering (string ordering of update function names) can
be configured as follows.›
schematic_goal "r\b := y, a := x\ = ?X"
supply [[record_sort_updates]] by simp
text‹Note the interplay between update ordering andrecord equality. Without update ordering
the following equality is handled by @{ML [source] Record.eq_simproc}. Record equality isthus
solved by componentwise comparison of all the fields of the records which can be expensive in the presence of many fields.›
setup‹ let
val N = 300 in Record.add_record {overloaded = false} ([], 🍋‹large_record›) NONE
(map (fn i => (Binding.make ("fld_" ^ string_of_int i, 🍋), @{typ nat}, Mixfix.NoSyn))
(1 upto N)) end ›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.