Theorem: match_union_EpsilonNFA_toAbstract
Proof state before:
case right
α : Type
inst✝ : DecidableEq α
σ_0 σ_1 : Type
M_0 : EpsilonNFA α σ_0
M_1 : EpsilonNFA α σ_1
⊢ ((fun start_state stop_state =>
        ∃ stop_state_list,
          { start_state := start_state, stop_state_list := stop_state_list } ∈
              List.map
                  (fun arrow =>
                    { start_state := Sum.inl arrow.start_state,
                      stop_state_list := List.map Sum.inl arrow.stop_state_list })
                  M_0.epsilon_arrow_list ++
                List.map
                  (fun arrow =>
                    { start_state := Sum.inr arrow.start_state,
                      stop_state_list := List.map Sum.inr arrow.stop_state_list })
                  M_1.epsilon_arrow_list ∧
            stop_state ∈ stop_state_list) =
      fun p q =>
      match (p, q) with
      | (Sum.inl p', Sum.inl q') =>
        ∃ stop_state_list,
          { start_state := p', stop_state_list := stop_state_list } ∈ M_0.epsilon_arrow_list ∧ q' ∈ stop_state_list
      | (Sum.inr p', Sum.inr q') =>
        ∃ stop_state_list,
          { start_state := p', stop_state_list := stop_state_list } ∈ M_1.epsilon_arrow_list ∧ q' ∈ stop_state_list
      | x => False) ∧
    ((fun state => state ∈ List.map Sum.inl M_0.starting_state_list ++ List.map Sum.inr M_1.starting_state_list) =
        fun p =>
        match p with
        | Sum.inl p' => p' ∈ M_0.starting_state_list
        | Sum.inr p' => p' ∈ M_1.starting_state_list) ∧
      (fun state => state ∈ List.map Sum.inl M_0.accepting_state_list ++ List.map Sum.inr M_1.accepting_state_list) =
        fun p =>
        match p with
        | Sum.inl p' => p' ∈ M_0.accepting_state_list
        | Sum.inr p' => p' ∈ M_1.accepting_state_list
Tactic:
constructor
Proof state after:
case right.left
α : Type
inst✝ : DecidableEq α
σ_0 σ_1 : Type
M_0 : EpsilonNFA α σ_0
M_1 : EpsilonNFA α σ_1
⊢ (fun start_state stop_state =>
      ∃ stop_state_list,
        { start_state := start_state, stop_state_list := stop_state_list } ∈
            List.map
                (fun arrow =>
                  { start_state := Sum.inl arrow.start_state,
                    stop_state_list := List.map Sum.inl arrow.stop_state_list })
                M_0.epsilon_arrow_list ++
              List.map
                (fun arrow =>
                  { start_state := Sum.inr arrow.start_state,
                    stop_state_list := List.map Sum.inr arrow.stop_state_list })
                M_1.epsilon_arrow_list ∧
          stop_state ∈ stop_state_list) =
    fun p q =>
    match (p, q) with
    | (Sum.inl p', Sum.inl q') =>
      ∃ stop_state_list,
        { start_state := p', stop_state_list := stop_state_list } ∈ M_0.epsilon_arrow_list ∧ q' ∈ stop_state_list
    | (Sum.inr p', Sum.inr q') =>
      ∃ stop_state_list,
        { start_state := p', stop_state_list := stop_state_list } ∈ M_1.epsilon_arrow_list ∧ q' ∈ stop_state_list
    | x => False

case right.right
α : Type
inst✝ : DecidableEq α
σ_0 σ_1 : Type
M_0 : EpsilonNFA α σ_0
M_1 : EpsilonNFA α σ_1
⊢ ((fun state => state ∈ List.map Sum.inl M_0.starting_state_list ++ List.map Sum.inr M_1.starting_state_list) =
      fun p =>
      match p with
      | Sum.inl p' => p' ∈ M_0.starting_state_list
      | Sum.inr p' => p' ∈ M_1.starting_state_list) ∧
    (fun state => state ∈ List.map Sum.inl M_0.accepting_state_list ++ List.map Sum.inr M_1.accepting_state_list) =
      fun p =>
      match p with
      | Sum.inl p' => p' ∈ M_0.accepting_state_list
      | Sum.inr p' => p' ∈ M_1.accepting_state_list