Theory CompositionalityResults

theory CompositionalityResults
imports GeneralizedZippingLemma CompositionSupport
begin

context Compositionality 
begin


(* Theorem 6.4.1 case 1 *)
theorem compositionality_BSD: 
"⟦ BSD 𝒱1 Trβ‡˜ES1⇙; BSD 𝒱2 Trβ‡˜ES2⇙ ⟧ ⟹ BSD 𝒱 Trβ‡˜(ES1 βˆ₯ ES2)⇙"
proof -
  assume BSD_Tr1_v1: "BSD 𝒱1 Trβ‡˜ES1⇙"
  assume BSD_Tr2_v2: "BSD 𝒱2 Trβ‡˜ES2⇙"
  {
    fix Ξ± Ξ² c
    assume c_in_Cv: "c ∈ Cβ‡˜π’±β‡™"
    assume Ξ²cΞ±_in_Tr: "(Ξ² @ [c] @ Ξ±) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
    assume Ξ±_contains_no_c: "Ξ± β†Ώ Cβ‡˜π’±β‡™ = []"

    interpret CSES1: CompositionSupport "ES1" "𝒱" "𝒱1"  
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES1 validV1)

    interpret CSES2: CompositionSupport "ES2" "𝒱" "𝒱2"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES2 validV2)

    from Ξ²cΞ±_in_Tr 
    have  Ξ²cΞ±_E1_in_Tr1: "((Ξ² @ [c] @ Ξ±) β†Ώ Eβ‡˜ES1⇙) ∈ Trβ‡˜ES1⇙"
      and Ξ²cΞ±_E2_in_Tr2: "((Ξ² @ [c] @ Ξ±) β†Ώ Eβ‡˜ES2⇙) ∈ Trβ‡˜ES2⇙"
      by (auto, simp add: composeES_def)+

    from composeES_yields_ES validES1 validES2 have "ES_valid (ES1 βˆ₯ ES2)"
      by auto

    with Ξ²cΞ±_in_Tr have "set Ξ² βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
      by (simp add: ES_valid_def traces_contain_events_def, auto)
    moreover
    have "set (Ξ± β†Ώ Vβ‡˜π’±β‡™) βŠ† Vβ‡˜π’±β‡™"
      by (simp add: projection_def, auto)
    moreover 
    have "(Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Vβ‡˜π’±β‡™ = (Ξ± β†Ώ Vβ‡˜π’±β‡™)"
      by (simp add: projection_def)
    moreover
    from CSES1.BSD_in_subsystem[OF c_in_Cv Ξ²cΞ±_E1_in_Tr1 BSD_Tr1_v1]
    obtain Ξ±1' 
      where Ξ±1'_1: "((Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ±1') ∈ Trβ‡˜ES1⇙"
      and Ξ±1'_2: "(Ξ±1' β†Ώ Vβ‡˜π’±1⇙) = (Ξ± β†Ώ Vβ‡˜π’±1⇙)"
      and "Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []"
      by auto
    moreover
    from Ξ±1'_1 validES1 have Ξ±1'_in_E1: "set Ξ±1' βŠ† Eβ‡˜ES1⇙"
      by (simp add: ES_valid_def traces_contain_events_def, auto)
    moreover
    from Ξ±1'_2 propSepViews have "((Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES1⇙) = (Ξ±1' β†Ώ Vβ‡˜π’±β‡™)"
      proof -
        have "((Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES1⇙) = Ξ± β†Ώ (Vβ‡˜π’±β‡™ ∩ Eβ‡˜ES1⇙)"
          by (simp only: projection_def, auto)
        with propSepViews have "((Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES1⇙) = (Ξ± β†Ώ Vβ‡˜π’±1⇙)"
          unfolding properSeparationOfViews_def by auto
        moreover
        from Ξ±1'_2 have "(Ξ±1' β†Ώ Vβ‡˜π’±1⇙) = (Ξ±1' β†Ώ Vβ‡˜π’±β‡™)"
          proof -
            from Ξ±1'_in_E1 have "Ξ±1' β†Ώ Eβ‡˜ES1⇙ = Ξ±1'"
              by (simp add: list_subset_iff_projection_neutral)
            hence "(Ξ±1' β†Ώ Eβ‡˜ES1⇙) β†Ώ Vβ‡˜π’±β‡™ = Ξ±1' β†Ώ Vβ‡˜π’±β‡™"
              by simp
            with Vv_is_Vv1_union_Vv2 have "(Ξ±1' β†Ώ Eβ‡˜ES1⇙) β†Ώ (Vβ‡˜π’±1⇙ βˆͺ Vβ‡˜π’±2⇙) = Ξ±1' β†Ώ Vβ‡˜π’±β‡™"
              by simp
            hence "Ξ±1' β†Ώ (Eβ‡˜ES1⇙ ∩ (Vβ‡˜π’±1⇙ βˆͺ Vβ‡˜π’±2⇙)) = Ξ±1' β†Ώ Vβ‡˜π’±β‡™"
              by (simp only: projection_def, auto)
            hence "Ξ±1' β†Ώ (Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±1⇙ βˆͺ Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±2⇙) = Ξ±1' β†Ώ Vβ‡˜π’±β‡™"
              by (simp add: Int_Un_distrib)
            moreover 
            from validV1 have "Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±1⇙ = Vβ‡˜π’±1⇙"
              by (simp add: isViewOn_def V_valid_def 
                VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
            ultimately have "Ξ±1' β†Ώ (Vβ‡˜π’±1⇙ βˆͺ Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±2⇙) = Ξ±1' β†Ώ Vβ‡˜π’±β‡™"
              by simp
            moreover
            have "Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±2⇙ βŠ† Vβ‡˜π’±1⇙" 
              proof -
                from propSepViews Vv_is_Vv1_union_Vv2 have "(Vβ‡˜π’±1⇙ βˆͺ Vβ‡˜π’±2⇙) ∩ Eβ‡˜ES1⇙ = Vβ‡˜π’±1⇙"
                  unfolding properSeparationOfViews_def by simp
                hence "(Vβ‡˜π’±1⇙ ∩ Eβ‡˜ES1⇙ βˆͺ Vβ‡˜π’±2⇙ ∩ Eβ‡˜ES1⇙) = Vβ‡˜π’±1⇙"
                  by auto
                with validV1 have "(Vβ‡˜π’±1⇙ βˆͺ Vβ‡˜π’±2⇙ ∩ Eβ‡˜ES1⇙) = Vβ‡˜π’±1⇙"
                  by (simp add: isViewOn_def V_valid_def  
                    VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                thus ?thesis
                  by auto
              qed
            ultimately show ?thesis
               by (simp add: Un_absorb2)
          qed
          moreover note Ξ±1'_2
          ultimately show ?thesis
            by auto
      qed 
    moreover
    from CSES2.BSD_in_subsystem[OF c_in_Cv Ξ²cΞ±_E2_in_Tr2 BSD_Tr2_v2]
    obtain Ξ±2' 
      where Ξ±2'_1: "((Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ±2') ∈ Trβ‡˜ES2⇙"
      and Ξ±2'_2: "(Ξ±2' β†Ώ Vβ‡˜π’±2⇙) = (Ξ± β†Ώ Vβ‡˜π’±2⇙)"
      and "Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []"
      by auto
     moreover
    from Ξ±2'_1 validES2 have Ξ±2'_in_E2: "set Ξ±2' βŠ† Eβ‡˜ES2⇙"
      by (simp add: ES_valid_def traces_contain_events_def, auto)
    moreover
    from Ξ±2'_2 propSepViews have "((Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES2⇙) = (Ξ±2' β†Ώ Vβ‡˜π’±β‡™)"
      proof -
        have "((Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES2⇙) = Ξ± β†Ώ (Vβ‡˜π’±β‡™ ∩ Eβ‡˜ES2⇙)"
          by (simp only: projection_def, auto)
        with propSepViews have "((Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES2⇙) = (Ξ± β†Ώ Vβ‡˜π’±2⇙)"
          unfolding properSeparationOfViews_def by auto
        moreover
        from Ξ±2'_2 have "(Ξ±2' β†Ώ Vβ‡˜π’±2⇙) = (Ξ±2' β†Ώ Vβ‡˜π’±β‡™)"
          proof -
            from Ξ±2'_in_E2 have "Ξ±2' β†Ώ Eβ‡˜ES2⇙ = Ξ±2'"
              by (simp add: list_subset_iff_projection_neutral)
            hence "(Ξ±2' β†Ώ Eβ‡˜ES2⇙) β†Ώ Vβ‡˜π’±β‡™ = Ξ±2' β†Ώ Vβ‡˜π’±β‡™"
              by simp
            with Vv_is_Vv1_union_Vv2 have "(Ξ±2' β†Ώ Eβ‡˜ES2⇙) β†Ώ (Vβ‡˜π’±2⇙ βˆͺ Vβ‡˜π’±1⇙) = Ξ±2' β†Ώ Vβ‡˜π’±β‡™"
              by (simp add: Un_commute)
            hence "Ξ±2' β†Ώ (Eβ‡˜ES2⇙ ∩ (Vβ‡˜π’±2⇙ βˆͺ Vβ‡˜π’±1⇙)) = Ξ±2' β†Ώ Vβ‡˜π’±β‡™"
              by (simp only: projection_def, auto)
            hence "Ξ±2' β†Ώ (Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±2⇙ βˆͺ Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±1⇙) = Ξ±2' β†Ώ Vβ‡˜π’±β‡™"
              by (simp add: Int_Un_distrib)
            moreover 
            from validV2 have "Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±2⇙ = Vβ‡˜π’±2⇙"
              by (simp add: isViewOn_def V_valid_def 
                VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
            ultimately have "Ξ±2' β†Ώ (Vβ‡˜π’±2⇙ βˆͺ Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±1⇙) = Ξ±2' β†Ώ Vβ‡˜π’±β‡™"
              by simp
            moreover
            have "Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±1⇙ βŠ† Vβ‡˜π’±2⇙" 
              proof -
                from propSepViews Vv_is_Vv1_union_Vv2 have "(Vβ‡˜π’±2⇙ βˆͺ Vβ‡˜π’±1⇙) ∩ Eβ‡˜ES2⇙ = Vβ‡˜π’±2⇙"
                  unfolding properSeparationOfViews_def by (simp add: Un_commute)
                hence "(Vβ‡˜π’±2⇙ ∩ Eβ‡˜ES2⇙ βˆͺ Vβ‡˜π’±1⇙ ∩ Eβ‡˜ES2⇙) = Vβ‡˜π’±2⇙"
                  by auto
                with validV2 have "(Vβ‡˜π’±2⇙ βˆͺ Vβ‡˜π’±1⇙ ∩ Eβ‡˜ES2⇙) = Vβ‡˜π’±2⇙"
                  by (simp add: isViewOn_def V_valid_def 
                    VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                thus ?thesis
                  by auto
              qed
            ultimately show ?thesis
               by (simp add: Un_absorb2)
          qed
          moreover note Ξ±2'_2
          ultimately show ?thesis
            by auto
      qed
    moreover note generalized_zipping_lemma
    ultimately have "βˆƒΞ±'. ((Ξ² @ Ξ±') ∈ (Trβ‡˜(ES1 βˆ₯ ES2)⇙) ∧ (Ξ±' β†Ώ Vβ‡˜π’±β‡™ = (Ξ± β†Ώ Vβ‡˜π’±β‡™)) ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = [])"
      by blast
  }
  thus ?thesis 
    unfolding BSD_def
    by auto
qed

(* Theorem 6.4.1 case 2 *)
theorem compositionality_BSI: 
"⟦ BSD 𝒱1 Trβ‡˜ES1⇙; BSD 𝒱2 Trβ‡˜ES2⇙; BSI 𝒱1 Trβ‡˜ES1⇙; BSI 𝒱2 Trβ‡˜ES2⇙ ⟧
    ⟹ BSI 𝒱 Trβ‡˜(ES1 βˆ₯ ES2)⇙"
proof -
  assume BSD1: "BSD 𝒱1 Trβ‡˜ES1⇙"
     and BSD2: "BSD 𝒱2 Trβ‡˜ES2⇙"
     and BSI1: "BSI 𝒱1 Trβ‡˜ES1⇙"
     and BSI2: "BSI 𝒱2 Trβ‡˜ES2⇙"

  {
    fix Ξ± Ξ² c
    assume c_in_Cv: "c ∈ Cβ‡˜π’±β‡™"
    assume Ξ²Ξ±_in_Tr: "(Ξ² @ Ξ±) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
    assume Ξ±_no_Cv: "Ξ± β†Ώ Cβ‡˜π’±β‡™ = []"
    
    from Ξ²Ξ±_in_Tr 
    have  Ξ²Ξ±_E1_in_Tr1: "((Ξ² @ Ξ±) β†Ώ Eβ‡˜ES1⇙) ∈ Trβ‡˜ES1⇙"
      and Ξ²Ξ±_E2_in_Tr2: "((Ξ² @ Ξ±) β†Ώ Eβ‡˜ES2⇙) ∈ Trβ‡˜ES2⇙"
      by (simp add: composeES_def)+

    interpret CSES1: CompositionSupport "ES1" "𝒱" "𝒱1"
      using propSepViews unfolding properSeparationOfViews_def
      by (simp add: CompositionSupport_def validES1 validV1)

    interpret CSES2: CompositionSupport "ES2" "𝒱" "𝒱2"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES2 validV2)

    from CSES1.BSD_in_subsystem2[OF Ξ²Ξ±_E1_in_Tr1 BSD1] obtain Ξ±1'
      where Ξ²E1Ξ±1'_in_Tr1: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
      and Ξ±1'Vv1_is_Ξ±Vv1: "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
      and Ξ±1'Cv1_empty: "Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []"
      by auto

    from CSES2.BSD_in_subsystem2[OF Ξ²Ξ±_E2_in_Tr2 BSD2] obtain Ξ±2'
      where Ξ²E2Ξ±2'_in_Tr2: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
      and Ξ±2'Vv2_is_Ξ±Vv2: "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
      and Ξ±2'Cv2_empty: "Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []"
      by auto
  
    have "βˆƒ Ξ±1''. (set Ξ±1'' βŠ† Eβ‡˜ES1⇙ ∧ ((Ξ² @ [c]) β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙ 
      ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = [])"
      proof cases
        assume cE1_empty: "[c] β†Ώ Eβ‡˜ES1⇙ = []"
        
        from Ξ²E1Ξ±1'_in_Tr1 validES1 have "set Ξ±1' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        from cE1_empty Ξ²E1Ξ±1'_in_Tr1 have "((Ξ² @ [c]) β†Ώ Eβ‡˜ES1⇙) @ Ξ±1' ∈ Trβ‡˜ES1⇙"
          by (simp only: projection_concatenation_commute, auto)
        moreover
        note Ξ±1'Vv1_is_Ξ±Vv1 Ξ±1'Cv1_empty
        ultimately show ?thesis
          by auto
      next
        assume cE1_not_empty: "[c] β†Ώ Eβ‡˜ES1⇙ β‰  []"
        hence c_in_E1: "c ∈ Eβ‡˜ES1⇙"
          by (simp only: projection_def, auto, split if_split_asm, auto)

        from c_in_Cv c_in_E1 propSepViews have "c ∈ Cβ‡˜π’±1⇙"
          unfolding properSeparationOfViews_def by auto
        moreover
        note Ξ²E1Ξ±1'_in_Tr1 Ξ±1'Cv1_empty BSI1
        ultimately obtain Ξ±1'' 
          where Ξ²E1cΞ±1''_in_Tr1: "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [c] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          and   Ξ±1''Vv1_is_Ξ±1'Vv1: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
          and   Ξ±1''Cv1_empty: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
          unfolding BSI_def
          by blast
        
        from validES1 Ξ²E1cΞ±1''_in_Tr1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        from Ξ²E1cΞ±1''_in_Tr1 c_in_E1 have "((Ξ² @ [c]) β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          by (simp only: projection_concatenation_commute projection_def, auto)
        moreover
        from Ξ±1''Vv1_is_Ξ±1'Vv1 Ξ±1'Vv1_is_Ξ±Vv1 have "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
          by auto
        moreover
        note Ξ±1''Cv1_empty
        ultimately show ?thesis
          by auto
      qed
    then obtain Ξ±1''
      where Ξ±1''_in_E1star: "set Ξ±1'' βŠ† Eβ‡˜ES1⇙" 
      and Ξ²cE1Ξ±1''_in_Tr1: "((Ξ² @ [c]) β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙" 
      and Ξ±1''Vv1_is_Ξ±Vv1: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
      and Ξ±1''Cv1_empty: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
      by auto

    have "βˆƒ Ξ±2''. (set Ξ±2'' βŠ† Eβ‡˜ES2⇙ 
      ∧ ((Ξ² @ [c]) β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙ 
      ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙ 
      ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = [])"
      proof cases
        assume cE2_empty: "[c] β†Ώ Eβ‡˜ES2⇙ = []"
        
        from Ξ²E2Ξ±2'_in_Tr2 validES2 have "set Ξ±2' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        from cE2_empty Ξ²E2Ξ±2'_in_Tr2 have "((Ξ² @ [c]) β†Ώ Eβ‡˜ES2⇙) @ Ξ±2' ∈ Trβ‡˜ES2⇙"
          by (simp only: projection_concatenation_commute, auto)
        moreover
        note Ξ±2'Vv2_is_Ξ±Vv2 Ξ±2'Cv2_empty
        ultimately show ?thesis
          by auto
      next
        assume cE2_not_empty: "[c] β†Ώ Eβ‡˜ES2⇙ β‰  []"
        hence c_in_E2: "c ∈ Eβ‡˜ES2⇙"
          by (simp only: projection_def, auto, split if_split_asm, auto)

        from c_in_Cv c_in_E2 propSepViews have "c ∈ Cβ‡˜π’±2⇙"
          unfolding properSeparationOfViews_def by auto
        moreover
        note Ξ²E2Ξ±2'_in_Tr2 Ξ±2'Cv2_empty BSI2
        ultimately obtain Ξ±2'' 
          where Ξ²E2cΞ±2''_in_Tr2: "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [c] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          and   Ξ±2''Vv2_is_Ξ±2'Vv2: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
          and   Ξ±2''Cv2_empty: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
          unfolding BSI_def
          by blast
        
        from validES2 Ξ²E2cΞ±2''_in_Tr2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        from Ξ²E2cΞ±2''_in_Tr2 c_in_E2 have "((Ξ² @ [c]) β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          by (simp only: projection_concatenation_commute projection_def, auto)
        moreover
        from Ξ±2''Vv2_is_Ξ±2'Vv2 Ξ±2'Vv2_is_Ξ±Vv2 have "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
          by auto
        moreover
        note Ξ±2''Cv2_empty
        ultimately show ?thesis
          by auto
      qed
    then obtain Ξ±2''
      where Ξ±2''_in_E2star: "set Ξ±2'' βŠ† Eβ‡˜ES2⇙" 
      and Ξ²cE2Ξ±2''_in_Tr2: "((Ξ² @ [c]) β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙" 
      and Ξ±2''Vv2_is_Ξ±Vv2: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
      and Ξ±2''Cv2_empty: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
      by auto 
    
    (* apply the generalized zipping lemma *)
    from VIsViewOnE c_in_Cv Ξ²Ξ±_in_Tr have "set (Ξ² @ [c]) βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
      by (simp add: isViewOn_def V_valid_def VC_disjoint_def 
        VN_disjoint_def NC_disjoint_def composeES_def, auto)
    moreover
    have "set (Ξ± β†Ώ Vβ‡˜π’±β‡™) βŠ† Vβ‡˜π’±β‡™"
      by (simp add: projection_def, auto)
    moreover
    note Ξ±1''_in_E1star Ξ±2''_in_E2star Ξ²cE1Ξ±1''_in_Tr1 Ξ²cE2Ξ±2''_in_Tr2
    moreover
    have "(Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES1⇙ = Ξ±1'' β†Ώ Vβ‡˜π’±β‡™"
      proof -
        from  Ξ±1''Vv1_is_Ξ±Vv1 propSepViews have "Ξ± β†Ώ (Vβ‡˜π’±β‡™ ∩ Eβ‡˜ES1⇙) = Ξ±1'' β†Ώ (Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±β‡™)"
          unfolding properSeparationOfViews_def by (simp add: Int_commute)
        hence "Ξ± β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES1⇙ = Ξ±1'' β†Ώ Eβ‡˜ES1⇙ β†Ώ Vβ‡˜π’±β‡™"
          by (simp add: projection_def)
        with Ξ±1''_in_E1star show ?thesis
          by (simp add: list_subset_iff_projection_neutral)
      qed
    moreover
    have "(Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES2⇙ = Ξ±2'' β†Ώ Vβ‡˜π’±β‡™"
      proof -
        from  Ξ±2''Vv2_is_Ξ±Vv2 propSepViews have "Ξ± β†Ώ (Vβ‡˜π’±β‡™ ∩ Eβ‡˜ES2⇙) = Ξ±2'' β†Ώ (Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±β‡™)"
          unfolding properSeparationOfViews_def  by (simp add: Int_commute)
        hence "Ξ± β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES2⇙ = Ξ±2'' β†Ώ Eβ‡˜ES2⇙ β†Ώ Vβ‡˜π’±β‡™"
          by (simp add: projection_def)
        with Ξ±2''_in_E2star show ?thesis
          by (simp add: list_subset_iff_projection_neutral)
      qed
    moreover
    note Ξ±1''Cv1_empty Ξ±2''Cv2_empty generalized_zipping_lemma
    ultimately have "βˆƒΞ±'. (Ξ² @ [c]) @ Ξ±' ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙ ∧ Ξ±' β†Ώ Vβ‡˜π’±β‡™ = Ξ± β†Ώ Vβ‡˜π’±β‡™ ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = []"
      by blast
  }
  thus ?thesis
    unfolding BSI_def
    by auto
qed

(* Theorem 6.4.1 case 3 *)
theorem compositionality_BSIA: 
"⟦ BSD 𝒱1 Trβ‡˜ES1⇙; BSD 𝒱2 Trβ‡˜ES2⇙; BSIA ρ1 𝒱1 Trβ‡˜ES1⇙; BSIA ρ2 𝒱2 Trβ‡˜ES2⇙; 
  (ρ1 𝒱1) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES1⇙; (ρ2 𝒱2) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES2⇙ ⟧ 
    ⟹ BSIA ρ 𝒱 (Trβ‡˜(ES1 βˆ₯ ES2)⇙)"
proof -
  assume BSD1: "BSD 𝒱1 Trβ‡˜ES1⇙"
  and BSD2: "BSD 𝒱2 Trβ‡˜ES2⇙"
  and BSIA1: "BSIA ρ1 𝒱1 Trβ‡˜ES1⇙"
  and BSIA2: "BSIA ρ2 𝒱2 Trβ‡˜ES2⇙"
  and ρ1v1_subset_ρv_inter_E1: "(ρ1 𝒱1) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES1⇙"
  and ρ2v2_subset_ρv_inter_E2:"(ρ2 𝒱2) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES2⇙"

  {
    fix Ξ± Ξ² c
    assume c_in_Cv: "c ∈ Cβ‡˜π’±β‡™"
    assume Ξ²Ξ±_in_Tr: "(Ξ² @ Ξ±) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
    assume Ξ±_no_Cv: "Ξ± β†Ώ Cβ‡˜π’±β‡™ = []"
    assume Adm: "(Adm 𝒱 ρ Trβ‡˜(ES1 βˆ₯ ES2)⇙ Ξ² c)"
    then obtain Ξ³
      where γρv_is_βρv: "Ξ³ β†Ώ (ρ 𝒱) = Ξ² β†Ώ (ρ 𝒱)"
      and Ξ³c_in_Tr: "(Ξ³ @ [c]) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
      unfolding Adm_def
      by auto

    from Ξ²Ξ±_in_Tr 
    have  Ξ²Ξ±_E1_in_Tr1: "((Ξ² @ Ξ±) β†Ώ Eβ‡˜ES1⇙) ∈ Trβ‡˜ES1⇙"
      and Ξ²Ξ±_E2_in_Tr2: "((Ξ² @ Ξ±) β†Ώ Eβ‡˜ES2⇙) ∈ Trβ‡˜ES2⇙"
      by (simp add: composeES_def)+

    interpret CSES1: CompositionSupport "ES1" "𝒱" "𝒱1"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES1 validV1)

    interpret CSES2: CompositionSupport "ES2" "𝒱" "𝒱2"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES2 validV2)


    from CSES1.BSD_in_subsystem2[OF Ξ²Ξ±_E1_in_Tr1 BSD1] obtain Ξ±1'
      where Ξ²E1Ξ±1'_in_Tr1: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
      and Ξ±1'Vv1_is_Ξ±Vv1: "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
      and Ξ±1'Cv1_empty: "Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []"
      by auto

    from CSES2.BSD_in_subsystem2[OF Ξ²Ξ±_E2_in_Tr2 BSD2] obtain Ξ±2'
      where Ξ²E2Ξ±2'_in_Tr2: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
      and Ξ±2'Vv2_is_Ξ±Vv2: "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
      and Ξ±2'Cv2_empty: "Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []"
      by auto

    have "βˆƒ Ξ±1''. (set Ξ±1'' βŠ† Eβ‡˜ES1⇙ 
      ∧ ((Ξ² @ [c]) β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙ 
      ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙ 
      ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = [])"
      proof cases
        assume cE1_empty: "[c] β†Ώ Eβ‡˜ES1⇙ = []"
        
        from Ξ²E1Ξ±1'_in_Tr1 validES1 have "set Ξ±1' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        from cE1_empty Ξ²E1Ξ±1'_in_Tr1 have "((Ξ² @ [c]) β†Ώ Eβ‡˜ES1⇙) @ Ξ±1' ∈ Trβ‡˜ES1⇙"
          by (simp only: projection_concatenation_commute, auto)
        moreover
        note Ξ±1'Vv1_is_Ξ±Vv1 Ξ±1'Cv1_empty
        ultimately show ?thesis
          by auto
      next
        assume cE1_not_empty: "[c] β†Ώ Eβ‡˜ES1⇙ β‰  []"
        hence c_in_E1: "c ∈ Eβ‡˜ES1⇙"
          by (simp only: projection_def, auto, split if_split_asm, auto)

        from c_in_Cv c_in_E1 propSepViews have "c ∈ Cβ‡˜π’±1⇙"
          unfolding properSeparationOfViews_def by auto
        moreover
        note Ξ²E1Ξ±1'_in_Tr1 Ξ±1'Cv1_empty
        moreover
        have "(Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ (Ξ² β†Ώ Eβ‡˜ES1⇙) c)" 
          proof -
            from c_in_E1 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES1⇙) @ [c] ∈ Trβ‡˜ES1⇙"
              by (simp add: projection_def composeES_def)
            moreover
            have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1)"
              proof -
                from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱)"
                  by (metis projection_commute)
                with ρ1v1_subset_ρv_inter_E1 have "Ξ³ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ (ρ1 𝒱1)"
                  by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
                thus ?thesis
                  by (metis projection_commute)
              qed
           ultimately show ?thesis unfolding Adm_def
              by auto
          qed
        moreover
        note BSIA1
        ultimately obtain Ξ±1'' 
          where Ξ²E1cΞ±1''_in_Tr1: "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [c] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          and   Ξ±1''Vv1_is_Ξ±1'Vv1: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
          and   Ξ±1''Cv1_empty: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
          unfolding BSIA_def
          by blast
        
        from validES1 Ξ²E1cΞ±1''_in_Tr1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        from Ξ²E1cΞ±1''_in_Tr1 c_in_E1 have "((Ξ² @ [c]) β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          by (simp only: projection_concatenation_commute projection_def, auto)
        moreover
        from Ξ±1''Vv1_is_Ξ±1'Vv1 Ξ±1'Vv1_is_Ξ±Vv1 have "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
          by auto
        moreover
        note Ξ±1''Cv1_empty
        ultimately show ?thesis
          by auto
      qed
    then obtain Ξ±1''
      where Ξ±1''_in_E1star: "set Ξ±1'' βŠ† Eβ‡˜ES1⇙" 
      and Ξ²cE1Ξ±1''_in_Tr1: "((Ξ² @ [c]) β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙" 
      and Ξ±1''Vv1_is_Ξ±Vv1: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
      and Ξ±1''Cv1_empty: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
      by auto

    have "βˆƒ Ξ±2''. (set Ξ±2'' βŠ† Eβ‡˜ES2⇙ 
      ∧ ((Ξ² @ [c]) β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙ 
      ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙ 
      ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = [])"
      proof cases
        assume cE2_empty: "[c] β†Ώ Eβ‡˜ES2⇙ = []"
        
        from Ξ²E2Ξ±2'_in_Tr2 validES2 have "set Ξ±2' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        from cE2_empty Ξ²E2Ξ±2'_in_Tr2 have "((Ξ² @ [c]) β†Ώ Eβ‡˜ES2⇙) @ Ξ±2' ∈ Trβ‡˜ES2⇙"
          by (simp only: projection_concatenation_commute, auto)
        moreover
        note Ξ±2'Vv2_is_Ξ±Vv2 Ξ±2'Cv2_empty
        ultimately show ?thesis
          by auto
      next
        assume cE2_not_empty: "[c] β†Ώ Eβ‡˜ES2⇙ β‰  []"
        hence c_in_E2: "c ∈ Eβ‡˜ES2⇙"
          by (simp only: projection_def, auto, split if_split_asm, auto)

        from c_in_Cv c_in_E2 propSepViews have "c ∈ Cβ‡˜π’±2⇙"
          unfolding properSeparationOfViews_def by auto
        moreover
        note Ξ²E2Ξ±2'_in_Tr2 Ξ±2'Cv2_empty
        moreover
        have "(Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ (Ξ² β†Ώ Eβ‡˜ES2⇙) c)" 
          proof -
            from c_in_E2 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES2⇙) @ [c] ∈ Trβ‡˜ES2⇙"
              by (simp add: projection_def composeES_def)
            moreover
            have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2)"
              proof -
                from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱)"
                  by (metis projection_commute)
                with ρ2v2_subset_ρv_inter_E2 have "Ξ³ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ (ρ2 𝒱2)"
                  by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
                thus ?thesis
                  by (metis projection_commute)
              qed
           ultimately show ?thesis unfolding Adm_def
              by auto
          qed
        moreover
        note BSIA2
        ultimately obtain Ξ±2'' 
          where Ξ²E2cΞ±2''_in_Tr2: "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [c] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          and   Ξ±2''Vv2_is_Ξ±2'Vv2: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
          and   Ξ±2''Cv2_empty: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
          unfolding BSIA_def
          by blast
        
        from validES2 Ξ²E2cΞ±2''_in_Tr2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        from Ξ²E2cΞ±2''_in_Tr2 c_in_E2 have "((Ξ² @ [c]) β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          by (simp only: projection_concatenation_commute projection_def, auto)
        moreover
        from Ξ±2''Vv2_is_Ξ±2'Vv2 Ξ±2'Vv2_is_Ξ±Vv2 have "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
          by auto
        moreover
        note Ξ±2''Cv2_empty
        ultimately show ?thesis
          by auto
      qed
    then obtain Ξ±2''
      where Ξ±2''_in_E2star: "set Ξ±2'' βŠ† Eβ‡˜ES2⇙" 
      and Ξ²cE2Ξ±2''_in_Tr2: "((Ξ² @ [c]) β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙" 
      and Ξ±2''Vv2_is_Ξ±Vv2: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
      and Ξ±2''Cv2_empty: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
      by auto
    
    (* apply the generalized zipping lemma *)
    from VIsViewOnE c_in_Cv Ξ²Ξ±_in_Tr have "set (Ξ² @ [c]) βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
      by (simp add: isViewOn_def V_valid_def VC_disjoint_def 
        VN_disjoint_def NC_disjoint_def composeES_def, auto)
    moreover
    have "set (Ξ± β†Ώ Vβ‡˜π’±β‡™) βŠ† Vβ‡˜π’±β‡™"
      by (simp add: projection_def, auto)
    moreover
    note Ξ±1''_in_E1star Ξ±2''_in_E2star Ξ²cE1Ξ±1''_in_Tr1 Ξ²cE2Ξ±2''_in_Tr2
    moreover
    have "(Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES1⇙ = Ξ±1'' β†Ώ Vβ‡˜π’±β‡™"
      proof -
        from  Ξ±1''Vv1_is_Ξ±Vv1 propSepViews 
        have "Ξ± β†Ώ (Vβ‡˜π’±β‡™ ∩ Eβ‡˜ES1⇙) = Ξ±1'' β†Ώ (Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±β‡™)"
         unfolding properSeparationOfViews_def by (simp add: Int_commute)
        hence "Ξ± β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES1⇙ = Ξ±1'' β†Ώ Eβ‡˜ES1⇙ β†Ώ Vβ‡˜π’±β‡™"
          by (simp add: projection_def)
        with Ξ±1''_in_E1star show ?thesis
          by (simp add: list_subset_iff_projection_neutral)
      qed
    moreover
    have "(Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES2⇙ = Ξ±2'' β†Ώ Vβ‡˜π’±β‡™"
      proof -
        from  Ξ±2''Vv2_is_Ξ±Vv2 propSepViews 
        have "Ξ± β†Ώ (Vβ‡˜π’±β‡™ ∩ Eβ‡˜ES2⇙) = Ξ±2'' β†Ώ (Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±β‡™)"
          unfolding properSeparationOfViews_def by (simp add: Int_commute)
        hence "Ξ± β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES2⇙ = Ξ±2'' β†Ώ Eβ‡˜ES2⇙ β†Ώ Vβ‡˜π’±β‡™"
          by (simp add: projection_def)
        with Ξ±2''_in_E2star show ?thesis
          by (simp add: list_subset_iff_projection_neutral)
      qed
    moreover
    note Ξ±1''Cv1_empty Ξ±2''Cv2_empty generalized_zipping_lemma
    ultimately have "βˆƒΞ±'. (Ξ² @ [c]) @ Ξ±' ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙ ∧ Ξ±' β†Ώ Vβ‡˜π’±β‡™ = Ξ± β†Ώ Vβ‡˜π’±β‡™ ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = []"
      by blast
  }
  thus ?thesis
    unfolding BSIA_def
    by auto
