[STATEMENT]
lemma get\<^sub>S\<^sub>h\<^sub>a\<^sub>d\<^sub>o\<^sub>w\<^sub>R\<^sub>o\<^sub>o\<^sub>t_type_wf:
  assumes "type_wf h"
  shows "shadow_root_ptr |\<in>| shadow_root_ptr_kinds h \<longleftrightarrow> get\<^sub>S\<^sub>h\<^sub>a\<^sub>d\<^sub>o\<^sub>w\<^sub>R\<^sub>o\<^sub>o\<^sub>t shadow_root_ptr h \<noteq> None"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. (shadow_root_ptr |\<in>| shadow_root_ptr_kinds h) = (get shadow_root_ptr h \<noteq> None)
[PROOF STEP]
proof
[PROOF STATE]
proof (state)
goal (2 subgoals):
 1. shadow_root_ptr |\<in>| shadow_root_ptr_kinds h \<Longrightarrow> get shadow_root_ptr h \<noteq> None
 2. get shadow_root_ptr h \<noteq> None \<Longrightarrow> shadow_root_ptr |\<in>| shadow_root_ptr_kinds h
[PROOF STEP]
assume "shadow_root_ptr |\<in>| shadow_root_ptr_kinds h"
[PROOF STATE]
proof (state)
this:
shadow_root_ptr |\<in>| shadow_root_ptr_kinds h

goal (2 subgoals):
 1. shadow_root_ptr |\<in>| shadow_root_ptr_kinds h \<Longrightarrow> get shadow_root_ptr h \<noteq> None
 2. get shadow_root_ptr h \<noteq> None \<Longrightarrow> shadow_root_ptr |\<in>| shadow_root_ptr_kinds h
[PROOF STEP]
then
[PROOF STATE]
proof (chain)
picking this:
shadow_root_ptr |\<in>| shadow_root_ptr_kinds h
[PROOF STEP]
show "get shadow_root_ptr h \<noteq> None"
[PROOF STATE]
proof (prove)
using this:
shadow_root_ptr |\<in>| shadow_root_ptr_kinds h

goal (1 subgoal):
 1. get shadow_root_ptr h \<noteq> None
[PROOF STEP]
using l_type_wf\<^sub>S\<^sub>h\<^sub>a\<^sub>d\<^sub>o\<^sub>w\<^sub>R\<^sub>o\<^sub>o\<^sub>t_axioms[unfolded l_type_wf\<^sub>S\<^sub>h\<^sub>a\<^sub>d\<^sub>o\<^sub>w\<^sub>R\<^sub>o\<^sub>o\<^sub>t_def type_wf_defs] assms
[PROOF STATE]
proof (prove)
using this:
shadow_root_ptr |\<in>| shadow_root_ptr_kinds h
\<forall>h. type_wf h \<longrightarrow> DocumentClass.type_wf h \<and> (\<forall>shadow_root_ptr\<in>fset (shadow_root_ptr_kinds h). get shadow_root_ptr h \<noteq> None)
type_wf h

goal (1 subgoal):
 1. get shadow_root_ptr h \<noteq> None
[PROOF STEP]
by (meson notin_fset)
[PROOF STATE]
proof (state)
this:
get shadow_root_ptr h \<noteq> None

goal (1 subgoal):
 1. get shadow_root_ptr h \<noteq> None \<Longrightarrow> shadow_root_ptr |\<in>| shadow_root_ptr_kinds h
[PROOF STEP]
next
[PROOF STATE]
proof (state)
goal (1 subgoal):
 1. get shadow_root_ptr h \<noteq> None \<Longrightarrow> shadow_root_ptr |\<in>| shadow_root_ptr_kinds h
[PROOF STEP]
assume "get shadow_root_ptr h \<noteq> None"
[PROOF STATE]
proof (state)
this:
get shadow_root_ptr h \<noteq> None

goal (1 subgoal):
 1. get shadow_root_ptr h \<noteq> None \<Longrightarrow> shadow_root_ptr |\<in>| shadow_root_ptr_kinds h
[PROOF STEP]
then
[PROOF STATE]
proof (chain)
picking this:
get shadow_root_ptr h \<noteq> None
[PROOF STEP]
show "shadow_root_ptr |\<in>| shadow_root_ptr_kinds h"
[PROOF STATE]
proof (prove)
using this:
get shadow_root_ptr h \<noteq> None

goal (1 subgoal):
 1. shadow_root_ptr |\<in>| shadow_root_ptr_kinds h
[PROOF STEP]
apply(auto simp add: get\<^sub>S\<^sub>h\<^sub>a\<^sub>d\<^sub>o\<^sub>w\<^sub>R\<^sub>o\<^sub>o\<^sub>t_def get\<^sub>D\<^sub>o\<^sub>c\<^sub>u\<^sub>m\<^sub>e\<^sub>n\<^sub>t_def get\<^sub>O\<^sub>b\<^sub>j\<^sub>e\<^sub>c\<^sub>t_def shadow_root_ptr_kinds_def
        document_ptr_kinds_def object_ptr_kinds_def
        split: Option.bind_splits)[1]
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. \<And>xa y. \<lbrakk>fmlookup (the_heap h) (cast (cast shadow_root_ptr)) = Some (cast xa); cast xa = Some y\<rbrakk> \<Longrightarrow> shadow_root_ptr |\<in>| (the \<circ> cast) |`| ffilter is_shadow_root_ptr_kind ((the \<circ> cast) |`| ffilter is_document_ptr_kind (fmdom (the_heap h)))
[PROOF STEP]
by (metis comp_eq_dest_lhs document_ptr_casts_commute2 document_ptr_document_ptr_cast
        ffmember_filter fimageI fmdomI is_shadow_root_ptr_kind_cast option.sel
        shadow_root_ptr_casts_commute2)
[PROOF STATE]
proof (state)
this:
shadow_root_ptr |\<in>| shadow_root_ptr_kinds h

goal:
No subgoals!
[PROOF STEP]
qed