Theorem: match_union_EpsilonNFA_toAbstract
Proof state before:
α : Type
inst✝ : DecidableEq α
σ_0 σ_1 : Type
M_0 : EpsilonNFA α σ_0
M_1 : EpsilonNFA α σ_1
⊢ {
      symbol := fun start_state symbol stop_state =>
        ∃ stop_state_list,
          { start_state := start_state, symbol := symbol, stop_state_list := stop_state_list } ∈
              (EpsilonNFA.wrapLeft σ_1 M_0).symbol_arrow_list ++ (EpsilonNFA.wrapRight σ_0 M_1).symbol_arrow_list ∧
            stop_state ∈ stop_state_list,
      epsilon := fun start_state stop_state =>
        ∃ stop_state_list,
          { start_state := start_state, stop_state_list := stop_state_list } ∈
              (EpsilonNFA.wrapLeft σ_1 M_0).epsilon_arrow_list ++ (EpsilonNFA.wrapRight σ_0 M_1).epsilon_arrow_list ∧
            stop_state ∈ stop_state_list,
      start := fun state =>
        state ∈ (EpsilonNFA.wrapLeft σ_1 M_0).starting_state_list ++ (EpsilonNFA.wrapRight σ_0 M_1).starting_state_list,
      accepting := fun state =>
        state ∈
          (EpsilonNFA.wrapLeft σ_1 M_0).accepting_state_list ++ (EpsilonNFA.wrapRight σ_0 M_1).accepting_state_list } =
    match_union_AbstractEpsilonNFA α σ_0 σ_1
      {
        symbol := fun start_state symbol stop_state =>
          ∃ stop_state_list,
            { start_state := start_state, symbol := symbol, stop_state_list := stop_state_list } ∈
                M_0.symbol_arrow_list ∧
              stop_state ∈ stop_state_list,
        epsilon := fun start_state stop_state =>
          ∃ stop_state_list,
            { start_state := start_state, stop_state_list := stop_state_list } ∈ M_0.epsilon_arrow_list ∧
              stop_state ∈ stop_state_list,
        start := fun state => state ∈ M_0.starting_state_list,
        accepting := fun state => state ∈ M_0.accepting_state_list }
      {
        symbol := fun start_state symbol stop_state =>
          ∃ stop_state_list,
            { start_state := start_state, symbol := symbol, stop_state_list := stop_state_list } ∈
                M_1.symbol_arrow_list ∧
              stop_state ∈ stop_state_list,
        epsilon := fun start_state stop_state =>
          ∃ stop_state_list,
            { start_state := start_state, stop_state_list := stop_state_list } ∈ M_1.epsilon_arrow_list ∧
              stop_state ∈ stop_state_list,
        start := fun state => state ∈ M_1.starting_state_list,
        accepting := fun state => state ∈ M_1.accepting_state_list }
Tactic:
simp only [match_union_AbstractEpsilonNFA]
Proof state after:
α : Type
inst✝ : DecidableEq α
σ_0 σ_1 : Type
M_0 : EpsilonNFA α σ_0
M_1 : EpsilonNFA α σ_1
⊢ {
      symbol := fun start_state symbol stop_state =>
        ∃ stop_state_list,
          { start_state := start_state, symbol := symbol, stop_state_list := stop_state_list } ∈
              (EpsilonNFA.wrapLeft σ_1 M_0).symbol_arrow_list ++ (EpsilonNFA.wrapRight σ_0 M_1).symbol_arrow_list ∧
            stop_state ∈ stop_state_list,
      epsilon := fun start_state stop_state =>
        ∃ stop_state_list,
          { start_state := start_state, stop_state_list := stop_state_list } ∈
              (EpsilonNFA.wrapLeft σ_1 M_0).epsilon_arrow_list ++ (EpsilonNFA.wrapRight σ_0 M_1).epsilon_arrow_list ∧
            stop_state ∈ stop_state_list,
      start := fun state =>
        state ∈ (EpsilonNFA.wrapLeft σ_1 M_0).starting_state_list ++ (EpsilonNFA.wrapRight σ_0 M_1).starting_state_list,
      accepting := fun state =>
        state ∈
          (EpsilonNFA.wrapLeft σ_1 M_0).accepting_state_list ++ (EpsilonNFA.wrapRight σ_0 M_1).accepting_state_list } =
    {
      symbol := fun p c q =>
        match (p, q) with
        | (Sum.inl p', Sum.inl q') =>
          ∃ stop_state_list,
            { start_state := p', symbol := c, stop_state_list := stop_state_list } ∈ M_0.symbol_arrow_list ∧
              q' ∈ stop_state_list
        | (Sum.inr p', Sum.inr q') =>
          ∃ stop_state_list,
            { start_state := p', symbol := c, stop_state_list := stop_state_list } ∈ M_1.symbol_arrow_list ∧
              q' ∈ stop_state_list
        | x => False,
      epsilon := 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,
      start := fun p =>
        match p with
        | Sum.inl p' => p' ∈ M_0.starting_state_list
        | Sum.inr p' => p' ∈ M_1.starting_state_list,
      accepting := fun p =>
        match p with
        | Sum.inl p' => p' ∈ M_0.accepting_state_list
        | Sum.inr p' => p' ∈ M_1.accepting_state_list }