qed

(* Theorem 6.4.1 case 4 *)
theorem compositionality_FCD: 
 "⟦ BSD 𝒱1 Trβ‡˜ES1⇙; BSD 𝒱2 Trβ‡˜ES2⇙; 
  βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† βˆ‡β‡˜Ξ“1⇙; βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† βˆ‡β‡˜Ξ“2⇙;
  Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙; Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙;
  ( Ξ”β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±1⇙ βˆͺ Ξ”β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±2⇙ ) βŠ† Ξ”β‡˜Ξ“β‡™;
  Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ = {}; Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ = {};
  FCD Ξ“1 𝒱1 Trβ‡˜ES1⇙; FCD Ξ“2 𝒱2 Trβ‡˜ES2⇙ ⟧ 
  ⟹ FCD Ξ“ 𝒱 (Trβ‡˜(ES1 βˆ₯ ES2)⇙)"
proof -
  assume BSD1: "BSD 𝒱1 Trβ‡˜ES1⇙"
    and BSD2: "BSD 𝒱2 Trβ‡˜ES2⇙"
    and Nabla_inter_E1_subset_Nabla1: "βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† βˆ‡β‡˜Ξ“1⇙"
    and Nabla_inter_E2_subset_Nabla2: "βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† βˆ‡β‡˜Ξ“2⇙"
    and Upsilon_inter_E1_subset_Upsilon1: "Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙"
    and Upsilon_inter_E2_subset_Upsilon2: "Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙"
    and Delta1_N1_Delta2_N2_subset_Delta: "( Ξ”β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±1⇙ βˆͺ Ξ”β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±2⇙ ) βŠ† Ξ”β‡˜Ξ“β‡™"
    and N1_Delta1_E2_disjoint: "Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ = {}"
    and N2_Delta2_E1_disjoint: "Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ = {}"
    and FCD1: "FCD Ξ“1 𝒱1 Trβ‡˜ES1⇙"
    and FCD2: "FCD Ξ“2 𝒱2 Trβ‡˜ES2⇙"

  {
    fix Ξ± Ξ² c v'
    assume c_in_Cv_inter_Upsilon: "c ∈ (Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™)"
      and v'_in_Vv_inter_Nabla: "v' ∈ (Vβ‡˜π’±β‡™ ∩ βˆ‡β‡˜Ξ“β‡™)"
      and Ξ²cv'Ξ±_in_Tr: "(Ξ² @ [c,v'] @ Ξ±) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙" 
      and Ξ±Cv_empty: "Ξ± β†Ώ Cβ‡˜π’±β‡™ = []"

    from  Ξ²cv'Ξ±_in_Tr
    have  Ξ²cv'Ξ±_E1_in_Tr1: "(((Ξ² @ [c,v']) @ Ξ±) β†Ώ Eβ‡˜ES1⇙) ∈ Trβ‡˜ES1⇙"
      and Ξ²cv'Ξ±_E2_in_Tr2: "(((Ξ² @ [c,v']) @ Ξ±) β†Ώ Eβ‡˜ES2⇙) ∈ Trβ‡˜ES2⇙"
      by (simp add: composeES_def)+

    interpret CSES1: CompositionSupport "ES1" "𝒱" "𝒱1"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES1 validV1)

    interpret CSES2: CompositionSupport "ES2" "𝒱" "𝒱2"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES2 validV2)

    from CSES1.BSD_in_subsystem2[OF Ξ²cv'Ξ±_E1_in_Tr1 BSD1] obtain Ξ±1'
      where Ξ²cv'E1Ξ±1'_in_Tr1: "(Ξ² @ [c,v']) β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
      and Ξ±1'Vv1_is_Ξ±Vv1: "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
      and Ξ±1'Cv1_empty: "Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []"
      by auto

    from CSES2.BSD_in_subsystem2[OF Ξ²cv'Ξ±_E2_in_Tr2 BSD2] obtain Ξ±2'
      where Ξ²cv'E2Ξ±2'_in_Tr2: "(Ξ² @ [c,v']) β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
      and Ξ±2'Vv2_is_Ξ±Vv2: "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
      and Ξ±2'Cv2_empty: "Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []"
      by auto

    from c_in_Cv_inter_Upsilon v'_in_Vv_inter_Nabla validV1
    have "c βˆ‰ Eβ‡˜ES1⇙ ∨ (c ∈ Eβ‡˜ES1⇙ ∧ v' βˆ‰ Eβ‡˜ES1⇙) ∨ (c ∈ Eβ‡˜ES1⇙ ∧ v' ∈ Eβ‡˜ES1⇙)"
      by (simp add: isViewOn_def V_valid_def
        VC_disjoint_def VN_disjoint_def NC_disjoint_def)
    moreover {
      assume c_notin_E1: "c βˆ‰ Eβ‡˜ES1⇙"
     
      have "set [] βŠ† (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
        by auto
      moreover
      from Ξ²cv'E1Ξ±1'_in_Tr1 c_notin_E1 have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [] @ ([v'] β†Ώ Eβ‡˜ES1⇙) @ Ξ±1' ∈ Trβ‡˜ES1⇙"
        by (simp only: projection_concatenation_commute projection_def, auto)
      moreover
      have "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙" ..
      moreover
      note Ξ±1'Cv1_empty 
      ultimately have "βˆƒ Ξ±1'' Ξ΄1''. set Ξ΄1'' βŠ† (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙) 
        ∧ (Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ΄1'' @ ([v'] β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙        
        ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
        by blast
    }
    moreover {
      assume c_in_E1: "c ∈ Eβ‡˜ES1⇙"
      and v'_notin_E1: "v' βˆ‰ Eβ‡˜ES1⇙"

      from c_in_E1 c_in_Cv_inter_Upsilon propSepViews
        Upsilon_inter_E1_subset_Upsilon1 
      have c_in_Cv1_Upsilon1: "c ∈ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙)"
        unfolding properSeparationOfViews_def by auto
      hence c_in_Cv1: "c ∈ Cβ‡˜π’±1⇙"
        by auto
      moreover
      from Ξ²cv'E1Ξ±1'_in_Tr1 c_in_E1 v'_notin_E1 have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [c] @ Ξ±1' ∈ Trβ‡˜ES1⇙"
        by (simp only: projection_concatenation_commute projection_def, auto)
      moreover
      note Ξ±1'Cv1_empty BSD1
      ultimately obtain Ξ±1''
        where first: "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
        and second: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
        and third: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
        unfolding BSD_def
        by blast
       
      have "set [] βŠ† (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
        by auto
      moreover
      from first v'_notin_E1 have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [] @ ([v'] β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
        by (simp add: projection_def)
      moreover
      note second third
      ultimately
      have "βˆƒ Ξ±1'' Ξ΄1''. set Ξ΄1'' βŠ† (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙) 
        ∧ (Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ΄1'' @ ([v'] β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙        
        ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
        by blast
    }
    moreover {
      assume c_in_E1: "c ∈ Eβ‡˜ES1⇙"
      and v'_in_E1: "v' ∈ Eβ‡˜ES1⇙"
      
      from c_in_E1 c_in_Cv_inter_Upsilon propSepViews
        Upsilon_inter_E1_subset_Upsilon1 
      have c_in_Cv1_Upsilon1: "c ∈ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙)"
        unfolding properSeparationOfViews_def by auto
      moreover
      from v'_in_E1 v'_in_Vv_inter_Nabla propSepViews Nabla_inter_E1_subset_Nabla1
      have v'_in_Vv1_inter_Nabla1: "v' ∈ (Vβ‡˜π’±1⇙ ∩ βˆ‡β‡˜Ξ“1⇙)"
        unfolding properSeparationOfViews_def by auto
      moreover
      from Ξ²cv'E1Ξ±1'_in_Tr1 c_in_E1 v'_in_E1 have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [c,v'] @ Ξ±1' ∈ Trβ‡˜ES1⇙"
        by (simp add: projection_def)
      moreover
      note Ξ±1'Cv1_empty FCD1
      ultimately obtain Ξ±1'' Ξ΄1'' 
        where first: "set Ξ΄1'' βŠ† (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
        and second: "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ΄1'' @ [v'] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
        and third: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
        and fourth: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
        unfolding FCD_def
        by blast

      from second v'_in_E1 have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ΄1'' @ ([v'] β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
        by (simp add: projection_def)
      with first third fourth
      have "βˆƒ Ξ±1'' Ξ΄1''. set Ξ΄1'' βŠ† (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙) 
        ∧ (Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ΄1'' @ ([v'] β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙        
        ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
        unfolding FCD_def
        by blast
    }
    ultimately obtain Ξ±1'' Ξ΄1'' 
      where Ξ΄1''_in_Nv1_Delta1_star: "set Ξ΄1'' βŠ† (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
      and Ξ²E1Ξ΄1''vE1Ξ±1''_in_Tr1: "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ΄1'' @ ([v'] β†Ώ Eβ‡˜ES1⇙) @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
      and Ξ±1''Vv1_is_Ξ±1'Vv1: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
      and Ξ±1''Cv1_empty: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
      by blast
    with validV1 have Ξ΄1''_in_E1_star: "set Ξ΄1'' βŠ† Eβ‡˜ES1⇙"
      by (simp add: isViewOn_def V_valid_def 
        VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)

    from c_in_Cv_inter_Upsilon v'_in_Vv_inter_Nabla validV2
    have "c βˆ‰ Eβ‡˜ES2⇙ ∨ (c ∈ Eβ‡˜ES2⇙ ∧ v' βˆ‰ Eβ‡˜ES2⇙) ∨ (c ∈ Eβ‡˜ES2⇙ ∧ v' ∈ Eβ‡˜ES2⇙)"
      by (simp add: isViewOn_def V_valid_def 
        VC_disjoint_def VN_disjoint_def NC_disjoint_def)
    moreover {
      assume c_notin_E2: "c βˆ‰ Eβ‡˜ES2⇙"
     
      have "set [] βŠ† (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
        by auto
      moreover
      from Ξ²cv'E2Ξ±2'_in_Tr2 c_notin_E2 have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [] @ ([v'] β†Ώ Eβ‡˜ES2⇙) @ Ξ±2' ∈ Trβ‡˜ES2⇙"
        by (simp only: projection_concatenation_commute projection_def, auto)
      moreover
      have "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙" ..
      moreover
      note Ξ±2'Cv2_empty 
      ultimately have "βˆƒ Ξ±2'' Ξ΄2''. set Ξ΄2'' βŠ† (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙) 
        ∧ (Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ΄2'' @ ([v'] β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙        
        ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
        by blast
    }
    moreover {
      assume c_in_E2: "c ∈ Eβ‡˜ES2⇙"
      and v'_notin_E2: "v' βˆ‰ Eβ‡˜ES2⇙"

      from c_in_E2 c_in_Cv_inter_Upsilon propSepViews Upsilon_inter_E2_subset_Upsilon2 
      have c_in_Cv2_Upsilon2: "c ∈ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙)"
        unfolding properSeparationOfViews_def by auto
      hence c_in_Cv2: "c ∈ Cβ‡˜π’±2⇙"
        by auto
      moreover
      from Ξ²cv'E2Ξ±2'_in_Tr2 c_in_E2 v'_notin_E2 have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [c] @ Ξ±2' ∈ Trβ‡˜ES2⇙"
        by (simp only: projection_concatenation_commute projection_def, auto)
      moreover
      note Ξ±2'Cv2_empty BSD2
      ultimately obtain Ξ±2''
        where first: "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
        and second: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
        and third: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
        unfolding BSD_def
        by blast
       
      have "set [] βŠ† (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
        by auto
      moreover
      from first v'_notin_E2 have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [] @ ([v'] β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
        by (simp add: projection_def)
      moreover
      note second third
      ultimately
      have "βˆƒ Ξ±2'' Ξ΄2''. set Ξ΄2'' βŠ† (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙) 
        ∧ (Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ΄2'' @ ([v'] β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙        
        ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
        by blast
    }
    moreover {
      assume c_in_E2: "c ∈ Eβ‡˜ES2⇙"
      and v'_in_E2: "v' ∈ Eβ‡˜ES2⇙"
      
      from c_in_E2 c_in_Cv_inter_Upsilon propSepViews
        Upsilon_inter_E2_subset_Upsilon2 
      have c_in_Cv2_Upsilon2: "c ∈ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙)"
        unfolding properSeparationOfViews_def by auto
      moreover
      from v'_in_E2 v'_in_Vv_inter_Nabla propSepViews Nabla_inter_E2_subset_Nabla2
      have v'_in_Vv2_inter_Nabla2: "v' ∈ (Vβ‡˜π’±2⇙ ∩ βˆ‡β‡˜Ξ“2⇙)"
        unfolding properSeparationOfViews_def by auto
      moreover
      from Ξ²cv'E2Ξ±2'_in_Tr2 c_in_E2 v'_in_E2 have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [c,v'] @ Ξ±2' ∈ Trβ‡˜ES2⇙"
        by (simp add: projection_def)
      moreover
      note Ξ±2'Cv2_empty FCD2
      ultimately obtain Ξ±2'' Ξ΄2'' 
        where first: "set Ξ΄2'' βŠ† (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
        and second: "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ΄2'' @ [v'] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
        and third: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
        and fourth: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
        unfolding FCD_def
        by blast

      from second v'_in_E2 have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ΄2'' @ ([v'] β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
        by (simp add: projection_def)
      with first third fourth
      have "βˆƒ Ξ±2'' Ξ΄2''. set Ξ΄2'' βŠ† (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙) 
        ∧ (Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ΄2'' @ ([v'] β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙        
        ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
        unfolding FCD_def
        by blast
    }
    ultimately obtain Ξ±2'' Ξ΄2'' 
      where Ξ΄2''_in_Nv2_Delta2_star: "set Ξ΄2'' βŠ† (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
      and Ξ²E2Ξ΄2''vE2Ξ±2''_in_Tr2: "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ΄2'' @ ([v'] β†Ώ Eβ‡˜ES2⇙) @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
      and Ξ±2''Vv2_is_Ξ±2'Vv2: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
      and Ξ±2''Cv2_empty: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
      by blast
    with validV2 have Ξ΄2''_in_E2_star: "set Ξ΄2'' βŠ† Eβ‡˜ES2⇙"
      by (simp add: isViewOn_def V_valid_def  
        VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
    
    from Ξ΄1''_in_Nv1_Delta1_star N1_Delta1_E2_disjoint 
    have Ξ΄1''E2_empty: "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = []"
      proof -
        from Ξ΄1''_in_Nv1_Delta1_star have "Ξ΄1'' = Ξ΄1'' β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
          by (simp only: list_subset_iff_projection_neutral)
        hence "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙) β†Ώ Eβ‡˜ES2⇙"
          by simp
        moreover
        have "Ξ΄1'' β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙) β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙)"
          by (simp only: projection_def, auto)
        with N1_Delta1_E2_disjoint have "Ξ΄1'' β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙) β†Ώ Eβ‡˜ES2⇙ = []"
          by (simp add: projection_def)
        ultimately show ?thesis
          by simp
      qed
    moreover
    from Ξ΄2''_in_Nv2_Delta2_star N2_Delta2_E1_disjoint have Ξ΄2''E1_empty: "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = []"
      proof -
        from Ξ΄2''_in_Nv2_Delta2_star have "Ξ΄2'' = Ξ΄2'' β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
          by (simp only: list_subset_iff_projection_neutral)
        hence "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙) β†Ώ Eβ‡˜ES1⇙"
          by simp
        moreover
        have "Ξ΄2'' β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙) β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙)"
          by (simp only: projection_def, auto)
        with N2_Delta2_E1_disjoint have "Ξ΄2'' β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙) β†Ώ Eβ‡˜ES1⇙ = []"
          by (simp add: projection_def)
        ultimately show ?thesis
          by simp
      qed
    moreover
    note Ξ²E1Ξ΄1''vE1Ξ±1''_in_Tr1 Ξ²E2Ξ΄2''vE2Ξ±2''_in_Tr2 Ξ΄1''_in_E1_star Ξ΄2''_in_E2_star
    ultimately have Ξ²Ξ΄1''Ξ΄2''v'E1Ξ±1''_in_Tr1: "(Ξ² @ Ξ΄1'' @ Ξ΄2'' @ [v']) β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
      and Ξ²Ξ΄1''Ξ΄2''v'E2Ξ±2''_in_Tr2: "(Ξ² @ Ξ΄1'' @ Ξ΄2'' @ [v']) β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
      by (simp only: projection_concatenation_commute list_subset_iff_projection_neutral, auto, 
          simp only: projection_concatenation_commute list_subset_iff_projection_neutral, auto)

    have "set (Ξ² @ Ξ΄1'' @ Ξ΄2'' @ [v']) βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
      proof -
        from Ξ²cv'Ξ±_in_Tr have "set Ξ² βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
          by (simp add: composeES_def)
        moreover
        note Ξ΄1''_in_E1_star Ξ΄2''_in_E2_star
        moreover
        from v'_in_Vv_inter_Nabla VIsViewOnE
        have "v' ∈ Eβ‡˜(ES1 βˆ₯ ES2)⇙"
          by (simp add:isViewOn_def  V_valid_def
            VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
        ultimately show ?thesis
          by (simp add: composeES_def, auto)
      qed
    moreover
    have "set (Ξ± β†Ώ Vβ‡˜π’±β‡™) βŠ† Vβ‡˜π’±β‡™"
      by (simp add: projection_def, auto)
    moreover
    from Ξ²E1Ξ΄1''vE1Ξ±1''_in_Tr1 validES1 have Ξ±1''_in_E1_star: "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
      by (simp add: ES_valid_def traces_contain_events_def, auto)
    moreover
    from Ξ²E2Ξ΄2''vE2Ξ±2''_in_Tr2 validES2 have Ξ±2''_in_E2_star: "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
      by (simp add: ES_valid_def traces_contain_events_def, auto)
    moreover
    note Ξ²Ξ΄1''Ξ΄2''v'E1Ξ±1''_in_Tr1 Ξ²Ξ΄1''Ξ΄2''v'E2Ξ±2''_in_Tr2
    moreover 
    have "(Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES1⇙ = Ξ±1'' β†Ώ Vβ‡˜π’±β‡™"
      proof -
        from  Ξ±1''Vv1_is_Ξ±1'Vv1 Ξ±1'Vv1_is_Ξ±Vv1 propSepViews 
        have "Ξ± β†Ώ (Vβ‡˜π’±β‡™ ∩ Eβ‡˜ES1⇙) = Ξ±1'' β†Ώ (Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±β‡™)"
          unfolding properSeparationOfViews_def by (simp add: Int_commute)
        hence "Ξ± β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES1⇙ = Ξ±1'' β†Ώ Eβ‡˜ES1⇙ β†Ώ Vβ‡˜π’±β‡™"
          by (simp add: projection_def)
        with Ξ±1''_in_E1_star show ?thesis
          by (simp add: list_subset_iff_projection_neutral)
      qed
    moreover
    have "(Ξ± β†Ώ Vβ‡˜π’±β‡™) β†Ώ Eβ‡˜ES2⇙ = Ξ±2'' β†Ώ Vβ‡˜π’±β‡™"
      proof -
        from  Ξ±2''Vv2_is_Ξ±2'Vv2 Ξ±2'Vv2_is_Ξ±Vv2 propSepViews 
        have "Ξ± β†Ώ (Vβ‡˜π’±β‡™ ∩ Eβ‡˜ES2⇙) = Ξ±2'' β†Ώ (Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±β‡™)"
          unfolding properSeparationOfViews_def by (simp add: Int_commute)
        hence "Ξ± β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES2⇙ = Ξ±2'' β†Ώ Eβ‡˜ES2⇙ β†Ώ Vβ‡˜π’±β‡™"
          by (simp add: projection_def)
        with Ξ±2''_in_E2_star show ?thesis
          by (simp add: list_subset_iff_projection_neutral)
      qed
    moreover
    note Ξ±1''Cv1_empty Ξ±2''Cv2_empty generalized_zipping_lemma
    ultimately obtain t
      where first: "(Ξ² @ Ξ΄1'' @ Ξ΄2'' @ [v']) @ t ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
      and second: "t β†Ώ Vβ‡˜π’±β‡™ = Ξ± β†Ώ Vβ‡˜π’±β‡™"
      and third: "t β†Ώ Cβ‡˜π’±β‡™ = []"
      by blast
    
    from Ξ΄1''_in_Nv1_Delta1_star Ξ΄2''_in_Nv2_Delta2_star 
    have "set (Ξ΄1'' @ Ξ΄2'') βŠ† (Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™)"
      proof -
        have "set (Ξ΄1'' @ Ξ΄2'') βŠ† Ξ”β‡˜Ξ“β‡™"
          proof -
            from Ξ΄1''_in_Nv1_Delta1_star Ξ΄2''_in_Nv2_Delta2_star 
            have "set (Ξ΄1'' @ Ξ΄2'') βŠ† Ξ”β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±1⇙ βˆͺ Ξ”β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±2⇙"
              by auto
            with Delta1_N1_Delta2_N2_subset_Delta show ?thesis
              by auto
          qed
        moreover
        have "set (Ξ΄1'' @ Ξ΄2'') βŠ† Nβ‡˜π’±β‡™"
          proof -
            from Ξ΄1''_in_Nv1_Delta1_star Ξ΄2''_in_Nv2_Delta2_star 
            have "set (Ξ΄1'' @ Ξ΄2'') βŠ† (Nβ‡˜π’±1⇙ βˆͺ Nβ‡˜π’±2⇙)"
              by auto
            with Nv1_union_Nv2_subsetof_Nv show ?thesis
              by auto
          qed
        ultimately show ?thesis
          by auto
      qed
    moreover
    from first have "Ξ² @ (Ξ΄1'' @ Ξ΄2'') @ [v'] @ t ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
      by auto
    moreover 
    note second third
    ultimately have "βˆƒΞ±'. βˆƒΞ³'. (set Ξ³') βŠ† (Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™) 
      ∧ ((Ξ² @ Ξ³' @ [v'] @ Ξ±') ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙  
      ∧ (Ξ±' β†Ώ Vβ‡˜π’±β‡™) = (Ξ± β†Ώ Vβ‡˜π’±β‡™) 
      ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = [])"
      by blast
  }
  thus ?thesis
    unfolding FCD_def
    by auto
qed

(* Theorem 6.4.1 case 5 *)
theorem compositionality_FCI: 
"⟦ BSD 𝒱1 Trβ‡˜ES1⇙; BSD 𝒱2 Trβ‡˜ES2⇙; BSIA ρ1 𝒱1 Trβ‡˜ES1⇙; BSIA ρ2 𝒱2 Trβ‡˜ES2⇙;
  total ES1 (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙); total ES2 (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙);
  βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† βˆ‡β‡˜Ξ“1⇙; βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† βˆ‡β‡˜Ξ“2⇙;
  Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙; Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙;
  ( Ξ”β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±1⇙ βˆͺ Ξ”β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±2⇙ ) βŠ† Ξ”β‡˜Ξ“β‡™;
  (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ = {} ∧ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙)
  ∨ ( Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ = {} ∧ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙)  ;
  FCI Ξ“1 𝒱1 Trβ‡˜ES1⇙; FCI Ξ“2 𝒱2 Trβ‡˜ES2⇙ ⟧ 
  ⟹ FCI Ξ“ 𝒱 (Trβ‡˜(ES1 βˆ₯ ES2)⇙)"
proof -
  assume BSD1: "BSD 𝒱1 Trβ‡˜ES1⇙" 
    and BSD2: "BSD 𝒱2 Trβ‡˜ES2⇙"
    and BSIA1: "BSIA ρ1 𝒱1 Trβ‡˜ES1⇙"
    and BSIA2: "BSIA ρ2 𝒱2 Trβ‡˜ES2⇙"
    and total_ES1_C1_inter_Upsilon1: "total ES1 (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙)"
    and total_ES2_C2_inter_Upsilon2: "total ES2 (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙)"
    and Nabla_inter_E1_subset_Nabla1: "βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† βˆ‡β‡˜Ξ“1⇙"
    and Nabla_inter_E2_subset_Nabla2: "βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† βˆ‡β‡˜Ξ“2⇙"
    and Upsilon_inter_E1_subset_Upsilon1: "Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙"
    and Upsilon_inter_E2_subset_Upsilon2: "Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙"
    and Delta1_N1_Delta2_N2_subset_Delta: "( Ξ”β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±1⇙ βˆͺ Ξ”β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±2⇙ ) βŠ† Ξ”β‡˜Ξ“β‡™"
    and very_long_asm: "(Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ = {} ∧ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙)
    ∨ ( Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ = {} ∧ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙)"
    and FCI1: "FCI Ξ“1 𝒱1 Trβ‡˜ES1⇙"
    and FCI2: "FCI Ξ“2 𝒱2 Trβ‡˜ES2⇙"

  {
    fix Ξ± Ξ² c v'
    assume c_in_Cv_inter_Upsilon: "c ∈ (Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™)"
      and v'_in_Vv_inter_Nabla: "v' ∈ (Vβ‡˜π’±β‡™ ∩ βˆ‡β‡˜Ξ“β‡™)"
      and Ξ²v'Ξ±_in_Tr: "(Ξ² @ [v'] @ Ξ±) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙" 
      and Ξ±Cv_empty: "Ξ± β†Ώ Cβ‡˜π’±β‡™ = []"

    from  Ξ²v'Ξ±_in_Tr
    have  Ξ²v'Ξ±_E1_in_Tr1: "(((Ξ² @ [v']) @ Ξ±) β†Ώ Eβ‡˜ES1⇙) ∈ Trβ‡˜ES1⇙"
      and Ξ²v'Ξ±_E2_in_Tr2: "(((Ξ² @ [v']) @ Ξ±) β†Ώ Eβ‡˜ES2⇙) ∈ Trβ‡˜ES2⇙"
      by (simp add: composeES_def)+

    interpret CSES1: CompositionSupport "ES1" "𝒱" "𝒱1"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES1 validV1)

    interpret CSES2: CompositionSupport "ES2" "𝒱" "𝒱2"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES2 validV2)

    from CSES1.BSD_in_subsystem2[OF Ξ²v'Ξ±_E1_in_Tr1 BSD1] obtain Ξ±1'
      where Ξ²v'E1Ξ±1'_in_Tr1: "(Ξ² @ [v']) β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
      and Ξ±1'Vv1_is_Ξ±Vv1: "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
      and Ξ±1'Cv1_empty: "Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []"
      by auto

    from CSES2.BSD_in_subsystem2[OF Ξ²v'Ξ±_E2_in_Tr2 BSD2] obtain Ξ±2'
      where Ξ²v'E2Ξ±2'_in_Tr2: "(Ξ² @ [v']) β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
      and Ξ±2'Vv2_is_Ξ±Vv2: "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
      and Ξ±2'Cv2_empty: "Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []"
      by auto

    note very_long_asm
    moreover {
      assume Nv1_inter_Delta1_inter_E2_empty: "Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ = {}" 
        and  Nv2_inter_Delta2_inter_E1_subsetof_Upsilon1: "Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙"

      let ?ALPHA2''_DELTA2'' = "βˆƒ Ξ±2'' Ξ΄2''. (
        set Ξ±2'' βŠ† Eβ‡˜ES2⇙ ∧ set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ 
        ∧ Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙        
        ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = [])"

      from c_in_Cv_inter_Upsilon v'_in_Vv_inter_Nabla  validV2
      have "c βˆ‰ Eβ‡˜ES2⇙ ∨ (c ∈ Eβ‡˜ES2⇙ ∧ v' βˆ‰ Eβ‡˜ES2⇙) ∨ (c ∈ Eβ‡˜ES2⇙ ∧ v' ∈ Eβ‡˜ES2⇙)"
        by (simp add: isViewOn_def V_valid_def 
          VC_disjoint_def VN_disjoint_def NC_disjoint_def)
      moreover {
        assume c_notin_E2: "c βˆ‰ Eβ‡˜ES2⇙"

        from validES2 Ξ²v'E2Ξ±2'_in_Tr2 have "set Ξ±2' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover 
        have "set [] βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
          by auto
        moreover 
        from Ξ²v'E2Ξ±2'_in_Tr2 c_notin_E2 
        have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover
        have "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙" ..
        moreover 
        note Ξ±2'Cv2_empty
        ultimately have ?ALPHA2''_DELTA2''
          by blast
      }
      moreover {
        assume c_in_E2: "c ∈ Eβ‡˜ES2⇙"
          and  v'_notin_E2: "v' βˆ‰ Eβ‡˜ES2⇙"

        from c_in_E2 c_in_Cv_inter_Upsilon propSepViews 
          Upsilon_inter_E2_subset_Upsilon2
        have c_in_Cv2_inter_Upsilon2: "c ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
          unfolding properSeparationOfViews_def by auto
        hence "c ∈ Cβ‡˜π’±2⇙"
          by auto
        moreover
        from Ξ²v'E2Ξ±2'_in_Tr2 v'_notin_E2 have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover
        note Ξ±2'Cv2_empty
        moreover
        have "(Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ (Ξ² β†Ώ Eβ‡˜ES2⇙) c)" 
          proof -
            from validES2 Ξ²v'E2Ξ±2'_in_Tr2 v'_notin_E2 have "Ξ² β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
              by (simp add: ES_valid_def traces_prefixclosed_def
                prefixclosed_def prefix_def projection_concatenation_commute)
            with total_ES2_C2_inter_Upsilon2 c_in_Cv2_inter_Upsilon2 
            have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] ∈ Trβ‡˜ES2⇙"
              by (simp add: total_def)
            thus ?thesis
              unfolding Adm_def
              by blast
          qed
        moreover 
        note BSIA2
        ultimately obtain  Ξ±2''
          where one: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          and two:   "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
          and three: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
          unfolding BSIA_def
          by blast

        from one validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        have "set [] βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
          by auto
        moreover
        from one c_in_E2 v'_notin_E2 
        have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover 
        note two three
        ultimately have ?ALPHA2''_DELTA2''
          by blast
      }
      moreover {
        assume c_in_E2: "c ∈ Eβ‡˜ES2⇙"
          and  v'_in_E2: "v' ∈ Eβ‡˜ES2⇙"

        from c_in_E2 c_in_Cv_inter_Upsilon propSepViews
          Upsilon_inter_E2_subset_Upsilon2
        have c_in_Cv2_inter_Upsilon2: "c ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
          unfolding properSeparationOfViews_def by auto
        moreover
        from v'_in_E2 propSepViews v'_in_Vv_inter_Nabla Nabla_inter_E2_subset_Nabla2
        have "v' ∈ Vβ‡˜π’±2⇙ ∩ Nabla Ξ“2"
          unfolding properSeparationOfViews_def by auto
        moreover
        from v'_in_E2  Ξ²v'E2Ξ±2'_in_Tr2 have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [v'] @ Ξ±2' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover
        note Ξ±2'Cv2_empty FCI2
        ultimately obtain Ξ±2'' Ξ΄2''
          where one: "set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
          and two: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] @ Ξ΄2'' @ [v'] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          and three: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
          and four: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
          unfolding FCI_def
          by blast

        from two validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        note one
        moreover
        from two c_in_E2 v'_in_E2 
        have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover
        note three four
        ultimately have ?ALPHA2''_DELTA2''
          by blast
      }
      ultimately obtain Ξ±2'' Ξ΄2''
        where Ξ±2''_in_E2star: "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
        and Ξ΄2''_in_N2_inter_Delta2star:"set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
        and Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2:
              "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
        and Ξ±2''Vv2_is_Ξ±2'Vv2: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
        and Ξ±2''Cv2_empty: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
        by blast

      from c_in_Cv_inter_Upsilon Upsilon_inter_E1_subset_Upsilon1 
      propSepViews 
      have cE1_in_Cv1_inter_Upsilon1: "set ([c] β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
        unfolding properSeparationOfViews_def  by (simp add: projection_def, auto)
     
      from Ξ΄2''_in_N2_inter_Delta2star Nv2_inter_Delta2_inter_E1_subsetof_Upsilon1 
        propSepViews disjoint_Nv2_Vv1 
      have Ξ΄2''E1_in_Cv1_inter_Upsilon1star: "set (Ξ΄2'' β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
        proof -
          from Ξ΄2''_in_N2_inter_Delta2star 
          have eq: "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙)"
            by (metis Int_commute Int_left_commute Int_lower1 Int_lower2 
              projection_intersection_neutral subset_trans)
          
          from validV1 Nv2_inter_Delta2_inter_E1_subsetof_Upsilon1 propSepViews
            disjoint_Nv2_Vv1  
          have "Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
            unfolding properSeparationOfViews_def
            by (simp add:isViewOn_def V_valid_def  VC_disjoint_def
              VN_disjoint_def NC_disjoint_def, auto)
          thus ?thesis
            by (subst eq, simp only: projection_def, auto)
        qed
      
      have cΞ΄2''E1_in_Cv1_inter_Upsilon1star: "set ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
        proof -
          from cE1_in_Cv1_inter_Upsilon1 Ξ΄2''E1_in_Cv1_inter_Upsilon1star
          have "set (([c] @ Ξ΄2'') β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
            by (simp only: projection_concatenation_commute, auto)
          thus ?thesis
            by auto
        qed


      have "βˆƒ Ξ±1'' Ξ΄1''. set Ξ±1'' βŠ† Eβ‡˜ES1⇙ 
        ∧ set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2
⇙        ∧ Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙        
        ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []
        ∧ Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
        proof cases
          assume v'_in_E1: "v' ∈ Eβ‡˜ES1⇙"
          with Nabla_inter_E1_subset_Nabla1 propSepViews v'_in_Vv_inter_Nabla
          have v'_in_Vv1_inter_Nabla1: "v' ∈ Vβ‡˜π’±1⇙ ∩ Nabla Ξ“1"
            unfolding properSeparationOfViews_def by auto

          have "⟦ (Ξ² @ [v']) β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙ ; 
            Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []; set ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ; 
            c ∈ Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™ ; set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ⟧ 
            ⟹ βˆƒ Ξ±1'' Ξ΄1''. (set Ξ±1'' βŠ† Eβ‡˜ES1⇙ ∧ set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ 
              βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙
            ∧ Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙            
            ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []
            ∧ Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙)"
            proof (induct "length ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙)" arbitrary: Ξ² Ξ±1' c Ξ΄2'')
              case 0

              from 0(2) validES1 have "set Ξ±1' βŠ† Eβ‡˜ES1⇙"
                by (simp add: ES_valid_def traces_contain_events_def, auto)
              moreover
              have "set [] βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                by auto
              moreover
              have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
                proof -
                  note 0(2)
                  moreover
                  from 0(1) have "c βˆ‰ Eβ‡˜ES1⇙"
                    by (simp add: projection_def, auto)
                  ultimately show ?thesis
                    by (simp add: projection_concatenation_commute projection_def)
                qed
              moreover
              have "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙" ..
              moreover
              note 0(3)
              moreover 
              from 0(1) have "[] β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                by (simp add: projection_def, split if_split_asm, auto)
              ultimately show ?case
                by blast
            next
              case (Suc n)

              from projection_split_last[OF Suc(2)] obtain ΞΌ c' Ξ½
                where c'_in_E1: "c' ∈ Eβ‡˜ES1⇙"
                and cΞ΄2''_is_ΞΌc'Ξ½: "c # Ξ΄2'' = ΞΌ @ [c'] @ Ξ½"
                and Ξ½E1_empty: "Ξ½ β†Ώ Eβ‡˜ES1⇙ = []"
                and n_is_length_ΞΌΞ½E1: "n = length ((ΞΌ @ Ξ½) β†Ώ Eβ‡˜ES1⇙)"
                by blast

              from Suc(5) c'_in_E1 cΞ΄2''_is_ΞΌc'Ξ½ 
              have "set (ΞΌ β†Ώ Eβ‡˜ES1⇙ @ [c']) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                by (simp only: cΞ΄2''_is_ΞΌc'Ξ½ projection_concatenation_commute 
                  projection_def, auto)
              hence c'_in_Cv1_inter_Upsilon1: "c' ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                by auto
              hence c'_in_Cv1: "c' ∈ Cβ‡˜π’±1⇙" and c'_in_Upsilon1: "c' ∈ Ξ₯β‡˜Ξ“1⇙"
                by auto
              with validV1 have c'_in_E1: "c' ∈ Eβ‡˜ES1⇙"
                by (simp add: isViewOn_def V_valid_def  VC_disjoint_def 
                  VN_disjoint_def NC_disjoint_def, auto)

              show ?case
                proof (cases ΞΌ)
                  case Nil (* we apply FCI in this case *)
                  with cΞ΄2''_is_ΞΌc'Ξ½ have c_is_c': "c = c'" and Ξ΄2''_is_Ξ½: "Ξ΄2'' = Ξ½"
                    by auto
                  with c'_in_Cv1_inter_Upsilon1 have "c ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                    by simp
                  moreover
                  note v'_in_Vv1_inter_Nabla1
                  moreover
                  from v'_in_E1 Suc(3) have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [v'] @ Ξ±1' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_concatenation_commute projection_def)
                  moreover
                  note Suc(4) FCI1
                  ultimately obtain Ξ±1'' Ξ³
                    where one: "set Ξ³ βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    and two: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] @ Ξ³ @ [v'] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    and three: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    and four: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
                    unfolding FCI_def
                    by blast

                  (* we choose Ξ΄1'' = Ξ½ β†Ώ EES1 @ Ξ³ *)
                  let ?DELTA1'' = "Ξ½ β†Ώ Eβ‡˜ES1⇙ @ Ξ³"

                  from two validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  from one Ξ½E1_empty 
                  have "set ?DELTA1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    by auto
                  moreover
                  have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ ?DELTA1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    proof -
                      from c_is_c' c'_in_E1 have "[c] = [c] β†Ώ Eβ‡˜ES1⇙"
                        by (simp add: projection_def)
                      moreover
                      from v'_in_E1 have "[v'] = [v'] β†Ώ Eβ‡˜ES1⇙"
                        by (simp add: projection_def)
                      moreover
                      note Ξ½E1_empty two
                      ultimately show ?thesis
                        by auto
                    qed
                  moreover
                  note three four
                  moreover
                  have "?DELTA1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                    proof -
                      have "Ξ³ β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = []"
                        proof -
                          from validV1 have "Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = {}"
                            by (simp add: isViewOn_def V_valid_def 
                              VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                          with projection_intersection_neutral[OF one, of "Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"]
                          show ?thesis
                            by (simp add: projection_def)
                        qed
                      with Ξ΄2''_is_Ξ½ Ξ½E1_empty show ?thesis
                        by (simp add: projection_concatenation_commute)
                    qed
                  ultimately show ?thesis
                    by blast
                next
                  case (Cons x xs) (* we apply the inductive hypothesis in this case *)
                  with cΞ΄2''_is_ΞΌc'Ξ½ have ΞΌ_is_c_xs: "ΞΌ = [c] @ xs" 
                    and Ξ΄2''_is_xs_c'_Ξ½: "Ξ΄2'' = xs @ [c'] @ Ξ½"
                    by auto
                  with n_is_length_ΞΌΞ½E1 have "n = length ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES1⇙)"
                    by auto
                  moreover
                  note Suc(3,4)
                  moreover
                  have "set ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                    proof -
                      have res: "c # (xs @ Ξ½) = [c] @ (xs @ Ξ½)" 
                        by auto

                      from Suc(5) cΞ΄2''_is_ΞΌc'Ξ½ ΞΌ_is_c_xs Ξ½E1_empty
                      show ?thesis
                        by (subst res, simp only: cΞ΄2''_is_ΞΌc'Ξ½ projection_concatenation_commute 
                          set_append, auto)
                    qed
                  moreover
                  note Suc(6) 
                  moreover
                  from Suc(7) Ξ΄2''_is_xs_c'_Ξ½ have "set (xs @ Ξ½) βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    by auto
                  moreover note Suc(1)[of c "xs @ Ξ½" Ξ² Ξ±1']
                  ultimately obtain Ξ΄ Ξ³
                    where one: "set Ξ΄ βŠ† Eβ‡˜ES1⇙"
                    and two: "set Ξ³ βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    and three: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ³ @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄ ∈ Trβ‡˜ES1⇙"
                    and four: "Ξ΄ β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    and five: "Ξ΄ β†Ώ Cβ‡˜π’±1⇙ = []"
                    and six: "Ξ³ β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = (xs @ Ξ½) β†Ώ Eβ‡˜ES1⇙"
                    by blast

                  (* apply FCI to insert c' after Ξ³ *)
                  let ?BETA = "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ³"

                  note c'_in_Cv1_inter_Upsilon1 v'_in_Vv1_inter_Nabla1
                  moreover
                  from three v'_in_E1 have "?BETA @ [v'] @ Ξ΄ ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  note five FCI1
                  ultimately obtain Ξ±1'' Ξ΄'
                    where fci_one: "set Ξ΄' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    and fci_two: "?BETA @ [c'] @ Ξ΄' @ [v'] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    and fci_three: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ΄ β†Ώ Vβ‡˜π’±1⇙"
                    and fci_four:  "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
                    unfolding FCI_def
                    by blast
  
                  let ?DELTA1'' = "Ξ³ @ [c'] @ Ξ΄'"

                  from fci_two validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  have "set ?DELTA1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    proof -
                      from Suc(7) c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½ 
                      have "c' ∈  Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                        by auto
                      with two fci_one show ?thesis
                        by auto
                    qed
                  moreover
                  from fci_two v'_in_E1 
                  have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ ?DELTA1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  from fci_three four have "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    by simp
                  moreover
                  note fci_four
                  moreover             
                  have "?DELTA1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                    proof -
                      have "Ξ΄' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = []"
                        proof -
                          from fci_one have "βˆ€ e ∈ set Ξ΄'. e ∈ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                            by auto
                          with validV1 have "βˆ€ e ∈ set Ξ΄'. e βˆ‰ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                            by (simp add: isViewOn_def V_valid_def
                              VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                          thus ?thesis
                            by (simp add: projection_def)
                        qed
                      with c'_in_E1 c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½ Ξ½E1_empty six 
                      show ?thesis
                        by (simp only: projection_concatenation_commute projection_def, auto)
                    qed
                  ultimately show ?thesis 
                    by blast     
                qed
          qed
          from this[OF Ξ²v'E1Ξ±1'_in_Tr1 Ξ±1'Cv1_empty cΞ΄2''E1_in_Cv1_inter_Upsilon1star 
            c_in_Cv_inter_Upsilon Ξ΄2''_in_N2_inter_Delta2star]
          obtain Ξ±1'' Ξ΄1''
            where one: "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
            and two: "set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
            and three: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙            
            ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
            and four: "Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
            by blast

          note one two three
          moreover
          have "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙" 
            proof -
              from projection_intersection_neutral[OF two, of "Eβ‡˜ES2⇙"] 
                Nv1_inter_Delta1_inter_E2_empty validV2 
              have "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES2⇙)"
                by (simp only: Int_Un_distrib2, auto)
              moreover
              from validV2 
              have "Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES2⇙ = Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                by (simp add: isViewOn_def V_valid_def 
                  VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
              ultimately have "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
                by simp
              hence "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
                by (simp add: projection_def)
              with four have "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
                by simp
              hence "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙) β†Ώ Eβ‡˜ES1⇙"
                by (simp only: projection_commute)
              with Ξ΄2''_in_N2_inter_Delta2star show ?thesis
                by (simp only: list_subset_iff_projection_neutral)
            qed
          ultimately show ?thesis
              by blast
        next
          assume v'_notin_E1: "v' βˆ‰ Eβ‡˜ES1⇙"

           have "⟦ (Ξ² @ [v']) β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙ ; 
            Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []; set ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ; 
             c ∈ Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™ ; set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ⟧ 
            ⟹ βˆƒ Ξ±1'' Ξ΄1''. (set Ξ±1'' βŠ† Eβ‡˜ES1⇙ ∧ set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ 
                ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2
⇙            ∧ Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙            
             ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []
            ∧ Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙)"
            proof (induct "length ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙)" arbitrary: Ξ² Ξ±1' c Ξ΄2'')
               case 0

              from 0(2) validES1 have "set Ξ±1' βŠ† Eβ‡˜ES1⇙"
                by (simp add: ES_valid_def traces_contain_events_def, auto)
              moreover
              have "set [] βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                by auto
              moreover
              have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
                proof -
                  note 0(2)
                  moreover
                  from 0(1) have "c βˆ‰ Eβ‡˜ES1⇙"
                    by (simp add: projection_def, auto)
                  ultimately show ?thesis
                    by (simp add: projection_concatenation_commute projection_def)
                qed
              moreover
              have "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙" ..
              moreover
              note 0(3)
              moreover 
              from 0(1) have "[] β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                by (simp add: projection_def, split if_split_asm, auto)
              ultimately show ?case
                by blast
            next
              case (Suc n)

              from projection_split_last[OF Suc(2)] obtain ΞΌ c' Ξ½
                where c'_in_E1: "c' ∈ Eβ‡˜ES1⇙"
                and cΞ΄2''_is_ΞΌc'Ξ½: "c # Ξ΄2'' = ΞΌ @ [c'] @ Ξ½"
                and Ξ½E1_empty: "Ξ½ β†Ώ Eβ‡˜ES1⇙ = []"
                and n_is_length_ΞΌΞ½E1: "n = length ((ΞΌ @ Ξ½) β†Ώ Eβ‡˜ES1⇙)"
                by blast

              from Suc(5) c'_in_E1 cΞ΄2''_is_ΞΌc'Ξ½ 
              have "set (ΞΌ β†Ώ Eβ‡˜ES1⇙ @ [c']) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                by (simp only: cΞ΄2''_is_ΞΌc'Ξ½ projection_concatenation_commute 
                  projection_def, auto)
              hence c'_in_Cv1_inter_Upsilon1: "c' ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                by auto
              hence c'_in_Cv1: "c' ∈ Cβ‡˜π’±1⇙" and c'_in_Upsilon1: "c' ∈ Ξ₯β‡˜Ξ“1⇙"
                by auto
              with validV1 have c'_in_E1: "c' ∈ Eβ‡˜ES1⇙"
                by (simp add: isViewOn_def V_valid_def
                  VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)

              show ?case
                proof (cases ΞΌ)
                  case Nil (* we just apply BSIA in this case *)
                  with cΞ΄2''_is_ΞΌc'Ξ½ have c_is_c': "c = c'" 
                    and Ξ΄2''_is_Ξ½: "Ξ΄2'' = Ξ½"
                    by auto
                  with c'_in_Cv1_inter_Upsilon1 have "c ∈ Cβ‡˜π’±1⇙"
                    by simp
                  moreover
                  from v'_notin_E1 Suc(3) have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ±1' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_concatenation_commute projection_def)
                  moreover
                  note Suc(4)
                  moreover
                  have "Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ (Ξ² β†Ώ Eβ‡˜ES1⇙) c"
                    proof -
                      have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] ∈ Trβ‡˜ES1⇙"
                        proof -
                          from c_is_c' c'_in_Cv1_inter_Upsilon1 
                          have "c ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                            by simp
                          moreover
                          from validES1 Suc(3) 
                          have "(Ξ² β†Ώ Eβ‡˜ES1⇙) ∈ Trβ‡˜ES1⇙"
                            by (simp only: ES_valid_def traces_prefixclosed_def
                              projection_concatenation_commute 
                              prefixclosed_def prefix_def, auto)
                          moreover
                          note total_ES1_C1_inter_Upsilon1
                          ultimately show ?thesis
                            unfolding total_def
                            by blast
                        qed
                      thus ?thesis
                        unfolding Adm_def
                        by blast                        
                    qed
                  moreover
                  note BSIA1
                  ultimately obtain Ξ±1''
                    where one: "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [c] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    and two: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    and three: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
                    unfolding BSIA_def
                    by blast

                  let ?DELTA1'' = "Ξ½ β†Ώ Eβ‡˜ES1⇙"

                  from one validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  from Ξ½E1_empty
                  have "set ?DELTA1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    by simp
                  moreover
                  from c_is_c' c'_in_E1 one v'_notin_E1 Ξ½E1_empty
                  have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [c] β†Ώ Eβ‡˜ES1⇙ @ ?DELTA1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  note two three
                  moreover
                  from Ξ½E1_empty Ξ΄2''_is_Ξ½ have "?DELTA1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  ultimately show ?thesis
                    by blast
                next
                  case (Cons x xs) (* apply inductive hypothesis, then BSIA *)
                  with cΞ΄2''_is_ΞΌc'Ξ½
                  have ΞΌ_is_c_xs: "ΞΌ = [c] @ xs" and Ξ΄2''_is_xs_c'_Ξ½: "Ξ΄2'' = xs @ [c'] @ Ξ½"
                    by auto
                  with n_is_length_ΞΌΞ½E1 have "n = length ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES1⇙)"
                    by auto
                  moreover
                  note Suc(3,4)
                  moreover
                  have "set ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                    proof -
                      have res: "c # (xs @ Ξ½) = [c] @ (xs @ Ξ½)" 
                        by auto

                      from Suc(5) cΞ΄2''_is_ΞΌc'Ξ½ ΞΌ_is_c_xs Ξ½E1_empty
                      show ?thesis
                        by (subst res, simp only: cΞ΄2''_is_ΞΌc'Ξ½ projection_concatenation_commute 
                          set_append, auto)
                    qed
                  moreover
                  note Suc(6) 
                  moreover
                  from Suc(7) Ξ΄2''_is_xs_c'_Ξ½ have "set (xs @ Ξ½) βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    by auto
                  moreover note Suc(1)[of c "xs @ Ξ½" Ξ² Ξ±1']
                  ultimately obtain Ξ΄ Ξ³
                    where one: "set Ξ΄ βŠ† Eβ‡˜ES1⇙"
                    and two: "set Ξ³ βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    and three: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ³ @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄ ∈ Trβ‡˜ES1⇙"
                    and four: "Ξ΄ β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    and five: "Ξ΄ β†Ώ Cβ‡˜π’±1⇙ = []"
                    and six: "Ξ³ β†Ώ Eβ‡˜ES2⇙ = (xs @ Ξ½) β†Ώ Eβ‡˜ES1⇙"
                    by blast
                  
                   (* apply BSIA to insert c' after Ξ³ *)
                  let ?BETA = "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ³"

                  from c'_in_Cv1_inter_Upsilon1 have "c' ∈ Cβ‡˜π’±1⇙"
                    by auto
                  moreover
                  from three v'_notin_E1 have "?BETA @ Ξ΄ ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  note five 
                  moreover
                  have "Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ ?BETA c'"
                    proof -
                      have "?BETA @ [c'] ∈ Trβ‡˜ES1⇙"
                        proof -
                          from validES1 three 
                          have "?BETA ∈ Trβ‡˜ES1⇙"
                            by (simp only: ES_valid_def traces_prefixclosed_def
                              projection_concatenation_commute 
                              prefixclosed_def prefix_def, auto)
                          moreover
                          note c'_in_Cv1_inter_Upsilon1 total_ES1_C1_inter_Upsilon1
                          ultimately show ?thesis
                            unfolding total_def
                            by blast
                        qed
                      thus ?thesis
                        unfolding Adm_def
                        by blast                        
                    qed
                  moreover
                  note BSIA1
                  ultimately obtain Ξ±1''
                    where bsia_one: "?BETA @ [c'] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    and bsia_two: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ΄ β†Ώ Vβ‡˜π’±1⇙"
                    and bsia_three:  "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
                    unfolding BSIA_def
                    by blast
  
                  let ?DELTA1'' = "Ξ³ @ [c']"

                  from bsia_one validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
                    by (simp add:isViewOn_def ES_valid_def traces_contain_events_def, auto)
                  moreover
                  have "set ?DELTA1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    proof -
                      from Suc(7) c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½ 
                      have "c' ∈  Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                        by auto
                      with two show ?thesis
                        by auto
                    qed
                  moreover
                  from bsia_one v'_notin_E1 
                  have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ ?DELTA1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  from bsia_two four have "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    by simp
                  moreover
                  note bsia_three
                  moreover             
                  have "?DELTA1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                    proof -
                      from validV2 Suc(7) Ξ΄2''_is_xs_c'_Ξ½ 
                      have "c' ∈ Eβ‡˜ES2⇙"
                        by (simp add: isViewOn_def V_valid_def
                          VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                      with c'_in_E1 c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½ Ξ½E1_empty six 
                      show ?thesis
                        by (simp only: projection_concatenation_commute projection_def, auto)
                    qed
                  ultimately show ?thesis 
                    by blast     
                qed
            qed
          from this[OF Ξ²v'E1Ξ±1'_in_Tr1 Ξ±1'Cv1_empty cΞ΄2''E1_in_Cv1_inter_Upsilon1star 
            c_in_Cv_inter_Upsilon Ξ΄2''_in_N2_inter_Delta2star]
          show ?thesis 
            by blast
        qed
      then obtain Ξ±1'' Ξ΄1''
        where Ξ±1''_in_E1star: "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
        and Ξ΄1''_in_N1_inter_Delta1star:"set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
        and Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1: 
        "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
        and Ξ±1''Vv1_is_Ξ±1'Vv1: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
        and Ξ±1''Cv1_empty: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
        and Ξ΄1''E2_is_Ξ΄2''E1: "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
        by blast

      from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 
        validES1 validES2
      have Ξ΄1''_in_E1star: "set Ξ΄1'' βŠ† Eβ‡˜ES1⇙" and Ξ΄2''_in_E2star: "set Ξ΄2'' βŠ† Eβ‡˜ES2⇙"
        by (simp_all add: ES_valid_def traces_contain_events_def, auto)
      with Ξ΄1''E2_is_Ξ΄2''E1 merge_property[of Ξ΄1'' "Eβ‡˜ES1⇙" Ξ΄2'' "Eβ‡˜ES2⇙"] obtain Ξ΄'
        where Ξ΄'E1_is_Ξ΄1'': "Ξ΄' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1''"
        and Ξ΄'E2_is_Ξ΄2'': "Ξ΄' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2''"
        and Ξ΄'_contains_only_Ξ΄1''_Ξ΄2''_events: "set Ξ΄' βŠ† set Ξ΄1'' βˆͺ set Ξ΄2''"
        unfolding Let_def
        by auto

      let ?TAU = "Ξ² @ [c] @ Ξ΄' @ [v']"
      let ?LAMBDA = "Ξ± β†Ώ Vβ‡˜π’±β‡™"
      let ?T1 = Ξ±1''
      let ?T2 = Ξ±2''

     (* apply the generalized zipping lemma *)
     have "?TAU ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
        proof -
          from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ΄'E1_is_Ξ΄1'' validES1 
          have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄' β†Ώ Eβ‡˜ES1⇙ @ [v'] β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
            by (simp add: ES_valid_def traces_prefixclosed_def
              prefixclosed_def prefix_def)
          hence "(Ξ² @ [c] @ Ξ΄' @ [v']) β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
            by (simp add: projection_def, auto)
          moreover          
          from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ΄'E2_is_Ξ΄2'' validES2 
          have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄' β†Ώ Eβ‡˜ES2⇙ @ [v'] β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
            by (simp add: ES_valid_def traces_prefixclosed_def
              prefixclosed_def prefix_def)
          hence "(Ξ² @ [c] @ Ξ΄' @ [v']) β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
            by (simp add: projection_def, auto)
          moreover
          from Ξ²v'Ξ±_in_Tr c_in_Cv_inter_Upsilon VIsViewOnE
            Ξ΄'_contains_only_Ξ΄1''_Ξ΄2''_events Ξ΄1''_in_E1star Ξ΄2''_in_E2star
          have "set (Ξ² @ [c] @ Ξ΄' @ [v']) βŠ† Eβ‡˜ES1⇙ βˆͺ Eβ‡˜ES2⇙"
            unfolding composeES_def isViewOn_def V_valid_def 
              VC_disjoint_def VN_disjoint_def NC_disjoint_def
            by auto
          ultimately show ?thesis
            unfolding composeES_def
            by auto
        qed 
      hence "set ?TAU βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
        unfolding composeES_def
        by auto
      moreover
      have "set ?LAMBDA βŠ† Vβ‡˜π’±β‡™"
        by (simp add: projection_def, auto)
      moreover
      note Ξ±1''_in_E1star Ξ±2''_in_E2star
      moreover
      from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ΄'E1_is_Ξ΄1'' 
      have "?TAU β†Ώ Eβ‡˜ES1⇙ @ ?T1 ∈ Trβ‡˜ES1⇙"
        by (simp only: projection_concatenation_commute, auto)
      moreover
      from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ΄'E2_is_Ξ΄2'' 
      have "?TAU β†Ώ Eβ‡˜ES2⇙ @ ?T2 ∈ Trβ‡˜ES2⇙"
        by (simp only: projection_concatenation_commute, auto)
      moreover
      have "?LAMBDA β†Ώ Eβ‡˜ES1⇙ = ?T1 β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from propSepViews have "?LAMBDA β†Ώ Eβ‡˜ES1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def by (simp add: projection_sequence)
          moreover
          from Ξ±1''_in_E1star propSepViews 
          have "?T1 β†Ώ Vβ‡˜π’±β‡™ = ?T1 β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def 
            by (metis Int_commute projection_intersection_neutral)
          moreover
          note Ξ±1'Vv1_is_Ξ±Vv1 Ξ±1''Vv1_is_Ξ±1'Vv1
          ultimately show ?thesis
            by simp
        qed
      moreover
      have "?LAMBDA β†Ώ Eβ‡˜ES2⇙ = ?T2 β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from propSepViews 
          have "?LAMBDA β†Ώ Eβ‡˜ES2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def  by (simp add: projection_sequence)
          moreover
          from Ξ±2''_in_E2star propSepViews 
          have "?T2 β†Ώ Vβ‡˜π’±β‡™ = ?T2 β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def
            by (metis Int_commute projection_intersection_neutral)
          moreover
          note Ξ±2'Vv2_is_Ξ±Vv2 Ξ±2''Vv2_is_Ξ±2'Vv2
          ultimately show ?thesis
            by simp
        qed
      moreover
      note Ξ±1''Cv1_empty Ξ±2''Cv2_empty generalized_zipping_lemma
      ultimately obtain t (* show that the conclusion of FCI holds *)
        where "?TAU @ t ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
        and  "t β†Ώ Vβ‡˜π’±β‡™ = ?LAMBDA"
        and "t β†Ώ Cβ‡˜π’±β‡™ = []"
        by blast
      moreover
      have "set Ξ΄' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™"
        proof -
          from Ξ΄'_contains_only_Ξ΄1''_Ξ΄2''_events 
            Ξ΄1''_in_N1_inter_Delta1star Ξ΄2''_in_N2_inter_Delta2star
          have "set Ξ΄' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
            by auto
          with Delta1_N1_Delta2_N2_subset_Delta Nv1_union_Nv2_subsetof_Nv 
          show ?thesis
            by auto
        qed
        ultimately
        have "βˆƒΞ±' Ξ³'. (set Ξ³' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™ ∧ Ξ² @ [c] @ Ξ³' @ [v'] @ Ξ±' ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙ 
                    ∧ Ξ±' β†Ώ Vβ‡˜π’±β‡™ = Ξ± β†Ώ Vβ‡˜π’±β‡™ ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = [])"
        by (simp only: append_assoc, blast)
    }
    moreover {
      assume Nv2_inter_Delta2_inter_E1_empty: "Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ = {}" 
        and  Nv1_inter_Delta1_inter_E2_subsetof_Upsilon2: "Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙"

      let ?ALPHA1''_DELTA1'' = "βˆƒ Ξ±1'' Ξ΄1''. (
        set Ξ±1'' βŠ† Eβ‡˜ES1⇙ ∧ set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ 
        ∧ Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙        
        ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = [])"

      from c_in_Cv_inter_Upsilon v'_in_Vv_inter_Nabla validV1
      have "c βˆ‰ Eβ‡˜ES1⇙ ∨ (c ∈ Eβ‡˜ES1⇙ ∧ v' βˆ‰ Eβ‡˜ES1⇙) ∨ (c ∈ Eβ‡˜ES1⇙ ∧ v' ∈ Eβ‡˜ES1⇙)"
        by (simp add: isViewOn_def V_valid_def 
          VC_disjoint_def VN_disjoint_def NC_disjoint_def)
      moreover {
        assume c_notin_E1: "c βˆ‰ Eβ‡˜ES1⇙"

        from validES1 Ξ²v'E1Ξ±1'_in_Tr1 have "set Ξ±1' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover 
        have "set [] βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
          by auto
        moreover 
        from Ξ²v'E1Ξ±1'_in_Tr1 c_notin_E1 
        have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover
        have "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙" ..
        moreover 
        note Ξ±1'Cv1_empty
        ultimately have ?ALPHA1''_DELTA1''
          by blast
      }
      moreover {
        assume c_in_E1: "c ∈ Eβ‡˜ES1⇙"
          and  v'_notin_E1: "v' βˆ‰ Eβ‡˜ES1⇙"

        from c_in_E1 c_in_Cv_inter_Upsilon propSepViews
          Upsilon_inter_E1_subset_Upsilon1
        have c_in_Cv1_inter_Upsilon1: "c ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
          unfolding properSeparationOfViews_def by auto
        hence "c ∈ Cβ‡˜π’±1⇙"
          by auto
        moreover
        from Ξ²v'E1Ξ±1'_in_Tr1 v'_notin_E1 have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover
        note Ξ±1'Cv1_empty
        moreover
        have "(Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ (Ξ² β†Ώ Eβ‡˜ES1⇙) c)" 
          proof -
            from validES1 Ξ²v'E1Ξ±1'_in_Tr1 v'_notin_E1 have "Ξ² β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
              by (simp add: ES_valid_def traces_prefixclosed_def
                prefixclosed_def prefix_def projection_concatenation_commute)
            with total_ES1_C1_inter_Upsilon1 c_in_Cv1_inter_Upsilon1
            have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] ∈ Trβ‡˜ES1⇙"
              by (simp add: total_def)
            thus ?thesis
              unfolding Adm_def
              by blast
          qed
        moreover 
        note BSIA1
        ultimately obtain  Ξ±1''
          where one: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          and two:   "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
          and three: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
          unfolding BSIA_def
          by blast

        from one validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        have "set [] βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
          by auto
        moreover
        from one c_in_E1 v'_notin_E1 
        have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover 
        note two three
        ultimately have ?ALPHA1''_DELTA1''
          by blast
      }
      moreover {
        assume c_in_E1: "c ∈ Eβ‡˜ES1⇙"
          and  v'_in_E1: "v' ∈ Eβ‡˜ES1⇙"

        from c_in_E1 c_in_Cv_inter_Upsilon propSepViews
          Upsilon_inter_E1_subset_Upsilon1
        have c_in_Cv1_inter_Upsilon1: "c ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
          unfolding properSeparationOfViews_def by auto
        moreover
        from v'_in_E1 propSepViews v'_in_Vv_inter_Nabla Nabla_inter_E1_subset_Nabla1
        have "v' ∈ Vβ‡˜π’±1⇙ ∩ Nabla Ξ“1"
         unfolding properSeparationOfViews_def by auto
        moreover
        from v'_in_E1  Ξ²v'E1Ξ±1'_in_Tr1 have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [v'] @ Ξ±1' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover
        note Ξ±1'Cv1_empty FCI1
        ultimately obtain Ξ±1'' Ξ΄1''
          where one: "set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
          and two: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] @ Ξ΄1'' @ [v'] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          and three: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
          and four: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
          unfolding FCI_def
          by blast

        from two validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        note one
        moreover
        from two c_in_E1 v'_in_E1 
        have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover
        note three four
        ultimately have ?ALPHA1''_DELTA1''
          by blast
      }
      ultimately obtain Ξ±1'' Ξ΄1''
        where Ξ±1''_in_E1star: "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
        and Ξ΄1''_in_N1_inter_Delta1star:"set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
        and Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1: 
        "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
        and Ξ±1''Vv1_is_Ξ±1'Vv1: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
        and Ξ±1''Cv1_empty: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
        by blast

      from c_in_Cv_inter_Upsilon Upsilon_inter_E2_subset_Upsilon2 propSepViews 
      have cE2_in_Cv2_inter_Upsilon2: "set ([c] β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
        unfolding properSeparationOfViews_def by (simp add: projection_def, auto)
     
      from Ξ΄1''_in_N1_inter_Delta1star Nv1_inter_Delta1_inter_E2_subsetof_Upsilon2 
        propSepViews disjoint_Nv1_Vv2 
      have Ξ΄1''E2_in_Cv2_inter_Upsilon2star: "set (Ξ΄1'' β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
        proof -
          from Ξ΄1''_in_N1_inter_Delta1star have eq: "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙)"
            by (metis Int_commute Int_left_commute Int_lower2 Int_lower1 
              projection_intersection_neutral subset_trans)
          
          from validV2 Nv1_inter_Delta1_inter_E2_subsetof_Upsilon2 
           propSepViews disjoint_Nv1_Vv2  
          have "Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
            unfolding properSeparationOfViews_def
            by (simp add: isViewOn_def V_valid_def VC_disjoint_def 
              VN_disjoint_def NC_disjoint_def, auto)
          thus ?thesis
            by (subst eq, simp only: projection_def, auto)
        qed
      
      have cΞ΄1''E2_in_Cv2_inter_Upsilon2star: "set ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
        proof -
          from cE2_in_Cv2_inter_Upsilon2 Ξ΄1''E2_in_Cv2_inter_Upsilon2star
          have "set (([c] @ Ξ΄1'') β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
            by (simp only: projection_concatenation_commute, auto)
          thus ?thesis
            by auto
        qed


      have "βˆƒ Ξ±2'' Ξ΄2''. set Ξ±2'' βŠ† Eβ‡˜ES2⇙        
        ∧ set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙        
        ∧ Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙        
        ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []
        ∧ Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
        proof cases
          assume v'_in_E2: "v' ∈ Eβ‡˜ES2⇙"
          with Nabla_inter_E2_subset_Nabla2 
            propSepViews v'_in_Vv_inter_Nabla
          have v'_in_Vv2_inter_Nabla2: "v' ∈ Vβ‡˜π’±2⇙ ∩ Nabla Ξ“2"
            unfolding properSeparationOfViews_def by auto

          have "⟦ (Ξ² @ [v']) β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙ ; 
            Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []; set ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ; 
            c ∈ Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™ ; set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ⟧ 
            ⟹ βˆƒ Ξ±2'' Ξ΄2''. (set Ξ±2'' βŠ† Eβ‡˜ES2⇙ ∧ set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ 
              ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙            
            ∧ Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙            
            ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []
            ∧ Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙)"
            proof (induct "length ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙)" arbitrary: Ξ² Ξ±2' c Ξ΄1'')
              case 0

              from 0(2) validES2 have "set Ξ±2' βŠ† Eβ‡˜ES2⇙"
                by (simp add: ES_valid_def traces_contain_events_def, auto)
              moreover
              have "set [] βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                by auto
              moreover
              have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
                proof -
                  note 0(2)
                  moreover
                  from 0(1) have "c βˆ‰ Eβ‡˜ES2⇙"
                    by (simp add: projection_def, auto)
                  ultimately show ?thesis
                    by (simp add: projection_concatenation_commute projection_def)
                qed
              moreover
              have "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙" ..
              moreover
              note 0(3)
              moreover 
              from 0(1) have "[] β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                by (simp add: projection_def, split if_split_asm, auto)
              ultimately show ?case
                by blast
            next
              case (Suc n)

              from projection_split_last[OF Suc(2)] obtain ΞΌ c' Ξ½
                where c'_in_E2: "c' ∈ Eβ‡˜ES2⇙"
                and cΞ΄1''_is_ΞΌc'Ξ½: "c # Ξ΄1'' = ΞΌ @ [c'] @ Ξ½"
                and Ξ½E2_empty: "Ξ½ β†Ώ Eβ‡˜ES2⇙ = []"
                and n_is_length_ΞΌΞ½E2: "n = length ((ΞΌ @ Ξ½) β†Ώ Eβ‡˜ES2⇙)"
                by blast

              from Suc(5) c'_in_E2 cΞ΄1''_is_ΞΌc'Ξ½ 
              have "set (ΞΌ β†Ώ Eβ‡˜ES2⇙ @ [c']) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                by (simp only: cΞ΄1''_is_ΞΌc'Ξ½ projection_concatenation_commute 
                  projection_def, auto)
              hence c'_in_Cv2_inter_Upsilon2: "c' ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                by auto
              hence c'_in_Cv2: "c' ∈ Cβ‡˜π’±2⇙" and c'_in_Upsilon2: "c' ∈ Ξ₯β‡˜Ξ“2⇙"
                by auto
              with validV2 have c'_in_E2: "c' ∈ Eβ‡˜ES2⇙"
                by (simp add: isViewOn_def V_valid_def VC_disjoint_def 
                  VN_disjoint_def NC_disjoint_def, auto)

              show ?case
                proof (cases ΞΌ)
                  case Nil (* we apply FCI in this case *)
                  with cΞ΄1''_is_ΞΌc'Ξ½ have c_is_c': "c = c'" and Ξ΄1''_is_Ξ½: "Ξ΄1'' = Ξ½"
                    by auto
                  with c'_in_Cv2_inter_Upsilon2 have "c ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                    by simp
                  moreover
                  note v'_in_Vv2_inter_Nabla2
                  moreover
                  from v'_in_E2 Suc(3) have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [v'] @ Ξ±2' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_concatenation_commute projection_def)
                  moreover
                  note Suc(4) FCI2
                  ultimately obtain Ξ±2'' Ξ³
                    where one: "set Ξ³ βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    and two: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] @ Ξ³ @ [v'] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    and three: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    and four: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
                    unfolding FCI_def
                    by blast

                  (* we choose Ξ΄2'' = Ξ½ β†Ώ EES2 @ Ξ³ *)
                  let ?DELTA2'' = "Ξ½ β†Ώ Eβ‡˜ES2⇙ @ Ξ³"

                  from two validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  from one Ξ½E2_empty
                  have "set ?DELTA2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    by auto
                  moreover
                  have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ ?DELTA2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    proof -
                      from c_is_c' c'_in_E2 have "[c] = [c] β†Ώ Eβ‡˜ES2⇙"
                        by (simp add: projection_def)
                      moreover
                      from v'_in_E2 have "[v'] = [v'] β†Ώ Eβ‡˜ES2⇙"
                        by (simp add: projection_def)
                      moreover
                      note Ξ½E2_empty two
                      ultimately show ?thesis
                        by auto
                    qed
                  moreover
                  note three four
                  moreover
                  have "?DELTA2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                    proof -
                      have "Ξ³ β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = []"
                        proof -
                          from validV2 have "Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = {}"
                            by (simp add: isViewOn_def V_valid_def
                              VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                          with projection_intersection_neutral[OF one, of "Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"]
                          show ?thesis
                            by (simp add: projection_def)
                        qed
                      with Ξ΄1''_is_Ξ½ Ξ½E2_empty show ?thesis
                        by (simp add: projection_concatenation_commute)
                    qed
                  ultimately show ?thesis
                    by blast
                next
                  case (Cons x xs) (* we apply the inductive hypothesis in this case *)
                  with cΞ΄1''_is_ΞΌc'Ξ½ have ΞΌ_is_c_xs: "ΞΌ = [c] @ xs" 
                    and Ξ΄1''_is_xs_c'_Ξ½: "Ξ΄1'' = xs @ [c'] @ Ξ½"
                    by auto
                  with n_is_length_ΞΌΞ½E2 have "n = length ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES2⇙)"
                    by auto
                  moreover
                  note Suc(3,4)
                  moreover
                  have "set ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                    proof -
                      have res: "c # (xs @ Ξ½) = [c] @ (xs @ Ξ½)" 
                        by auto

                      from Suc(5) cΞ΄1''_is_ΞΌc'Ξ½ ΞΌ_is_c_xs Ξ½E2_empty
                      show ?thesis
                        by (subst res, simp only: cΞ΄1''_is_ΞΌc'Ξ½ 
                          projection_concatenation_commute set_append, auto)
                    qed
                  moreover
                  note Suc(6) 
                  moreover
                  from Suc(7) Ξ΄1''_is_xs_c'_Ξ½ have "set (xs @ Ξ½) βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    by auto
                  moreover note Suc(1)[of c "xs @ Ξ½" Ξ² Ξ±2']
                  ultimately obtain Ξ΄ Ξ³
                    where one: "set Ξ΄ βŠ† Eβ‡˜ES2⇙"
                    and two: "set Ξ³ βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    and three: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ³ @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄ ∈ Trβ‡˜ES2⇙"
                    and four: "Ξ΄ β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    and five: "Ξ΄ β†Ώ Cβ‡˜π’±2⇙ = []"
                    and six: "Ξ³ β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = (xs @ Ξ½) β†Ώ Eβ‡˜ES2⇙"
                    by blast

                  (* apply FCI to insert c' after Ξ³ *)
                  let ?BETA = "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ³"

                  note c'_in_Cv2_inter_Upsilon2 v'_in_Vv2_inter_Nabla2
                  moreover
                  from three v'_in_E2 have "?BETA @ [v'] @ Ξ΄ ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  note five FCI2
                  ultimately obtain Ξ±2'' Ξ΄'
                    where fci_one: "set Ξ΄' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    and fci_two: "?BETA @ [c'] @ Ξ΄' @ [v'] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    and fci_three: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ΄ β†Ώ Vβ‡˜π’±2⇙"
                    and fci_four:  "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
                    unfolding FCI_def
                    by blast
  
                  let ?DELTA2'' = "Ξ³ @ [c'] @ Ξ΄'"

                  from fci_two validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  have "set ?DELTA2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    proof -
                      from Suc(7) c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½ 
                      have "c' ∈  Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                        by auto
                      with two fci_one show ?thesis
                        by auto
                    qed
                  moreover
                  from fci_two v'_in_E2 
                  have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ ?DELTA2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  from fci_three four have "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    by simp
                  moreover
                  note fci_four
                  moreover             
                  have "?DELTA2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                    proof -
                      have "Ξ΄' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = []"
                        proof -
                          from fci_one have "βˆ€ e ∈ set Ξ΄'. e ∈ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                            by auto
                          with validV2 have "βˆ€ e ∈ set Ξ΄'. e βˆ‰ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                            by (simp add: isViewOn_def V_valid_def
                              VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                          thus ?thesis
                            by (simp add: projection_def)
                        qed
                      with c'_in_E2 c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½ Ξ½E2_empty six 
                      show ?thesis
                        by (simp only: projection_concatenation_commute projection_def, auto)
                    qed
                  ultimately show ?thesis 
                    by blast     
                qed
          qed
          from this[OF Ξ²v'E2Ξ±2'_in_Tr2 Ξ±2'Cv2_empty cΞ΄1''E2_in_Cv2_inter_Upsilon2star 
            c_in_Cv_inter_Upsilon Ξ΄1''_in_N1_inter_Delta1star]
          obtain Ξ±2'' Ξ΄2''
            where one: "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
            and two: "set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
            and three: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙            
            ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
            and four: "Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
            by blast

          note one two three
          moreover
          have "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙" 
            proof -
              from projection_intersection_neutral[OF two, of "Eβ‡˜ES1⇙"] 
                Nv2_inter_Delta2_inter_E1_empty validV1 
              have "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES1⇙)"
                by (simp only: Int_Un_distrib2, auto)
              moreover
              from validV1 
              have "Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES1⇙ = Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                by (simp add: isViewOn_def V_valid_def VC_disjoint_def 
                  VN_disjoint_def NC_disjoint_def, auto)
              ultimately have "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
                by simp
              hence "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
                by (simp add: projection_def)
              with four have "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
                by simp
              hence "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙) β†Ώ Eβ‡˜ES2⇙"
                by (simp only: projection_commute)
              with Ξ΄1''_in_N1_inter_Delta1star show ?thesis
                by (simp only: list_subset_iff_projection_neutral)
            qed
          ultimately show ?thesis
              by blast
        next
          assume v'_notin_E2: "v' βˆ‰ Eβ‡˜ES2⇙"

          have 
            "⟦ (Ξ² @ [v']) β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙ ; Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []; 
                set ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ; c ∈ Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™ ;
                set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ⟧ 
            ⟹ βˆƒ Ξ±2'' Ξ΄2''.
             (set Ξ±2'' βŠ† Eβ‡˜ES2⇙ ∧ set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙            
             ∧ Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2 ⇙            
             ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []
            ∧ Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙)"
            proof (induct "length ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙)" arbitrary: Ξ² Ξ±2' c Ξ΄1'')
               case 0

              from 0(2) validES2 have "set Ξ±2' βŠ† Eβ‡˜ES2⇙"
                by (simp add: ES_valid_def traces_contain_events_def, auto)
              moreover
              have "set [] βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                by auto
              moreover
              have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
                proof -
                  note 0(2)
                  moreover
                  from 0(1) have "c βˆ‰ Eβ‡˜ES2⇙"
                    by (simp add: projection_def, auto)
                  ultimately show ?thesis
                    by (simp add: projection_concatenation_commute projection_def)
                qed
              moreover
              have "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙" ..
              moreover
              note 0(3)
              moreover 
              from 0(1) have "[] β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                by (simp add: projection_def, split if_split_asm, auto)
              ultimately show ?case
                by blast
            next
              case (Suc n)

              from projection_split_last[OF Suc(2)] obtain ΞΌ c' Ξ½
                where c'_in_E2: "c' ∈ Eβ‡˜ES2⇙"
                and cΞ΄1''_is_ΞΌc'Ξ½: "c # Ξ΄1'' = ΞΌ @ [c'] @ Ξ½"
                and Ξ½E2_empty: "Ξ½ β†Ώ Eβ‡˜ES2⇙ = []"
                and n_is_length_ΞΌΞ½E2: "n = length ((ΞΌ @ Ξ½) β†Ώ Eβ‡˜ES2⇙)"
                by blast

              from Suc(5) c'_in_E2 cΞ΄1''_is_ΞΌc'Ξ½ have "set (ΞΌ β†Ώ Eβ‡˜ES2⇙ @ [c']) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                by (simp only: cΞ΄1''_is_ΞΌc'Ξ½ projection_concatenation_commute projection_def, auto)
              hence c'_in_Cv2_inter_Upsilon2: "c' ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                by auto
              hence c'_in_Cv2: "c' ∈ Cβ‡˜π’±2⇙" and c'_in_Upsilon2: "c' ∈ Ξ₯β‡˜Ξ“2⇙"
                by auto
              with validV2 have c'_in_E2: "c' ∈ Eβ‡˜ES2⇙"
                by (simp add: isViewOn_def V_valid_def VC_disjoint_def
                  VN_disjoint_def NC_disjoint_def, auto)

              show ?case
                proof (cases ΞΌ)
                  case Nil (* we just apply BSIA in this case *)
                  with cΞ΄1''_is_ΞΌc'Ξ½ have c_is_c': "c = c'" and Ξ΄1''_is_Ξ½: "Ξ΄1'' = Ξ½"
                    by auto
                  with c'_in_Cv2_inter_Upsilon2 have "c ∈ Cβ‡˜π’±2⇙"
                    by simp
                  moreover
                  from v'_notin_E2 Suc(3) have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ±2' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_concatenation_commute projection_def)
                  moreover
                  note Suc(4)
                  moreover
                  have "Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ (Ξ² β†Ώ Eβ‡˜ES2⇙) c"
                    proof -
                      have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] ∈ Trβ‡˜ES2⇙"
                        proof -
                          from c_is_c' c'_in_Cv2_inter_Upsilon2 have "c ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                            by simp
                          moreover
                          from validES2 Suc(3) have "(Ξ² β†Ώ Eβ‡˜ES2⇙) ∈ Trβ‡˜ES2⇙"
                            by (simp only: ES_valid_def traces_prefixclosed_def
                              projection_concatenation_commute 
                              prefixclosed_def prefix_def, auto)
                          moreover
                          note total_ES2_C2_inter_Upsilon2
                          ultimately show ?thesis
                            unfolding total_def
                            by blast
                        qed
                      thus ?thesis
                        unfolding Adm_def
                        by blast                        
                    qed
                  moreover
                  note BSIA2
                  ultimately obtain Ξ±2''
                    where one: "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [c] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    and two: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    and three: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
                    unfolding BSIA_def
                    by blast

                  let ?DELTA2'' = "Ξ½ β†Ώ Eβ‡˜ES2⇙"

                  from one validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  from Ξ½E2_empty
                  have "set ?DELTA2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    by simp
                  moreover
                  from c_is_c' c'_in_E2 one v'_notin_E2 Ξ½E2_empty
                  have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [c] β†Ώ Eβ‡˜ES2⇙ @ ?DELTA2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  note two three
                  moreover
                  from Ξ½E2_empty Ξ΄1''_is_Ξ½ have "?DELTA2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  ultimately show ?thesis
                    by blast
                next
                  case (Cons x xs) (* apply inductive hypothesis, then BSIA *)
                   with cΞ΄1''_is_ΞΌc'Ξ½ have ΞΌ_is_c_xs: "ΞΌ = [c] @ xs" 
                     and Ξ΄1''_is_xs_c'_Ξ½: "Ξ΄1'' = xs @ [c'] @ Ξ½"
                    by auto
                  with n_is_length_ΞΌΞ½E2 have "n = length ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES2⇙)"
                    by auto
                  moreover
                  note Suc(3,4)
                  moreover
                  have "set ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                    proof -
                      have res: "c # (xs @ Ξ½) = [c] @ (xs @ Ξ½)" 
                        by auto

                      from Suc(5) cΞ΄1''_is_ΞΌc'Ξ½ ΞΌ_is_c_xs Ξ½E2_empty
                      show ?thesis
                        by (subst res, simp only: cΞ΄1''_is_ΞΌc'Ξ½ projection_concatenation_commute 
                          set_append, auto)
                    qed
                  moreover
                  note Suc(6) 
                  moreover
                  from Suc(7) Ξ΄1''_is_xs_c'_Ξ½ have "set (xs @ Ξ½) βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    by auto
                  moreover note Suc(1)[of c "xs @ Ξ½" Ξ² Ξ±2']
                  ultimately obtain Ξ΄ Ξ³
                    where one: "set Ξ΄ βŠ† Eβ‡˜ES2⇙"
                    and two: "set Ξ³ βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    and three: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ³ @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄ ∈ Trβ‡˜ES2⇙"
                    and four: "Ξ΄ β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    and five: "Ξ΄ β†Ώ Cβ‡˜π’±2⇙ = []"
                    and six: "Ξ³ β†Ώ Eβ‡˜ES1⇙ = (xs @ Ξ½) β†Ώ Eβ‡˜ES2⇙"
                    by blast
                  
                   (* apply BSIA to insert c' after Ξ³ *)
                  let ?BETA = "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ³"

                  from c'_in_Cv2_inter_Upsilon2 have "c' ∈ Cβ‡˜π’±2⇙"
                    by auto
                  moreover
                  from three v'_notin_E2 have "?BETA @ Ξ΄ ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  note five 
                  moreover
                  have "Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ ?BETA c'"
                    proof -
                      have "?BETA @ [c'] ∈ Trβ‡˜ES2⇙"
                        proof -
                          from validES2 three have "?BETA ∈ Trβ‡˜ES2⇙"
                            by (simp only: ES_valid_def traces_prefixclosed_def
                              projection_concatenation_commute prefixclosed_def prefix_def, auto)
                          moreover
                          note c'_in_Cv2_inter_Upsilon2 total_ES2_C2_inter_Upsilon2
                          ultimately show ?thesis
                            unfolding total_def
                            by blast
                        qed
                      thus ?thesis
                        unfolding Adm_def
                        by blast                        
                    qed
                  moreover
                  note BSIA2
                  ultimately obtain Ξ±2''
                    where bsia_one: "?BETA @ [c'] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    and bsia_two: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ΄ β†Ώ Vβ‡˜π’±2⇙"
                    and bsia_three:  "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
                    unfolding BSIA_def
                    by blast
  
                  let ?DELTA2'' = "Ξ³ @ [c']"

                  from bsia_one validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  have "set ?DELTA2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    proof -
                      from Suc(7) c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½ 
                      have "c' ∈  Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                        by auto
                      with two show ?thesis
                        by auto
                    qed
                  moreover
                  from bsia_one v'_notin_E2 
                  have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ ?DELTA2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  from bsia_two four have "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    by simp
                  moreover
                  note bsia_three
                  moreover             
                  have "?DELTA2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                    proof -
                      from validV1 Suc(7) Ξ΄1''_is_xs_c'_Ξ½ have "c' ∈ Eβ‡˜ES1⇙"
                        by (simp add: isViewOn_def V_valid_def
                          VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                      with c'_in_E2 c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½ Ξ½E2_empty six 
                      show ?thesis
                        by (simp only: projection_concatenation_commute 
                          projection_def, auto)
                    qed
                  ultimately show ?thesis 
                    by blast     
                qed
            qed
          from this[OF Ξ²v'E2Ξ±2'_in_Tr2 Ξ±2'Cv2_empty cΞ΄1''E2_in_Cv2_inter_Upsilon2star 
            c_in_Cv_inter_Upsilon Ξ΄1''_in_N1_inter_Delta1star]
          show ?thesis 
            by blast
        qed
      then obtain Ξ±2'' Ξ΄2''
        where Ξ±2''_in_E2star: "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
        and Ξ΄2''_in_N2_inter_Delta2star:"set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
        and Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2: 
        "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
        and Ξ±2''Vv2_is_Ξ±2'Vv2: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
        and Ξ±2''Cv2_empty: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
        and Ξ΄2''E1_is_Ξ΄1''E2: "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
        by blast

      from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 
        validES2 validES1
      have Ξ΄2''_in_E2star: "set Ξ΄2'' βŠ† Eβ‡˜ES2⇙" and Ξ΄1''_in_E1star: "set Ξ΄1'' βŠ† Eβ‡˜ES1⇙"
        by (simp_all add: ES_valid_def traces_contain_events_def, auto)
      with Ξ΄2''E1_is_Ξ΄1''E2 merge_property[of Ξ΄2'' "Eβ‡˜ES2⇙" Ξ΄1'' "Eβ‡˜ES1⇙"] obtain Ξ΄'
        where Ξ΄'E2_is_Ξ΄2'': "Ξ΄' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2''"
        and Ξ΄'E1_is_Ξ΄1'': "Ξ΄' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1''"
        and Ξ΄'_contains_only_Ξ΄2''_Ξ΄1''_events: "set Ξ΄' βŠ† set Ξ΄2'' βˆͺ set Ξ΄1''"
        unfolding Let_def
        by auto

      let ?TAU = "Ξ² @ [c] @ Ξ΄' @ [v']"
      let ?LAMBDA = "Ξ± β†Ώ Vβ‡˜π’±β‡™"
      let ?T2 = Ξ±2''
      let ?T1 = Ξ±1''

     (* apply the generalized zipping lemma *)
     have "?TAU ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
        proof -
          from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ΄'E2_is_Ξ΄2'' validES2 
          have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄' β†Ώ Eβ‡˜ES2⇙ @ [v'] β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
            by (simp add: ES_valid_def traces_prefixclosed_def
              prefixclosed_def prefix_def)
          hence "(Ξ² @ [c] @ Ξ΄' @ [v']) β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
            by (simp add: projection_def, auto)
          moreover          
          from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ΄'E1_is_Ξ΄1'' validES1 
          have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄' β†Ώ Eβ‡˜ES1⇙ @ [v'] β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
            by (simp add: ES_valid_def traces_prefixclosed_def
              prefixclosed_def prefix_def)
          hence "(Ξ² @ [c] @ Ξ΄' @ [v']) β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
            by (simp add: projection_def, auto)
          moreover
          from Ξ²v'Ξ±_in_Tr c_in_Cv_inter_Upsilon VIsViewOnE Ξ΄'_contains_only_Ξ΄2''_Ξ΄1''_events 
            Ξ΄2''_in_E2star Ξ΄1''_in_E1star
          have "set (Ξ² @ [c] @ Ξ΄' @ [v']) βŠ† Eβ‡˜ES2⇙ βˆͺ Eβ‡˜ES1⇙"
            unfolding composeES_def isViewOn_def V_valid_def VC_disjoint_def 
              VN_disjoint_def NC_disjoint_def
            by auto
          ultimately show ?thesis
            unfolding composeES_def
            by auto
        qed 
      hence "set ?TAU βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
        unfolding composeES_def
        by auto
      moreover
      have "set ?LAMBDA βŠ† Vβ‡˜π’±β‡™"
        by (simp add: projection_def, auto)
      moreover
      note Ξ±2''_in_E2star Ξ±1''_in_E1star
      moreover
      from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ΄'E2_is_Ξ΄2'' 
      have "?TAU β†Ώ Eβ‡˜ES2⇙ @ ?T2 ∈ Trβ‡˜ES2⇙"
        by (simp only: projection_concatenation_commute, auto)
      moreover
      from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ΄'E1_is_Ξ΄1'' 
      have "?TAU β†Ώ Eβ‡˜ES1⇙ @ ?T1 ∈ Trβ‡˜ES1⇙"
        by (simp only: projection_concatenation_commute, auto)
      moreover
      have "?LAMBDA β†Ώ Eβ‡˜ES2⇙ = ?T2 β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from propSepViews 
          have "?LAMBDA β†Ώ Eβ‡˜ES2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def  by (simp only: projection_sequence)
          moreover
          from Ξ±2''_in_E2star propSepViews
          have "?T2 β†Ώ Vβ‡˜π’±β‡™ = ?T2 β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def
            by (metis Int_commute projection_intersection_neutral)
          moreover
          note Ξ±2'Vv2_is_Ξ±Vv2 Ξ±2''Vv2_is_Ξ±2'Vv2
          ultimately show ?thesis
            by simp
        qed
      moreover
      have "?LAMBDA β†Ώ Eβ‡˜ES1⇙ = ?T1 β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from propSepViews
          have "?LAMBDA β†Ώ Eβ‡˜ES1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def  by (simp add: projection_sequence)
          moreover
          from Ξ±1''_in_E1star propSepViews
          have "?T1 β†Ώ Vβ‡˜π’±β‡™ = ?T1 β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def 
            by (metis Int_commute projection_intersection_neutral)
          moreover
          note Ξ±1'Vv1_is_Ξ±Vv1 Ξ±1''Vv1_is_Ξ±1'Vv1
          ultimately show ?thesis
            by simp
        qed
      moreover
      note Ξ±2''Cv2_empty Ξ±1''Cv1_empty generalized_zipping_lemma
      ultimately obtain t (* show that the conclusion of FCI holds *)
        where "?TAU @ t ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
        and  "t β†Ώ Vβ‡˜π’±β‡™ = ?LAMBDA"
        and "t β†Ώ Cβ‡˜π’±β‡™ = []"
        by blast
      moreover
      have "set Ξ΄' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™"
        proof -
          from Ξ΄'_contains_only_Ξ΄2''_Ξ΄1''_events Ξ΄2''_in_N2_inter_Delta2star
               Ξ΄1''_in_N1_inter_Delta1star
          have "set Ξ΄' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
            by auto
          with Delta1_N1_Delta2_N2_subset_Delta Nv1_union_Nv2_subsetof_Nv show ?thesis
            by auto
        qed
      ultimately have "βˆƒΞ±' Ξ³'. (set Ξ³' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™ ∧ Ξ² @ [c] @ Ξ³' @ [v'] @ Ξ±' ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙ 
        ∧ Ξ±' β†Ώ Vβ‡˜π’±β‡™ = Ξ± β†Ώ Vβ‡˜π’±β‡™ ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = [])"
        by (simp only: append_assoc, blast)
    }
    ultimately have "βˆƒΞ±' Ξ³'. (set Ξ³' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™ ∧ Ξ² @ [c] @ Ξ³' @ [v'] @ Ξ±' ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙ 
      ∧ Ξ±' β†Ώ Vβ‡˜π’±β‡™ = Ξ± β†Ώ Vβ‡˜π’±β‡™ ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = [])"
      by blast
  }
  thus ?thesis
    unfolding FCI_def
    by blast
