cases: fixes a1 :: "cmd"   and a2 :: "label"   and a3 :: "p_edge_kind"   and a4 :: "label" assumes "a1 \<turnstile> a2 -a3\<rightarrow>\<^sub>p a4" obtains prog :: "cmd" where "a1 = prog__" and "a2 = Entry" and "a3 = IEdge (\<lambda>s. False)\<^sub>\<surd>" and "a4 = Exit"   | prog :: "cmd" where "a1 = prog" and "a2 = Entry" and "a3 = IEdge (\<lambda>s. True)\<^sub>\<surd>" and "a4 = Label 0"   | "a1 = Skip" and "a2 = Label 0" and "a3 = IEdge \<Up>id" and "a4 = Exit"   | V :: "char list" and e :: "expr" where "a1 = V__:=e__" and "a2 = Label 0" and "a3 = IEdge \<Up>\<lambda>cf. update cf V__ e__" and "a4 = Label 1"   | V :: "char list" and e :: "expr" where "a1 = V:=e" and "a2 = Label 1" and "a3 = IEdge \<Up>id" and "a4 = Exit"   | c\<^sub>1 :: "cmd" and n :: "label" and et :: "p_edge_kind" and n' :: "label" and c\<^sub>2 :: "cmd" where "a1 = c\<^sub>1__;; c\<^sub>2__" and "a2 = n__" and "a3 = et__" and "a4 = n'__" and "c\<^sub>1__ \<turnstile> n__ -et__\<rightarrow>\<^sub>p n'__" and "n'__ \<noteq> Exit"   | c\<^sub>1 :: "cmd" and n :: "label" and et :: "p_edge_kind" and c\<^sub>2 :: "cmd" where "a1 = c\<^sub>1'__;; c\<^sub>2'__" and "a2 = na__" and "a3 = eta__" and "a4 = Label #:c\<^sub>1'__" and "c\<^sub>1'__ \<turnstile> na__ -eta__\<rightarrow>\<^sub>p Exit" and "na__ \<noteq> Entry"   | c\<^sub>2 :: "cmd" and n :: "label" and et :: "p_edge_kind" and n' :: "label" and c\<^sub>1 :: "cmd" where "a1 = c\<^sub>1''__;; c\<^sub>2''__" and "a2 = nb__ \<oplus> #:c\<^sub>1''__" and "a3 = etb__" and "a4 = n'a__ \<oplus> #:c\<^sub>1''__" and "c\<^sub>2''__ \<turnstile> nb__ -etb__\<rightarrow>\<^sub>p n'a__" and "nb__ \<noteq> Entry"   | b :: "expr" and c\<^sub>1 :: "cmd" and c\<^sub>2 :: "cmd" where "a1 = if (b__) c\<^sub>1'''__ else c\<^sub>2'''__" and "a2 = Label 0" and "a3 = IEdge (\<lambda>cf. state_check cf b__ (Some true))\<^sub>\<surd>" and "a4 = Label 1"   | b :: "expr" and c\<^sub>1 :: "cmd" and c\<^sub>2 :: "cmd" where "a1 = if (ba__) c\<^sub>1''''__ else c\<^sub>2''''__" and "a2 = Label 0" and "a3 = IEdge (\<lambda>cf. state_check cf ba__ (Some false))\<^sub>\<surd>" and "a4 = Label (#:c\<^sub>1''''__ + 1)"   | c\<^sub>1 :: "cmd" and n :: "label" and et :: "p_edge_kind" and n' :: "label" and b :: "expr" and c\<^sub>2 :: "cmd" where "a1 = if (bb__) c\<^sub>1'''''__ else c\<^sub>2'''''__" and "a2 = nc__ \<oplus> 1" and "a3 = etc__" and "a4 = n'b__ \<oplus> 1" and "c\<^sub>1'''''__ \<turnstile> nc__ -etc__\<rightarrow>\<^sub>p n'b__" and "nc__ \<noteq> Entry"   | c\<^sub>2 :: "cmd" and n :: "label" and et :: "p_edge_kind" and n' :: "label" and b :: "expr" and c\<^sub>1 :: "cmd" where "a1 = if (bc__) c\<^sub>1 else c\<^sub>2" and "a2 = nd__ \<oplus> #:c\<^sub>1 + 1" and "a3 = etd__" and "a4 = n'c__ \<oplus> #:c\<^sub>1 + 1" and "c\<^sub>2 \<turnstile> nd__ -etd__\<rightarrow>\<^sub>p n'c__" and "nd__ \<noteq> Entry"   | b :: "expr" and c' :: "cmd" where "a1 = while (bd__) c'__" and "a2 = Label 0" and "a3 = IEdge (\<lambda>cf. state_check cf bd__ (Some true))\<^sub>\<surd>" and "a4 = Label 2"   | b :: "expr" and c' :: "cmd" where "a1 = while (be__) c'a__" and "a2 = Label 0" and "a3 = IEdge (\<lambda>cf. state_check cf be__ (Some false))\<^sub>\<surd>" and "a4 = Label 1"   | b :: "expr" and c' :: "cmd" where "a1 = while (bf__) c'b__" and "a2 = Label 1" and "a3 = IEdge \<Up>id" and "a4 = Exit"   | c' :: "cmd" and n :: "label" and et :: "p_edge_kind" and n' :: "label" and b :: "expr" where "a1 = while (bg__) c'c__" and "a2 = ne__ \<oplus> 2" and "a3 = ete__" and "a4 = n' \<oplus> 2" and "c'c__ \<turnstile> ne__ -ete__\<rightarrow>\<^sub>p n'" and "ne__ \<noteq> Entry" and "n' \<noteq> Exit"   | c' :: "cmd" and n :: "label" and et :: "p_edge_kind" and b :: "expr" where "a1 = while (b) c'" and "a2 = n \<oplus> 2" and "a3 = et" and "a4 = Label 0" and "c' \<turnstile> n -et\<rightarrow>\<^sub>p Exit" and "n \<noteq> Entry"   | p :: "char list" and es :: "expr list" and rets :: "char list list" where "a1 = Call p__ es__ rets__" and "a2 = Label 0" and "a3 = CEdge (p__, es__, rets__)" and "a4 = Label 1"   | p :: "char list" and es :: "expr list" and rets :: "char list list" where "a1 = Call p es rets" and "a2 = Label 1" and "a3 = IEdge \<Up>id" and "a4 = Exit"