@@ -23,7 +23,7 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
***********************************************************************************) | |||
@@ -23,7 +23,7 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
*******************************************************************************\***) | |||
@@ -31,7 +31,7 @@ section\<open>Basic Data Types\<close> | |||
text\<open> | |||
\label{sec:Core_DOM_Basic_Datatypes} | |||
This theory formalizes the primitive data types used by the DOM standard~\cite{dom-specification}. | |||
\<close> | |||
\<close> | |||
theory Core_DOM_Basic_Datatypes | |||
imports | |||
Main | |||
@@ -39,16 +39,16 @@ begin | |||
type_synonym USVString = string | |||
text\<open> | |||
In the official standard, the type @{type "USVString"} corresponds to the set of all possible | |||
In the official standard, the type @{type "USVString"} corresponds to the set of all possible | |||
sequences of Unicode scalar values. As we are not interested in analyzing the specifics of Unicode | |||
strings, we just model @{type "USVString"} using the standard type @{type "string"} of Isabelle/HOL. | |||
\<close> | |||
\<close> | |||
type_synonym DOMString = string | |||
text\<open> | |||
In the official standard, the type @{type "DOMString"} corresponds to the set of all possible | |||
sequences of code units, commonly interpreted as UTF-16 encoded strings. Again, as we are not | |||
interested in analyzing the specifics of Unicode strings, we just model @{type "DOMString"} using | |||
In the official standard, the type @{type "DOMString"} corresponds to the set of all possible | |||
sequences of code units, commonly interpreted as UTF-16 encoded strings. Again, as we are not | |||
interested in analyzing the specifics of Unicode strings, we just model @{type "DOMString"} using | |||
the standard type @{type "string"} of Isabelle/HOL. | |||
\<close> | |||
@@ -23,7 +23,7 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
***********************************************************************************) | |||
@@ -23,18 +23,18 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
***********************************************************************************) | |||
section\<open>The Class Infrastructure\<close> | |||
text\<open>In this theory, we introduce the basic infrastructure for our encoding | |||
text\<open>In this theory, we introduce the basic infrastructure for our encoding | |||
of classes.\<close> | |||
theory BaseClass | |||
imports | |||
"HOL-Library.Finite_Map" | |||
"../pointers/Ref" | |||
"../Core_DOM_Basic_Datatypes" | |||
"../Core_DOM_Basic_Datatypes" | |||
begin | |||
named_theorems instances | |||
@@ -43,26 +43,26 @@ consts get :: 'a | |||
consts put :: 'a | |||
consts delete :: 'a | |||
text \<open>Overall, the definition of the class types follows closely the one of the pointer | |||
types. Instead of datatypes, we use records for our classes. This allows us to, first, | |||
text \<open>Overall, the definition of the class types follows closely the one of the pointer | |||
types. Instead of datatypes, we use records for our classes. This allows us to, first, | |||
make use of record inheritance, which is, in addition to the type synonyms of | |||
previous class types, the second place where the inheritance relationship of | |||
previous class types, the second place where the inheritance relationship of | |||
our types manifest. Second, we get a convenient notation to define classes, in | |||
addition to automatically generated getter and setter functions.\<close> | |||
text \<open>Along with our class types, we also develop our heap type, which is a finite | |||
map at its core. It is important to note that while the map stores a mapping | |||
from @{term "object_ptr"} to @{term "Object"}, we restrict the type variables | |||
of the record extension slot of @{term "Object"} in such a way that allows | |||
down-casting, but requires a bit of taking-apart and re-assembling of our records | |||
text \<open>Along with our class types, we also develop our heap type, which is a finite | |||
map at its core. It is important to note that while the map stores a mapping | |||
from @{term "object_ptr"} to @{term "Object"}, we restrict the type variables | |||
of the record extension slot of @{term "Object"} in such a way that allows | |||
down-casting, but requires a bit of taking-apart and re-assembling of our records | |||
before they are stored in the heap.\<close> | |||
text \<open>Throughout the theory files, we will use underscore case to reference pointer | |||
text \<open>Throughout the theory files, we will use underscore case to reference pointer | |||
types, and camel case for class types.\<close> | |||
text \<open>Every class type contains at least one attribute; nothing. This is used for | |||
two purposes: first, the record package does not allow records without any | |||
attributes. Second, we will use the getter of nothing later to check whether a | |||
text \<open>Every class type contains at least one attribute; nothing. This is used for | |||
two purposes: first, the record package does not allow records without any | |||
attributes. Second, we will use the getter of nothing later to check whether a | |||
class of the correct type could be retrieved, for which we will be able to use | |||
our infrastructure regarding the behaviour of getters across different heaps.\<close> | |||
@@ -23,7 +23,7 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
***********************************************************************************) | |||
@@ -36,45 +36,45 @@ begin | |||
subsubsection\<open>CharacterData\<close> | |||
text\<open>The type @{type "DOMString"} is a type synonym for @{type "string"}, defined | |||
text\<open>The type @{type "DOMString"} is a type synonym for @{type "string"}, defined | |||
\autoref{sec:Core_DOM_Basic_Datatypes}.\<close> | |||
record RCharacterData = RNode + | |||
nothing :: unit | |||
val :: DOMString | |||
register_default_tvars "'CharacterData RCharacterData_ext" | |||
register_default_tvars "'CharacterData RCharacterData_ext" | |||
type_synonym 'CharacterData CharacterData = "'CharacterData option RCharacterData_scheme" | |||
register_default_tvars "'CharacterData CharacterData" | |||
type_synonym ('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Node, | |||
register_default_tvars "'CharacterData CharacterData" | |||
type_synonym ('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Node, | |||
'Element, 'CharacterData) Node | |||
= "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, | |||
= "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, | |||
'CharacterData option RCharacterData_ext + 'Node, 'Element) Node" | |||
register_default_tvars "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Node, | |||
'Element, 'CharacterData) Node" | |||
type_synonym ('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Object, 'Node, | |||
register_default_tvars "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Node, | |||
'Element, 'CharacterData) Node" | |||
type_synonym ('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Object, 'Node, | |||
'Element, 'CharacterData) Object | |||
= "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Object, | |||
= "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Object, | |||
'CharacterData option RCharacterData_ext + 'Node, | |||
'Element) Object" | |||
register_default_tvars "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Object, | |||
'Node, 'Element, 'CharacterData) Object" | |||
register_default_tvars "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Object, | |||
'Node, 'Element, 'CharacterData) Object" | |||
type_synonym ('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
type_synonym ('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
'shadow_root_ptr, 'Object, 'Node, 'Element, 'CharacterData) heap | |||
= "('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, 'shadow_root_ptr, | |||
= "('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, 'shadow_root_ptr, | |||
'Object, 'CharacterData option RCharacterData_ext + 'Node, 'Element) heap" | |||
register_default_tvars "('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
'shadow_root_ptr, 'Object, 'Node, 'Element, 'CharacterData) heap" | |||
register_default_tvars "('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
'shadow_root_ptr, 'Object, 'Node, 'Element, 'CharacterData) heap" | |||
type_synonym heap\<^sub>f\<^sub>i\<^sub>n\<^sub>a\<^sub>l = "(unit, unit, unit, unit, unit, unit, unit, unit, unit, unit) heap" | |||
definition character_data_ptr_kinds :: "(_) heap \<Rightarrow> (_) character_data_ptr fset" | |||
where | |||
"character_data_ptr_kinds heap = the |`| (cast |`| (ffilter is_character_data_ptr_kind | |||
where | |||
"character_data_ptr_kinds heap = the |`| (cast |`| (ffilter is_character_data_ptr_kind | |||
(node_ptr_kinds heap)))" | |||
lemma character_data_ptr_kinds_simp [simp]: | |||
"character_data_ptr_kinds (Heap (fmupd (cast character_data_ptr) character_data (the_heap h))) | |||
"character_data_ptr_kinds (Heap (fmupd (cast character_data_ptr) character_data (the_heap h))) | |||
= {|character_data_ptr|} |\<union>| character_data_ptr_kinds h" | |||
apply(auto simp add: character_data_ptr_kinds_def)[1] | |||
by force | |||
@@ -94,7 +94,7 @@ adhoc_overloading cast cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^su | |||
abbreviation cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a :: "(_) Object \<Rightarrow> (_) CharacterData option" | |||
where | |||
"cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a obj \<equiv> (case cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e obj of Some node \<Rightarrow> cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a node | |||
"cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a obj \<equiv> (case cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e obj of Some node \<Rightarrow> cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a node | |||
| None \<Rightarrow> None)" | |||
adhoc_overloading cast cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a | |||
@@ -123,15 +123,15 @@ abbreviation is_character_data_kind\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^su | |||
adhoc_overloading is_character_data_kind is_character_data_kind\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t | |||
lemma character_data_ptr_kinds_commutes [simp]: | |||
"cast character_data_ptr |\<in>| node_ptr_kinds h | |||
"cast character_data_ptr |\<in>| node_ptr_kinds h | |||
\<longleftrightarrow> character_data_ptr |\<in>| character_data_ptr_kinds h" | |||
apply(auto simp add: character_data_ptr_kinds_def)[1] | |||
by (metis character_data_ptr_casts_commute2 comp_eq_dest_lhs ffmember_filter fimage_eqI | |||
by (metis character_data_ptr_casts_commute2 comp_eq_dest_lhs ffmember_filter fimage_eqI | |||
is_character_data_ptr_kind_none | |||
option.distinct(1) option.sel) | |||
definition get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a :: "(_) character_data_ptr \<Rightarrow> (_) heap \<Rightarrow> (_) CharacterData option" | |||
where | |||
where | |||
"get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr h = Option.bind (get\<^sub>N\<^sub>o\<^sub>d\<^sub>e (cast character_data_ptr) h) cast" | |||
adhoc_overloading get get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a | |||
@@ -160,11 +160,12 @@ sublocale l_get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_lemmas b | |||
lemma get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_type_wf: | |||
assumes "type_wf h" | |||
shows "character_data_ptr |\<in>| character_data_ptr_kinds h | |||
shows "character_data_ptr |\<in>| character_data_ptr_kinds h | |||
\<longleftrightarrow> get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr h \<noteq> None" | |||
using l_type_wf\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_axioms assms | |||
apply(simp add: type_wf_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def l_type_wf\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def) | |||
by (metis assms bind.bind_lzero character_data_ptr_kinds_commutes fmember.rep_eq local.get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_type_wf option.exhaust option.simps(3)) | |||
by (metis assms bind.bind_lzero character_data_ptr_kinds_commutes fmember.rep_eq | |||
local.get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_type_wf option.exhaust option.simps(3)) | |||
end | |||
global_interpretation l_get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_lemmas type_wf | |||
@@ -172,7 +173,7 @@ global_interpretation l_get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^su | |||
definition put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a :: "(_) character_data_ptr \<Rightarrow> (_) CharacterData \<Rightarrow> (_) heap \<Rightarrow> (_) heap" | |||
where | |||
"put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr character_data = put\<^sub>N\<^sub>o\<^sub>d\<^sub>e (cast character_data_ptr) | |||
"put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr character_data = put\<^sub>N\<^sub>o\<^sub>d\<^sub>e (cast character_data_ptr) | |||
(cast character_data)" | |||
adhoc_overloading put put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a | |||
@@ -196,16 +197,16 @@ lemma cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub | |||
lemma cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_none [simp]: | |||
"cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a node = None \<longleftrightarrow> \<not> (\<exists>character_data. cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e character_data = node)" | |||
apply(auto simp add: cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def RObject.extend_def RNode.extend_def | |||
apply(auto simp add: cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def RObject.extend_def RNode.extend_def | |||
split: sum.splits)[1] | |||
by (metis (full_types) RNode.select_convs(2) RNode.surjective old.unit.exhaust) | |||
lemma cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_some [simp]: | |||
lemma cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_some [simp]: | |||
"cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a node = Some character_data \<longleftrightarrow> cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e character_data = node" | |||
by(auto simp add: cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def RObject.extend_def RNode.extend_def | |||
by(auto simp add: cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def RObject.extend_def RNode.extend_def | |||
split: sum.splits) | |||
lemma cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_inv [simp]: | |||
lemma cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_inv [simp]: | |||
"cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a (cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e character_data) = Some character_data" | |||
by simp | |||
@@ -214,19 +215,19 @@ lemma cast_element_not_character_data [simp]: | |||
"(cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e character_data \<noteq> cast\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e element)" | |||
by(auto simp add: cast\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def cast\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def RNode.extend_def) | |||
lemma get_CharacterData_simp1 [simp]: | |||
"get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr (put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr character_data h) | |||
lemma get_CharacterData_simp1 [simp]: | |||
"get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr (put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr character_data h) | |||
= Some character_data" | |||
by(auto simp add: get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def) | |||
lemma get_CharacterData_simp2 [simp]: | |||
"character_data_ptr \<noteq> character_data_ptr' \<Longrightarrow> get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr | |||
lemma get_CharacterData_simp2 [simp]: | |||
"character_data_ptr \<noteq> character_data_ptr' \<Longrightarrow> get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr | |||
(put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr' character_data h) = get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr h" | |||
by(auto simp add: get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def) | |||
lemma get_CharacterData_simp3 [simp]: | |||
lemma get_CharacterData_simp3 [simp]: | |||
"get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr (put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr f h) = get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr h" | |||
by(auto simp add: get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def) | |||
lemma get_CharacterData_simp4 [simp]: | |||
lemma get_CharacterData_simp4 [simp]: | |||
"get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a element_ptr (put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t character_data_ptr f h) = get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a element_ptr h" | |||
by(auto simp add: get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
@@ -244,7 +245,7 @@ abbreviation "create_character_data_obj val_arg | |||
definition new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a :: "(_) heap \<Rightarrow> ((_) character_data_ptr \<times> (_) heap)" | |||
where | |||
"new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a h = | |||
(let new_character_data_ptr = character_data_ptr.Ref (Suc (fMax (character_data_ptr.the_ref | |||
(let new_character_data_ptr = character_data_ptr.Ref (Suc (fMax (character_data_ptr.the_ref | |||
|`| (character_data_ptrs h)))) in | |||
(new_character_data_ptr, put new_character_data_ptr (create_character_data_obj '''') h))" | |||
@@ -255,17 +256,19 @@ lemma new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub> | |||
unfolding new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def Let_def | |||
using put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_ptr_in_heap by blast | |||
lemma new_character_data_ptr_new: | |||
"character_data_ptr.Ref (Suc (fMax (finsert 0 (character_data_ptr.the_ref |`| character_data_ptrs h)))) | |||
lemma new_character_data_ptr_new: | |||
"character_data_ptr.Ref (Suc (fMax (finsert 0 (character_data_ptr.the_ref |`| character_data_ptrs h)))) | |||
|\<notin>| character_data_ptrs h" | |||
by (metis Suc_n_not_le_n character_data_ptr.sel(1) fMax_ge fimage_finsert finsertI1 finsertI2 set_finsert) | |||
by (metis Suc_n_not_le_n character_data_ptr.sel(1) fMax_ge fimage_finsert finsertI1 | |||
finsertI2 set_finsert) | |||
lemma new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_ptr_not_in_heap: | |||
assumes "new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a h = (new_character_data_ptr, h')" | |||
shows "new_character_data_ptr |\<notin>| character_data_ptr_kinds h" | |||
using assms | |||
unfolding new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def | |||
by (metis Pair_inject character_data_ptrs_def fMax_finsert fempty_iff ffmember_filter fimage_is_fempty is_character_data_ptr_ref max_0L new_character_data_ptr_new) | |||
by (metis Pair_inject character_data_ptrs_def fMax_finsert fempty_iff ffmember_filter | |||
fimage_is_fempty is_character_data_ptr_ref max_0L new_character_data_ptr_new) | |||
lemma new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_new_ptr: | |||
assumes "new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a h = (new_character_data_ptr, h')" | |||
@@ -313,7 +316,7 @@ definition a_known_ptr :: "(_) object_ptr \<Rightarrow> bool" | |||
where | |||
"a_known_ptr ptr = (known_ptr ptr \<or> is_character_data_ptr ptr)" | |||
lemma known_ptr_not_character_data_ptr: | |||
lemma known_ptr_not_character_data_ptr: | |||
"\<not>is_character_data_ptr ptr \<Longrightarrow> a_known_ptr ptr \<Longrightarrow> known_ptr ptr" | |||
by(simp add: a_known_ptr_def) | |||
end | |||
@@ -331,13 +334,15 @@ lemma known_ptrs_known_ptr: "a_known_ptrs h \<Longrightarrow> ptr |\<in>| object | |||
apply(simp add: a_known_ptrs_def) | |||
using notin_fset by fastforce | |||
lemma known_ptrs_preserved: | |||
lemma known_ptrs_preserved: | |||
"object_ptr_kinds h = object_ptr_kinds h' \<Longrightarrow> a_known_ptrs h = a_known_ptrs h'" | |||
by(auto simp add: a_known_ptrs_def) | |||
lemma known_ptrs_subset: | |||
lemma known_ptrs_subset: | |||
"object_ptr_kinds h' |\<subseteq>| object_ptr_kinds h \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
by(simp add: a_known_ptrs_def less_eq_fset.rep_eq subsetD) | |||
lemma known_ptrs_new_ptr: "object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
lemma known_ptrs_new_ptr: | |||
"object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> | |||
a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
by(simp add: a_known_ptrs_def) | |||
end | |||
global_interpretation l_known_ptrs\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a known_ptr defines known_ptrs = a_known_ptrs . | |||
@@ -23,18 +23,18 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
***********************************************************************************) | |||
section\<open>Document\<close> | |||
text\<open>In this theory, we introduce the types for the Document class.\<close> | |||
theory DocumentClass | |||
imports | |||
imports | |||
CharacterDataClass | |||
begin | |||
begin | |||
text\<open>The type @{type "doctype"} is a type synonym for @{type "string"}, defined | |||
text\<open>The type @{type "doctype"} is a type synonym for @{type "string"}, defined | |||
in \autoref{sec:Core_DOM_Basic_Datatypes}.\<close> | |||
record ('node_ptr, 'element_ptr, 'character_data_ptr) RDocument = RObject + | |||
@@ -42,35 +42,35 @@ record ('node_ptr, 'element_ptr, 'character_data_ptr) RDocument = RObject + | |||
doctype :: doctype | |||
document_element :: "(_) element_ptr option" | |||
disconnected_nodes :: "('node_ptr, 'element_ptr, 'character_data_ptr) node_ptr list" | |||
type_synonym | |||
type_synonym | |||
('node_ptr, 'element_ptr, 'character_data_ptr, 'Document) Document | |||
= "('node_ptr, 'element_ptr, 'character_data_ptr, 'Document option) RDocument_scheme" | |||
register_default_tvars | |||
register_default_tvars | |||
"('node_ptr, 'element_ptr, 'character_data_ptr, 'Document) Document" | |||
type_synonym | |||
('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Object, 'Node, | |||
type_synonym | |||
('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, 'Object, 'Node, | |||
'Element, 'CharacterData, 'Document) Object | |||
= "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, | |||
= "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, | |||
('node_ptr, 'element_ptr, 'character_data_ptr, 'Document option) | |||
RDocument_ext + 'Object, 'Node, 'Element, 'CharacterData) Object" | |||
register_default_tvars "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, | |||
'Object, 'Node, 'Element, 'CharacterData, 'Document) Object" | |||
register_default_tvars "('node_ptr, 'element_ptr, 'character_data_ptr, 'shadow_root_ptr, | |||
'Object, 'Node, 'Element, 'CharacterData, 'Document) Object" | |||
type_synonym ('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
type_synonym ('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
'shadow_root_ptr, 'Object, 'Node, 'Element, 'CharacterData, 'Document) heap | |||
= "('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
'shadow_root_ptr, | |||
('node_ptr, 'element_ptr, 'character_data_ptr, 'Document option) RDocument_ext + 'Object, 'Node, | |||
= "('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
'shadow_root_ptr, | |||
('node_ptr, 'element_ptr, 'character_data_ptr, 'Document option) RDocument_ext + 'Object, 'Node, | |||
'Element, 'CharacterData) heap" | |||
register_default_tvars | |||
"('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
register_default_tvars | |||
"('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
'shadow_root_ptr, 'Object, 'Node, 'Element, 'CharacterData, 'Document) heap" | |||
type_synonym heap\<^sub>f\<^sub>i\<^sub>n\<^sub>a\<^sub>l = "(unit, unit, unit, unit, unit, unit, unit, unit, unit, unit, unit) heap" | |||
definition document_ptr_kinds :: "(_) heap \<Rightarrow> (_) document_ptr fset" | |||
where | |||
"document_ptr_kinds heap = the |`| (cast\<^sub>o\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>_\<^sub>p\<^sub>t\<^sub>r\<^sub>2\<^sub>d\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>_\<^sub>p\<^sub>t\<^sub>r |`| | |||
"document_ptr_kinds heap = the |`| (cast\<^sub>o\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>_\<^sub>p\<^sub>t\<^sub>r\<^sub>2\<^sub>d\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>_\<^sub>p\<^sub>t\<^sub>r |`| | |||
(ffilter is_document_ptr_kind (object_ptr_kinds heap)))" | |||
definition document_ptrs :: "(_) heap \<Rightarrow> (_) document_ptr fset" | |||
@@ -86,7 +86,7 @@ adhoc_overloading cast cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^su | |||
definition cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t:: "(_) Document \<Rightarrow> (_) Object" | |||
where | |||
"cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t document = (RObject.extend (RObject.truncate document) | |||
"cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t document = (RObject.extend (RObject.truncate document) | |||
(Inr (Inl (RObject.more document))))" | |||
adhoc_overloading cast cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t | |||
@@ -94,20 +94,20 @@ definition is_document_kind :: "(_) Object \<Rightarrow> bool" | |||
where | |||
"is_document_kind ptr \<longleftrightarrow> cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t ptr \<noteq> None" | |||
lemma document_ptr_kinds_simp [simp]: | |||
"document_ptr_kinds (Heap (fmupd (cast document_ptr) document (the_heap h))) | |||
lemma document_ptr_kinds_simp [simp]: | |||
"document_ptr_kinds (Heap (fmupd (cast document_ptr) document (the_heap h))) | |||
= {|document_ptr|} |\<union>| document_ptr_kinds h" | |||
apply(auto simp add: document_ptr_kinds_def)[1] | |||
by force | |||
lemma document_ptr_kinds_commutes [simp]: | |||
lemma document_ptr_kinds_commutes [simp]: | |||
"cast document_ptr |\<in>| object_ptr_kinds h \<longleftrightarrow> document_ptr |\<in>| document_ptr_kinds h" | |||
apply(auto simp add: object_ptr_kinds_def document_ptr_kinds_def)[1] | |||
by (metis (no_types, lifting) document_ptr_casts_commute2 document_ptr_document_ptr_cast | |||
by (metis (no_types, lifting) document_ptr_casts_commute2 document_ptr_document_ptr_cast | |||
ffmember_filter fimage_eqI fset.map_comp option.sel) | |||
definition get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t :: "(_) document_ptr \<Rightarrow> (_) heap \<Rightarrow> (_) Document option" | |||
where | |||
where | |||
"get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr h = Option.bind (get (cast document_ptr) h) cast" | |||
adhoc_overloading get get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t | |||
@@ -115,7 +115,7 @@ locale l_type_wf_def\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^s | |||
begin | |||
definition a_type_wf :: "(_) heap \<Rightarrow> bool" | |||
where | |||
"a_type_wf h = (CharacterDataClass.type_wf h \<and> | |||
"a_type_wf h = (CharacterDataClass.type_wf h \<and> | |||
(\<forall>document_ptr \<in> fset (document_ptr_kinds h). get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr h \<noteq> None))" | |||
end | |||
global_interpretation l_type_wf_def\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t defines type_wf = a_type_wf . | |||
@@ -136,7 +136,8 @@ lemma get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_type_w | |||
shows "document_ptr |\<in>| document_ptr_kinds h \<longleftrightarrow> get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr h \<noteq> None" | |||
using l_type_wf\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_axioms assms | |||
apply(simp add: type_wf_defs get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def l_type_wf\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
by (metis document_ptr_kinds_commutes fmember.rep_eq is_none_bind is_none_simps(1) is_none_simps(2) local.get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_type_wf) | |||
by (metis document_ptr_kinds_commutes fmember.rep_eq is_none_bind is_none_simps(1) | |||
is_none_simps(2) local.get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_type_wf) | |||
end | |||
global_interpretation l_get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_lemmas type_wf by unfold_locales | |||
@@ -164,15 +165,15 @@ lemma cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub | |||
apply(simp add: cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def RObject.extend_def) | |||
by (metis (full_types) RObject.surjective old.unit.exhaust) | |||
lemma cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_none [simp]: | |||
lemma cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_none [simp]: | |||
"cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t obj = None \<longleftrightarrow> \<not> (\<exists>document. cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t document = obj)" | |||
apply(auto simp add: cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def RObject.extend_def | |||
apply(auto simp add: cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def RObject.extend_def | |||
split: sum.splits)[1] | |||
by (metis (full_types) RObject.select_convs(2) RObject.surjective old.unit.exhaust) | |||
lemma cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_some [simp]: | |||
lemma cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_some [simp]: | |||
"cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t obj = Some document \<longleftrightarrow> cast document = obj" | |||
by(auto simp add: cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def RObject.extend_def | |||
by(auto simp add: cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def RObject.extend_def | |||
split: sum.splits) | |||
lemma cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_inv [simp]: "cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t (cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t document) = Some document" | |||
@@ -183,24 +184,26 @@ lemma cast_document_not_node [simp]: | |||
"cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t node \<noteq> cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t document" | |||
by(auto simp add: cast\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def RObject.extend_def) | |||
lemma get_document_ptr_simp1 [simp]: | |||
lemma get_document_ptr_simp1 [simp]: | |||
"get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr (put\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr document h) = Some document" | |||
by(auto simp add: get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
lemma get_document_ptr_simp2 [simp]: | |||
"document_ptr \<noteq> document_ptr' | |||
lemma get_document_ptr_simp2 [simp]: | |||
"document_ptr \<noteq> document_ptr' | |||
\<Longrightarrow> get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr (put\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr' document h) = get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr h" | |||
by(auto simp add: get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
lemma get_document_ptr_simp3 [simp]: | |||
lemma get_document_ptr_simp3 [simp]: | |||
"get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr (put\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr f h) = get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr h" | |||
by(auto simp add: get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
lemma get_document_ptr_simp4 [simp]: "get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr (put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr f h) = get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr h" | |||
lemma get_document_ptr_simp4 [simp]: | |||
"get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr (put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr f h) = get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr h" | |||
by(auto simp add: get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def) | |||
lemma get_document_ptr_simp5 [simp]: | |||
lemma get_document_ptr_simp5 [simp]: | |||
"get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr (put\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr f h) = get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr h" | |||
by(auto simp add: get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
lemma get_document_ptr_simp6 [simp]: "get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr (put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr f h) = get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr h" | |||
lemma get_document_ptr_simp6 [simp]: | |||
"get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr (put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr f h) = get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t document_ptr h" | |||
by(auto simp add: get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def) | |||
lemma new\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t [simp]: | |||
@@ -217,18 +220,18 @@ lemma new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub> | |||
abbreviation | |||
abbreviation | |||
create_document_obj :: "char list \<Rightarrow> (_) element_ptr option \<Rightarrow> (_) node_ptr list \<Rightarrow> (_) Document" | |||
where | |||
"create_document_obj doctype_arg document_element_arg disconnected_nodes_arg | |||
\<equiv> \<lparr> RObject.nothing = (), RDocument.nothing = (), doctype = doctype_arg, | |||
\<equiv> \<lparr> RObject.nothing = (), RDocument.nothing = (), doctype = doctype_arg, | |||
document_element = document_element_arg, | |||
disconnected_nodes = disconnected_nodes_arg, \<dots> = None \<rparr>" | |||
definition new\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t :: "(_)heap \<Rightarrow> ((_) document_ptr \<times> (_) heap)" | |||
where | |||
"new\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t h = | |||
(let new_document_ptr = document_ptr.Ref (Suc (fMax (finsert 0 (document_ptr.the_ref |`| (document_ptrs h))))) | |||
"new\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t h = | |||
(let new_document_ptr = document_ptr.Ref (Suc (fMax (finsert 0 (document_ptr.the_ref |`| (document_ptrs h))))) | |||
in | |||
(new_document_ptr, put new_document_ptr (create_document_obj '''' None []) h))" | |||
@@ -239,8 +242,8 @@ lemma new\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_ptr_in | |||
unfolding new\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def Let_def | |||
using put\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_ptr_in_heap by blast | |||
lemma new_document_ptr_new: | |||
"document_ptr.Ref (Suc (fMax (finsert 0 (document_ptr.the_ref |`| document_ptrs h)))) | |||
lemma new_document_ptr_new: | |||
"document_ptr.Ref (Suc (fMax (finsert 0 (document_ptr.the_ref |`| document_ptrs h)))) | |||
|\<notin>| document_ptrs h" | |||
by (metis Suc_n_not_le_n document_ptr.sel(1) fMax_ge fimage_finsert finsertI1 finsertI2 set_finsert) | |||
@@ -249,7 +252,7 @@ lemma new\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_ptr_no | |||
shows "new_document_ptr |\<notin>| document_ptr_kinds h" | |||
using assms | |||
unfolding new\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def | |||
by (metis Pair_inject document_ptrs_def fMax_finsert fempty_iff ffmember_filter | |||
by (metis Pair_inject document_ptrs_def fMax_finsert fempty_iff ffmember_filter | |||
fimage_is_fempty is_document_ptr_ref max_0L new_document_ptr_new) | |||
lemma new\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_new_ptr: | |||
@@ -321,13 +324,15 @@ lemma known_ptrs_known_ptr: "a_known_ptrs h \<Longrightarrow> ptr |\<in>| object | |||
apply(simp add: a_known_ptrs_def) | |||
using notin_fset by fastforce | |||
lemma known_ptrs_preserved: | |||
lemma known_ptrs_preserved: | |||
"object_ptr_kinds h = object_ptr_kinds h' \<Longrightarrow> a_known_ptrs h = a_known_ptrs h'" | |||
by(auto simp add: a_known_ptrs_def) | |||
lemma known_ptrs_subset: | |||
lemma known_ptrs_subset: | |||
"object_ptr_kinds h' |\<subseteq>| object_ptr_kinds h \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
by(simp add: a_known_ptrs_def less_eq_fset.rep_eq subsetD) | |||
lemma known_ptrs_new_ptr: "object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
lemma known_ptrs_new_ptr: | |||
"object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> | |||
a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
by(simp add: a_known_ptrs_def) | |||
end | |||
global_interpretation l_known_ptrs\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t known_ptr defines known_ptrs = a_known_ptrs . | |||
@@ -23,7 +23,7 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
***********************************************************************************) | |||
@@ -41,33 +41,33 @@ subsubsection\<open>Node\<close> | |||
record RNode = RObject | |||
+ nothing :: unit | |||
register_default_tvars "'Node RNode_ext" | |||
register_default_tvars "'Node RNode_ext" | |||
type_synonym 'Node Node = "'Node RNode_scheme" | |||
register_default_tvars "'Node Node" | |||
register_default_tvars "'Node Node" | |||
type_synonym ('Object, 'Node) Object = "('Node RNode_ext + 'Object) Object" | |||
register_default_tvars "('Object, 'Node) Object" | |||
register_default_tvars "('Object, 'Node) Object" | |||
type_synonym ('object_ptr, 'node_ptr, 'Object, 'Node) heap | |||
= "('node_ptr node_ptr + 'object_ptr, 'Node RNode_ext + 'Object) heap" | |||
register_default_tvars | |||
"('object_ptr, 'node_ptr, 'Object, 'Node) heap" | |||
"('object_ptr, 'node_ptr, 'Object, 'Node) heap" | |||
type_synonym heap\<^sub>f\<^sub>i\<^sub>n\<^sub>a\<^sub>l = "(unit, unit, unit, unit) heap" | |||
definition node_ptr_kinds :: "(_) heap \<Rightarrow> (_) node_ptr fset" | |||
where | |||
"node_ptr_kinds heap = | |||
"node_ptr_kinds heap = | |||
(the |`| (cast\<^sub>o\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>_\<^sub>p\<^sub>t\<^sub>r\<^sub>2\<^sub>n\<^sub>o\<^sub>d\<^sub>e\<^sub>_\<^sub>p\<^sub>t\<^sub>r |`| (ffilter is_node_ptr_kind (object_ptr_kinds heap))))" | |||
lemma node_ptr_kinds_simp [simp]: | |||
"node_ptr_kinds (Heap (fmupd (cast node_ptr) node (the_heap h))) | |||
lemma node_ptr_kinds_simp [simp]: | |||
"node_ptr_kinds (Heap (fmupd (cast node_ptr) node (the_heap h))) | |||
= {|node_ptr|} |\<union>| node_ptr_kinds h" | |||
apply(auto simp add: node_ptr_kinds_def)[1] | |||
by force | |||
definition cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e :: "(_) Object \<Rightarrow> (_) Node option" | |||
where | |||
"cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e obj = (case RObject.more obj of Inl node | |||
"cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e obj = (case RObject.more obj of Inl node | |||
\<Rightarrow> Some (RObject.extend (RObject.truncate obj) node) | _ \<Rightarrow> None)" | |||
adhoc_overloading cast cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e | |||
@@ -81,7 +81,7 @@ definition is_node_kind :: "(_) Object \<Rightarrow> bool" | |||
"is_node_kind ptr \<longleftrightarrow> cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e ptr \<noteq> None" | |||
definition get\<^sub>N\<^sub>o\<^sub>d\<^sub>e :: "(_) node_ptr \<Rightarrow> (_) heap \<Rightarrow> (_) Node option" | |||
where | |||
where | |||
"get\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr h = Option.bind (get (cast node_ptr) h) cast" | |||
adhoc_overloading get get\<^sub>N\<^sub>o\<^sub>d\<^sub>e | |||
@@ -89,7 +89,7 @@ locale l_type_wf_def\<^sub>N\<^sub>o\<^sub>d\<^sub>e | |||
begin | |||
definition a_type_wf :: "(_) heap \<Rightarrow> bool" | |||
where | |||
"a_type_wf h = (ObjectClass.type_wf h | |||
"a_type_wf h = (ObjectClass.type_wf h | |||
\<and> (\<forall>node_ptr \<in> fset( node_ptr_kinds h). get\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr h \<noteq> None))" | |||
end | |||
global_interpretation l_type_wf_def\<^sub>N\<^sub>o\<^sub>d\<^sub>e defines type_wf = a_type_wf . | |||
@@ -110,8 +110,8 @@ lemma get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_type_wf: | |||
shows "node_ptr |\<in>| node_ptr_kinds h \<longleftrightarrow> get\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr h \<noteq> None" | |||
using l_type_wf\<^sub>N\<^sub>o\<^sub>d\<^sub>e_axioms assms | |||
apply(simp add: type_wf_defs get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def l_type_wf\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def) | |||
by (metis bind_eq_None_conv ffmember_filter fimage_eqI fmember.rep_eq is_node_ptr_kind_cast | |||
get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_type_wf node_ptr_casts_commute2 node_ptr_kinds_def option.sel option.simps(3)) | |||
by (metis bind_eq_None_conv ffmember_filter fimage_eqI fmember.rep_eq is_node_ptr_kind_cast | |||
get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_type_wf node_ptr_casts_commute2 node_ptr_kinds_def option.sel option.simps(3)) | |||
end | |||
global_interpretation l_get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_lemmas type_wf | |||
@@ -127,7 +127,7 @@ lemma put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_ptr_in_heap: | |||
shows "node_ptr |\<in>| node_ptr_kinds h'" | |||
using assms | |||
unfolding put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def node_ptr_kinds_def | |||
by (metis ffmember_filter fimage_eqI is_node_ptr_kind_cast node_ptr_casts_commute2 | |||
by (metis ffmember_filter fimage_eqI is_node_ptr_kind_cast node_ptr_casts_commute2 | |||
option.sel put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_ptr_in_heap) | |||
lemma put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_put_ptrs: | |||
@@ -136,14 +136,14 @@ lemma put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_put_ptrs: | |||
using assms | |||
by (simp add: put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_put_ptrs) | |||
lemma node_ptr_kinds_commutes [simp]: | |||
lemma node_ptr_kinds_commutes [simp]: | |||
"cast node_ptr |\<in>| object_ptr_kinds h \<longleftrightarrow> node_ptr |\<in>| node_ptr_kinds h" | |||
apply(auto simp add: node_ptr_kinds_def split: option.splits)[1] | |||
by (metis (no_types, lifting) ffmember_filter fimage_eqI fset.map_comp | |||
by (metis (no_types, lifting) ffmember_filter fimage_eqI fset.map_comp | |||
is_node_ptr_kind_none node_ptr_casts_commute2 | |||
option.distinct(1) option.sel) | |||
lemma node_empty [simp]: | |||
lemma node_empty [simp]: | |||
"\<lparr>RObject.nothing = (), RNode.nothing = (), \<dots> = RNode.more node\<rparr> = node" | |||
by simp | |||
@@ -151,7 +151,7 @@ lemma cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub | |||
apply(simp add: cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def RObject.extend_def) | |||
by (metis (full_types) RObject.surjective old.unit.exhaust) | |||
lemma cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_none [simp]: | |||
lemma cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_none [simp]: | |||
"cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e obj = None \<longleftrightarrow> \<not> (\<exists>node. cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t node = obj)" | |||
apply(auto simp add: cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def RObject.extend_def split: sum.splits)[1] | |||
by (metis (full_types) RObject.select_convs(2) RObject.surjective old.unit.exhaust) | |||
@@ -181,23 +181,28 @@ definition a_known_ptrs :: "(_) heap \<Rightarrow> bool" | |||
lemma known_ptrs_known_ptr: "a_known_ptrs h \<Longrightarrow> ptr |\<in>| object_ptr_kinds h \<Longrightarrow> known_ptr ptr" | |||
apply(simp add: a_known_ptrs_def) | |||
using notin_fset by fastforce | |||
lemma known_ptrs_preserved: "object_ptr_kinds h = object_ptr_kinds h' \<Longrightarrow> a_known_ptrs h = a_known_ptrs h'" | |||
lemma known_ptrs_preserved: | |||
"object_ptr_kinds h = object_ptr_kinds h' \<Longrightarrow> a_known_ptrs h = a_known_ptrs h'" | |||
by(auto simp add: a_known_ptrs_def) | |||
lemma known_ptrs_subset: "object_ptr_kinds h' |\<subseteq>| object_ptr_kinds h \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
lemma known_ptrs_subset: | |||
"object_ptr_kinds h' |\<subseteq>| object_ptr_kinds h \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
by(simp add: a_known_ptrs_def less_eq_fset.rep_eq subsetD) | |||
lemma known_ptrs_new_ptr: "object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
lemma known_ptrs_new_ptr: | |||
"object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> | |||
a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
by(simp add: a_known_ptrs_def) | |||
end | |||
global_interpretation l_known_ptrs\<^sub>N\<^sub>o\<^sub>d\<^sub>e known_ptr defines known_ptrs = a_known_ptrs . | |||
lemmas known_ptrs_defs = a_known_ptrs_def | |||
lemma known_ptrs_is_l_known_ptrs: "l_known_ptrs known_ptr known_ptrs" | |||
using known_ptrs_known_ptr known_ptrs_preserved l_known_ptrs_def known_ptrs_subset known_ptrs_new_ptr | |||
using known_ptrs_known_ptr known_ptrs_preserved l_known_ptrs_def known_ptrs_subset | |||
known_ptrs_new_ptr | |||
by blast | |||
lemma get_node_ptr_simp1 [simp]: "get\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr (put\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr node h) = Some node" | |||
by(auto simp add: get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def) | |||
lemma get_node_ptr_simp2 [simp]: | |||
lemma get_node_ptr_simp2 [simp]: | |||
"node_ptr \<noteq> node_ptr' \<Longrightarrow> get\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr (put\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr' node h) = get\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr h" | |||
by(auto simp add: get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def) | |||
@@ -23,12 +23,12 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
***********************************************************************************) | |||
section\<open>Object\<close> | |||
text\<open>In this theory, we introduce the definition of the class Object. This class is the | |||
text\<open>In this theory, we introduce the definition of the class Object. This class is the | |||
common superclass of our class model.\<close> | |||
theory ObjectClass | |||
@@ -39,27 +39,27 @@ begin | |||
record RObject = | |||
nothing :: unit | |||
register_default_tvars "'Object RObject_ext" | |||
register_default_tvars "'Object RObject_ext" | |||
type_synonym 'Object Object = "'Object RObject_scheme" | |||
register_default_tvars "'Object Object" | |||
register_default_tvars "'Object Object" | |||
datatype ('object_ptr, 'Object) heap = Heap (the_heap: "((_) object_ptr, (_) Object) fmap") | |||
register_default_tvars "('object_ptr, 'Object) heap" | |||
register_default_tvars "('object_ptr, 'Object) heap" | |||
type_synonym heap\<^sub>f\<^sub>i\<^sub>n\<^sub>a\<^sub>l = "(unit, unit) heap" | |||
definition object_ptr_kinds :: "(_) heap \<Rightarrow> (_) object_ptr fset" | |||
where | |||
"object_ptr_kinds = fmdom \<circ> the_heap" | |||
lemma object_ptr_kinds_simp [simp]: | |||
"object_ptr_kinds (Heap (fmupd object_ptr object (the_heap h))) | |||
lemma object_ptr_kinds_simp [simp]: | |||
"object_ptr_kinds (Heap (fmupd object_ptr object (the_heap h))) | |||
= {|object_ptr|} |\<union>| object_ptr_kinds h" | |||
by(auto simp add: object_ptr_kinds_def) | |||
definition get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t :: "(_) object_ptr \<Rightarrow> (_) heap \<Rightarrow> (_) Object option" | |||
where | |||
"get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ptr h = fmlookup (the_heap h) ptr" | |||
adhoc_overloading get get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t | |||
adhoc_overloading get get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t | |||
locale l_type_wf_def\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t | |||
begin | |||
@@ -102,7 +102,7 @@ lemma put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_put_ptrs: | |||
assumes "put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr object h = h'" | |||
shows "object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|object_ptr|}" | |||
using assms | |||
by (metis comp_apply fmdom_fmupd funion_finsert_right heap.sel object_ptr_kinds_def | |||
by (metis comp_apply fmdom_fmupd funion_finsert_right heap.sel object_ptr_kinds_def | |||
sup_bot.right_neutral put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def) | |||
lemma object_more_extend_id [simp]: "more (extend x y) = y" | |||
@@ -117,7 +117,7 @@ definition a_known_ptr :: "(_) object_ptr \<Rightarrow> bool" | |||
where | |||
"a_known_ptr ptr = False" | |||
lemma known_ptr_not_object_ptr: | |||
lemma known_ptr_not_object_ptr: | |||
"a_known_ptr ptr \<Longrightarrow> \<not>is_object_ptr ptr \<Longrightarrow> known_ptr ptr" | |||
by(simp add: a_known_ptr_def) | |||
end | |||
@@ -127,9 +127,13 @@ lemmas known_ptr_defs = a_known_ptr_def | |||
locale l_known_ptrs = l_known_ptr known_ptr for known_ptr :: "(_) object_ptr \<Rightarrow> bool" + | |||
fixes known_ptrs :: "(_) heap \<Rightarrow> bool" | |||
assumes known_ptrs_known_ptr: "known_ptrs h \<Longrightarrow> ptr |\<in>| object_ptr_kinds h \<Longrightarrow> known_ptr ptr" | |||
assumes known_ptrs_preserved: "object_ptr_kinds h = object_ptr_kinds h' \<Longrightarrow> known_ptrs h = known_ptrs h'" | |||
assumes known_ptrs_subset: "object_ptr_kinds h' |\<subseteq>| object_ptr_kinds h \<Longrightarrow> known_ptrs h \<Longrightarrow> known_ptrs h'" | |||
assumes known_ptrs_new_ptr: "object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> known_ptrs h \<Longrightarrow> known_ptrs h'" | |||
assumes known_ptrs_preserved: | |||
"object_ptr_kinds h = object_ptr_kinds h' \<Longrightarrow> known_ptrs h = known_ptrs h'" | |||
assumes known_ptrs_subset: | |||
"object_ptr_kinds h' |\<subseteq>| object_ptr_kinds h \<Longrightarrow> known_ptrs h \<Longrightarrow> known_ptrs h'" | |||
assumes known_ptrs_new_ptr: | |||
"object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> | |||
known_ptrs h \<Longrightarrow> known_ptrs h'" | |||
locale l_known_ptrs\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t = l_known_ptr known_ptr for known_ptr :: "(_) object_ptr \<Rightarrow> bool" | |||
begin | |||
@@ -137,16 +141,20 @@ definition a_known_ptrs :: "(_) heap \<Rightarrow> bool" | |||
where | |||
"a_known_ptrs h = (\<forall>ptr \<in> fset (object_ptr_kinds h). known_ptr ptr)" | |||
lemma known_ptrs_known_ptr: | |||
lemma known_ptrs_known_ptr: | |||
"a_known_ptrs h \<Longrightarrow> ptr |\<in>| object_ptr_kinds h \<Longrightarrow> known_ptr ptr" | |||
apply(simp add: a_known_ptrs_def) | |||
using notin_fset by fastforce | |||
lemma known_ptrs_preserved: "object_ptr_kinds h = object_ptr_kinds h' \<Longrightarrow> a_known_ptrs h = a_known_ptrs h'" | |||
lemma known_ptrs_preserved: | |||
"object_ptr_kinds h = object_ptr_kinds h' \<Longrightarrow> a_known_ptrs h = a_known_ptrs h'" | |||
by(auto simp add: a_known_ptrs_def) | |||
lemma known_ptrs_subset: "object_ptr_kinds h' |\<subseteq>| object_ptr_kinds h \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
lemma known_ptrs_subset: | |||
"object_ptr_kinds h' |\<subseteq>| object_ptr_kinds h \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
by(simp add: a_known_ptrs_def less_eq_fset.rep_eq subsetD) | |||
lemma known_ptrs_new_ptr: "object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
lemma known_ptrs_new_ptr: | |||
"object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|new_ptr|} \<Longrightarrow> known_ptr new_ptr \<Longrightarrow> | |||
a_known_ptrs h \<Longrightarrow> a_known_ptrs h'" | |||
by(simp add: a_known_ptrs_def) | |||
end | |||
global_interpretation l_known_ptrs\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t known_ptr defines known_ptrs = a_known_ptrs . | |||
@@ -159,8 +167,8 @@ lemma known_ptrs_is_l_known_ptrs: "l_known_ptrs known_ptr known_ptrs" | |||
lemma get_object_ptr_simp1 [simp]: "get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr (put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr object h) = Some object" | |||
by(simp add: get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def) | |||
lemma get_object_ptr_simp2 [simp]: | |||
"object_ptr \<noteq> object_ptr' | |||
lemma get_object_ptr_simp2 [simp]: | |||
"object_ptr \<noteq> object_ptr' | |||
\<Longrightarrow> get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr (put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr' object h) = get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr h" | |||
by(simp add: get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def) | |||
@@ -169,11 +177,11 @@ subsection\<open>Limited Heap Modifications\<close> | |||
definition heap_unchanged_except :: "(_) object_ptr set \<Rightarrow> (_) heap \<Rightarrow> (_) heap \<Rightarrow> bool" | |||
where | |||
"heap_unchanged_except S h h' = (\<forall>ptr \<in> (fset (object_ptr_kinds h) | |||
"heap_unchanged_except S h h' = (\<forall>ptr \<in> (fset (object_ptr_kinds h) | |||
\<union> (fset (object_ptr_kinds h'))) - S. get ptr h = get ptr h')" | |||
definition delete\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t :: "(_) object_ptr \<Rightarrow> (_) heap \<Rightarrow> (_) heap option" where | |||
"delete\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ptr h = (if ptr |\<in>| object_ptr_kinds h then Some (Heap (fmdrop ptr (the_heap h))) | |||
"delete\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ptr h = (if ptr |\<in>| object_ptr_kinds h then Some (Heap (fmdrop ptr (the_heap h))) | |||
else None)" | |||
lemma delete\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_pointer_removed: | |||
@@ -201,15 +209,15 @@ definition "create_heap xs = Heap (fmap_of_list xs)" | |||
code_datatype ObjectClass.heap.Heap create_heap | |||
lemma object_ptr_kinds_code3 [code]: | |||
lemma object_ptr_kinds_code3 [code]: | |||
"fmlookup (the_heap (create_heap xs)) x = map_of xs x" | |||
by(auto simp add: create_heap_def fmlookup_of_list) | |||
lemma object_ptr_kinds_code4 [code]: | |||
lemma object_ptr_kinds_code4 [code]: | |||
"the_heap (create_heap xs) = fmap_of_list xs" | |||
by(simp add: create_heap_def) | |||
lemma object_ptr_kinds_code5 [code]: | |||
lemma object_ptr_kinds_code5 [code]: | |||
"the_heap (Heap x) = x" | |||
by simp | |||
@@ -23,7 +23,7 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
***********************************************************************************) | |||
@@ -46,7 +46,7 @@ consts put_M :: 'a | |||
consts get_M :: 'a | |||
consts delete_M :: 'a | |||
lemma sorted_list_of_set_eq [dest]: | |||
lemma sorted_list_of_set_eq [dest]: | |||
"sorted_list_of_set (fset x) = sorted_list_of_set (fset y) \<Longrightarrow> x = y" | |||
by (metis finite_fset fset_inject sorted_list_of_set(1)) | |||
@@ -70,18 +70,18 @@ lemma ptr_kinds_M_pure [simp]: "pure a_ptr_kinds_M h" | |||
lemma ptr_kinds_ptr_kinds_M [simp]: "ptr \<in> set |h \<turnstile> a_ptr_kinds_M|\<^sub>r \<longleftrightarrow> ptr |\<in>| ptr_kinds h" | |||
by(simp add: a_ptr_kinds_M_def) | |||
lemma ptr_kinds_M_ptr_kinds [simp]: | |||
lemma ptr_kinds_M_ptr_kinds [simp]: | |||
"h \<turnstile> a_ptr_kinds_M \<rightarrow>\<^sub>r xa \<longleftrightarrow> xa = sorted_list_of_set (fset (ptr_kinds h))" | |||
by(auto simp add: a_ptr_kinds_M_def) | |||
lemma ptr_kinds_M_ptr_kinds_returns_result [simp]: | |||
lemma ptr_kinds_M_ptr_kinds_returns_result [simp]: | |||
"h \<turnstile> a_ptr_kinds_M \<bind> f \<rightarrow>\<^sub>r x \<longleftrightarrow> h \<turnstile> f (sorted_list_of_set (fset (ptr_kinds h))) \<rightarrow>\<^sub>r x" | |||
by(auto simp add: a_ptr_kinds_M_def) | |||
lemma ptr_kinds_M_ptr_kinds_returns_heap [simp]: | |||
lemma ptr_kinds_M_ptr_kinds_returns_heap [simp]: | |||
"h \<turnstile> a_ptr_kinds_M \<bind> f \<rightarrow>\<^sub>h h' \<longleftrightarrow> h \<turnstile> f (sorted_list_of_set (fset (ptr_kinds h))) \<rightarrow>\<^sub>h h'" | |||
by(auto simp add: a_ptr_kinds_M_def) | |||
end | |||
locale l_get_M = | |||
locale l_get_M = | |||
fixes get :: "'ptr \<Rightarrow> 'heap \<Rightarrow> 'obj option" | |||
fixes type_wf :: "'heap \<Rightarrow> bool" | |||
fixes ptr_kinds :: "'heap \<Rightarrow> 'ptr fset" | |||
@@ -129,14 +129,14 @@ lemma put_M_ok: | |||
lemma put_M_ptr_in_heap: | |||
"h \<turnstile> ok (a_put_M ptr setter v) \<Longrightarrow> ptr |\<in>| ptr_kinds h" | |||
by(auto simp add: a_put_M_def intro!: bind_is_OK_I2 elim: get_M_ptr_in_heap | |||
by(auto simp add: a_put_M_def intro!: bind_is_OK_I2 elim: get_M_ptr_in_heap | |||
dest: is_OK_returns_result_I elim!: bind_is_OK_E) | |||
end | |||
subsection \<open>Setup for Defining Partial Functions\<close> | |||
lemma execute_admissible: | |||
lemma execute_admissible: | |||
"ccpo.admissible (fun_lub (flat_lub (Inl (e::'e)))) (fun_ord (flat_ord (Inl e))) | |||
((\<lambda>a. \<forall>(h::'heap) h2 (r::'result). h \<turnstile> a = Inr (r, h2) \<longrightarrow> P h h2 r) \<circ> Prog)" | |||
proof (unfold comp_def, rule ccpo.admissibleI, clarify) | |||
@@ -153,16 +153,16 @@ proof (unfold comp_def, rule ccpo.admissibleI, clarify) | |||
by force | |||
qed | |||
lemma execute_admissible2: | |||
lemma execute_admissible2: | |||
"ccpo.admissible (fun_lub (flat_lub (Inl (e::'e)))) (fun_ord (flat_ord (Inl e))) | |||
((\<lambda>a. \<forall>(h::'heap) h' h2 h2' (r::'result) r'. | |||
((\<lambda>a. \<forall>(h::'heap) h' h2 h2' (r::'result) r'. | |||
h \<turnstile> a = Inr (r, h2) \<longrightarrow> h' \<turnstile> a = Inr (r', h2') \<longrightarrow> P h h' h2 h2' r r') \<circ> Prog)" | |||
proof (unfold comp_def, rule ccpo.admissibleI, clarify) | |||
fix A :: "('heap \<Rightarrow> 'e + 'result \<times> 'heap) set" | |||
let ?lub = "Prog (fun_lub (flat_lub (Inl e)) A)" | |||
fix h h' h2 h2' r r' | |||
assume 1: "Complete_Partial_Order.chain (fun_ord (flat_ord (Inl e))) A" | |||
and 2 [rule_format]: "\<forall>xa\<in>A. \<forall>h h' h2 h2' r r'. h \<turnstile> Prog xa = Inr (r, h2) | |||
and 2 [rule_format]: "\<forall>xa\<in>A. \<forall>h h' h2 h2' r r'. h \<turnstile> Prog xa = Inr (r, h2) | |||
\<longrightarrow> h' \<turnstile> Prog xa = Inr (r', h2') \<longrightarrow> P h h' h2 h2' r r'" | |||
and 4: "h \<turnstile> Prog (fun_lub (flat_lub (Inl e)) A) = Inr (r, h2)" | |||
and 5: "h' \<turnstile> Prog (fun_lub (flat_lub (Inl e)) A) = Inr (r', h2')" | |||
@@ -180,18 +180,18 @@ proof (unfold comp_def, rule ccpo.admissibleI, clarify) | |||
"f \<in> A" and | |||
"h \<turnstile> Prog f = Inr (r, h2)" and | |||
"h' \<turnstile> Prog f = Inr (r', h2')" | |||
using 1 4 5 | |||
using 1 4 5 | |||
apply(auto simp add: chain_def fun_ord_def flat_ord_def execute_def)[1] | |||
by (metis Inl_Inr_False) | |||
then show "P h h' h2 h2' r r'" | |||
by(fact 2) | |||
qed | |||
definition dom_prog_ord :: | |||
definition dom_prog_ord :: | |||
"('heap, exception, 'result) prog \<Rightarrow> ('heap, exception, 'result) prog \<Rightarrow> bool" where | |||
"dom_prog_ord = img_ord (\<lambda>a b. execute b a) (fun_ord (flat_ord (Inl NonTerminationException)))" | |||
definition dom_prog_lub :: | |||
definition dom_prog_lub :: | |||
"('heap, exception, 'result) prog set \<Rightarrow> ('heap, exception, 'result) prog" where | |||
"dom_prog_lub = img_lub (\<lambda>a b. execute b a) Prog (fun_lub (flat_lub (Inl NonTerminationException)))" | |||
@@ -200,7 +200,7 @@ lemma dom_prog_lub_empty: "dom_prog_lub {} = error NonTerminationException" | |||
lemma dom_prog_interpretation: "partial_function_definitions dom_prog_ord dom_prog_lub" | |||
proof - | |||
have "partial_function_definitions (fun_ord (flat_ord (Inl NonTerminationException))) | |||
have "partial_function_definitions (fun_ord (flat_ord (Inl NonTerminationException))) | |||
(fun_lub (flat_lub (Inl NonTerminationException)))" | |||
by (rule partial_function_lift) (rule flat_interpretation) | |||
then show ?thesis | |||
@@ -212,15 +212,15 @@ interpretation dom_prog: partial_function_definitions dom_prog_ord dom_prog_lub | |||
rewrites "dom_prog_lub {} \<equiv> error NonTerminationException" | |||
by (fact dom_prog_interpretation)(simp add: dom_prog_lub_empty) | |||
lemma admissible_dom_prog: | |||
lemma admissible_dom_prog: | |||
"dom_prog.admissible (\<lambda>f. \<forall>x h h' r. h \<turnstile> f x \<rightarrow>\<^sub>r r \<longrightarrow> h \<turnstile> f x \<rightarrow>\<^sub>h h' \<longrightarrow> P x h h' r)" | |||
proof (rule admissible_fun[OF dom_prog_interpretation]) | |||
fix x | |||
show "ccpo.admissible dom_prog_lub dom_prog_ord (\<lambda>a. \<forall>h h' r. h \<turnstile> a \<rightarrow>\<^sub>r r \<longrightarrow> h \<turnstile> a \<rightarrow>\<^sub>h h' | |||
show "ccpo.admissible dom_prog_lub dom_prog_ord (\<lambda>a. \<forall>h h' r. h \<turnstile> a \<rightarrow>\<^sub>r r \<longrightarrow> h \<turnstile> a \<rightarrow>\<^sub>h h' | |||
\<longrightarrow> P x h h' r)" | |||
unfolding dom_prog_ord_def dom_prog_lub_def | |||
proof (intro admissible_image partial_function_lift flat_interpretation) | |||
show "ccpo.admissible (fun_lub (flat_lub (Inl NonTerminationException))) | |||
show "ccpo.admissible (fun_lub (flat_lub (Inl NonTerminationException))) | |||
(fun_ord (flat_ord (Inl NonTerminationException))) | |||
((\<lambda>a. \<forall>h h' r. h \<turnstile> a \<rightarrow>\<^sub>r r \<longrightarrow> h \<turnstile> a \<rightarrow>\<^sub>h h' \<longrightarrow> P x h h' r) \<circ> Prog)" | |||
by(auto simp add: execute_admissible returns_result_def returns_heap_def split: sum.splits) | |||
@@ -234,20 +234,20 @@ proof (rule admissible_fun[OF dom_prog_interpretation]) | |||
qed | |||
lemma admissible_dom_prog2: | |||
"dom_prog.admissible (\<lambda>f. \<forall>x h h2 h' h2' r r2. h \<turnstile> f x \<rightarrow>\<^sub>r r \<longrightarrow> h \<turnstile> f x \<rightarrow>\<^sub>h h' | |||
"dom_prog.admissible (\<lambda>f. \<forall>x h h2 h' h2' r r2. h \<turnstile> f x \<rightarrow>\<^sub>r r \<longrightarrow> h \<turnstile> f x \<rightarrow>\<^sub>h h' | |||
\<longrightarrow> h2 \<turnstile> f x \<rightarrow>\<^sub>r r2 \<longrightarrow> h2 \<turnstile> f x \<rightarrow>\<^sub>h h2' \<longrightarrow> P x h h2 h' h2' r r2)" | |||
proof (rule admissible_fun[OF dom_prog_interpretation]) | |||
fix x | |||
show "ccpo.admissible dom_prog_lub dom_prog_ord (\<lambda>a. \<forall>h h2 h' h2' r r2. h \<turnstile> a \<rightarrow>\<^sub>r r | |||
show "ccpo.admissible dom_prog_lub dom_prog_ord (\<lambda>a. \<forall>h h2 h' h2' r r2. h \<turnstile> a \<rightarrow>\<^sub>r r | |||
\<longrightarrow> h \<turnstile> a \<rightarrow>\<^sub>h h' \<longrightarrow> h2 \<turnstile> a \<rightarrow>\<^sub>r r2 \<longrightarrow> h2 \<turnstile> a \<rightarrow>\<^sub>h h2' \<longrightarrow> P x h h2 h' h2' r r2)" | |||
unfolding dom_prog_ord_def dom_prog_lub_def | |||
proof (intro admissible_image partial_function_lift flat_interpretation) | |||
show "ccpo.admissible (fun_lub (flat_lub (Inl NonTerminationException))) | |||
show "ccpo.admissible (fun_lub (flat_lub (Inl NonTerminationException))) | |||
(fun_ord (flat_ord (Inl NonTerminationException))) | |||
((\<lambda>a. \<forall>h h2 h' h2' r r2. h \<turnstile> a \<rightarrow>\<^sub>r r \<longrightarrow> h \<turnstile> a \<rightarrow>\<^sub>h h' \<longrightarrow> h2 \<turnstile> a \<rightarrow>\<^sub>r r2 \<longrightarrow> h2 \<turnstile> a \<rightarrow>\<^sub>h h2' | |||
((\<lambda>a. \<forall>h h2 h' h2' r r2. h \<turnstile> a \<rightarrow>\<^sub>r r \<longrightarrow> h \<turnstile> a \<rightarrow>\<^sub>h h' \<longrightarrow> h2 \<turnstile> a \<rightarrow>\<^sub>r r2 \<longrightarrow> h2 \<turnstile> a \<rightarrow>\<^sub>h h2' | |||
\<longrightarrow> P x h h2 h' h2' r r2) \<circ> Prog)" | |||
by(auto simp add: returns_result_def returns_heap_def intro!: ccpo.admissibleI | |||
dest!: ccpo.admissibleD[OF execute_admissible2[where P="P x"]] | |||
by(auto simp add: returns_result_def returns_heap_def intro!: ccpo.admissibleI | |||
dest!: ccpo.admissibleD[OF execute_admissible2[where P="P x"]] | |||
split: sum.splits) | |||
next | |||
show "\<And>x y. (\<lambda>b. b \<turnstile> x) = (\<lambda>b. b \<turnstile> y) \<Longrightarrow> x = y" | |||
@@ -266,7 +266,7 @@ lemma fixp_induct_dom_prog: | |||
assumes mono: "\<And>x. monotone (fun_ord dom_prog_ord) dom_prog_ord (\<lambda>f. U (F (C f)) x)" | |||
assumes eq: "f \<equiv> C (ccpo.fixp (fun_lub dom_prog_lub) (fun_ord dom_prog_ord) (\<lambda>f. U (F (C f))))" | |||
assumes inverse2: "\<And>f. U (C f) = f" | |||
assumes step: "\<And>f x h h' r. (\<And>x h h' r. h \<turnstile> (U f x) \<rightarrow>\<^sub>r r \<Longrightarrow> h \<turnstile> (U f x) \<rightarrow>\<^sub>h h' \<Longrightarrow> P x h h' r) | |||
assumes step: "\<And>f x h h' r. (\<And>x h h' r. h \<turnstile> (U f x) \<rightarrow>\<^sub>r r \<Longrightarrow> h \<turnstile> (U f x) \<rightarrow>\<^sub>h h' \<Longrightarrow> P x h h' r) | |||
\<Longrightarrow> h \<turnstile> (U (F f) x) \<rightarrow>\<^sub>r r \<Longrightarrow> h \<turnstile> (U (F f) x) \<rightarrow>\<^sub>h h' \<Longrightarrow> P x h h' r" | |||
assumes defined: "h \<turnstile> (U f x) \<rightarrow>\<^sub>r r" and "h \<turnstile> (U f x) \<rightarrow>\<^sub>h h'" | |||
shows "P x h h' r" | |||
@@ -315,7 +315,7 @@ proof (rule monotoneI) | |||
proof (rule dom_prog_ordI) | |||
fix h | |||
from 1 show "h \<turnstile> ?L \<rightarrow>\<^sub>e NonTerminationException \<or> h \<turnstile> ?L = h \<turnstile> ?R" | |||
apply(rule dom_prog_ordE) | |||
apply(rule dom_prog_ordE) | |||
apply(auto)[1] | |||
using bind_cong by fastforce | |||
qed | |||
@@ -358,7 +358,7 @@ lemma mono_dom_prog1 [partial_function_mono]: | |||
assumes "\<And>x. (mono_dom_prog (\<lambda>f. g f x))" | |||
shows "mono_dom_prog (\<lambda>f. map_M (g f) xs)" | |||
using assms | |||
apply (induct xs) | |||
apply (induct xs) | |||
by(auto simp add: call_mono dom_prog.const_mono intro!: bind_mono) | |||
lemma mono_dom_prog2 [partial_function_mono]: | |||
@@ -366,10 +366,10 @@ lemma mono_dom_prog2 [partial_function_mono]: | |||
assumes "\<And>x. (mono_dom_prog (\<lambda>f. g f x))" | |||
shows "mono_dom_prog (\<lambda>f. forall_M (g f) xs)" | |||
using assms | |||
apply (induct xs) | |||
apply (induct xs) | |||
by(auto simp add: call_mono dom_prog.const_mono intro!: bind_mono) | |||
lemma sorted_list_set_cong [simp]: | |||
lemma sorted_list_set_cong [simp]: | |||
"sorted_list_of_set (fset FS) = sorted_list_of_set (fset FS') \<longleftrightarrow> FS = FS'" | |||
by auto | |||
@@ -23,7 +23,7 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||
* SPDX-License-Identifier: BSD-2-Clause | |||
***********************************************************************************) | |||
@@ -35,36 +35,36 @@ theory CharacterDataMonad | |||
"../classes/CharacterDataClass" | |||
begin | |||
type_synonym ('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
type_synonym ('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, | |||
'shadow_root_ptr, 'Object, 'Node, 'Element, 'CharacterData, 'result) dom_prog | |||
= "((_) heap, exception, 'result) prog" | |||
register_default_tvars | |||
"('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, 'shadow_root_ptr, | |||
'Object, 'Node, 'Element, 'CharacterData, 'result) dom_prog" | |||
register_default_tvars | |||
"('object_ptr, 'node_ptr, 'element_ptr, 'character_data_ptr, 'document_ptr, 'shadow_root_ptr, | |||
'Object, 'Node, 'Element, 'CharacterData, 'result) dom_prog" | |||
global_interpretation l_ptr_kinds_M character_data_ptr_kinds | |||
global_interpretation l_ptr_kinds_M character_data_ptr_kinds | |||
defines character_data_ptr_kinds_M = a_ptr_kinds_M . | |||
lemmas character_data_ptr_kinds_M_defs = a_ptr_kinds_M_def | |||
lemma character_data_ptr_kinds_M_eq: | |||
assumes "|h \<turnstile> node_ptr_kinds_M|\<^sub>r = |h' \<turnstile> node_ptr_kinds_M|\<^sub>r" | |||
shows "|h \<turnstile> character_data_ptr_kinds_M|\<^sub>r = |h' \<turnstile> character_data_ptr_kinds_M|\<^sub>r" | |||
using assms | |||
by(auto simp add: character_data_ptr_kinds_M_defs node_ptr_kinds_M_defs | |||
using assms | |||
by(auto simp add: character_data_ptr_kinds_M_defs node_ptr_kinds_M_defs | |||
character_data_ptr_kinds_def) | |||
lemma character_data_ptr_kinds_M_reads: | |||
lemma character_data_ptr_kinds_M_reads: | |||
"reads (\<Union>node_ptr. {preserved (get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t node_ptr RObject.nothing)}) character_data_ptr_kinds_M h h'" | |||
using node_ptr_kinds_M_reads | |||
apply (simp add: reads_def node_ptr_kinds_M_defs character_data_ptr_kinds_M_defs | |||
apply (simp add: reads_def node_ptr_kinds_M_defs character_data_ptr_kinds_M_defs | |||
character_data_ptr_kinds_def preserved_def) | |||
by (smt node_ptr_kinds_small preserved_def unit_all_impI) | |||
global_interpretation l_dummy defines get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a = "l_get_M.a_get_M get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a" . | |||
lemma get_M_is_l_get_M: "l_get_M get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a type_wf character_data_ptr_kinds" | |||
apply(simp add: get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_type_wf l_get_M_def) | |||
by (metis (no_types, hide_lams) NodeMonad.get_M_is_l_get_M bind_eq_Some_conv | |||
by (metis (no_types, hide_lams) NodeMonad.get_M_is_l_get_M bind_eq_Some_conv | |||
character_data_ptr_kinds_commutes get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def l_get_M_def option.distinct(1)) | |||
lemmas get_M_defs = get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def[unfolded l_get_M.a_get_M_def[OF get_M_is_l_get_M]] | |||
@@ -84,7 +84,7 @@ end | |||
global_interpretation l_get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_lemmas type_wf by unfold_locales | |||
global_interpretation l_put_M type_wf character_data_ptr_kinds get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a | |||
global_interpretation l_put_M type_wf character_data_ptr_kinds get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a | |||
rewrites "a_get_M = get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a" defines put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a = a_put_M | |||
apply (simp add: get_M_is_l_get_M l_put_M_def) | |||
by (simp add: get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def) | |||
@@ -109,98 +109,98 @@ global_interpretation l_put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^ | |||
lemma CharacterData_simp1 [simp]: | |||
"(\<And>x. getter (setter (\<lambda>_. v) x) = v) \<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
lemma CharacterData_simp1 [simp]: | |||
"(\<And>x. getter (setter (\<lambda>_. v) x) = v) \<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> h' \<turnstile> get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr getter \<rightarrow>\<^sub>r v" | |||
by(auto simp add: put_M_defs get_M_defs split: option.splits) | |||
lemma CharacterData_simp2 [simp]: | |||
"character_data_ptr \<noteq> character_data_ptr' | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
lemma CharacterData_simp2 [simp]: | |||
"character_data_ptr \<noteq> character_data_ptr' | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr' getter) h h'" | |||
by(auto simp add: put_M_defs get_M_defs preserved_def split: option.splits dest: get_heap_E) | |||
lemma CharacterData_simp3 [simp]: " | |||
(\<And>x. getter (setter (\<lambda>_. v) x) = getter x) | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
(\<And>x. getter (setter (\<lambda>_. v) x) = getter x) | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr' getter) h h'" | |||
apply(cases "character_data_ptr = character_data_ptr'") | |||
apply(cases "character_data_ptr = character_data_ptr'") | |||
by(auto simp add: put_M_defs get_M_defs preserved_def split: option.splits dest: get_heap_E) | |||
lemma CharacterData_simp4 [simp]: | |||
"h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
lemma CharacterData_simp4 [simp]: | |||
"h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr getter) h h'" | |||
by(auto simp add: put_M_defs ElementMonad.get_M_defs preserved_def | |||
by(auto simp add: put_M_defs ElementMonad.get_M_defs preserved_def | |||
split: option.splits dest: get_heap_E) | |||
lemma CharacterData_simp5 [simp]: | |||
"h \<turnstile> put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr setter v \<rightarrow>\<^sub>h h' | |||
lemma CharacterData_simp5 [simp]: | |||
"h \<turnstile> put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr getter) h h'" | |||
by(auto simp add: ElementMonad.put_M_defs get_M_defs preserved_def | |||
by(auto simp add: ElementMonad.put_M_defs get_M_defs preserved_def | |||
split: option.splits dest: get_heap_E) | |||
lemma CharacterData_simp6 [simp]: | |||
"(\<And>x. getter (cast (setter (\<lambda>_. v) x)) = getter (cast x)) | |||
lemma CharacterData_simp6 [simp]: | |||
"(\<And>x. getter (cast (setter (\<lambda>_. v) x)) = getter (cast x)) | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr getter) h h'" | |||
apply (cases "cast character_data_ptr = object_ptr") | |||
by(auto simp add: put_M_defs get_M_defs ObjectMonad.get_M_defs NodeMonad.get_M_defs | |||
get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def preserved_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
apply (cases "cast character_data_ptr = object_ptr") | |||
by(auto simp add: put_M_defs get_M_defs ObjectMonad.get_M_defs NodeMonad.get_M_defs | |||
get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def preserved_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
bind_eq_Some_conv split: option.splits) | |||
lemma CharacterData_simp7 [simp]: | |||
"(\<And>x. getter (cast (setter (\<lambda>_. v) x)) = getter (cast x)) | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
lemma CharacterData_simp7 [simp]: | |||
"(\<And>x. getter (cast (setter (\<lambda>_. v) x)) = getter (cast x)) | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr getter) h h'" | |||
apply(cases "cast character_data_ptr = node_ptr") | |||
by(auto simp add: put_M_defs get_M_defs ObjectMonad.get_M_defs NodeMonad.get_M_defs | |||
get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def preserved_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
by(auto simp add: put_M_defs get_M_defs ObjectMonad.get_M_defs NodeMonad.get_M_defs | |||
get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def preserved_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
bind_eq_Some_conv split: option.splits) | |||
lemma CharacterData_simp8 [simp]: | |||
"cast character_data_ptr \<noteq> node_ptr | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
lemma CharacterData_simp8 [simp]: | |||
"cast character_data_ptr \<noteq> node_ptr | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr getter) h h'" | |||
by(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def NodeMonad.get_M_defs | |||
by(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def NodeMonad.get_M_defs | |||
preserved_def split: option.splits dest: get_heap_E) | |||
lemma CharacterData_simp9 [simp]: | |||
"h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> (\<And>x. getter (cast (setter (\<lambda>_. v) x)) = getter (cast x)) | |||
lemma CharacterData_simp9 [simp]: | |||
"h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> (\<And>x. getter (cast (setter (\<lambda>_. v) x)) = getter (cast x)) | |||
\<Longrightarrow> preserved (get_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr getter) h h'" | |||
apply(cases "cast character_data_ptr \<noteq> node_ptr") | |||
by(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def | |||
NodeMonad.get_M_defs preserved_def split: option.splits bind_splits | |||
by(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def | |||
NodeMonad.get_M_defs preserved_def split: option.splits bind_splits | |||
dest: get_heap_E) | |||
lemma CharacterData_simp10 [simp]: | |||
"cast character_data_ptr \<noteq> node_ptr | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr setter v \<rightarrow>\<^sub>h h' | |||
lemma CharacterData_simp10 [simp]: | |||
"cast character_data_ptr \<noteq> node_ptr | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr getter) h h'" | |||
by(auto simp add: NodeMonad.put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def NodeMonad.get_M_defs | |||
by(auto simp add: NodeMonad.put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def NodeMonad.get_M_defs | |||
preserved_def split: option.splits dest: get_heap_E) | |||
lemma CharacterData_simp11 [simp]: | |||
"cast character_data_ptr \<noteq> object_ptr | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
lemma CharacterData_simp11 [simp]: | |||
"cast character_data_ptr \<noteq> object_ptr | |||
\<Longrightarrow> h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr getter) h h'" | |||
by(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def | |||
ObjectMonad.get_M_defs preserved_def | |||
by(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def | |||
ObjectMonad.get_M_defs preserved_def | |||
split: option.splits dest: get_heap_E) | |||
lemma CharacterData_simp12 [simp]: | |||
"h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> (\<And>x. getter (cast (setter (\<lambda>_. v) x)) = getter (cast x)) | |||
"h \<turnstile> put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> (\<And>x. getter (cast (setter (\<lambda>_. v) x)) = getter (cast x)) | |||
\<Longrightarrow> preserved (get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr getter) h h'" | |||
apply(cases "cast character_data_ptr \<noteq> object_ptr") | |||
apply(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def | |||
get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def ObjectMonad.get_M_defs preserved_def | |||
apply(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def | |||
get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def ObjectMonad.get_M_defs preserved_def | |||
split: option.splits bind_splits dest: get_heap_E)[1] | |||
by(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def | |||
get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def ObjectMonad.get_M_defs preserved_def | |||
by(auto simp add: put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def | |||
get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def ObjectMonad.get_M_defs preserved_def | |||
split: option.splits bind_splits dest: get_heap_E)[1] | |||
lemma CharacterData_simp13 [simp]: | |||
"cast character_data_ptr \<noteq> object_ptr \<Longrightarrow> h \<turnstile> put_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr setter v \<rightarrow>\<^sub>h h' | |||
lemma CharacterData_simp13 [simp]: | |||
"cast character_data_ptr \<noteq> object_ptr \<Longrightarrow> h \<turnstile> put_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr setter v \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr getter) h h'" | |||
by(auto simp add: ObjectMonad.put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
by(auto simp add: ObjectMonad.put_M_defs get_M_defs get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
ObjectMonad.get_M_defs preserved_def split: option.splits dest: get_heap_E) | |||
lemma new_element_get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a: | |||
lemma new_element_get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a: | |||
"h \<turnstile> new_element \<rightarrow>\<^sub>h h' \<Longrightarrow> preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a ptr getter) h h'" | |||
by(auto simp add: new_element_def get_M_defs preserved_def split: prod.splits option.splits | |||
by(auto simp add: new_element_def get_M_defs preserved_def split: prod.splits option.splits | |||
elim!: bind_returns_result_E bind_returns_heap_E) | |||
@@ -225,7 +225,7 @@ lemma new_character_data_ptr_in_heap: | |||
shows "new_character_data_ptr |\<in>| character_data_ptr_kinds h'" | |||
using assms | |||
unfolding new_character_data_def | |||
by(auto simp add: new_character_data_def new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def Let_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_ptr_in_heap | |||
by(auto simp add: new_character_data_def new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def Let_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_ptr_in_heap | |||
is_OK_returns_result_I | |||
elim!: bind_returns_result_E bind_returns_heap_E) | |||
@@ -234,7 +234,7 @@ lemma new_character_data_ptr_not_in_heap: | |||
and "h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr" | |||
shows "new_character_data_ptr |\<notin>| character_data_ptr_kinds h" | |||
using assms new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_ptr_not_in_heap | |||
by(auto simp add: new_character_data_def split: prod.splits | |||
by(auto simp add: new_character_data_def split: prod.splits | |||
elim!: bind_returns_result_E bind_returns_heap_E) | |||
lemma new_character_data_new_ptr: | |||
@@ -242,7 +242,7 @@ lemma new_character_data_new_ptr: | |||
and "h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr" | |||
shows "object_ptr_kinds h' = object_ptr_kinds h |\<union>| {|cast new_character_data_ptr|}" | |||
using assms new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_new_ptr | |||
by(auto simp add: new_character_data_def split: prod.splits | |||
by(auto simp add: new_character_data_def split: prod.splits | |||
elim!: bind_returns_result_E bind_returns_heap_E) | |||
lemma new_character_data_is_character_data_ptr: | |||
@@ -256,41 +256,41 @@ lemma new_character_data_child_nodes: | |||
assumes "h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr" | |||
shows "h' \<turnstile> get_M new_character_data_ptr val \<rightarrow>\<^sub>r ''''" | |||
using assms | |||
by(auto simp add: get_M_defs new_character_data_def new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def Let_def | |||
by(auto simp add: get_M_defs new_character_data_def new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def Let_def | |||
split: option.splits prod.splits elim!: bind_returns_result_E bind_returns_heap_E) | |||
lemma new_character_data_get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t: | |||
"h \<turnstile> new_character_data \<rightarrow>\<^sub>h h' \<Longrightarrow> h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr | |||
lemma new_character_data_get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t: | |||
"h \<turnstile> new_character_data \<rightarrow>\<^sub>h h' \<Longrightarrow> h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr | |||
\<Longrightarrow> ptr \<noteq> cast new_character_data_ptr \<Longrightarrow> preserved (get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ptr getter) h h'" | |||
by(auto simp add: new_character_data_def ObjectMonad.get_M_defs preserved_def | |||
by(auto simp add: new_character_data_def ObjectMonad.get_M_defs preserved_def | |||
split: prod.splits option.splits elim!: bind_returns_result_E bind_returns_heap_E) | |||
lemma new_character_data_get_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e: | |||
"h \<turnstile> new_character_data \<rightarrow>\<^sub>h h' \<Longrightarrow> h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr | |||
lemma new_character_data_get_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e: | |||
"h \<turnstile> new_character_data \<rightarrow>\<^sub>h h' \<Longrightarrow> h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr | |||
\<Longrightarrow> ptr \<noteq> cast new_character_data_ptr \<Longrightarrow> preserved (get_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e ptr getter) h h'" | |||
by(auto simp add: new_character_data_def NodeMonad.get_M_defs preserved_def | |||
by(auto simp add: new_character_data_def NodeMonad.get_M_defs preserved_def | |||
split: prod.splits option.splits elim!: bind_returns_result_E bind_returns_heap_E) | |||
lemma new_character_data_get_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t: | |||
"h \<turnstile> new_character_data \<rightarrow>\<^sub>h h' \<Longrightarrow> h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr | |||
lemma new_character_data_get_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t: | |||
"h \<turnstile> new_character_data \<rightarrow>\<^sub>h h' \<Longrightarrow> h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr | |||
\<Longrightarrow> preserved (get_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t ptr getter) h h'" | |||
by(auto simp add: new_character_data_def ElementMonad.get_M_defs preserved_def | |||
by(auto simp add: new_character_data_def ElementMonad.get_M_defs preserved_def | |||
split: prod.splits option.splits elim!: bind_returns_result_E bind_returns_heap_E) | |||
lemma new_character_data_get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a: | |||
"h \<turnstile> new_character_data \<rightarrow>\<^sub>h h' \<Longrightarrow> h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr | |||
lemma new_character_data_get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a: | |||
"h \<turnstile> new_character_data \<rightarrow>\<^sub>h h' \<Longrightarrow> h \<turnstile> new_character_data \<rightarrow>\<^sub>r new_character_data_ptr | |||
\<Longrightarrow> ptr \<noteq> new_character_data_ptr \<Longrightarrow> preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a ptr getter) h h'" | |||
by(auto simp add: new_character_data_def get_M_defs preserved_def | |||
by(auto simp add: new_character_data_def get_M_defs preserved_def | |||
split: prod.splits option.splits elim!: bind_returns_result_E bind_returns_heap_E) | |||
subsection\<open>Modified Heaps\<close> | |||
lemma get_CharacterData_ptr_simp [simp]: | |||
"get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr (put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ptr obj h) | |||
lemma get_CharacterData_ptr_simp [simp]: | |||
"get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr (put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ptr obj h) | |||
= (if ptr = cast character_data_ptr then cast obj else get character_data_ptr h)" | |||
by(auto simp add: get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def split: option.splits Option.bind_splits) | |||
lemma Character_data_ptr_kinds_simp [simp]: | |||
"character_data_ptr_kinds (put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ptr obj h) = character_data_ptr_kinds h |\<union>| | |||
lemma Character_data_ptr_kinds_simp [simp]: | |||
"character_data_ptr_kinds (put\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ptr obj h) = character_data_ptr_kinds h |\<union>| | |||
(if is_character_data_ptr_kind ptr then {|the (cast ptr)|} else {||})" | |||
by(auto simp add: character_data_ptr_kinds_def is_node_ptr_kind_def split: option.splits) | |||
@@ -307,7 +307,7 @@ lemma type_wf_put_ptr_not_in_heap_E: | |||
assumes "ptr |\<notin>| object_ptr_kinds h" | |||
shows "type_wf h" | |||
using assms | |||
apply(auto simp add: type_wf_defs elim!: ElementMonad.type_wf_put_ptr_not_in_heap_E | |||
apply(auto simp add: type_wf_defs elim!: ElementMonad.type_wf_put_ptr_not_in_heap_E | |||
split: option.splits if_splits)[1] | |||
using assms(2) node_ptr_kinds_commutes by blast | |||
@@ -319,7 +319,8 @@ lemma type_wf_put_ptr_in_heap_E: | |||
shows "type_wf h" | |||
using assms | |||
apply(auto simp add: type_wf_defs split: option.splits if_splits)[1] | |||
by (metis (no_types, lifting) ElementClass.get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_type_wf assms(2) bind.bind_lunit cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_inv cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_inv get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def notin_fset option.collapse) | |||
by (metis (no_types, lifting) ElementClass.get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_type_wf assms(2) bind.bind_lunit | |||
cast\<^sub>N\<^sub>o\<^sub>d\<^sub>e\<^sub>2\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_inv cast\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t\<^sub>2\<^sub>N\<^sub>o\<^sub>d\<^sub>e_inv get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def notin_fset option.collapse) | |||
subsection\<open>Preserving Types\<close> | |||
@@ -327,13 +328,13 @@ lemma new_element_type_wf_preserved [simp]: | |||
assumes "h \<turnstile> new_element \<rightarrow>\<^sub>h h'" | |||
shows "type_wf h = type_wf h'" | |||
using assms | |||
apply(auto simp add: new_element_def new\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def Let_def put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
elim!: bind_returns_heap_E type_wf_put_ptr_not_in_heap_E | |||
apply(auto simp add: new_element_def new\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def Let_def put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
elim!: bind_returns_heap_E type_wf_put_ptr_not_in_heap_E | |||
intro!: type_wf_put_I split: if_splits)[1] | |||
using CharacterDataClass.type_wf\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t assms new_element_type_wf_preserved apply blast | |||
using element_ptrs_def apply fastforce | |||
using CharacterDataClass.type_wf\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t assms new_element_type_wf_preserved apply blast | |||
by (metis Suc_n_not_le_n element_ptr.sel(1) element_ptrs_def fMax_ge ffmember_filter | |||
by (metis Suc_n_not_le_n element_ptr.sel(1) element_ptrs_def fMax_ge ffmember_filter | |||
fimage_eqI is_element_ptr_ref) | |||
lemma new_element_is_l_new_element: "l_new_element type_wf" | |||
@@ -342,20 +343,20 @@ lemma new_element_is_l_new_element: "l_new_element type_wf" | |||
lemma put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_tag_name_type_wf_preserved [simp]: | |||
"h \<turnstile> put_M element_ptr tag_name_update v \<rightarrow>\<^sub>h h' \<Longrightarrow> type_wf h = type_wf h'" | |||
apply(auto simp add: ElementMonad.put_M_defs put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
dest!: get_heap_E | |||
elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I | |||
apply(auto simp add: ElementMonad.put_M_defs put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
dest!: get_heap_E | |||
elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I | |||
ObjectMonad.type_wf_put_I)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs split: option.splits)[1] | |||
using ObjectMonad.type_wf_put_ptr_in_heap_E ObjectMonad.type_wf_put_ptr_not_in_heap_E apply blast | |||
apply (metis (no_types, lifting) bind_eq_Some_conv finite_set_in get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
@@ -363,70 +364,70 @@ lemma put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_tag_name_typ | |||
done | |||
lemma put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_child_nodes_type_wf_preserved [simp]: | |||
lemma put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_child_nodes_type_wf_preserved [simp]: | |||
"h \<turnstile> put_M element_ptr child_nodes_update v \<rightarrow>\<^sub>h h' \<Longrightarrow> type_wf h = type_wf h'" | |||
apply(auto simp add: ElementMonad.put_M_defs put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
dest!: get_heap_E elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I | |||
apply(auto simp add: ElementMonad.put_M_defs put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
dest!: get_heap_E elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I | |||
NodeMonad.type_wf_put_I ObjectMonad.type_wf_put_I)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs ElementMonad.get_M_defs | |||
split: option.splits)[1] | |||
using ObjectMonad.type_wf_put_ptr_in_heap_E ObjectMonad.type_wf_put_ptr_not_in_heap_E apply blast | |||
apply (metis (no_types, lifting) bind_eq_Some_conv finite_set_in get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
apply (metis finite_set_in) | |||
done | |||
lemma put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_attrs_type_wf_preserved [simp]: | |||
lemma put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_attrs_type_wf_preserved [simp]: | |||
"h \<turnstile> put_M element_ptr attrs_update v \<rightarrow>\<^sub>h h' \<Longrightarrow> type_wf h = type_wf h'" | |||
apply(auto simp add: ElementMonad.put_M_defs put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
dest!: get_heap_E | |||
elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I | |||
apply(auto simp add: ElementMonad.put_M_defs put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
dest!: get_heap_E | |||
elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I | |||
ObjectMonad.type_wf_put_I)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
using ObjectMonad.type_wf_put_ptr_in_heap_E ObjectMonad.type_wf_put_ptr_not_in_heap_E apply blast | |||
apply (metis (no_types, lifting) bind_eq_Some_conv finite_set_in get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
apply (metis finite_set_in) | |||
done | |||
lemma put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_shadow_root_opt_type_wf_preserved [simp]: | |||
lemma put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_shadow_root_opt_type_wf_preserved [simp]: | |||
"h \<turnstile> put_M element_ptr shadow_root_opt_update v \<rightarrow>\<^sub>h h' \<Longrightarrow> type_wf h = type_wf h'" | |||
apply(auto simp add: ElementMonad.put_M_defs put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
dest!: get_heap_E | |||
elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I | |||
apply(auto simp add: ElementMonad.put_M_defs put\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
dest!: get_heap_E | |||
elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I | |||
ObjectMonad.type_wf_put_I)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs | |||
ElementMonad.get_M_defs split: option.splits)[1] | |||
using ObjectMonad.type_wf_put_ptr_in_heap_E ObjectMonad.type_wf_put_ptr_not_in_heap_E apply blast | |||
apply (metis (no_types, lifting) bind_eq_Some_conv finite_set_in get\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def) | |||
@@ -434,11 +435,11 @@ lemma put_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t_shadow_root_ | |||
done | |||
lemma new_character_data_type_wf_preserved [simp]: | |||
lemma new_character_data_type_wf_preserved [simp]: | |||
"h \<turnstile> new_character_data \<rightarrow>\<^sub>h h' \<Longrightarrow> type_wf h = type_wf h'" | |||
apply(auto simp add: new_character_data_def new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def Let_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
elim!: bind_returns_heap_E type_wf_put_ptr_not_in_heap_E | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I ObjectMonad.type_wf_put_I | |||
apply(auto simp add: new_character_data_def new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def Let_def put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
elim!: bind_returns_heap_E type_wf_put_ptr_not_in_heap_E | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I ObjectMonad.type_wf_put_I | |||
split: if_splits)[1] | |||
apply(simp_all add: type_wf_defs ElementClass.type_wf_defs NodeClass.type_wf_defs is_node_kind_def) | |||
by (meson new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def new\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_ptr_not_in_heap) | |||
@@ -450,36 +451,36 @@ lemma new_character_data_is_l_new_character_data: "l_new_character_data type_wf" | |||
using l_new_character_data.intro new_character_data_type_wf_preserved | |||
by blast | |||
lemma put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_val_type_wf_preserved [simp]: | |||
lemma put_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_val_type_wf_preserved [simp]: | |||
"h \<turnstile> put_M character_data_ptr val_update v \<rightarrow>\<^sub>h h' \<Longrightarrow> type_wf h = type_wf h'" | |||
apply(auto simp add: CharacterDataMonad.put_M_defs put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
apply(auto simp add: CharacterDataMonad.put_M_defs put\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def put\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
CharacterDataClass.type_wf\<^sub>N\<^sub>o\<^sub>d\<^sub>e CharacterDataClass.type_wf\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t | |||
is_node_kind_def | |||
dest!: get_heap_E | |||
elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I | |||
ObjectMonad.type_wf_put_I)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs CharacterDataMonad.get_M_defs | |||
dest!: get_heap_E | |||
elim!: bind_returns_heap_E2 | |||
intro!: type_wf_put_I ElementMonad.type_wf_put_I NodeMonad.type_wf_put_I | |||
ObjectMonad.type_wf_put_I)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs CharacterDataMonad.get_M_defs | |||
split: option.splits)[1] | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
apply(auto simp add: is_node_kind_def type_wf_defs ElementClass.type_wf_defs | |||
NodeClass.type_wf_defs CharacterDataMonad.get_M_defs | |||
ObjectClass.a_type_wf_def | |||
split: option.splits)[1] | |||
apply (metis (no_types, lifting) bind_eq_Some_conv finite_set_in get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def) | |||
apply (metis (no_types, lifting) bind_eq_Some_conv finite_set_in get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def) | |||
apply (metis finite_set_in) | |||
done | |||
lemma character_data_ptr_kinds_small: | |||
assumes "\<And>object_ptr. preserved (get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr RObject.nothing) h h'" | |||
shows "character_data_ptr_kinds h = character_data_ptr_kinds h'" | |||
by(simp add: character_data_ptr_kinds_def node_ptr_kinds_def preserved_def | |||
by(simp add: character_data_ptr_kinds_def node_ptr_kinds_def preserved_def | |||
object_ptr_kinds_preserved_small[OF assms]) | |||
lemma character_data_ptr_kinds_preserved: | |||
assumes "writes SW setter h h'" | |||
assumes "h \<turnstile> setter \<rightarrow>\<^sub>h h'" | |||
assumes "\<And>h h'. \<forall>w \<in> SW. h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
assumes "\<And>h h'. \<forall>w \<in> SW. h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
\<longrightarrow> (\<forall>object_ptr. preserved (get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr RObject.nothing) h h')" | |||
shows "character_data_ptr_kinds h = character_data_ptr_kinds h'" | |||
using writes_small_big[OF assms] | |||
@@ -491,27 +492,27 @@ lemma type_wf_preserved_small: | |||
assumes "\<And>object_ptr. preserved (get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr RObject.nothing) h h'" | |||
assumes "\<And>node_ptr. preserved (get_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr RNode.nothing) h h'" | |||
assumes "\<And>element_ptr. preserved (get_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr RElement.nothing) h h'" | |||
assumes "\<And>character_data_ptr. preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr | |||
assumes "\<And>character_data_ptr. preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr | |||
RCharacterData.nothing) h h'" | |||
shows "type_wf h = type_wf h'" | |||
using type_wf_preserved_small[OF assms(1) assms(2) assms(3)] | |||
using type_wf_preserved_small[OF assms(1) assms(2) assms(3)] | |||
allI[OF assms(4), of id, simplified] character_data_ptr_kinds_small[OF assms(1)] | |||
apply(auto simp add: type_wf_defs preserved_def get_M_defs character_data_ptr_kinds_small[OF assms(1)] | |||
apply(auto simp add: type_wf_defs preserved_def get_M_defs character_data_ptr_kinds_small[OF assms(1)] | |||
split: option.splits)[1] | |||
apply(force) | |||
apply(force) | |||
by force | |||
lemma type_wf_preserved: | |||
assumes "writes SW setter h h'" | |||
assumes "h \<turnstile> setter \<rightarrow>\<^sub>h h'" | |||
assumes "\<And>h h' w. w \<in> SW \<Longrightarrow> h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
assumes "\<And>h h' w. w \<in> SW \<Longrightarrow> h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> \<forall>object_ptr. preserved (get_M\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t object_ptr RObject.nothing) h h'" | |||
assumes "\<And>h h' w. w \<in> SW \<Longrightarrow> h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
assumes "\<And>h h' w. w \<in> SW \<Longrightarrow> h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> \<forall>node_ptr. preserved (get_M\<^sub>N\<^sub>o\<^sub>d\<^sub>e node_ptr RNode.nothing) h h'" | |||
assumes "\<And>h h' w. w \<in> SW \<Longrightarrow> h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
assumes "\<And>h h' w. w \<in> SW \<Longrightarrow> h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> \<forall>element_ptr. preserved (get_M\<^sub>E\<^sub>l\<^sub>e\<^sub>m\<^sub>e\<^sub>n\<^sub>t element_ptr RElement.nothing) h h'" | |||
assumes "\<And>h h' w. w \<in> SW \<Longrightarrow> h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> \<forall>character_data_ptr. preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr | |||
assumes "\<And>h h' w. w \<in> SW \<Longrightarrow> h \<turnstile> w \<rightarrow>\<^sub>h h' | |||
\<Longrightarrow> \<forall>character_data_ptr. preserved (get_M\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a character_data_ptr | |||
RCharacterData.nothing) h h'" | |||
shows "type_wf h = type_wf h'" | |||
proof - | |||
@@ -523,9 +524,11 @@ proof - | |||
qed | |||
lemma type_wf_drop: "type_wf h \<Longrightarrow> type_wf (Heap (fmdrop ptr (the_heap h)))" | |||
apply(auto simp add: type_wf_def ElementMonad.type_wf_drop | |||
apply(auto simp add: type_wf_def ElementMonad.type_wf_drop | |||
l_type_wf_def\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a.a_type_wf_def)[1] | |||
using type_wf_drop | |||
by (metis (no_types, lifting) ElementClass.type_wf\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ObjectClass.get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_type_wf character_data_ptr_kinds_commutes finite_set_in fmlookup_drop get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def node_ptr_kinds_commutes object_ptr_kinds_code5) | |||
by (metis (no_types, lifting) ElementClass.type_wf\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t ObjectClass.get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_type_wf | |||
character_data_ptr_kinds_commutes finite_set_in fmlookup_drop get\<^sub>C\<^sub>h\<^sub>a\<^sub>r\<^sub>a\<^sub>c\<^sub>t\<^sub>e\<^sub>r\<^sub>D\<^sub>a\<^sub>t\<^sub>a_def get\<^sub>N\<^sub>o\<^sub>d\<^sub>e_def | |||
get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def node_ptr_kinds_commutes object_ptr_kinds_code5) | |||
end |
@@ -23,7 +23,7 @@ | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* | |||
* | |||