qed


(* Theorem 6.4.1 case 6 *)
theorem compositionality_FCIA: 
  "⟦ BSD 𝒱1 Trβ‡˜ES1⇙; BSD 𝒱2 Trβ‡˜ES2⇙; BSIA ρ1 𝒱1 Trβ‡˜ES1⇙; BSIA ρ2 𝒱2 Trβ‡˜ES2⇙;
  (ρ1 𝒱1) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES1⇙; (ρ2 𝒱2) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES2⇙;
  total ES1 (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙); total ES2 (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙);
  βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† βˆ‡β‡˜Ξ“1⇙; βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† βˆ‡β‡˜Ξ“2⇙;
  Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙; Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙;
  ( Ξ”β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±1⇙ βˆͺ Ξ”β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±2⇙ ) βŠ† Ξ”β‡˜Ξ“β‡™;
  (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ = {} ∧ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙)
  ∨ ( Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ = {} ∧ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙)  ;
  FCIA ρ1 Ξ“1 𝒱1 Trβ‡˜ES1⇙; FCIA ρ2 Ξ“2 𝒱2 Trβ‡˜ES2⇙ ⟧ 
  ⟹ FCIA ρ Ξ“ 𝒱 (Trβ‡˜(ES1 βˆ₯ ES2)⇙)"
proof -
 assume BSD1: "BSD 𝒱1 Trβ‡˜ES1⇙" 
    and BSD2: "BSD 𝒱2 Trβ‡˜ES2⇙"
    and BSIA1: "BSIA ρ1 𝒱1 Trβ‡˜ES1⇙"
    and BSIA2: "BSIA ρ2 𝒱2 Trβ‡˜ES2⇙"
    and ρ1v1_subset_ρv_inter_E1: "(ρ1 𝒱1) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES1⇙"
    and ρ2v2_subset_ρv_inter_E2: "(ρ2 𝒱2) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES2⇙"
    and total_ES1_C1_inter_Upsilon1_inter_N2_inter_Delta2: 
     "total ES1 (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
    and total_ES2_C2_inter_Upsilon2_inter_N1_inter_Delta1: 
     "total ES2 (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
    and Nabla_inter_E1_subset_Nabla1: "βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† βˆ‡β‡˜Ξ“1⇙"
    and Nabla_inter_E2_subset_Nabla2: "βˆ‡β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† βˆ‡β‡˜Ξ“2⇙"
    and Upsilon_inter_E1_subset_Upsilon1: "Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙"
    and Upsilon_inter_E2_subset_Upsilon2: "Ξ₯β‡˜Ξ“β‡™ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙"
    and Delta1_N1_Delta2_N2_subset_Delta: "( Ξ”β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±1⇙ βˆͺ Ξ”β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±2⇙ ) βŠ† Ξ”β‡˜Ξ“β‡™"
    and very_long_asm: "(Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ = {} ∧ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙)
    ∨ ( Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ = {} ∧ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙)"
    and FCIA1: "FCIA ρ1 Ξ“1 𝒱1 Trβ‡˜ES1⇙"
    and FCIA2: "FCIA ρ2 Ξ“2 𝒱2 Trβ‡˜ES2⇙"

  {
    fix Ξ± Ξ² c v'
    assume c_in_Cv_inter_Upsilon: "c ∈ (Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™)"
      and v'_in_Vv_inter_Nabla: "v' ∈ (Vβ‡˜π’±β‡™ ∩ βˆ‡β‡˜Ξ“β‡™)"
      and Ξ²v'Ξ±_in_Tr: "(Ξ² @ [v'] @ Ξ±) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙" 
      and Ξ±Cv_empty: "Ξ± β†Ώ Cβ‡˜π’±β‡™ = []"
      and Adm: "Adm 𝒱 ρ (Trβ‡˜(ES1 βˆ₯ ES2)⇙) Ξ² c"

    interpret CSES1: CompositionSupport "ES1" "𝒱" "𝒱1"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES1 validV1)

    interpret CSES2: CompositionSupport "ES2" "𝒱" "𝒱2"
      using propSepViews unfolding properSeparationOfViews_def 
      by (simp add: CompositionSupport_def validES2 validV2)

    from  Ξ²v'Ξ±_in_Tr
    have  Ξ²v'Ξ±_E1_in_Tr1: "(((Ξ² @ [v']) @ Ξ±) β†Ώ Eβ‡˜ES1⇙) ∈ Trβ‡˜ES1⇙"
      and Ξ²v'Ξ±_E2_in_Tr2: "(((Ξ² @ [v']) @ Ξ±) β†Ώ Eβ‡˜ES2⇙) ∈ Trβ‡˜ES2⇙"
      by (simp add: composeES_def)+    

    from CSES1.BSD_in_subsystem2[OF Ξ²v'Ξ±_E1_in_Tr1 BSD1] obtain Ξ±1'
      where Ξ²v'E1Ξ±1'_in_Tr1: "(Ξ² @ [v']) β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
      and Ξ±1'Vv1_is_Ξ±Vv1: "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
      and Ξ±1'Cv1_empty: "Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []"
      by auto

    from CSES2.BSD_in_subsystem2[OF Ξ²v'Ξ±_E2_in_Tr2 BSD2] obtain Ξ±2'
      where Ξ²v'E2Ξ±2'_in_Tr2: "(Ξ² @ [v']) β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
      and Ξ±2'Vv2_is_Ξ±Vv2: "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
      and Ξ±2'Cv2_empty: "Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []"
      by auto

    note very_long_asm
    moreover {
      assume Nv1_inter_Delta1_inter_E2_empty: "Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ = {}" 
        and  Nv2_inter_Delta2_inter_E1_subsetof_Upsilon1: "Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ βŠ† Ξ₯β‡˜Ξ“1⇙"

      let ?ALPHA2''_DELTA2'' = "βˆƒ Ξ±2'' Ξ΄2''. (
        set Ξ±2'' βŠ† Eβ‡˜ES2⇙ ∧ set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ 
        ∧ Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙        
        ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = [])"

      from c_in_Cv_inter_Upsilon v'_in_Vv_inter_Nabla validV2
      have "c βˆ‰ Eβ‡˜ES2⇙ ∨ (c ∈ Eβ‡˜ES2⇙ ∧ v' βˆ‰ Eβ‡˜ES2⇙) ∨ (c ∈ Eβ‡˜ES2⇙ ∧ v' ∈ Eβ‡˜ES2⇙)"
        by (simp add: V_valid_def isViewOn_def 
          VC_disjoint_def VN_disjoint_def NC_disjoint_def)
      moreover {
        assume c_notin_E2: "c βˆ‰ Eβ‡˜ES2⇙"

        from validES2 Ξ²v'E2Ξ±2'_in_Tr2 have "set Ξ±2' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover 
        have "set [] βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
          by auto
        moreover 
        from Ξ²v'E2Ξ±2'_in_Tr2 c_notin_E2 
        have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover
        have "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙" ..
        moreover 
        note Ξ±2'Cv2_empty
        ultimately have ?ALPHA2''_DELTA2''
          by blast
      }
      moreover {
        assume c_in_E2: "c ∈ Eβ‡˜ES2⇙"
          and  v'_notin_E2: "v' βˆ‰ Eβ‡˜ES2⇙"

        from c_in_E2 c_in_Cv_inter_Upsilon propSepViews
          Upsilon_inter_E2_subset_Upsilon2
        have c_in_Cv2_inter_Upsilon2: "c ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
          unfolding properSeparationOfViews_def by auto
        hence "c ∈ Cβ‡˜π’±2⇙"
          by auto
        moreover
        from Ξ²v'E2Ξ±2'_in_Tr2 v'_notin_E2 have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover
        note Ξ±2'Cv2_empty
        moreover
        have "Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ (Ξ² β†Ώ Eβ‡˜ES2⇙) c"
        proof -
          from Adm obtain Ξ³
            where γρv_is_βρv: "Ξ³ β†Ώ (ρ 𝒱) = Ξ² β†Ώ (ρ 𝒱)"
            and Ξ³c_in_Tr: "(Ξ³ @ [c]) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
            unfolding Adm_def
            by auto

          from c_in_E2 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES2⇙) @ [c] ∈ Trβ‡˜ES2⇙"
            by (simp add: projection_def composeES_def)
          moreover
          have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2)"
          proof -
            from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱)"
              by (metis projection_commute)
            with ρ2v2_subset_ρv_inter_E2 have "Ξ³ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ (ρ2 𝒱2)"
              by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
            thus ?thesis
              by (metis projection_commute)
          qed
          ultimately show ?thesis unfolding Adm_def
            by auto
        qed  
        moreover 
        note BSIA2
        ultimately obtain  Ξ±2''
          where one: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          and two:   "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
          and three: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
          unfolding BSIA_def
          by blast

        from one validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        have "set [] βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
          by auto
        moreover
        from one c_in_E2 v'_notin_E2 
        have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover 
        note two three
        ultimately have ?ALPHA2''_DELTA2''
          by blast
      }
      moreover {
        assume c_in_E2: "c ∈ Eβ‡˜ES2⇙"
          and  v'_in_E2: "v' ∈ Eβ‡˜ES2⇙"

        from c_in_E2 c_in_Cv_inter_Upsilon propSepViews
          Upsilon_inter_E2_subset_Upsilon2
        have c_in_Cv2_inter_Upsilon2: "c ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
          unfolding properSeparationOfViews_def by auto
        moreover
        from v'_in_E2 propSepViews v'_in_Vv_inter_Nabla Nabla_inter_E2_subset_Nabla2
        have "v' ∈ Vβ‡˜π’±2⇙ ∩ Nabla Ξ“2"
          unfolding properSeparationOfViews_def by auto
        moreover
        from v'_in_E2  Ξ²v'E2Ξ±2'_in_Tr2 have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [v'] @ Ξ±2' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover
        note Ξ±2'Cv2_empty 
        moreover
        have "Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ (Ξ² β†Ώ Eβ‡˜ES2⇙) c"
        proof -
          from Adm obtain Ξ³
            where γρv_is_βρv: "Ξ³ β†Ώ (ρ 𝒱) = Ξ² β†Ώ (ρ 𝒱)"
            and Ξ³c_in_Tr: "(Ξ³ @ [c]) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
            unfolding Adm_def
            by auto

          from c_in_E2 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES2⇙) @ [c] ∈ Trβ‡˜ES2⇙"
            by (simp add: projection_def composeES_def)
          moreover
          have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2)"
          proof -
            from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱)"
              by (metis projection_commute)
            with ρ2v2_subset_ρv_inter_E2 have "Ξ³ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ (ρ2 𝒱2)"
              by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
            thus ?thesis
              by (metis projection_commute)
          qed
          ultimately show ?thesis unfolding Adm_def
            by auto
        qed  
        moreover
        note FCIA2
        ultimately obtain Ξ±2'' Ξ΄2''
          where one: "set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
          and two: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] @ Ξ΄2'' @ [v'] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          and three: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
          and four: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
          unfolding FCIA_def
          by blast

        from two validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        note one
        moreover
        from two c_in_E2 v'_in_E2 
        have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
          by (simp add: projection_def)
        moreover
        note three four
        ultimately have ?ALPHA2''_DELTA2''
          by blast
      }
      ultimately obtain Ξ±2'' Ξ΄2''
        where Ξ±2''_in_E2star: "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
        and Ξ΄2''_in_N2_inter_Delta2star:"set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
        and Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2:
              "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
        and Ξ±2''Vv2_is_Ξ±2'Vv2: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
        and Ξ±2''Cv2_empty: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
        by blast

      from c_in_Cv_inter_Upsilon Upsilon_inter_E1_subset_Upsilon1 propSepViews
      have cE1_in_Cv1_inter_Upsilon1: "set ([c] β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
        unfolding properSeparationOfViews_def by (simp add: projection_def, auto)
     
      from Ξ΄2''_in_N2_inter_Delta2star Nv2_inter_Delta2_inter_E1_subsetof_Upsilon1 
       propSepViews disjoint_Nv2_Vv1 
      have Ξ΄2''E1_in_Cv1_inter_Upsilon1star: "set (Ξ΄2'' β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
        proof -
          from Ξ΄2''_in_N2_inter_Delta2star
          have eq: "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙)"
            by (metis Int_commute Int_left_commute Int_lower1 Int_lower2 
              projection_intersection_neutral subset_trans)
          
          from validV1 Nv2_inter_Delta2_inter_E1_subsetof_Upsilon1 
            propSepViews disjoint_Nv2_Vv1  
          have "Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
            unfolding properSeparationOfViews_def 
            by (simp add: isViewOn_def V_valid_def 
              VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
          thus ?thesis
            by (subst eq, simp only: projection_def, auto)
        qed
      
      have cΞ΄2''E1_in_Cv1_inter_Upsilon1star: "set ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
        proof -
          from cE1_in_Cv1_inter_Upsilon1 Ξ΄2''E1_in_Cv1_inter_Upsilon1star
          have "set (([c] @ Ξ΄2'') β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
            by (simp only: projection_concatenation_commute, auto)
          thus ?thesis
            by auto
        qed


        have 
        "βˆƒ Ξ±1'' Ξ΄1''. set Ξ±1'' βŠ† Eβ‡˜ES1⇙ ∧ set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙        
        ∧ Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙        
        ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []
        ∧ Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
        proof cases
          assume v'_in_E1: "v' ∈ Eβ‡˜ES1⇙"
          with Nabla_inter_E1_subset_Nabla1 propSepViews v'_in_Vv_inter_Nabla
          have v'_in_Vv1_inter_Nabla1: "v' ∈ Vβ‡˜π’±1⇙ ∩ Nabla Ξ“1"
            unfolding properSeparationOfViews_def by auto

          have "⟦ (Ξ² @ [v']) β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙ ; 
            Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []; set ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ; 
            c ∈ Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™ ; set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙;
            Adm 𝒱 ρ (Trβ‡˜(ES1 βˆ₯ ES2)⇙) Ξ² c ⟧ 
            ⟹ βˆƒ Ξ±1'' Ξ΄1''.
            (set Ξ±1'' βŠ† Eβ‡˜ES1⇙ ∧ set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙            
            ∧ Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙            
            ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []
            ∧ Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙)"
            proof (induct "length ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙)" arbitrary: Ξ² Ξ±1' c Ξ΄2'')
              case 0

              from 0(2) validES1 have "set Ξ±1' βŠ† Eβ‡˜ES1⇙"
                by (simp add: ES_valid_def traces_contain_events_def, auto)
              moreover
              have "set [] βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                by auto
              moreover
              have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
                proof -
                  note 0(2)
                  moreover
                  from 0(1) have "c βˆ‰ Eβ‡˜ES1⇙"
                    by (simp add: projection_def, auto)
                  ultimately show ?thesis
                    by (simp add: projection_concatenation_commute projection_def)
                qed
              moreover
              have "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙" ..
              moreover
              note 0(3)
              moreover 
              from 0(1) have "[] β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                by (simp add: projection_def, split if_split_asm, auto)
              ultimately show ?case
                by blast
            next
              case (Suc n)

              from projection_split_last[OF Suc(2)] obtain ΞΌ c' Ξ½
                where c'_in_E1: "c' ∈ Eβ‡˜ES1⇙"
                and cΞ΄2''_is_ΞΌc'Ξ½: "c # Ξ΄2'' = ΞΌ @ [c'] @ Ξ½"
                and Ξ½E1_empty: "Ξ½ β†Ώ Eβ‡˜ES1⇙ = []"
                and n_is_length_ΞΌΞ½E1: "n = length ((ΞΌ @ Ξ½) β†Ώ Eβ‡˜ES1⇙)"
                by blast

              from Suc(5) c'_in_E1 cΞ΄2''_is_ΞΌc'Ξ½ have "set (ΞΌ β†Ώ Eβ‡˜ES1⇙ @ [c']) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                by (simp only: cΞ΄2''_is_ΞΌc'Ξ½ projection_concatenation_commute 
                  projection_def, auto)
              hence c'_in_Cv1_inter_Upsilon1: "c' ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                by auto
              hence c'_in_Cv1: "c' ∈ Cβ‡˜π’±1⇙" and c'_in_Upsilon1: "c' ∈ Ξ₯β‡˜Ξ“1⇙"
                by auto
              with validV1 have c'_in_E1: "c' ∈ Eβ‡˜ES1⇙"
                by (simp add: isViewOn_def V_valid_def VC_disjoint_def 
                  VN_disjoint_def NC_disjoint_def, auto)

              show ?case
                proof (cases ΞΌ)
                  case Nil (* we apply FCIA in this case *)
                  with cΞ΄2''_is_ΞΌc'Ξ½ have c_is_c': "c = c'" and Ξ΄2''_is_Ξ½: "Ξ΄2'' = Ξ½"
                    by auto
                  with c'_in_Cv1_inter_Upsilon1 have "c ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                    by simp
                  moreover
                  note v'_in_Vv1_inter_Nabla1
                  moreover
                  from v'_in_E1 Suc(3) have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [v'] @ Ξ±1' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_concatenation_commute projection_def)
                  moreover
                  note Suc(4)
                  moreover
                  have "Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ (Ξ² β†Ώ Eβ‡˜ES1⇙) c"
                    proof -
                      from Suc(8) obtain Ξ³
                        where γρv_is_βρv: "Ξ³ β†Ώ (ρ 𝒱) = Ξ² β†Ώ (ρ 𝒱)"
                        and Ξ³c_in_Tr: "(Ξ³ @ [c]) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
                        unfolding Adm_def
                        by auto

                      from c_is_c' c'_in_E1 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES1⇙) @ [c] ∈ Trβ‡˜ES1⇙"
                        by (simp add: projection_def composeES_def)
                      moreover
                      have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1)"
                      proof -
                        from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱)"
                          by (metis projection_commute)
                        with ρ1v1_subset_ρv_inter_E1 have "Ξ³ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ (ρ1 𝒱1)"
                          by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
                        thus ?thesis
                          by (metis projection_commute)
                      qed
                      ultimately show ?thesis unfolding Adm_def
                        by auto
                    qed  
                  moreover
                  note FCIA1
                  ultimately obtain Ξ±1'' Ξ³
                    where one: "set Ξ³ βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    and two: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] @ Ξ³ @ [v'] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    and three: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    and four: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
                    unfolding FCIA_def
                    by blast

                  (* we choose Ξ΄1'' = Ξ½ β†Ώ EES1 @ Ξ³ *)
                  let ?DELTA1'' = "Ξ½ β†Ώ Eβ‡˜ES1⇙ @ Ξ³" 
                    
                  from two validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  from one Ξ½E1_empty
                  have "set ?DELTA1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    by auto
                  moreover
                  have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ ?DELTA1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    proof -
                      from c_is_c' c'_in_E1 have "[c] = [c] β†Ώ Eβ‡˜ES1⇙"
                        by (simp add: projection_def)
                      moreover
                      from v'_in_E1 have "[v'] = [v'] β†Ώ Eβ‡˜ES1⇙"
                        by (simp add: projection_def)
                      moreover
                      note Ξ½E1_empty two
                      ultimately show ?thesis
                        by auto
                    qed
                  moreover
                  note three four
                  moreover
                  have "?DELTA1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                    proof -
                      have "Ξ³ β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = []"
                        proof -
                          from validV1 have "Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = {}"
                            by (simp add: isViewOn_def V_valid_def
                              VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                          with projection_intersection_neutral[OF one, of "Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"]
                          show ?thesis
                            by (simp add: projection_def)
                        qed
                      with Ξ΄2''_is_Ξ½ Ξ½E1_empty show ?thesis
                        by (simp add: projection_concatenation_commute)
                    qed
                  ultimately show ?thesis
                    by blast
                next
                  case (Cons x xs) (* we apply the inductive hypothesis in this case *)
                  with cΞ΄2''_is_ΞΌc'Ξ½
                  have ΞΌ_is_c_xs: "ΞΌ = [c] @ xs" and Ξ΄2''_is_xs_c'_Ξ½: "Ξ΄2'' = xs @ [c'] @ Ξ½"
                    by auto
                  with n_is_length_ΞΌΞ½E1 have "n = length ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES1⇙)"
                    by auto
                  moreover
                  note Suc(3,4)
                  moreover
                  have "set ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                    proof -
                      have res: "c # (xs @ Ξ½) = [c] @ (xs @ Ξ½)" 
                        by auto

                      from Suc(5) cΞ΄2''_is_ΞΌc'Ξ½ ΞΌ_is_c_xs Ξ½E1_empty
                      show ?thesis
                        by (subst res, simp only: cΞ΄2''_is_ΞΌc'Ξ½ 
                          projection_concatenation_commute set_append, auto)
                    qed
                  moreover
                  note Suc(6) 
                  moreover
                  from Suc(7) Ξ΄2''_is_xs_c'_Ξ½ have "set (xs @ Ξ½) βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    by auto
                  moreover note Suc(8) Suc(1)[of c "xs @ Ξ½" Ξ² Ξ±1']
                  ultimately obtain Ξ΄ Ξ³
                    where one: "set Ξ΄ βŠ† Eβ‡˜ES1⇙"
                    and two: "set Ξ³ βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    and three: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ³ @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄ ∈ Trβ‡˜ES1⇙"
                    and four: "Ξ΄ β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    and five: "Ξ΄ β†Ώ Cβ‡˜π’±1⇙ = []"
                    and six: "Ξ³ β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = (xs @ Ξ½) β†Ώ Eβ‡˜ES1⇙"
                    by blast

                  (* apply FCIA to insert c' after Ξ³ *)
                  let ?BETA = "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ³"

                  note c'_in_Cv1_inter_Upsilon1 v'_in_Vv1_inter_Nabla1
                  moreover
                  from three v'_in_E1 have "?BETA @ [v'] @ Ξ΄ ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  note five 
                  moreover
                  have "Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ ?BETA c'"
                    proof -
                      have "?BETA @ [c'] ∈ Trβ‡˜ES1⇙"
                        proof -
                          from Suc(7) c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½
                          have "c' ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                            by auto
                          moreover
                          from validES1 three have "?BETA ∈ Trβ‡˜ES1⇙"
                            by (unfold ES_valid_def traces_prefixclosed_def
                              prefixclosed_def prefix_def, auto)
                          moreover
                          note total_ES1_C1_inter_Upsilon1_inter_N2_inter_Delta2
                          ultimately show ?thesis
                            unfolding total_def
                            by blast
                        qed
                      thus ?thesis
                        unfolding Adm_def
                        by blast                        
                    qed
                  moreover
                  note FCIA1
                  ultimately obtain Ξ±1'' Ξ΄'
                    where fcia_one: "set Ξ΄' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    and fcia_two: "?BETA @ [c'] @ Ξ΄' @ [v'] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    and fcia_three: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ΄ β†Ώ Vβ‡˜π’±1⇙"
                    and fcia_four:  "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
                    unfolding FCIA_def
                    by blast
  
                  let ?DELTA1'' = "Ξ³ @ [c'] @ Ξ΄'"

                  from fcia_two validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  have "set ?DELTA1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    proof -
                      from Suc(7) c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½ 
                      have "c' ∈  Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                        by auto
                      with two fcia_one show ?thesis
                        by auto
                    qed
                  moreover
                  from fcia_two v'_in_E1 
                  have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ ?DELTA1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  from fcia_three four have "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    by simp
                  moreover
                  note fcia_four
                  moreover             
                  have "?DELTA1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                    proof -
                      have "Ξ΄' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = []"
                        proof -
                          from fcia_one have "βˆ€ e ∈ set Ξ΄'. e ∈ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                            by auto
                          with validV1 have "βˆ€ e ∈ set Ξ΄'. e βˆ‰ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                            by (simp add: isViewOn_def V_valid_def 
                              VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                          thus ?thesis
                            by (simp add: projection_def)
                        qed
                      with c'_in_E1 c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½ Ξ½E1_empty six 
                      show ?thesis
                        by (simp only: projection_concatenation_commute projection_def, auto)
                    qed
                  ultimately show ?thesis 
                    by blast     
                qed
          qed
          from this[OF Ξ²v'E1Ξ±1'_in_Tr1 Ξ±1'Cv1_empty cΞ΄2''E1_in_Cv1_inter_Upsilon1star 
            c_in_Cv_inter_Upsilon Ξ΄2''_in_N2_inter_Delta2star Adm]
          obtain Ξ±1'' Ξ΄1''
            where one: "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
            and two: "set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
            and three: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙            
            ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
            and four: "Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
            by blast

          note one two three
          moreover
          have "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙" 
            proof -
              from projection_intersection_neutral[OF two, of "Eβ‡˜ES2⇙"] 
                Nv1_inter_Delta1_inter_E2_empty validV2 
              have "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES2⇙)"
                by (simp only: Int_Un_distrib2, auto)
              moreover
              from validV2 
              have "Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES2⇙ = Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                by (simp add:isViewOn_def  V_valid_def  VC_disjoint_def 
                  VN_disjoint_def NC_disjoint_def, auto)
              ultimately have "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
                by simp
              hence "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙) β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
                by (simp add: projection_def)
              with four have "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙)"
                by simp
              hence "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ (Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙) β†Ώ Eβ‡˜ES1⇙"
                by (simp only: projection_commute)
              with Ξ΄2''_in_N2_inter_Delta2star show ?thesis
                by (simp only: list_subset_iff_projection_neutral)
            qed
          ultimately show ?thesis
              by blast
        next
          assume v'_notin_E1: "v' βˆ‰ Eβ‡˜ES1⇙"

           have "⟦ (Ξ² @ [v']) β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙ ; 
            Ξ±1' β†Ώ Cβ‡˜π’±1⇙ = []; set ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ; 
             c ∈ Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™ ; set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙;
            Adm 𝒱 ρ (Trβ‡˜(ES1 βˆ₯ ES2)⇙) Ξ² c ⟧ 
            ⟹ βˆƒ Ξ±1'' Ξ΄1''. (set Ξ±1'' βŠ† Eβ‡˜ES1⇙ ∧ set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ 
             ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙            
             ∧ Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙            
             ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []
            ∧ Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙)"
            proof (induct "length ((c # Ξ΄2'') β†Ώ Eβ‡˜ES1⇙)" arbitrary: Ξ² Ξ±1' c Ξ΄2'')
               case 0

              from 0(2) validES1 have "set Ξ±1' βŠ† Eβ‡˜ES1⇙"
                by (simp add: ES_valid_def traces_contain_events_def, auto)
              moreover
              have "set [] βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                by auto
              moreover
              have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
                proof -
                  note 0(2)
                  moreover
                  from 0(1) have "c βˆ‰ Eβ‡˜ES1⇙"
                    by (simp add: projection_def, auto)
                  ultimately show ?thesis
                    by (simp add: projection_concatenation_commute projection_def)
                qed
              moreover
              have "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙" ..
              moreover
              note 0(3)
              moreover 
              from 0(1) have "[] β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                by (simp add: projection_def, split if_split_asm, auto)
              ultimately show ?case
                by blast
            next
              case (Suc n)

              from projection_split_last[OF Suc(2)] obtain ΞΌ c' Ξ½
                where c'_in_E1: "c' ∈ Eβ‡˜ES1⇙"
                and cΞ΄2''_is_ΞΌc'Ξ½: "c # Ξ΄2'' = ΞΌ @ [c'] @ Ξ½"
                and Ξ½E1_empty: "Ξ½ β†Ώ Eβ‡˜ES1⇙ = []"
                and n_is_length_ΞΌΞ½E1: "n = length ((ΞΌ @ Ξ½) β†Ώ Eβ‡˜ES1⇙)"
                by blast

              from Suc(5) c'_in_E1 cΞ΄2''_is_ΞΌc'Ξ½ have "set (ΞΌ β†Ώ Eβ‡˜ES1⇙ @ [c']) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                by (simp only: cΞ΄2''_is_ΞΌc'Ξ½ projection_concatenation_commute projection_def, auto)
              hence c'_in_Cv1_inter_Upsilon1: "c' ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                by auto
              hence c'_in_Cv1: "c' ∈ Cβ‡˜π’±1⇙" and c'_in_Upsilon1: "c' ∈ Ξ₯β‡˜Ξ“1⇙"
                by auto
              with validV1 have c'_in_E1: "c' ∈ Eβ‡˜ES1⇙"
                by (simp add:isViewOn_def V_valid_def VC_disjoint_def 
                  VN_disjoint_def NC_disjoint_def, auto)

              show ?case
                proof (cases ΞΌ)
                  case Nil (* we just apply BSIA in this case *)
                  with cΞ΄2''_is_ΞΌc'Ξ½ have c_is_c': "c = c'" and Ξ΄2''_is_Ξ½: "Ξ΄2'' = Ξ½"
                    by auto
                  with c'_in_Cv1_inter_Upsilon1 have "c ∈ Cβ‡˜π’±1⇙"
                    by simp
                  moreover
                  from v'_notin_E1 Suc(3) have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ Ξ±1' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_concatenation_commute projection_def)
                  moreover
                  note Suc(4)
                  moreover
                  have "Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ (Ξ² β†Ώ Eβ‡˜ES1⇙) c"
                     proof -
                      from Suc(8) obtain Ξ³
                        where γρv_is_βρv: "Ξ³ β†Ώ (ρ 𝒱) = Ξ² β†Ώ (ρ 𝒱)"
                        and Ξ³c_in_Tr: "(Ξ³ @ [c]) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
                        unfolding Adm_def
                        by auto

                      from c_is_c' c'_in_E1 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES1⇙) @ [c] ∈ Trβ‡˜ES1⇙"
                        by (simp add: projection_def composeES_def)
                      moreover
                      have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1)"
                      proof -
                        from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱)"
                          by (metis projection_commute)
                        with ρ1v1_subset_ρv_inter_E1 have "Ξ³ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ (ρ1 𝒱1)"
                          by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
                        thus ?thesis
                          by (metis projection_commute)
                      qed
                      ultimately show ?thesis unfolding Adm_def
                        by auto
                    qed  
                  moreover
                  note BSIA1
                  ultimately obtain Ξ±1''
                    where one: "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [c] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    and two: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    and three: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
                    unfolding BSIA_def
                    by blast

                  let ?DELTA1'' = "Ξ½ β†Ώ Eβ‡˜ES1⇙"

                  from one validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  from Ξ½E1_empty
                  have "set ?DELTA1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    by simp
                  moreover
                  from c_is_c' c'_in_E1 one v'_notin_E1 Ξ½E1_empty
                  have "(Ξ² β†Ώ Eβ‡˜ES1⇙) @ [c] β†Ώ Eβ‡˜ES1⇙ @ ?DELTA1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  note two three
                  moreover
                  from Ξ½E1_empty Ξ΄2''_is_Ξ½ have "?DELTA1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  ultimately show ?thesis
                    by blast
                next
                  case (Cons x xs) (* apply inductive hypothesis, then BSIA *)
                  with cΞ΄2''_is_ΞΌc'Ξ½
                  have ΞΌ_is_c_xs: "ΞΌ = [c] @ xs" and Ξ΄2''_is_xs_c'_Ξ½: "Ξ΄2'' = xs @ [c'] @ Ξ½"
                    by auto
                  with n_is_length_ΞΌΞ½E1 have "n = length ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES1⇙)"
                    by auto
                  moreover
                  note Suc(3,4)
                  moreover
                  have "set ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES1⇙) βŠ† Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
                    proof -
                      have res: "c # (xs @ Ξ½) = [c] @ (xs @ Ξ½)" 
                        by auto

                      from Suc(5) cΞ΄2''_is_ΞΌc'Ξ½ ΞΌ_is_c_xs Ξ½E1_empty
                      show ?thesis
                        by (subst res, simp only: cΞ΄2''_is_ΞΌc'Ξ½ projection_concatenation_commute 
                          set_append, auto)
                    qed
                  moreover
                  note Suc(6) 
                  moreover
                  from Suc(7) Ξ΄2''_is_xs_c'_Ξ½ have "set (xs @ Ξ½) βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    by auto
                  moreover note Suc(8) Suc(1)[of c "xs @ Ξ½" Ξ² Ξ±1']
                  ultimately obtain Ξ΄ Ξ³
                    where one: "set Ξ΄ βŠ† Eβ‡˜ES1⇙"
                    and two: "set Ξ³ βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    and three: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ³ @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄ ∈ Trβ‡˜ES1⇙"
                    and four: "Ξ΄ β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    and five: "Ξ΄ β†Ώ Cβ‡˜π’±1⇙ = []"
                    and six: "Ξ³ β†Ώ Eβ‡˜ES2⇙ = (xs @ Ξ½) β†Ώ Eβ‡˜ES1⇙"
                    by blast
                  
                   (* apply BSIA to insert c' after Ξ³ *)
                  let ?BETA = "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ³"

                  from c'_in_Cv1_inter_Upsilon1 have "c' ∈ Cβ‡˜π’±1⇙"
                    by auto
                  moreover
                  from three v'_notin_E1 have "?BETA @ Ξ΄ ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  note five 
                  moreover
                  have "Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ ?BETA c'"
                    proof -
                      have "?BETA @ [c'] ∈ Trβ‡˜ES1⇙"
                        proof -
                          from Suc(7) c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½
                          have "c' ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                            by auto
                          moreover
                          from validES1 three have "?BETA ∈ Trβ‡˜ES1⇙"
                            by (unfold ES_valid_def traces_prefixclosed_def
                              prefixclosed_def prefix_def, auto)
                          moreover
                          note total_ES1_C1_inter_Upsilon1_inter_N2_inter_Delta2
                          ultimately show ?thesis
                            unfolding total_def
                            by blast
                        qed
                      thus ?thesis
                        unfolding Adm_def
                        by blast                      
                    qed
                  moreover
                  note BSIA1
                  ultimately obtain Ξ±1''
                    where bsia_one: "?BETA @ [c'] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    and bsia_two: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ΄ β†Ώ Vβ‡˜π’±1⇙"
                    and bsia_three:  "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
                    unfolding BSIA_def
                    by blast
  
                  let ?DELTA1'' = "Ξ³ @ [c']"

                  from bsia_one validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  have "set ?DELTA1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    proof -
                      from Suc(7) c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½ 
                      have "c' ∈  Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                        by auto
                      with two show ?thesis
                        by auto
                    qed
                  moreover
                  from bsia_one v'_notin_E1 
                  have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ ?DELTA1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
                    by (simp add: projection_def)
                  moreover
                  from bsia_two four have "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
                    by simp
                  moreover
                  note bsia_three
                  moreover             
                  have "?DELTA1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
                    proof -
                      from validV2 Suc(7) Ξ΄2''_is_xs_c'_Ξ½ have "c' ∈ Eβ‡˜ES2⇙"
                        by (simp add: isViewOn_def V_valid_def
                          VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                      with c'_in_E1 c'_in_Cv1_inter_Upsilon1 Ξ΄2''_is_xs_c'_Ξ½ Ξ½E1_empty six 
                      show ?thesis
                        by (simp only: projection_concatenation_commute projection_def, auto)
                    qed
                  ultimately show ?thesis 
                    by blast     
                qed
            qed
          from this[OF Ξ²v'E1Ξ±1'_in_Tr1 Ξ±1'Cv1_empty cΞ΄2''E1_in_Cv1_inter_Upsilon1star 
            c_in_Cv_inter_Upsilon Ξ΄2''_in_N2_inter_Delta2star Adm]
          show ?thesis 
            by blast
        qed
      then obtain Ξ±1'' Ξ΄1''
        where Ξ±1''_in_E1star: "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
        and Ξ΄1''_in_N1_inter_Delta1star:"set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙ ∩ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
        and Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1: 
          "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
        and Ξ±1''Vv1_is_Ξ±1'Vv1: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
        and Ξ±1''Cv1_empty: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
        and Ξ΄1''E2_is_Ξ΄2''E1: "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2'' β†Ώ Eβ‡˜ES1⇙"
        by blast

      from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 validES1 
        validES2
      have Ξ΄1''_in_E1star: "set Ξ΄1'' βŠ† Eβ‡˜ES1⇙" and Ξ΄2''_in_E2star: "set Ξ΄2'' βŠ† Eβ‡˜ES2⇙"
        by (simp_all add: ES_valid_def traces_contain_events_def, auto)
      with Ξ΄1''E2_is_Ξ΄2''E1 merge_property[of Ξ΄1'' "Eβ‡˜ES1⇙" Ξ΄2'' "Eβ‡˜ES2⇙"] obtain Ξ΄'
        where Ξ΄'E1_is_Ξ΄1'': "Ξ΄' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1''"
        and Ξ΄'E2_is_Ξ΄2'': "Ξ΄' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2''"
        and Ξ΄'_contains_only_Ξ΄1''_Ξ΄2''_events: "set Ξ΄' βŠ† set Ξ΄1'' βˆͺ set Ξ΄2''"
        unfolding Let_def
        by auto

      let ?TAU = "Ξ² @ [c] @ Ξ΄' @ [v']"
      let ?LAMBDA = "Ξ± β†Ώ Vβ‡˜π’±β‡™"
      let ?T1 = Ξ±1''
      let ?T2 = Ξ±2''

     (* apply the generalized zipping lemma *)
     have "?TAU ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
        proof -
          from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ΄'E1_is_Ξ΄1'' validES1
          have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄' β†Ώ Eβ‡˜ES1⇙ @ [v'] β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
            by (simp add: ES_valid_def traces_prefixclosed_def
              prefixclosed_def prefix_def)
          hence "(Ξ² @ [c] @ Ξ΄' @ [v']) β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
            by (simp add: projection_def, auto)
          moreover          
          from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ΄'E2_is_Ξ΄2'' validES2 
          have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄' β†Ώ Eβ‡˜ES2⇙ @ [v'] β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
            by (simp add: ES_valid_def traces_prefixclosed_def
              prefixclosed_def prefix_def)
          hence "(Ξ² @ [c] @ Ξ΄' @ [v']) β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
            by (simp add: projection_def, auto)
          moreover
          from Ξ²v'Ξ±_in_Tr c_in_Cv_inter_Upsilon VIsViewOnE Ξ΄'_contains_only_Ξ΄1''_Ξ΄2''_events 
            Ξ΄1''_in_E1star Ξ΄2''_in_E2star
          have "set (Ξ² @ [c] @ Ξ΄' @ [v']) βŠ† Eβ‡˜ES1⇙ βˆͺ Eβ‡˜ES2⇙"
            unfolding composeES_def isViewOn_def V_valid_def 
              VC_disjoint_def VN_disjoint_def NC_disjoint_def
            by auto
          ultimately show ?thesis
            unfolding composeES_def
            by auto
        qed 
      hence "set ?TAU βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
        unfolding composeES_def
        by auto
      moreover
      have "set ?LAMBDA βŠ† Vβ‡˜π’±β‡™"
        by (simp add: projection_def, auto)
      moreover
      note Ξ±1''_in_E1star Ξ±2''_in_E2star
      moreover
      from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ΄'E1_is_Ξ΄1'' 
      have "?TAU β†Ώ Eβ‡˜ES1⇙ @ ?T1 ∈ Trβ‡˜ES1⇙"
        by (simp only: projection_concatenation_commute, auto)
      moreover
      from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ΄'E2_is_Ξ΄2'' 
      have "?TAU β†Ώ Eβ‡˜ES2⇙ @ ?T2 ∈ Trβ‡˜ES2⇙"
        by (simp only: projection_concatenation_commute, auto)
      moreover
      have "?LAMBDA β†Ώ Eβ‡˜ES1⇙ = ?T1 β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from propSepViews have "?LAMBDA β†Ώ Eβ‡˜ES1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def by (simp only: projection_sequence)
          moreover
          from Ξ±1''_in_E1star propSepViews 
          have "?T1 β†Ώ Vβ‡˜π’±β‡™ = ?T1 β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def
            by (metis Int_commute projection_intersection_neutral)
          moreover
          note Ξ±1'Vv1_is_Ξ±Vv1 Ξ±1''Vv1_is_Ξ±1'Vv1
          ultimately show ?thesis
            by simp
        qed
      moreover
      have "?LAMBDA β†Ώ Eβ‡˜ES2⇙ = ?T2 β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from propSepViews have "?LAMBDA β†Ώ Eβ‡˜ES2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def by (simp only: projection_sequence)
          moreover
          from Ξ±2''_in_E2star propSepViews have "?T2 β†Ώ Vβ‡˜π’±β‡™ = ?T2 β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def
            by (metis Int_commute projection_intersection_neutral)
          moreover
          note Ξ±2'Vv2_is_Ξ±Vv2 Ξ±2''Vv2_is_Ξ±2'Vv2
          ultimately show ?thesis
            by simp
        qed
      moreover
      note Ξ±1''Cv1_empty Ξ±2''Cv2_empty generalized_zipping_lemma
      ultimately obtain t (* show that the conclusion of FCIA holds *)
        where "?TAU @ t ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
        and  "t β†Ώ Vβ‡˜π’±β‡™ = ?LAMBDA"
        and "t β†Ώ Cβ‡˜π’±β‡™ = []"
        by blast
      moreover
      have "set Ξ΄' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™"
        proof -
          from Ξ΄'_contains_only_Ξ΄1''_Ξ΄2''_events Ξ΄1''_in_N1_inter_Delta1star 
            Ξ΄2''_in_N2_inter_Delta2star
          have "set Ξ΄' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ βˆͺ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
            by auto
          with Delta1_N1_Delta2_N2_subset_Delta Nv1_union_Nv2_subsetof_Nv 
          show ?thesis
            by auto
        qed
      ultimately have "βˆƒΞ±' Ξ³'. (set Ξ³' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™ ∧ Ξ² @ [c] @ Ξ³' @ [v'] @ Ξ±' ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙ 
        ∧ Ξ±' β†Ώ Vβ‡˜π’±β‡™ = Ξ± β†Ώ Vβ‡˜π’±β‡™ ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = [])"
        by (simp only: append_assoc, blast)
    }
    moreover {
      assume Nv2_inter_Delta2_inter_E1_empty: "Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ Eβ‡˜ES1⇙ = {}" 
        and  Nv1_inter_Delta1_inter_E2_subsetof_Upsilon2: "Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ βŠ† Ξ₯β‡˜Ξ“2⇙"

      let ?ALPHA1''_DELTA1'' = "βˆƒ Ξ±1'' Ξ΄1''. (
        set Ξ±1'' βŠ† Eβ‡˜ES1⇙ ∧ set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ 
        ∧ Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙ 
        ∧ Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙ ∧ Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = [])"

      from c_in_Cv_inter_Upsilon v'_in_Vv_inter_Nabla validV1
      have "c βˆ‰ Eβ‡˜ES1⇙ ∨ (c ∈ Eβ‡˜ES1⇙ ∧ v' βˆ‰ Eβ‡˜ES1⇙) ∨ (c ∈ Eβ‡˜ES1⇙ ∧ v' ∈ Eβ‡˜ES1⇙)"
        by (simp add: isViewOn_def V_valid_def VC_disjoint_def 
          VN_disjoint_def NC_disjoint_def)
      moreover {
        assume c_notin_E1: "c βˆ‰ Eβ‡˜ES1⇙"

        from validES1 Ξ²v'E1Ξ±1'_in_Tr1 have "set Ξ±1' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover 
        have "set [] βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
          by auto
        moreover 
        from Ξ²v'E1Ξ±1'_in_Tr1 c_notin_E1 
        have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover
        have "Ξ±1' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙" ..
        moreover 
        note Ξ±1'Cv1_empty
        ultimately have ?ALPHA1''_DELTA1''
          by blast
      }
      moreover {
        assume c_in_E1: "c ∈ Eβ‡˜ES1⇙"
          and  v'_notin_E1: "v' βˆ‰ Eβ‡˜ES1⇙"

        from c_in_E1 c_in_Cv_inter_Upsilon propSepViews
          Upsilon_inter_E1_subset_Upsilon1
        have c_in_Cv1_inter_Upsilon1: "c ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
          unfolding properSeparationOfViews_def by auto
        hence "c ∈ Cβ‡˜π’±1⇙"
          by auto
        moreover
        from Ξ²v'E1Ξ±1'_in_Tr1 v'_notin_E1 have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ Ξ±1' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover
        note Ξ±1'Cv1_empty
        moreover
        have "Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ (Ξ² β†Ώ Eβ‡˜ES1⇙) c"
        proof -
          from Adm obtain Ξ³
            where γρv_is_βρv: "Ξ³ β†Ώ (ρ 𝒱) = Ξ² β†Ώ (ρ 𝒱)"
            and Ξ³c_in_Tr: "(Ξ³ @ [c]) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
            unfolding Adm_def
            by auto

          from c_in_E1 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES1⇙) @ [c] ∈ Trβ‡˜ES1⇙"
            by (simp add: projection_def composeES_def)
          moreover
          have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1)"
          proof -
            from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱)"
              by (metis projection_commute)
            with ρ1v1_subset_ρv_inter_E1 have "Ξ³ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ (ρ1 𝒱1)"
              by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
            thus ?thesis
              by (metis projection_commute)
          qed
          ultimately show ?thesis unfolding Adm_def
            by auto
        qed  
        moreover 
        note BSIA1
        ultimately obtain  Ξ±1''
          where one: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          and two:   "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
          and three: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
          unfolding BSIA_def
          by blast

        from one validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        have "set [] βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
          by auto
        moreover
        from one c_in_E1 v'_notin_E1 
        have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover 
        note two three
        ultimately have ?ALPHA1''_DELTA1''
          by blast
      }
      moreover {
        assume c_in_E1: "c ∈ Eβ‡˜ES1⇙"
          and  v'_in_E1: "v' ∈ Eβ‡˜ES1⇙"

        from c_in_E1 c_in_Cv_inter_Upsilon propSepViews
          Upsilon_inter_E1_subset_Upsilon1
        have c_in_Cv1_inter_Upsilon1: "c ∈ Cβ‡˜π’±1⇙ ∩ Ξ₯β‡˜Ξ“1⇙"
          unfolding properSeparationOfViews_def by auto
        moreover
        from v'_in_E1 propSepViews v'_in_Vv_inter_Nabla 
          Nabla_inter_E1_subset_Nabla1
        have "v' ∈ Vβ‡˜π’±1⇙ ∩ Nabla Ξ“1"
          unfolding properSeparationOfViews_def by auto
        moreover
        from v'_in_E1  Ξ²v'E1Ξ±1'_in_Tr1 have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [v'] @ Ξ±1' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover
        note Ξ±1'Cv1_empty 
        moreover
        have "Adm 𝒱1 ρ1 Trβ‡˜ES1⇙ (Ξ² β†Ώ Eβ‡˜ES1⇙) c"
        proof -
          from Adm obtain Ξ³
            where γρv_is_βρv: "Ξ³ β†Ώ (ρ 𝒱) = Ξ² β†Ώ (ρ 𝒱)"
            and Ξ³c_in_Tr: "(Ξ³ @ [c]) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
            unfolding Adm_def
            by auto

          from c_in_E1 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES1⇙) @ [c] ∈ Trβ‡˜ES1⇙"
            by (simp add: projection_def composeES_def)
          moreover
          have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ1 𝒱1)"
          proof -
            from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES1⇙ β†Ώ (ρ 𝒱)"
              by (metis projection_commute)
            with ρ1v1_subset_ρv_inter_E1 have "Ξ³ β†Ώ (ρ1 𝒱1) = Ξ² β†Ώ (ρ1 𝒱1)"
              by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
            thus ?thesis
              by (metis projection_commute)
          qed
          ultimately show ?thesis unfolding Adm_def
            by auto
        qed  
        moreover
        note FCIA1
        ultimately obtain Ξ±1'' Ξ΄1''
          where one: "set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
          and two: "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] @ Ξ΄1'' @ [v'] @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          and three: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
          and four: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
          unfolding FCIA_def
          by blast

        from two validES1 have "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
          by (simp add: ES_valid_def traces_contain_events_def, auto)
        moreover
        note one
        moreover
        from two c_in_E1 v'_in_E1 
        have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
          by (simp add: projection_def)
        moreover
        note three four
        ultimately have ?ALPHA1''_DELTA1''
          by blast
      }
      ultimately obtain Ξ±1'' Ξ΄1''
        where Ξ±1''_in_E1star: "set Ξ±1'' βŠ† Eβ‡˜ES1⇙"
        and Ξ΄1''_in_N1_inter_Delta1star:"set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
        and Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1: 
          "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄1'' @ [v'] β†Ώ Eβ‡˜ES1⇙ @ Ξ±1'' ∈ Trβ‡˜ES1⇙"
        and Ξ±1''Vv1_is_Ξ±1'Vv1: "Ξ±1'' β†Ώ Vβ‡˜π’±1⇙ = Ξ±1' β†Ώ Vβ‡˜π’±1⇙"
        and Ξ±1''Cv1_empty: "Ξ±1'' β†Ώ Cβ‡˜π’±1⇙ = []"
        by blast

      from c_in_Cv_inter_Upsilon Upsilon_inter_E2_subset_Upsilon2 propSepViews
      have cE2_in_Cv2_inter_Upsilon2: "set ([c] β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
        unfolding properSeparationOfViews_def by (simp add: projection_def, auto)
     
      from Ξ΄1''_in_N1_inter_Delta1star Nv1_inter_Delta1_inter_E2_subsetof_Upsilon2 
       propSepViews disjoint_Nv1_Vv2 
      have Ξ΄1''E2_in_Cv2_inter_Upsilon2star: "set (Ξ΄1'' β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
        proof -
          from Ξ΄1''_in_N1_inter_Delta1star 
          have eq: "Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ = Ξ΄1'' β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙)"
            by (metis Int_commute Int_left_commute Int_lower2 Int_lower1 
              projection_intersection_neutral subset_trans)
          
          from validV2 Nv1_inter_Delta1_inter_E2_subsetof_Upsilon2 
            propSepViews disjoint_Nv1_Vv2  
          have "Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
            unfolding properSeparationOfViews_def 
            by (simp add: isViewOn_def V_valid_def VC_disjoint_def 
              VN_disjoint_def NC_disjoint_def, auto)
          thus ?thesis
            by (subst eq, simp only: projection_def, auto)
        qed
      
      have cΞ΄1''E2_in_Cv2_inter_Upsilon2star: "set ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
        proof -
          from cE2_in_Cv2_inter_Upsilon2 Ξ΄1''E2_in_Cv2_inter_Upsilon2star
          have "set (([c] @ Ξ΄1'') β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
            by (simp only: projection_concatenation_commute, auto)
          thus ?thesis
            by auto
        qed


      have "βˆƒ Ξ±2'' Ξ΄2''. set Ξ±2'' βŠ† Eβ‡˜ES2⇙        
        ∧ set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙        
        ∧ Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙        
        ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []
        ∧ Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
        proof cases
          assume v'_in_E2: "v' ∈ Eβ‡˜ES2⇙"
          with Nabla_inter_E2_subset_Nabla2 propSepViews v'_in_Vv_inter_Nabla
          have v'_in_Vv2_inter_Nabla2: "v' ∈ Vβ‡˜π’±2⇙ ∩ Nabla Ξ“2"
            unfolding properSeparationOfViews_def by auto

          have "⟦ (Ξ² @ [v']) β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙ ; 
            Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []; set ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ; 
            c ∈ Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™ ; set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙;
            Adm 𝒱 ρ (Trβ‡˜(ES1 βˆ₯ ES2)⇙) Ξ² c ⟧ 
            ⟹ βˆƒ Ξ±2'' Ξ΄2''.
           (set Ξ±2'' βŠ† Eβ‡˜ES2⇙ ∧ set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙            
            ∧ Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙            
            ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []
            ∧ Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙)"
            proof (induct "length ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙)" arbitrary: Ξ² Ξ±2' c Ξ΄1'')
              case 0

              from 0(2) validES2 have "set Ξ±2' βŠ† Eβ‡˜ES2⇙"
                by (simp add: ES_valid_def traces_contain_events_def, auto)
              moreover
              have "set [] βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                by auto
              moreover
              have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
                proof -
                  note 0(2)
                  moreover
                  from 0(1) have "c βˆ‰ Eβ‡˜ES2⇙"
                    by (simp add: projection_def, auto)
                  ultimately show ?thesis
                    by (simp add: projection_concatenation_commute projection_def)
                qed
              moreover
              have "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙" ..
              moreover
              note 0(3)
              moreover 
              from 0(1) have "[] β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                by (simp add: projection_def, split if_split_asm, auto)
              ultimately show ?case
                by blast
            next
              case (Suc n)

              from projection_split_last[OF Suc(2)] obtain ΞΌ c' Ξ½
                where c'_in_E2: "c' ∈ Eβ‡˜ES2⇙"
                and cΞ΄1''_is_ΞΌc'Ξ½: "c # Ξ΄1'' = ΞΌ @ [c'] @ Ξ½"
                and Ξ½E2_empty: "Ξ½ β†Ώ Eβ‡˜ES2⇙ = []"
                and n_is_length_ΞΌΞ½E2: "n = length ((ΞΌ @ Ξ½) β†Ώ Eβ‡˜ES2⇙)"
                by blast

              from Suc(5) c'_in_E2 cΞ΄1''_is_ΞΌc'Ξ½ have "set (ΞΌ β†Ώ Eβ‡˜ES2⇙ @ [c']) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                by (simp only: cΞ΄1''_is_ΞΌc'Ξ½ projection_concatenation_commute 
                  projection_def, auto)
              hence c'_in_Cv2_inter_Upsilon2: "c' ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                by auto
              hence c'_in_Cv2: "c' ∈ Cβ‡˜π’±2⇙" and c'_in_Upsilon2: "c' ∈ Ξ₯β‡˜Ξ“2⇙"
                by auto
              with validV2 have c'_in_E2: "c' ∈ Eβ‡˜ES2⇙"
                by (simp add: isViewOn_def V_valid_def
                  VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)

              show ?case
                proof (cases ΞΌ)
                  case Nil (* we apply FCIA in this case *)
                  with cΞ΄1''_is_ΞΌc'Ξ½ have c_is_c': "c = c'" and Ξ΄1''_is_Ξ½: "Ξ΄1'' = Ξ½"
                    by auto
                  with c'_in_Cv2_inter_Upsilon2 have "c ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                    by simp
                  moreover
                  note v'_in_Vv2_inter_Nabla2
                  moreover
                  from v'_in_E2 Suc(3) have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [v'] @ Ξ±2' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_concatenation_commute projection_def)
                  moreover
                  note Suc(4)
                  moreover
                  have "Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ (Ξ² β†Ώ Eβ‡˜ES2⇙) c"
                    proof -
                      from Suc(8) obtain Ξ³
                        where γρv_is_βρv: "Ξ³ β†Ώ (ρ 𝒱) = Ξ² β†Ώ (ρ 𝒱)"
                        and Ξ³c_in_Tr: "(Ξ³ @ [c]) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
                        unfolding Adm_def
                        by auto

                      from c_is_c' c'_in_E2 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES2⇙) @ [c] ∈ Trβ‡˜ES2⇙"
                        by (simp add: projection_def composeES_def)
                      moreover
                      have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2)"
                      proof -
                        from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱)"
                          by (metis projection_commute)
                        with ρ2v2_subset_ρv_inter_E2 have "Ξ³ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ (ρ2 𝒱2)"
                          by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
                        thus ?thesis
                          by (metis projection_commute)
                      qed
                      ultimately show ?thesis unfolding Adm_def
                        by auto
                    qed  
                  moreover
                  note FCIA2
                  ultimately obtain Ξ±2'' Ξ³
                    where one: "set Ξ³ βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    and two: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] @ Ξ³ @ [v'] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    and three: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    and four: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
                    unfolding FCIA_def
                    by blast

                  (* we choose Ξ΄2'' = Ξ½ β†Ώ EES2 @ Ξ³ *)
                  let ?DELTA2'' = "Ξ½ β†Ώ Eβ‡˜ES2⇙ @ Ξ³" 
                    
                  from two validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  from one Ξ½E2_empty
                  have "set ?DELTA2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    by auto
                  moreover
                  have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ ?DELTA2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    proof -
                      from c_is_c' c'_in_E2 have "[c] = [c] β†Ώ Eβ‡˜ES2⇙"
                        by (simp add: projection_def)
                      moreover
                      from v'_in_E2 have "[v'] = [v'] β†Ώ Eβ‡˜ES2⇙"
                        by (simp add: projection_def)
                      moreover
                      note Ξ½E2_empty two
                      ultimately show ?thesis
                        by auto
                    qed
                  moreover
                  note three four
                  moreover
                  have "?DELTA2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                    proof -
                      have "Ξ³ β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = []"
                        proof -
                          from validV2 have "Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ ∩ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = {}"
                            by (simp add: isViewOn_def V_valid_def
                              VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                          with projection_intersection_neutral[OF one, of "Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"]
                          show ?thesis
                            by (simp add: projection_def)
                        qed
                      with Ξ΄1''_is_Ξ½ Ξ½E2_empty show ?thesis
                        by (simp add: projection_concatenation_commute)
                    qed
                  ultimately show ?thesis
                    by blast
                next
                  case (Cons x xs) (* we apply the inductive hypothesis in this case *)
                  with cΞ΄1''_is_ΞΌc'Ξ½
                  have ΞΌ_is_c_xs: "ΞΌ = [c] @ xs" and Ξ΄1''_is_xs_c'_Ξ½: "Ξ΄1'' = xs @ [c'] @ Ξ½"
                    by auto
                  with n_is_length_ΞΌΞ½E2 have "n = length ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES2⇙)"
                    by auto
                  moreover
                  note Suc(3,4)
                  moreover
                  have "set ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                    proof -
                      have res: "c # (xs @ Ξ½) = [c] @ (xs @ Ξ½)" 
                        by auto

                      from Suc(5) cΞ΄1''_is_ΞΌc'Ξ½ ΞΌ_is_c_xs Ξ½E2_empty
                      show ?thesis
                        by (subst res, simp only: cΞ΄1''_is_ΞΌc'Ξ½ 
                          projection_concatenation_commute set_append, auto)
                    qed
                  moreover
                  note Suc(6) 
                  moreover
                  from Suc(7) Ξ΄1''_is_xs_c'_Ξ½ have "set (xs @ Ξ½) βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    by auto
                  moreover note Suc(8) Suc(1)[of c "xs @ Ξ½" Ξ² Ξ±2']
                  ultimately obtain Ξ΄ Ξ³
                    where one: "set Ξ΄ βŠ† Eβ‡˜ES2⇙"
                    and two: "set Ξ³ βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    and three: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ³ @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄ ∈ Trβ‡˜ES2⇙"
                    and four: "Ξ΄ β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    and five: "Ξ΄ β†Ώ Cβ‡˜π’±2⇙ = []"
                    and six: "Ξ³ β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = (xs @ Ξ½) β†Ώ Eβ‡˜ES2⇙"
                    by blast

                  (* apply FCIA to insert c' after Ξ³ *)
                  let ?BETA = "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ³"

                  note c'_in_Cv2_inter_Upsilon2 v'_in_Vv2_inter_Nabla2
                  moreover
                  from three v'_in_E2 have "?BETA @ [v'] @ Ξ΄ ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  note five 
                  moreover
                  have "Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ ?BETA c'"
                    proof -
                      have "?BETA @ [c'] ∈ Trβ‡˜ES2⇙"
                        proof -
                          from Suc(7) c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½
                          have "c' ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                            by auto
                          moreover
                          from validES2 three have "?BETA ∈ Trβ‡˜ES2⇙"
                            by (unfold ES_valid_def traces_prefixclosed_def
                              prefixclosed_def prefix_def, auto)
                          moreover
                          note total_ES2_C2_inter_Upsilon2_inter_N1_inter_Delta1
                          ultimately show ?thesis
                            unfolding total_def
                            by blast
                        qed
                      thus ?thesis
                        unfolding Adm_def
                        by blast                        
                    qed
                  moreover
                  note FCIA2
                  ultimately obtain Ξ±2'' Ξ΄'
                    where fcia_one: "set Ξ΄' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                    and fcia_two: "?BETA @ [c'] @ Ξ΄' @ [v'] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    and fcia_three: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ΄ β†Ώ Vβ‡˜π’±2⇙"
                    and fcia_four:  "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
                    unfolding FCIA_def
                    by blast
  
                  let ?DELTA2'' = "Ξ³ @ [c'] @ Ξ΄'"

                  from fcia_two validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  have "set ?DELTA2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    proof -
                      from Suc(7) c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½ 
                      have "c' ∈  Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                        by auto
                      with two fcia_one show ?thesis
                        by auto
                    qed
                  moreover
                  from fcia_two v'_in_E2 
                  have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ ?DELTA2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  from fcia_three four have "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    by simp
                  moreover
                  note fcia_four
                  moreover             
                  have "?DELTA2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                    proof -
                      have "Ξ΄' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = []"
                        proof -
                          from fcia_one have "βˆ€ e ∈ set Ξ΄'. e ∈ Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙"
                            by auto
                          with validV2 have "βˆ€ e ∈ set Ξ΄'. e βˆ‰ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                            by (simp add:isViewOn_def V_valid_def 
                              VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                          thus ?thesis
                            by (simp add: projection_def)
                        qed
                      with c'_in_E2 c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½ Ξ½E2_empty six 
                      show ?thesis
                        by (simp only: projection_concatenation_commute projection_def, auto)
                    qed
                  ultimately show ?thesis 
                    by blast     
                qed
          qed
          from this[OF Ξ²v'E2Ξ±2'_in_Tr2 Ξ±2'Cv2_empty 
            cΞ΄1''E2_in_Cv2_inter_Upsilon2star c_in_Cv_inter_Upsilon Ξ΄1''_in_N1_inter_Delta1star Adm]
          obtain Ξ±2'' Ξ΄2''
            where one: "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
            and two: "set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
            and three: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙            
            ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
            and four: "Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
            by blast

          note one two three
          moreover
          have "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙" 
            proof -
              from projection_intersection_neutral[OF two, of "Eβ‡˜ES1⇙"] 
                Nv2_inter_Delta2_inter_E1_empty validV1 
              have "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES1⇙)"
                by (simp only: Int_Un_distrib2, auto)
              moreover
              from validV1
              have "Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙ ∩ Eβ‡˜ES1⇙ = Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                by (simp add: isViewOn_def V_valid_def VC_disjoint_def 
                  VN_disjoint_def NC_disjoint_def, auto)
              ultimately have "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
                by simp
              hence "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄2'' β†Ώ (Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙) β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
                by (simp add: projection_def)
              with four have "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙ β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙)"
                by simp
              hence "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ (Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙) β†Ώ Eβ‡˜ES2⇙"
                by (simp only: projection_commute)
              with Ξ΄1''_in_N1_inter_Delta1star show ?thesis
                by (simp only: list_subset_iff_projection_neutral)
            qed
          ultimately show ?thesis
              by blast
        next
          assume v'_notin_E2: "v' βˆ‰ Eβ‡˜ES2⇙"

           have "⟦ (Ξ² @ [v']) β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙ ; 
            Ξ±2' β†Ώ Cβ‡˜π’±2⇙ = []; set ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ; 
             c ∈ Cβ‡˜π’±β‡™ ∩ Ξ₯β‡˜Ξ“β‡™ ; set Ξ΄1'' βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙;
            Adm 𝒱 ρ (Trβ‡˜(ES1 βˆ₯ ES2)⇙) Ξ² c ⟧ 
            ⟹ βˆƒ Ξ±2'' Ξ΄2''.
             (set Ξ±2'' βŠ† Eβ‡˜ES2⇙ ∧ set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙            
             ∧ Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙            
             ∧ Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙ ∧ Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []
            ∧ Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙)"
            proof (induct "length ((c # Ξ΄1'') β†Ώ Eβ‡˜ES2⇙)" arbitrary: Ξ² Ξ±2' c Ξ΄1'')
               case 0

              from 0(2) validES2 have "set Ξ±2' βŠ† Eβ‡˜ES2⇙"
                by (simp add: ES_valid_def traces_contain_events_def, auto)
              moreover
              have "set [] βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                by auto
              moreover
              have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ [] @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2' ∈ Trβ‡˜ES2⇙"
                proof -
                  note 0(2)
                  moreover
                  from 0(1) have "c βˆ‰ Eβ‡˜ES2⇙"
                    by (simp add: projection_def, auto)
                  ultimately show ?thesis
                    by (simp add: projection_concatenation_commute projection_def)
                qed
              moreover
              have "Ξ±2' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙" ..
              moreover
              note 0(3)
              moreover 
              from 0(1) have "[] β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                by (simp add: projection_def, split if_split_asm, auto)
              ultimately show ?case
                by blast
            next
              case (Suc n)

              from projection_split_last[OF Suc(2)] obtain ΞΌ c' Ξ½
                where c'_in_E2: "c' ∈ Eβ‡˜ES2⇙"
                and cΞ΄1''_is_ΞΌc'Ξ½: "c # Ξ΄1'' = ΞΌ @ [c'] @ Ξ½"
                and Ξ½E2_empty: "Ξ½ β†Ώ Eβ‡˜ES2⇙ = []"
                and n_is_length_ΞΌΞ½E2: "n = length ((ΞΌ @ Ξ½) β†Ώ Eβ‡˜ES2⇙)"
                by blast

              from Suc(5) c'_in_E2 cΞ΄1''_is_ΞΌc'Ξ½ have "set (ΞΌ β†Ώ Eβ‡˜ES2⇙ @ [c']) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                by (simp only: cΞ΄1''_is_ΞΌc'Ξ½ projection_concatenation_commute projection_def, auto)
              hence c'_in_Cv2_inter_Upsilon2: "c' ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                by auto
              hence c'_in_Cv2: "c' ∈ Cβ‡˜π’±2⇙" and c'_in_Upsilon2: "c' ∈ Ξ₯β‡˜Ξ“2⇙"
                by auto
              with validV2 have c'_in_E2: "c' ∈ Eβ‡˜ES2⇙"
                by (simp add:isViewOn_def V_valid_def 
                  VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)

              show ?case
                proof (cases ΞΌ)
                  case Nil (* we just apply BSIA in this case *)
                  with cΞ΄1''_is_ΞΌc'Ξ½ have c_is_c': "c = c'" and Ξ΄1''_is_Ξ½: "Ξ΄1'' = Ξ½"
                    by auto
                  with c'_in_Cv2_inter_Upsilon2 have "c ∈ Cβ‡˜π’±2⇙"
                    by simp
                  moreover
                  from v'_notin_E2 Suc(3) have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ Ξ±2' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_concatenation_commute projection_def)
                  moreover
                  note Suc(4)
                  moreover
                  have "Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ (Ξ² β†Ώ Eβ‡˜ES2⇙) c"
                     proof -
                      from Suc(8) obtain Ξ³
                        where γρv_is_βρv: "Ξ³ β†Ώ (ρ 𝒱) = Ξ² β†Ώ (ρ 𝒱)"
                        and Ξ³c_in_Tr: "(Ξ³ @ [c]) ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
                        unfolding Adm_def
                        by auto

                      from c_is_c' c'_in_E2 Ξ³c_in_Tr have "(Ξ³ β†Ώ Eβ‡˜ES2⇙) @ [c] ∈ Trβ‡˜ES2⇙"
                        by (simp add: projection_def composeES_def)
                      moreover
                      have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ2 𝒱2)"
                      proof -
                        from γρv_is_βρv have "Ξ³ β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱) = Ξ² β†Ώ Eβ‡˜ES2⇙ β†Ώ (ρ 𝒱)"
                          by (metis projection_commute)
                        with ρ2v2_subset_ρv_inter_E2 
                        have "Ξ³ β†Ώ (ρ2 𝒱2) = Ξ² β†Ώ (ρ2 𝒱2)"
                          by (metis Int_subset_iff γρv_is_βρv projection_subset_elim)
                        thus ?thesis
                          by (metis projection_commute)
                      qed
                      ultimately show ?thesis unfolding Adm_def
                        by auto
                    qed  
                  moreover
                  note BSIA2
                  ultimately obtain Ξ±2''
                    where one: "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [c] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    and two: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    and three: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
                    unfolding BSIA_def
                    by blast

                  let ?DELTA2'' = "Ξ½ β†Ώ Eβ‡˜ES2⇙"

                  from one validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  from Ξ½E2_empty
                  have "set ?DELTA2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    by simp
                  moreover
                  from c_is_c' c'_in_E2 one v'_notin_E2 Ξ½E2_empty
                  have "(Ξ² β†Ώ Eβ‡˜ES2⇙) @ [c] β†Ώ Eβ‡˜ES2⇙ @ ?DELTA2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  note two three
                  moreover
                  from Ξ½E2_empty Ξ΄1''_is_Ξ½ have "?DELTA2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  ultimately show ?thesis
                    by blast
                next
                  case (Cons x xs) (* apply inductive hypothesis, then BSIA *)
                   with cΞ΄1''_is_ΞΌc'Ξ½ have ΞΌ_is_c_xs: "ΞΌ = [c] @ xs" 
                     and Ξ΄1''_is_xs_c'_Ξ½: "Ξ΄1'' = xs @ [c'] @ Ξ½"
                    by auto
                  with n_is_length_ΞΌΞ½E2 have "n = length ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES2⇙)"
                    by auto
                  moreover
                  note Suc(3,4)
                  moreover
                  have "set ((c # (xs @ Ξ½)) β†Ώ Eβ‡˜ES2⇙) βŠ† Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙"
                    proof -
                      have res: "c # (xs @ Ξ½) = [c] @ (xs @ Ξ½)" 
                        by auto

                      from Suc(5) cΞ΄1''_is_ΞΌc'Ξ½ ΞΌ_is_c_xs Ξ½E2_empty
                      show ?thesis
                        by (subst res, simp only: cΞ΄1''_is_ΞΌc'Ξ½ 
                          projection_concatenation_commute set_append, auto)
                    qed
                  moreover
                  note Suc(6) 
                  moreover
                  from Suc(7) Ξ΄1''_is_xs_c'_Ξ½ have "set (xs @ Ξ½) βŠ† Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    by auto
                  moreover note Suc(8) Suc(1)[of c "xs @ Ξ½" Ξ² Ξ±2']
                  ultimately obtain Ξ΄ Ξ³
                    where one: "set Ξ΄ βŠ† Eβ‡˜ES2⇙"
                    and two: "set Ξ³ βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    and three: "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ³ @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄ ∈ Trβ‡˜ES2⇙"
                    and four: "Ξ΄ β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    and five: "Ξ΄ β†Ώ Cβ‡˜π’±2⇙ = []"
                    and six: "Ξ³ β†Ώ Eβ‡˜ES1⇙ = (xs @ Ξ½) β†Ώ Eβ‡˜ES2⇙"
                    by blast
                  
                   (* apply BSIA to insert c' after Ξ³ *)
                  let ?BETA = "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ³"

                  from c'_in_Cv2_inter_Upsilon2 have "c' ∈ Cβ‡˜π’±2⇙"
                    by auto
                  moreover
                  from three v'_notin_E2 have "?BETA @ Ξ΄ ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  note five 
                  moreover
                  have "Adm 𝒱2 ρ2 Trβ‡˜ES2⇙ ?BETA c'"
                    proof -
                      have "?BETA @ [c'] ∈ Trβ‡˜ES2⇙"
                        proof -
                          from Suc(7) c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½
                          have "c' ∈ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                            by auto
                          moreover
                          from validES2 three have "?BETA ∈ Trβ‡˜ES2⇙"
                            by (unfold ES_valid_def traces_prefixclosed_def
                              prefixclosed_def prefix_def, auto)
                          moreover
                          note total_ES2_C2_inter_Upsilon2_inter_N1_inter_Delta1
                          ultimately show ?thesis
                            unfolding total_def
                            by blast
                        qed
                      thus ?thesis
                        unfolding Adm_def
                        by blast                      
                    qed
                  moreover
                  note BSIA2
                  ultimately obtain Ξ±2''
                    where bsia_one: "?BETA @ [c'] @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    and bsia_two: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ΄ β†Ώ Vβ‡˜π’±2⇙"
                    and bsia_three:  "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
                    unfolding BSIA_def
                    by blast
  
                  let ?DELTA2'' = "Ξ³ @ [c']"

                  from bsia_one validES2 have "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
                    by (simp add: ES_valid_def traces_contain_events_def, auto)
                  moreover
                  have "set ?DELTA2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                    proof -
                      from Suc(7) c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½ 
                      have "c' ∈  Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
                        by auto
                      with two show ?thesis
                        by auto
                    qed
                  moreover
                  from bsia_one v'_notin_E2 
                  have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ ?DELTA2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
                    by (simp add: projection_def)
                  moreover
                  from bsia_two four have "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
                    by simp
                  moreover
                  note bsia_three
                  moreover             
                  have "?DELTA2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
                    proof -
                      from validV1 Suc(7) Ξ΄1''_is_xs_c'_Ξ½ have "c' ∈ Eβ‡˜ES1⇙"
                        by (simp add: isViewOn_def V_valid_def 
                          VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
                      with c'_in_E2 c'_in_Cv2_inter_Upsilon2 Ξ΄1''_is_xs_c'_Ξ½ Ξ½E2_empty six 
                      show ?thesis
                        by (simp only: projection_concatenation_commute projection_def, auto)
                    qed
                  ultimately show ?thesis 
                    by blast     
                qed
            qed
          from this[OF Ξ²v'E2Ξ±2'_in_Tr2 Ξ±2'Cv2_empty cΞ΄1''E2_in_Cv2_inter_Upsilon2star 
            c_in_Cv_inter_Upsilon Ξ΄1''_in_N1_inter_Delta1star Adm]
          show ?thesis 
            by blast
        qed
      then obtain Ξ±2'' Ξ΄2''
        where Ξ±2''_in_E2star: "set Ξ±2'' βŠ† Eβ‡˜ES2⇙"
        and Ξ΄2''_in_N2_inter_Delta2star:"set Ξ΄2'' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Cβ‡˜π’±2⇙ ∩ Ξ₯β‡˜Ξ“2⇙ ∩ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
        and Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2: 
        "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄2'' @ [v'] β†Ώ Eβ‡˜ES2⇙ @ Ξ±2'' ∈ Trβ‡˜ES2⇙"
        and Ξ±2''Vv2_is_Ξ±2'Vv2: "Ξ±2'' β†Ώ Vβ‡˜π’±2⇙ = Ξ±2' β†Ώ Vβ‡˜π’±2⇙"
        and Ξ±2''Cv2_empty: "Ξ±2'' β†Ώ Cβ‡˜π’±2⇙ = []"
        and Ξ΄2''E1_is_Ξ΄1''E2: "Ξ΄2'' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1'' β†Ώ Eβ‡˜ES2⇙"
        by blast

      from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 
        validES2 validES1
      have Ξ΄2''_in_E2star: "set Ξ΄2'' βŠ† Eβ‡˜ES2⇙" and Ξ΄1''_in_E1star: "set Ξ΄1'' βŠ† Eβ‡˜ES1⇙"
        by (simp_all add: ES_valid_def traces_contain_events_def, auto)
      with Ξ΄2''E1_is_Ξ΄1''E2 merge_property[of Ξ΄2'' "Eβ‡˜ES2⇙" Ξ΄1'' "Eβ‡˜ES1⇙"] obtain Ξ΄'
        where Ξ΄'E2_is_Ξ΄2'': "Ξ΄' β†Ώ Eβ‡˜ES2⇙ = Ξ΄2''"
        and Ξ΄'E1_is_Ξ΄1'': "Ξ΄' β†Ώ Eβ‡˜ES1⇙ = Ξ΄1''"
        and Ξ΄'_contains_only_Ξ΄2''_Ξ΄1''_events: "set Ξ΄' βŠ† set Ξ΄2'' βˆͺ set Ξ΄1''"
        unfolding Let_def
        by auto

      let ?TAU = "Ξ² @ [c] @ Ξ΄' @ [v']"
      let ?LAMBDA = "Ξ± β†Ώ Vβ‡˜π’±β‡™"
      let ?T2 = Ξ±2''
      let ?T1 = Ξ±1''

     (* apply the generalized zipping lemma *)
     have "?TAU ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
        proof -
          from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ΄'E2_is_Ξ΄2'' validES2
          have "Ξ² β†Ώ Eβ‡˜ES2⇙ @ [c] β†Ώ Eβ‡˜ES2⇙ @ Ξ΄' β†Ώ Eβ‡˜ES2⇙ @ [v'] β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
            by (simp add: ES_valid_def traces_prefixclosed_def
              prefixclosed_def prefix_def)
          hence "(Ξ² @ [c] @ Ξ΄' @ [v']) β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
            by (simp add: projection_def, auto)
          moreover          
          from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ΄'E1_is_Ξ΄1'' validES1 
          have "Ξ² β†Ώ Eβ‡˜ES1⇙ @ [c] β†Ώ Eβ‡˜ES1⇙ @ Ξ΄' β†Ώ Eβ‡˜ES1⇙ @ [v'] β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
            by (simp add: ES_valid_def traces_prefixclosed_def
              prefixclosed_def prefix_def)
          hence "(Ξ² @ [c] @ Ξ΄' @ [v']) β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
            by (simp add: projection_def, auto)
          moreover
          from Ξ²v'Ξ±_in_Tr c_in_Cv_inter_Upsilon VIsViewOnE
            Ξ΄'_contains_only_Ξ΄2''_Ξ΄1''_events Ξ΄2''_in_E2star Ξ΄1''_in_E1star
          have "set (Ξ² @ [c] @ Ξ΄' @ [v']) βŠ† Eβ‡˜ES2⇙ βˆͺ Eβ‡˜ES1⇙"
            unfolding composeES_def isViewOn_def V_valid_def 
              VC_disjoint_def VN_disjoint_def NC_disjoint_def
            by auto
          ultimately show ?thesis
            unfolding composeES_def
            by auto
        qed 
      hence "set ?TAU βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
        unfolding composeES_def
        by auto
      moreover
      have "set ?LAMBDA βŠ† Vβ‡˜π’±β‡™"
        by (simp add: projection_def, auto)
      moreover
      note Ξ±2''_in_E2star Ξ±1''_in_E1star
      moreover
      from Ξ²E2_cE2_Ξ΄2''_v'E2_Ξ±2''_in_Tr2 Ξ΄'E2_is_Ξ΄2'' 
      have "?TAU β†Ώ Eβ‡˜ES2⇙ @ ?T2 ∈ Trβ‡˜ES2⇙"
        by (simp only: projection_concatenation_commute, auto)
      moreover
      from Ξ²E1_cE1_Ξ΄1''_v'E1_Ξ±1''_in_Tr1 Ξ΄'E1_is_Ξ΄1'' 
      have "?TAU β†Ώ Eβ‡˜ES1⇙ @ ?T1 ∈ Trβ‡˜ES1⇙"
        by (simp only: projection_concatenation_commute, auto)
      moreover
      have "?LAMBDA β†Ώ Eβ‡˜ES2⇙ = ?T2 β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from propSepViews have "?LAMBDA β†Ώ Eβ‡˜ES2⇙ = Ξ± β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def by (simp only: projection_sequence)
          moreover
          from Ξ±2''_in_E2star propSepViews have "?T2 β†Ώ Vβ‡˜π’±β‡™ = ?T2 β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def
            by (metis Int_commute projection_intersection_neutral)
          moreover
          note Ξ±2'Vv2_is_Ξ±Vv2 Ξ±2''Vv2_is_Ξ±2'Vv2
          ultimately show ?thesis
            by simp
        qed
      moreover
      have "?LAMBDA β†Ώ Eβ‡˜ES1⇙ = ?T1 β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from propSepViews have "?LAMBDA β†Ώ Eβ‡˜ES1⇙ = Ξ± β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def by (simp only: projection_sequence)
          moreover
          from Ξ±1''_in_E1star propSepViews have "?T1 β†Ώ Vβ‡˜π’±β‡™ = ?T1 β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def
            by (metis Int_commute projection_intersection_neutral)
          moreover
          note Ξ±1'Vv1_is_Ξ±Vv1 Ξ±1''Vv1_is_Ξ±1'Vv1
          ultimately show ?thesis
            by simp
        qed
      moreover
      note Ξ±2''Cv2_empty Ξ±1''Cv1_empty generalized_zipping_lemma
      ultimately obtain t (* show that the conclusion of FCIA holds *)
        where "?TAU @ t ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
        and  "t β†Ώ Vβ‡˜π’±β‡™ = ?LAMBDA"
        and "t β†Ώ Cβ‡˜π’±β‡™ = []"
        by blast
      moreover
      have "set Ξ΄' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™"
        proof -
          from Ξ΄'_contains_only_Ξ΄2''_Ξ΄1''_events 
            Ξ΄2''_in_N2_inter_Delta2star Ξ΄1''_in_N1_inter_Delta1star
          have "set Ξ΄' βŠ† Nβ‡˜π’±2⇙ ∩ Ξ”β‡˜Ξ“2⇙ βˆͺ Nβ‡˜π’±1⇙ ∩ Ξ”β‡˜Ξ“1⇙"
            by auto
          with Delta1_N1_Delta2_N2_subset_Delta Nv1_union_Nv2_subsetof_Nv show ?thesis
            by auto
        qed
      ultimately have "βˆƒΞ±' Ξ³'. (set Ξ³' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™ ∧ Ξ² @ [c] @ Ξ³' @ [v'] @ Ξ±' ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙ 
        ∧ Ξ±' β†Ώ Vβ‡˜π’±β‡™ = Ξ± β†Ώ Vβ‡˜π’±β‡™ ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = [])"
        by (simp only: append_assoc, blast)
    }
    ultimately have "βˆƒΞ±' Ξ³'. (set Ξ³' βŠ† Nβ‡˜π’±β‡™ ∩ Ξ”β‡˜Ξ“β‡™ ∧ Ξ² @ [c] @ Ξ³' @ [v'] @ Ξ±' ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙ 
      ∧ Ξ±' β†Ώ Vβ‡˜π’±β‡™ = Ξ± β†Ώ Vβ‡˜π’±β‡™ ∧ Ξ±' β†Ώ Cβ‡˜π’±β‡™ = [])"
      by blast
  }
  thus ?thesis
    unfolding FCIA_def
    by blast
