simps: fixes a1 :: "(bool list cstate \<times> (bool list \<times> bool list) option \<times> (bool list \<Rightarrow> bool list option)) spmf"   and a2 :: "((bool \<times> unit) \<times> (bool list \<Rightarrow> bool list option) \<times> (bool list \<times> bool list) cstate) spmf" shows "local.S a1 a2 = (a1 = return_spmf (Void, None, Map.empty) \<and> a2 = return_spmf ((False, ()), Map.empty, Void) \<or> (\<exists>m. a1 = return_spmf (Store m, None, Map.empty) \<and> a2 = map_spmf (\<lambda>a. ((True, ()), [m \<mapsto> a], Store (a, m))) (spmf_of_set (nlists UNIV \<eta>)) \<and> length m = id' \<eta>) \<or> (\<exists>m. a1 = return_spmf (cstate.Collect m, None, Map.empty) \<and> a2 = map_spmf (\<lambda>a. ((True, ()), [m \<mapsto> a], cstate.Collect (a, m))) (spmf_of_set (nlists UNIV \<eta>)) \<and> length m = id' \<eta>) \<or> (\<exists>m a. a1 = return_spmf (Store m, None, [m \<mapsto> a]) \<and> a2 = return_spmf ((True, ()), [m \<mapsto> a], Store (a, m)) \<and> length m = id' \<eta> \<and> length a = id' \<eta>) \<or> (\<exists>m a. a1 = return_spmf (cstate.Collect m, None, [m \<mapsto> a]) \<and> a2 = return_spmf ((True, ()), [m \<mapsto> a], cstate.Collect (a, m)) \<and> length m = id' \<eta> \<and> length a = id' \<eta>) \<or> (\<exists>m. a1 = return_spmf (cstate.Fail, None, Map.empty) \<and> a2 = map_spmf (\<lambda>a. ((True, ()), [m \<mapsto> a], cstate.Fail)) (spmf_of_set (nlists UNIV \<eta>)) \<and> length m = id' \<eta>) \<or> (\<exists>m a. a1 = return_spmf (cstate.Fail, None, [m \<mapsto> a]) \<and> a2 = return_spmf ((True, ()), [m \<mapsto> a], cstate.Fail) \<and> length m = id' \<eta> \<and> length a = id' \<eta>) \<or> (\<exists>m' a'. a1 = return_spmf (cstate.Collect m', Some (a', m'), Map.empty) \<and> a2 = return_spmf ((False, ()), Map.empty, cstate.Collect (a', m')) \<and> length m' = id' \<eta> \<and> length a' = id' \<eta>) \<or> (\<exists>m a m' a'. a1 = return_spmf (cstate.Collect m', Some (a', m'), [m \<mapsto> a]) \<and> a2 = return_spmf ((True, ()), [m \<mapsto> a], cstate.Collect (a', m')) \<and> length m = id' \<eta> \<and> length a = id' \<eta> \<and> length m' = id' \<eta> \<and> length a' = id' \<eta>) \<or> (\<exists>m m' a'. a1 = return_spmf (cstate.Collect m', Some (a', m'), Map.empty) \<and> a2 = map_spmf (\<lambda>x. ((True, ()), [m \<mapsto> x], cstate.Collect (a', m'))) (spmf_of_set (nlists UNIV \<eta>)) \<and> length m = id' \<eta> \<and> length m' = id' \<eta> \<and> length a' = id' \<eta>) \<or> (\<exists>m' spmf_s as. a1 = map_spmf (\<lambda>x. (cstate.Fail, None, as(m' \<mapsto> x))) spmf_s \<and> a2 = map_spmf (\<lambda>x. ((False, ()), as(m' \<mapsto> x), cstate.Fail)) spmf_s \<and> length m' = id' \<eta> \<and> lossless_spmf spmf_s) \<or> (\<exists>m' spmf_s as. a1 = map_spmf (\<lambda>x. (cstate.Fail, None, as(m' \<mapsto> x))) spmf_s \<and> a2 = map_spmf (\<lambda>x. ((True, ()), as(m' \<mapsto> x), cstate.Fail)) spmf_s \<and> length m' = id' \<eta> \<and> lossless_spmf spmf_s) \<or> (\<exists>m m' a'. a1 = return_spmf (cstate.Fail, None, [m' \<mapsto> a']) \<and> a2 = map_spmf (\<lambda>x. ((True, ()), [m \<mapsto> x, m' \<mapsto> a'], cstate.Fail)) (spmf_of_set (nlists UNIV \<eta>)) \<and> length m = id' \<eta> \<and> length m' = id' \<eta> \<and> length a' = id' \<eta>) \<or> (\<exists>m m' a'. a1 = map_spmf (\<lambda>x. (cstate.Fail, None, [m' \<mapsto> x])) (spmf_of_set (nlists UNIV \<eta> \<inter> {x. x \<noteq> a'})) \<and> a2 = map_spmf (\<lambda>x. ((True, ()), [m \<mapsto> fst x, m' \<mapsto> snd x], cstate.Fail)) (spmf_of_set (nlists UNIV \<eta> \<times> nlists UNIV \<eta> \<inter> {x. snd x \<noteq> a'})) \<and> length m = id' \<eta> \<and> length m' = id' \<eta>) \<or> (\<exists>m m' spmf_s as. a1 = map_spmf (\<lambda>x. (cstate.Fail, None, as(m' \<mapsto> x))) spmf_s \<and> a2 = map_spmf (\<lambda>p. ((True, ()), as(m' \<mapsto> fst p, m \<mapsto> snd p), cstate.Fail)) (mk_lossless (pair_spmf spmf_s (spmf_of_set (nlists UNIV \<eta>)))) \<and> length m = id' \<eta> \<and> length m' = id' \<eta> \<and> lossless_spmf spmf_s))"