qed

(* Theorem 6.4.2 *)
theorem compositionality_R: 
"⟦ R 𝒱1 Trβ‡˜ES1⇙; R 𝒱2 Trβ‡˜ES2⇙ ⟧ ⟹ R 𝒱 (Trβ‡˜(ES1 βˆ₯ ES2)⇙)"
  proof -
    assume R1: "R 𝒱1 Trβ‡˜ES1⇙"
    and R2: "R 𝒱2 Trβ‡˜ES2⇙"

    {
      fix Ο„'
      assume Ο„'_in_Tr: "Ο„' ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙"
      hence Ο„'E1_in_Tr1: "Ο„' β†Ώ Eβ‡˜ES1⇙ ∈ Trβ‡˜ES1⇙"
        and Ο„'E2_in_Tr2: "Ο„' β†Ώ Eβ‡˜ES2⇙ ∈ Trβ‡˜ES2⇙"
        unfolding composeES_def
        by auto
      with R1 R2 obtain Ο„1' Ο„2'
        where Ο„1'_in_Tr1: "Ο„1' ∈ Trβ‡˜ES1⇙"
        and Ο„1'Cv1_empty: "Ο„1' β†Ώ Cβ‡˜π’±1⇙ = []"
        and Ο„1'Vv1_is_Ο„'_E1_Vv1: "Ο„1' β†Ώ Vβ‡˜π’±1⇙ = Ο„' β†Ώ Eβ‡˜ES1⇙ β†Ώ Vβ‡˜π’±1⇙"
        and Ο„2'_in_Tr2: "Ο„2' ∈ Trβ‡˜ES2⇙"
        and Ο„2'Cv2_empty: "Ο„2' β†Ώ Cβ‡˜π’±2⇙ = []"
        and Ο„2'Vv2_is_Ο„'_E2_Vv2: "Ο„2' β†Ώ Vβ‡˜π’±2⇙ = Ο„' β†Ώ Eβ‡˜ES2⇙ β†Ώ Vβ‡˜π’±2⇙"
        unfolding R_def
        by blast

      have "set [] βŠ† Eβ‡˜(ES1 βˆ₯ ES2)⇙"
        by auto
      moreover
      have "set (Ο„' β†Ώ Vβ‡˜π’±β‡™) βŠ† Vβ‡˜π’±β‡™"
        by (simp add: projection_def, auto)
      moreover
      from validES1 Ο„1'_in_Tr1 have Ο„1'_in_E1: "set Ο„1' βŠ† Eβ‡˜ES1⇙"
        by (simp add: ES_valid_def traces_contain_events_def, auto)
      moreover
      from validES2 Ο„2'_in_Tr2 have Ο„2'_in_E2: "set Ο„2' βŠ† Eβ‡˜ES2⇙"
        by (simp add: ES_valid_def traces_contain_events_def, auto)
      moreover
      from Ο„1'_in_Tr1 have "[] β†Ώ Eβ‡˜ES1⇙ @ Ο„1' ∈ Trβ‡˜ES1⇙"
        by (simp add: projection_def)
      moreover
      from Ο„2'_in_Tr2 have "[] β†Ώ Eβ‡˜ES2⇙ @ Ο„2' ∈ Trβ‡˜ES2⇙"
        by (simp add: projection_def)
      moreover
      have "Ο„' β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES1⇙ = Ο„1' β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from projection_intersection_neutral[OF Ο„1'_in_E1, of "Vβ‡˜π’±β‡™"] propSepViews 
          have "Ο„1' β†Ώ Vβ‡˜π’±β‡™ = Ο„1' β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def
            by (simp add: Int_commute)
          moreover
          from  propSepViews have "Ο„' β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES1⇙ = Ο„' β†Ώ Vβ‡˜π’±1⇙"
            unfolding properSeparationOfViews_def
            by (simp add: projection_sequence)
          moreover {
            have " Ο„' β†Ώ Eβ‡˜ES1⇙ β†Ώ Vβ‡˜π’±1⇙ = Ο„' β†Ώ (Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±1⇙)"
              by (simp add: projection_def)
            moreover
            from validV1 have "Eβ‡˜ES1⇙ ∩ Vβ‡˜π’±1⇙ = Vβ‡˜π’±1⇙"
              by (simp add: isViewOn_def V_valid_def 
                VC_disjoint_def VN_disjoint_def NC_disjoint_def, auto)
            ultimately have "Ο„' β†Ώ Eβ‡˜ES1⇙ β†Ώ Vβ‡˜π’±1⇙ = Ο„' β†Ώ Vβ‡˜π’±1⇙"
              by simp
            }
          moreover
          note Ο„1'Vv1_is_Ο„'_E1_Vv1
          ultimately show ?thesis
            by simp
        qed
      moreover
      have "Ο„' β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES2⇙ = Ο„2' β†Ώ Vβ‡˜π’±β‡™"
        proof -
          from projection_intersection_neutral[OF Ο„2'_in_E2, of "Vβ‡˜π’±β‡™"] propSepViews
          have "Ο„2' β†Ώ Vβ‡˜π’±β‡™ = Ο„2' β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def
            by (simp add: Int_commute)
          moreover
          from  propSepViews have "Ο„' β†Ώ Vβ‡˜π’±β‡™ β†Ώ Eβ‡˜ES2⇙ = Ο„' β†Ώ Vβ‡˜π’±2⇙"
            unfolding properSeparationOfViews_def
            by (simp add: projection_sequence)
          moreover {
            have " Ο„' β†Ώ Eβ‡˜ES2⇙ β†Ώ Vβ‡˜π’±2⇙ = Ο„' β†Ώ (Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±2⇙)"
              by (simp add: projection_def)
            moreover
            from validV2 have "Eβ‡˜ES2⇙ ∩ Vβ‡˜π’±2⇙ = Vβ‡˜π’±2⇙"
              by (simp add:isViewOn_def V_valid_def VC_disjoint_def 
                VN_disjoint_def NC_disjoint_def, auto)
            ultimately have "Ο„' β†Ώ Eβ‡˜ES2⇙ β†Ώ Vβ‡˜π’±2⇙ = Ο„' β†Ώ Vβ‡˜π’±2⇙"
              by simp
            }
          moreover
          note Ο„2'Vv2_is_Ο„'_E2_Vv2
          ultimately show ?thesis
            by simp
        qed
      moreover
      note Ο„1'Cv1_empty Ο„2'Cv2_empty generalized_zipping_lemma
      ultimately have "βˆƒt. [] @ t ∈ Trβ‡˜(ES1 βˆ₯ ES2)⇙ ∧ t β†Ώ Vβ‡˜π’±β‡™ = Ο„' β†Ώ Vβ‡˜π’±β‡™ ∧ t β†Ώ Cβ‡˜π’±β‡™ = []"
        by blast
    }
    thus ?thesis
      unfolding R_def
      by auto
  qed

end

locale CompositionalityStrictBSPs = Compositionality +
(*adds the additional assumptions of theorem 6.4.3 in Heiko Mantel's phd thesis*)
assumes N𝒱_inter_E1_is_N𝒱1: "Nβ‡˜π’±β‡™ ∩ Eβ‡˜ES1⇙ = Nβ‡˜π’±1⇙"
    and N𝒱_inter_E2_is_N𝒱2: "Nβ‡˜π’±β‡™ ∩ Eβ‡˜ES2⇙ = Nβ‡˜π’±2⇙"

(* sublocale relationship to other compositionality assumptions*)
sublocale CompositionalityStrictBSPs βŠ† Compositionality
by (unfold_locales)

context CompositionalityStrictBSPs
begin
(*Theorem 6.4.3 Case 1 in Heiko Mantel's pdh thesis*)
theorem compositionality_SR: 
"⟦ SR 𝒱1 Trβ‡˜ES1⇙; SR 𝒱2 Trβ‡˜ES2⇙ ⟧ ⟹ SR 𝒱 (Trβ‡˜(ES1 βˆ₯ ES2)⇙)" 
proof -
  assume "SR 𝒱1 Trβ‡˜ES1⇙"
     and "SR 𝒱2 Trβ‡˜ES2⇙"
  { 
    let ?𝒱1'="⦇V = Vβ‡˜π’±1⇙ βˆͺ Nβ‡˜π’±1⇙, N = {}, C = Cβ‡˜π’±1β‡™β¦ˆ"
    let ?𝒱2'="⦇V = Vβ‡˜π’±2⇙ βˆͺ Nβ‡˜π’±2⇙, N = {}, C = Cβ‡˜π’±2⇙ ⦈"
    let ?𝒱' ="⦇V=Vβ‡˜π’±β‡™ βˆͺ Nβ‡˜π’±β‡™, N={}, C=Cβ‡˜π’±β‡™ ⦈" 
    (*Show ?𝒱1' ?𝒱2' ?𝒱' are views on the respective set of events*)
    from validV1 have 𝒱1'IsViewOnE1: "isViewOn ?𝒱1' Eβ‡˜ES1⇙ " 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    from validV2 have 𝒱2'IsViewOnE2: "isViewOn ?𝒱2' Eβ‡˜ES2⇙ " 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    from VIsViewOnE have 𝒱'IsViewOnE: "isViewOn  ?𝒱' Eβ‡˜(ES1βˆ₯ES2)⇙" 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    
    (*Show ?𝒱1' and ?𝒱2' are proper separation of ⦇ V=𝒱, N={}, C=𝒱 ⦈ *)
     from propSepViews  N𝒱_inter_E1_is_N𝒱1
     have "Vβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ = Vβ‡˜?𝒱1'⇙"
       unfolding properSeparationOfViews_def by auto
     from propSepViews   N𝒱_inter_E2_is_N𝒱2
     have "Vβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ = Vβ‡˜?𝒱2'⇙"
       unfolding properSeparationOfViews_def by auto
     from propSepViews 
     have  "Cβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜?𝒱1'⇙"
       unfolding properSeparationOfViews_def by auto      
     from propSepViews
     have  "Cβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜?𝒱2'⇙"
       unfolding properSeparationOfViews_def by auto
     have "Nβ‡˜?𝒱1'⇙ ∩ Nβ‡˜?𝒱2'⇙ ={}"
       by auto
     
     note properSeparation_𝒱1𝒱2=β€ΉVβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ = Vβ‡˜?𝒱1'⇙› β€ΉVβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ = Vβ‡˜?𝒱2'⇙› 
              β€ΉCβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜?𝒱1'⇙› β€ΉCβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜?𝒱2'⇙› β€ΉNβ‡˜?𝒱1'⇙ ∩ Nβ‡˜?𝒱2'⇙ ={}β€Ί
    
    (*Show ES1βˆ₯ES2 is a well behaved composition w.r.t.  ?𝒱1' and ?𝒱2' *)
     have wbc1: "Nβ‡˜?𝒱1'⇙ ∩ Eβ‡˜ES1⇙={} ∧ Nβ‡˜?𝒱2'⇙ ∩ Eβ‡˜ES2⇙={}"
       by auto
     
     
    from β€ΉSR 𝒱1 Trβ‡˜ES1⇙›  have "R ?𝒱1' Trβ‡˜ES1⇙"      
      using validES1 validV1 BSPTaxonomyDifferentCorrections.SR_implies_R_for_modified_view  
      unfolding  BSPTaxonomyDifferentCorrections_def by auto
    from β€ΉSR 𝒱2 Trβ‡˜ES2⇙›  have "R ?𝒱2' Trβ‡˜ES2⇙"     
      using validES2 validV2  BSPTaxonomyDifferentCorrections.SR_implies_R_for_modified_view 
      unfolding BSPTaxonomyDifferentCorrections_def by auto   
 
    from validES1 validES2 composableES1ES2  𝒱'IsViewOnE 𝒱1'IsViewOnE1 𝒱2'IsViewOnE2
         properSeparation_𝒱1𝒱2  wbc1
    have "Compositionality ES1 ES2 ?𝒱' ?𝒱1' ?𝒱2'" unfolding Compositionality_def 
      by (simp add: properSeparationOfViews_def wellBehavedComposition_def)
    with β€ΉR ?𝒱1' Trβ‡˜ES1⇙› β€ΉR ?𝒱2' Trβ‡˜ES2⇙› have "R ?𝒱' Trβ‡˜(ES1βˆ₯ES2)⇙" 
     using Compositionality.compositionality_R by blast
     
   from  validES1 validES2 composeES_yields_ES validVC
   have "BSPTaxonomyDifferentCorrections (ES1βˆ₯ES2) 𝒱"
      unfolding BSPTaxonomyDifferentCorrections_def by auto 
    with β€ΉR ?𝒱' Trβ‡˜(ES1βˆ₯ES2)⇙› have "SR 𝒱 Trβ‡˜(ES1βˆ₯ES2)⇙" 
      using BSPTaxonomyDifferentCorrections.R_implies_SR_for_modified_view  by auto 
  }
  thus ?thesis by auto  
qed

(*Theorem 6.4.3 Case 2 in Heiko Mantel's pdh thesis*)
theorem compositionality_SD: 
"⟦ SD 𝒱1 Trβ‡˜ES1⇙; SD 𝒱2 Trβ‡˜ES2⇙ ⟧ ⟹ SD 𝒱 (Trβ‡˜(ES1 βˆ₯ ES2)⇙)" 
proof -
  assume "SD 𝒱1 Trβ‡˜ES1⇙"
     and "SD 𝒱2 Trβ‡˜ES2⇙"
  { 
    let ?𝒱1'="⦇V = Vβ‡˜π’±1⇙ βˆͺ Nβ‡˜π’±1⇙, N = {}, C = Cβ‡˜π’±1β‡™β¦ˆ"
    let ?𝒱2'="⦇V = Vβ‡˜π’±2⇙ βˆͺ Nβ‡˜π’±2⇙, N = {}, C = Cβ‡˜π’±2⇙ ⦈"
    let ?𝒱' ="⦇V=Vβ‡˜π’±β‡™ βˆͺ Nβ‡˜π’±β‡™, N={}, C=Cβ‡˜π’±β‡™ ⦈" 
    (*Show ?𝒱1' ?𝒱2' ?𝒱' are views on the respective set of events*)
    from validV1 have 𝒱1'IsViewOnE1: "isViewOn ?𝒱1' Eβ‡˜ES1⇙ " 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    from validV2 have 𝒱2'IsViewOnE2: "isViewOn ?𝒱2' Eβ‡˜ES2⇙ " 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    from VIsViewOnE have 𝒱'IsViewOnE: "isViewOn  ?𝒱' Eβ‡˜(ES1βˆ₯ES2)⇙" 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    
    (*Show ?𝒱1' and ?𝒱2' are proper separation of ⦇ V=𝒱, N={}, C=𝒱 ⦈ *)
     from propSepViews  N𝒱_inter_E1_is_N𝒱1
     have "Vβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ = Vβ‡˜?𝒱1'⇙" 
       unfolding properSeparationOfViews_def by auto
     from propSepViews   N𝒱_inter_E2_is_N𝒱2
     have "Vβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ = Vβ‡˜?𝒱2'⇙"
       unfolding properSeparationOfViews_def by auto
     from propSepViews 
     have  "Cβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜?𝒱1'⇙"
       unfolding properSeparationOfViews_def by auto      
     from propSepViews
     have  "Cβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜?𝒱2'⇙"
       unfolding properSeparationOfViews_def by auto
     have "Nβ‡˜?𝒱1'⇙ ∩ Nβ‡˜?𝒱2'⇙ ={}"
       by auto
     
     note properSeparation_𝒱1𝒱2=β€ΉVβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ = Vβ‡˜?𝒱1'⇙› β€ΉVβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ = Vβ‡˜?𝒱2'⇙› 
              β€ΉCβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜?𝒱1'⇙› β€ΉCβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜?𝒱2'⇙› β€ΉNβ‡˜?𝒱1'⇙ ∩ Nβ‡˜?𝒱2'⇙ ={}β€Ί
    
    (*Show ES1βˆ₯ES2 is a well behaved composition w.r.t.  ?𝒱1' and ?𝒱2' *)
     have wbc1: "Nβ‡˜?𝒱1'⇙ ∩ Eβ‡˜ES1⇙={} ∧ Nβ‡˜?𝒱2'⇙ ∩ Eβ‡˜ES2⇙={}"
       by auto
     
     
    from β€ΉSD 𝒱1 Trβ‡˜ES1⇙›  have "BSD ?𝒱1' Trβ‡˜ES1⇙"      
      using validES1 validV1 BSPTaxonomyDifferentCorrections.SD_implies_BSD_for_modified_view
      unfolding  BSPTaxonomyDifferentCorrections_def by auto
    from β€ΉSD 𝒱2 Trβ‡˜ES2⇙›  have "BSD ?𝒱2' Trβ‡˜ES2⇙"     
      using validES2 validV2 BSPTaxonomyDifferentCorrections.SD_implies_BSD_for_modified_view
      unfolding BSPTaxonomyDifferentCorrections_def by auto   
 
    from validES1 validES2 composableES1ES2   𝒱'IsViewOnE 𝒱1'IsViewOnE1 𝒱2'IsViewOnE2
         properSeparation_𝒱1𝒱2  wbc1
    have "Compositionality ES1 ES2 ?𝒱' ?𝒱1' ?𝒱2'"
      unfolding Compositionality_def
      by (simp add: properSeparationOfViews_def wellBehavedComposition_def)
    with β€ΉBSD ?𝒱1' Trβ‡˜ES1⇙› β€ΉBSD ?𝒱2' Trβ‡˜ES2⇙› have "BSD ?𝒱' Trβ‡˜(ES1βˆ₯ES2)⇙" 
     using Compositionality.compositionality_BSD by blast
     
   from  validES1 validES2 composeES_yields_ES validVC
   have "BSPTaxonomyDifferentCorrections (ES1βˆ₯ES2) 𝒱"
      unfolding BSPTaxonomyDifferentCorrections_def by auto 
    with β€ΉBSD ?𝒱' Trβ‡˜(ES1βˆ₯ES2)⇙› have "SD 𝒱 Trβ‡˜(ES1βˆ₯ES2)⇙" 
      using BSPTaxonomyDifferentCorrections.BSD_implies_SD_for_modified_view  by auto 
  }
  thus ?thesis by auto  
qed

(*Theorem 6.4.3 Case 3 in Heiko Mantel's pdh thesis*)
theorem compositionality_SI: 
"⟦SD 𝒱1 Trβ‡˜ES1⇙; SD 𝒱2 Trβ‡˜ES2⇙; SI 𝒱1 Trβ‡˜ES1⇙; SI 𝒱2 Trβ‡˜ES2⇙ ⟧ 
   ⟹ SI 𝒱 (Trβ‡˜(ES1 βˆ₯ ES2)⇙)" 
proof -
  assume "SD 𝒱1 Trβ‡˜ES1⇙"
     and "SD 𝒱2 Trβ‡˜ES2⇙"
     and "SI 𝒱1 Trβ‡˜ES1⇙"
     and "SI 𝒱2 Trβ‡˜ES2⇙"
  { 
    let ?𝒱1'="⦇V = Vβ‡˜π’±1⇙ βˆͺ Nβ‡˜π’±1⇙, N = {}, C = Cβ‡˜π’±1β‡™β¦ˆ"
    let ?𝒱2'="⦇V = Vβ‡˜π’±2⇙ βˆͺ Nβ‡˜π’±2⇙, N = {}, C = Cβ‡˜π’±2⇙ ⦈"
    let ?𝒱' ="⦇V=Vβ‡˜π’±β‡™ βˆͺ Nβ‡˜π’±β‡™, N={}, C=Cβ‡˜π’±β‡™ ⦈" 
    (*Show ?𝒱1' ?𝒱2' ?𝒱' are views on the respective set of events*)
    from validV1 have 𝒱1'IsViewOnE1: "isViewOn ?𝒱1' Eβ‡˜ES1⇙ " 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    from validV2 have 𝒱2'IsViewOnE2: "isViewOn ?𝒱2' Eβ‡˜ES2⇙ " 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    from VIsViewOnE have 𝒱'IsViewOnE: "isViewOn  ?𝒱' Eβ‡˜(ES1βˆ₯ES2)⇙" 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    
    (*Show ?𝒱1' and ?𝒱2' are proper separation of ⦇ V=𝒱, N={}, C=𝒱 ⦈ *)
     from propSepViews  N𝒱_inter_E1_is_N𝒱1
     have "Vβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ = Vβ‡˜?𝒱1'⇙" 
       unfolding properSeparationOfViews_def by auto
     from propSepViews   N𝒱_inter_E2_is_N𝒱2
     have "Vβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ = Vβ‡˜?𝒱2'⇙" 
       unfolding properSeparationOfViews_def by auto
     from propSepViews 
     have  "Cβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜?𝒱1'⇙" 
       unfolding properSeparationOfViews_def by auto      
     from propSepViews
     have  "Cβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜?𝒱2'⇙" 
       unfolding properSeparationOfViews_def by auto
     have "Nβ‡˜?𝒱1'⇙ ∩ Nβ‡˜?𝒱2'⇙ ={}"
       by auto
     
     note properSeparation_𝒱1𝒱2=β€ΉVβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ = Vβ‡˜?𝒱1'⇙› β€ΉVβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ = Vβ‡˜?𝒱2'⇙› 
              β€ΉCβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜?𝒱1'⇙› β€ΉCβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜?𝒱2'⇙› β€ΉNβ‡˜?𝒱1'⇙ ∩ Nβ‡˜?𝒱2'⇙ ={}β€Ί
    
    (*Show ES1βˆ₯ES2 is a well behaved composition w.r.t.  ?𝒱1' and ?𝒱2' *)
     have wbc1: "Nβ‡˜?𝒱1'⇙ ∩ Eβ‡˜ES1⇙={} ∧ Nβ‡˜?𝒱2'⇙ ∩ Eβ‡˜ES2⇙={}"
       by auto
     
    from β€ΉSD 𝒱1 Trβ‡˜ES1⇙›  have "BSD ?𝒱1' Trβ‡˜ES1⇙"      
      using validES1 validV1 BSPTaxonomyDifferentCorrections.SD_implies_BSD_for_modified_view 
      unfolding  BSPTaxonomyDifferentCorrections_def by auto
    from β€ΉSD 𝒱2 Trβ‡˜ES2⇙›  have "BSD ?𝒱2' Trβ‡˜ES2⇙"     
      using validES2 validV2 BSPTaxonomyDifferentCorrections.SD_implies_BSD_for_modified_view 
      unfolding BSPTaxonomyDifferentCorrections_def by auto  
    from β€ΉSI 𝒱1 Trβ‡˜ES1⇙›  have "BSI ?𝒱1' Trβ‡˜ES1⇙"      
      using validES1 validV1 BSPTaxonomyDifferentCorrections.SI_implies_BSI_for_modified_view 
      unfolding  BSPTaxonomyDifferentCorrections_def by auto
    from β€ΉSI 𝒱2 Trβ‡˜ES2⇙›  have "BSI ?𝒱2' Trβ‡˜ES2⇙"     
      using validES2 validV2 BSPTaxonomyDifferentCorrections.SI_implies_BSI_for_modified_view 
      unfolding BSPTaxonomyDifferentCorrections_def by auto   

    from validES1 validES2 composableES1ES2  𝒱'IsViewOnE 𝒱1'IsViewOnE1 𝒱2'IsViewOnE2
         properSeparation_𝒱1𝒱2  wbc1
    have "Compositionality ES1 ES2 ?𝒱' ?𝒱1' ?𝒱2'" unfolding Compositionality_def 
      by (simp add: properSeparationOfViews_def wellBehavedComposition_def)
    with β€ΉBSD ?𝒱1' Trβ‡˜ES1⇙› β€ΉBSD ?𝒱2' Trβ‡˜ES2⇙› β€ΉBSI  ?𝒱1' Trβ‡˜ES1⇙› β€ΉBSI ?𝒱2' Trβ‡˜ES2⇙›
    have "BSI ?𝒱' Trβ‡˜(ES1βˆ₯ES2)⇙" 
     using Compositionality.compositionality_BSI by blast
     
   from  validES1 validES2 composeES_yields_ES validVC
   have "BSPTaxonomyDifferentCorrections (ES1βˆ₯ES2) 𝒱"
      unfolding BSPTaxonomyDifferentCorrections_def by auto 
    with β€ΉBSI ?𝒱' Trβ‡˜(ES1βˆ₯ES2)⇙› have "SI 𝒱 Trβ‡˜(ES1βˆ₯ES2)⇙" 
      using BSPTaxonomyDifferentCorrections.BSI_implies_SI_for_modified_view  by auto 
  }
  thus ?thesis by auto  
qed


(*Theorem 6.4.3 Case 4 in Heiko Mantel's pdh thesis*)
theorem compositionality_SIA: 
"⟦SD 𝒱1 Trβ‡˜ES1⇙; SD 𝒱2 Trβ‡˜ES2⇙; SIA ρ1 𝒱1 Trβ‡˜ES1⇙; SIA ρ2 𝒱2 Trβ‡˜ES2⇙; 
  (ρ1 𝒱1) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES1⇙; (ρ2 𝒱2) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES2⇙ ⟧
   ⟹ SIA ρ 𝒱 (Trβ‡˜(ES1 βˆ₯ ES2)⇙)"
proof -
  assume "SD 𝒱1 Trβ‡˜ES1⇙"
     and "SD 𝒱2 Trβ‡˜ES2⇙"
     and "SIA ρ1 𝒱1 Trβ‡˜ES1⇙"
     and "SIA ρ2 𝒱2 Trβ‡˜ES2⇙"
     and "(ρ1 𝒱1) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES1⇙"
     and "(ρ2 𝒱2) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES2⇙"
  { 
    let ?𝒱1' ="⦇V = Vβ‡˜π’±1⇙ βˆͺ Nβ‡˜π’±1⇙, N = {}, C = Cβ‡˜π’±1β‡™β¦ˆ"
    let ?𝒱2'="⦇V = Vβ‡˜π’±2⇙ βˆͺ Nβ‡˜π’±2⇙, N = {}, C = Cβ‡˜π’±2⇙ ⦈"
    let ?𝒱' ="⦇V=Vβ‡˜π’±β‡™ βˆͺ Nβ‡˜π’±β‡™, N={}, C=Cβ‡˜π’±β‡™ ⦈" 
    
    (*Fix some intermediate rho's such that (ρ1' ?𝒱1') = (ρ1 𝒱1), (ρ2' ?𝒱2') = (ρ2 𝒱2)  and
      (ρ' ?𝒱') = (ρ 𝒱) hold.*)
    let "?ρ1'::'a Rho" ="λ𝒱. if 𝒱=?𝒱1' then ρ1 𝒱1  else {}"
    let "?ρ2'::'a Rho" ="λ𝒱. if 𝒱=?𝒱2' then ρ2 𝒱2  else {}"
    let "?ρ'::'a Rho" ="λ𝒱'. if 𝒱'=?𝒱' then ρ 𝒱  else {}"
    
    have "(?ρ1' ?𝒱1') = (ρ1 𝒱1)" by simp 
    have "(?ρ2' ?𝒱2') = (ρ2 𝒱2)" by simp
    have "(?ρ' ?𝒱') = (ρ 𝒱)" by simp

    (*Show ?𝒱1' ?𝒱2' ?𝒱' are views on the respective set of events*)
    from validV1 have 𝒱1'IsViewOnE1: "isViewOn ?𝒱1' Eβ‡˜ES1⇙ " 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    from validV2 have 𝒱2'IsViewOnE2: "isViewOn ?𝒱2' Eβ‡˜ES2⇙ " 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    from VIsViewOnE have 𝒱'IsViewOnE: "isViewOn  ?𝒱' Eβ‡˜(ES1βˆ₯ES2)⇙" 
      unfolding isViewOn_def V_valid_def  VN_disjoint_def NC_disjoint_def VC_disjoint_def by auto
    
    (*Show ?𝒱1' and ?𝒱2' are proper separation of ⦇ V=𝒱, N={}, C=𝒱 ⦈ *)
     from propSepViews  N𝒱_inter_E1_is_N𝒱1
     have "Vβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ = Vβ‡˜?𝒱1'⇙"
       unfolding properSeparationOfViews_def by auto
     from propSepViews   N𝒱_inter_E2_is_N𝒱2
     have "Vβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ = Vβ‡˜?𝒱2'⇙"
       unfolding properSeparationOfViews_def by auto
     from propSepViews 
     have  "Cβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜?𝒱1'⇙"
       unfolding properSeparationOfViews_def by auto      
     from propSepViews
     have  "Cβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜?𝒱2'⇙"
       unfolding properSeparationOfViews_def by auto
     have "Nβ‡˜?𝒱1'⇙ ∩ Nβ‡˜?𝒱2'⇙ ={}"
       by auto
     
     note properSeparation_𝒱1𝒱2=β€ΉVβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ = Vβ‡˜?𝒱1'⇙› β€ΉVβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ = Vβ‡˜?𝒱2'⇙› 
              β€ΉCβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES1⇙ βŠ† Cβ‡˜?𝒱1'⇙› β€ΉCβ‡˜?𝒱'⇙ ∩ Eβ‡˜ES2⇙ βŠ† Cβ‡˜?𝒱2'⇙› β€ΉNβ‡˜?𝒱1'⇙ ∩ Nβ‡˜?𝒱2'⇙ ={}β€Ί
    
    (*Show ES1βˆ₯ES2 is a well behaved composition w.r.t.  ?𝒱1' and ?𝒱2' *)
     have wbc1: "Nβ‡˜?𝒱1'⇙ ∩ Eβ‡˜ES1⇙={} ∧ Nβ‡˜?𝒱2'⇙ ∩ Eβ‡˜ES2⇙={}" 
       by auto
    
      
    from β€ΉSD 𝒱1 Trβ‡˜ES1⇙›  have "BSD ?𝒱1' Trβ‡˜ES1⇙"      
      using validES1 validV1 BSPTaxonomyDifferentCorrections.SD_implies_BSD_for_modified_view 
      unfolding  BSPTaxonomyDifferentCorrections_def by auto
    from β€ΉSD 𝒱2 Trβ‡˜ES2⇙›  have "BSD ?𝒱2' Trβ‡˜ES2⇙"     
      using validES2 validV2 BSPTaxonomyDifferentCorrections.SD_implies_BSD_for_modified_view 
      unfolding BSPTaxonomyDifferentCorrections_def by auto 

    from β€ΉSIA ρ1 𝒱1 Trβ‡˜ES1⇙› β€Ή(?ρ1' ?𝒱1') = (ρ1 𝒱1)β€Ί  have "BSIA ?ρ1' ?𝒱1' Trβ‡˜ES1⇙"      
      using validES1 validV1 BSPTaxonomyDifferentCorrections.SIA_implies_BSIA_for_modified_view 
      unfolding  BSPTaxonomyDifferentCorrections_def by fastforce
    from β€ΉSIA ρ2 𝒱2 Trβ‡˜ES2⇙› β€Ή(?ρ2' ?𝒱2') = (ρ2 𝒱2)β€Ί  have "BSIA ?ρ2' ?𝒱2' Trβ‡˜ES2⇙"     
      using validES2 validV2 BSPTaxonomyDifferentCorrections.SIA_implies_BSIA_for_modified_view 
      unfolding BSPTaxonomyDifferentCorrections_def by fastforce   

    from validES1 validES2 composableES1ES2  𝒱'IsViewOnE 𝒱1'IsViewOnE1 𝒱2'IsViewOnE2
         properSeparation_𝒱1𝒱2  wbc1
    have "Compositionality ES1 ES2 ?𝒱' ?𝒱1' ?𝒱2'" 
      unfolding Compositionality_def 
      by (simp add: properSeparationOfViews_def wellBehavedComposition_def)
    from β€Ή(ρ1 𝒱1) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES1⇙› β€Ή(?ρ1' ?𝒱1') = (ρ1 𝒱1)β€Ί β€Ή(?ρ' ?𝒱') = (ρ 𝒱)β€Ί
    have "?ρ1' ?𝒱1'  βŠ†  ?ρ'  ?𝒱' ∩ Eβ‡˜ES1⇙"
      by auto 
    from β€Ή(ρ2 𝒱2) βŠ† (ρ 𝒱) ∩ Eβ‡˜ES2⇙› β€Ή(?ρ2' ?𝒱2') = (ρ2 𝒱2)β€Ί β€Ή(?ρ' ?𝒱') = (ρ 𝒱)β€Ί
    have "?ρ2' ?𝒱2'  βŠ†  ?ρ'  ?𝒱' ∩ Eβ‡˜ES2⇙"
      by auto   

    from β€ΉCompositionality ES1 ES2 ?𝒱' ?𝒱1' ?𝒱2'β€Ί β€ΉBSD ?𝒱1' Trβ‡˜ES1⇙› β€ΉBSD ?𝒱2' Trβ‡˜ES2⇙› 
          β€ΉBSIA ?ρ1' ?𝒱1' Trβ‡˜ES1⇙› β€ΉBSIA ?ρ2' ?𝒱2' Trβ‡˜ES2⇙› 
          β€Ή?ρ1' ?𝒱1'  βŠ†  ?ρ'  ?𝒱' ∩ Eβ‡˜ES1⇙› β€Ή?ρ2' ?𝒱2'  βŠ†  ?ρ'  ?𝒱' ∩ Eβ‡˜ES2⇙›
    have "BSIA ?ρ' ?𝒱' Trβ‡˜(ES1βˆ₯ES2)⇙"
      using Compositionality.compositionality_BSIA by fastforce
      
    from  validES1 validES2 composeES_yields_ES validVC 
    have "BSPTaxonomyDifferentCorrections (ES1βˆ₯ES2) 𝒱" 
      unfolding BSPTaxonomyDifferentCorrections_def by auto 
    with β€ΉBSIA ?ρ' ?𝒱' Trβ‡˜(ES1βˆ₯ES2)⇙› β€Ή(?ρ' ?𝒱') = (ρ 𝒱)β€Ί have "SIA ρ 𝒱 Trβ‡˜(ES1βˆ₯ES2)⇙" 
      using BSPTaxonomyDifferentCorrections.BSIA_implies_SIA_for_modified_view  by fastforce
  }
  thus ?thesis
    by auto  
qed
end

end