Goal:
  
  elt : Type
  eq_elt : elt -> elt -> Prop
  m : t elt
  m' : t elt
  H : forall x y : key, E.eq x y -> find x m = find y m
  H0 : forall x y : key, E.eq x y -> find x m' = find y m'
  k : key
  H1 : forall k0 : key,
       E.eq k0 k ->
       match find k0 m with
       | Some x =>
           match find k0 m' with
           | Some y => eq_elt x y
           | None => False
           end
       | None => match find k0 m' with
                 | Some _ => False
                 | None => True
                 end
       end
  H3 : forall (k k0 : key) (e : elt),
       E.eq k k0 ->
       List.In (k0, e) (elements m') ->
       match find k m with
       | Some x =>
           match find k m' with
           | Some y => eq_elt x y
           | None => False
           end
       | None => match find k m' with
                 | Some _ => False
                 | None => True
                 end
       end
  e : elt
  H2 : List.In (k, e) (elements m)
  H4 : forall (k : key) (e : elt),
       List.In (k, e) (elements m') ->
       match find k m with
       | Some x =>
           match find k m' with
           | Some y => eq_elt x y
           | None => False
           end
       | None => match find k m' with
                 | Some _ => False
                 | None => True
                 end
       end
  E : find k m = None
  E0 : find k m' = None
  H5 : True
  H6 : forall k : key, find k m' = find k m'
  H7 : forall k : key, find k m = find k m
  ============================
   True


DEBUG:Going to execute:
<coq-core.plugins.cc::cc@0> $1

Goals:

DEBUG:Going to execute:
intuition eauto

Goals:

DEBUG:Going to execute:
eauto

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.intuition_then> t

Goals:

DEBUG:Going to execute:
fun tac =>
             <Coq.Init.Tauto.with_uniform_flags>
              ltac:(fun flags => <Coq.Init.Tauto.intuition_gen> flags tac)

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.with_uniform_flags>
            ltac:(fun flags => <Coq.Init.Tauto.intuition_gen> flags tac)

Goals:

DEBUG:Going to execute:
fun f => <coq-core.plugins.tauto::with_uniform_flags@0>

Goals:

DEBUG:Going to execute:
fun flags => <Coq.Init.Tauto.intuition_gen> flags tac

Goals:

DEBUG:Going to execute:
<coq-core.plugins.tauto::with_uniform_flags@0>

Goals:

DEBUG:Going to execute:
f x

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.intuition_gen> flags tac

Goals:

DEBUG:Going to execute:
fun flags solver =>
             <Coq.Init.Tauto.tauto_intuit> flags
              ltac:(<Coq.Init.Tauto.reduction_not_iff>) solver

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.tauto_intuit> flags
            ltac:(<Coq.Init.Tauto.reduction_not_iff>) solver

Goals:

DEBUG:Going to execute:
fun flags t_reduce t_solver =>
             let rec t_tauto_intuit :=
              <Coq.Init.Tauto.simplif> flags;
               <Coq.Init.Tauto.axioms> flags ||
                 match reverse goal with
                 | id:(?X1 -> ?X2) -> ?X3
                   |- _ =>
                       cut X3;
                        [ intro; clear id; t_tauto_intuit
                        | cut (X1 -> X2);
                           [ exact
                           id
                           | generalize (fun y : X2 => id (fun x : X1 => y));
                              intro; clear id; (solve 
                              [ t_tauto_intuit ]) ] ]
                 | id:~ ?X1 -> ?X3
                   |- _ =>
                       cut X3;
                        [ intro; clear id; t_tauto_intuit
                        | cut (~ X1);
                           [ exact
                           id
                           | clear id; intro; (solve [ t_tauto_intuit ]) ] ]
                 | |- ?X1 =>
                       <Coq.Init.Tauto.is_disj> flags X1; (solve
                        [ left; t_tauto_intuit | right; t_tauto_intuit ])
                 end ||
                   match goal with
                   | |- _ -> _ => intro; t_tauto_intuit
                   | |- _ => t_reduce; t_solver
                   end || t_solver
             in
             t_tauto_intuit

Goals:

DEBUG:Going to execute:
fun => <coq-core.plugins.tauto::reduction_not_iff@0>

Goals:

DEBUG:Going to execute:
let rec t_tauto_intuit :=
            <Coq.Init.Tauto.simplif> flags;
             <Coq.Init.Tauto.axioms> flags ||
               match reverse goal with
               | id:(?X1 -> ?X2) -> ?X3
                 |- _ =>
                     cut X3;
                      [ intro; clear id; t_tauto_intuit
                      | cut (X1 -> X2);
                         [ exact
                         id
                         | generalize (fun y : X2 => id (fun x : X1 => y));
                            intro; clear id; (solve 
                            [ t_tauto_intuit ]) ] ]
               | id:~ ?X1 -> ?X3
                 |- _ =>
                     cut X3;
                      [ intro; clear id; t_tauto_intuit
                      | cut (~ X1);
                         [ exact
                         id
                         | clear id; intro; (solve [ t_tauto_intuit ]) ] ]
               | |- ?X1 =>
                     <Coq.Init.Tauto.is_disj> flags X1; (solve
                      [ left; t_tauto_intuit | right; t_tauto_intuit ])
               end ||
                 match goal with
                 | |- _ -> _ => intro; t_tauto_intuit
                 | |- _ => t_reduce; t_solver
                 end || t_solver
           in
           t_tauto_intuit

Goals:

DEBUG:Going to execute:
t_tauto_intuit

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.simplif> flags;
            <Coq.Init.Tauto.axioms> flags ||
              match reverse goal with
              | id:(?X1 -> ?X2) -> ?X3
                |- _ =>
                    cut X3;
                     [ intro; clear id; t_tauto_intuit
                     | cut (X1 -> X2);
                        [ exact
                        id
                        | generalize (fun y : X2 => id (fun x : X1 => y));
                           intro; clear id; (solve 
                           [ t_tauto_intuit ]) ] ]
              | id:~ ?X1 -> ?X3
                |- _ =>
                    cut X3;
                     [ intro; clear id; t_tauto_intuit
                     | cut (~ X1);
                        [ exact
                        id
                        | clear id; intro; (solve [ t_tauto_intuit ]) ] ]
              | |- ?X1 =>
                    <Coq.Init.Tauto.is_disj> flags X1; (solve
                     [ left; t_tauto_intuit | right; t_tauto_intuit ])
              end ||
                match goal with
                | |- _ -> _ => intro; t_tauto_intuit
                | |- _ => t_reduce; t_solver
                end || t_solver

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.simplif> flags;
            <Coq.Init.Tauto.axioms> flags ||
              match reverse goal with
              | id:(?X1 -> ?X2) -> ?X3
                |- _ =>
                    cut X3;
                     [ intro; clear id; t_tauto_intuit
                     | cut (X1 -> X2);
                        [ exact
                        id
                        | generalize (fun y : X2 => id (fun x : X1 => y));
                           intro; clear id; (solve 
                           [ t_tauto_intuit ]) ] ]
              | id:~ ?X1 -> ?X3
                |- _ =>
                    cut X3;
                     [ intro; clear id; t_tauto_intuit
                     | cut (~ X1);
                        [ exact
                        id
                        | clear id; intro; (solve [ t_tauto_intuit ]) ] ]
              | |- ?X1 =>
                    <Coq.Init.Tauto.is_disj> flags X1; (solve
                     [ left; t_tauto_intuit | right; t_tauto_intuit ])
              end ||
                match goal with
                | |- _ -> _ => intro; t_tauto_intuit
                | |- _ => t_reduce; t_solver
                end || t_solver

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.simplif> flags

Goals:

DEBUG:Going to execute:
fun flags =>
             <Coq.Init.Tauto.not_dep_intros>;
              repeat
               (match reverse goal with
                | id:?X1
                  |- _ =>
                      <Coq.Init.Tauto.is_conj> flags X1; elim id; do 2 intro;
                       clear id
                | id:_ <-> _ |- _ => elim id; do 2 intro; clear id
                | id:~ _ |- _ => red in id
                | id:?X1
                  |- _ =>
                      <Coq.Init.Tauto.is_disj> flags X1; elim id; intro;
                       clear id
                | _ =>
                    <Coq.Init.Tauto.find_cut>
                     ltac:(fun id0 id1 X2 =>
                             assert X2; [ exact (id0 id1) | clear id0 ])
                | id:?X1 -> ?X2
                  |- _ =>
                      <Coq.Init.Tauto.is_unit_or_eq> flags X1; cut X2;
                       [ intro; clear id
                       | cut X1; [ exact id | constructor 1; fail ] ]
                | id:?X1 -> ?X2
                  |- _ =>
                      <Coq.Init.Tauto.flatten_contravariant_conj> flags X1 X2
                       id
                | id:?X1 <-> ?X2 -> ?X3
                  |- _ =>
                      assert ((X1 -> X2) -> (X2 -> X1) -> X3) by
                       (do 2 intro; apply id; split; assumption); clear id
                | id:?X1 -> ?X2
                  |- _ =>
                      <Coq.Init.Tauto.flatten_contravariant_disj> flags X1 X2
                       id
                | |- ?X1 => <Coq.Init.Tauto.is_conj> flags X1; split
                | |- _ <-> _ => split
                | |- ~ _ => red
                end; <Coq.Init.Tauto.not_dep_intros>)

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.not_dep_intros>;
            repeat
             (match reverse goal with
              | id:?X1
                |- _ =>
                    <Coq.Init.Tauto.is_conj> flags X1; elim id; do 2 intro;
                     clear id
              | id:_ <-> _ |- _ => elim id; do 2 intro; clear id
              | id:~ _ |- _ => red in id
              | id:?X1
                |- _ =>
                    <Coq.Init.Tauto.is_disj> flags X1; elim id; intro; clear
                     id
              | _ =>
                  <Coq.Init.Tauto.find_cut>
                   ltac:(fun id0 id1 X2 =>
                           assert X2; [ exact (id0 id1) | clear id0 ])
              | id:?X1 -> ?X2
                |- _ =>
                    <Coq.Init.Tauto.is_unit_or_eq> flags X1; cut X2;
                     [ intro; clear id
                     | cut X1; [ exact id | constructor 1; fail ] ]
              | id:?X1 -> ?X2
                |- _ =>
                    <Coq.Init.Tauto.flatten_contravariant_conj> flags X1 X2
                     id
              | id:?X1 <-> ?X2 -> ?X3
                |- _ =>
                    assert ((X1 -> X2) -> (X2 -> X1) -> X3) by
                     (do 2 intro; apply id; split; assumption); clear id
              | id:?X1 -> ?X2
                |- _ =>
                    <Coq.Init.Tauto.flatten_contravariant_disj> flags X1 X2
                     id
              | |- ?X1 => <Coq.Init.Tauto.is_conj> flags X1; split
              | |- _ <-> _ => split
              | |- ~ _ => red
              end; <Coq.Init.Tauto.not_dep_intros>)

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.not_dep_intros>

Goals:

DEBUG:Going to execute:
repeat
            match goal with
            | |- ?X1 -> ?X2 => intro
            | |- ~ _ => unfold not at 1; intro
            end

Goals:

DEBUG:Going to execute:
repeat
            (match reverse goal with
             | id:?X1
               |- _ =>
                   <Coq.Init.Tauto.is_conj> flags X1; elim id; do 2 intro;
                    clear id
             | id:_ <-> _ |- _ => elim id; do 2 intro; clear id
             | id:~ _ |- _ => red in id
             | id:?X1
               |- _ =>
                   <Coq.Init.Tauto.is_disj> flags X1; elim id; intro; clear
                    id
             | _ =>
                 <Coq.Init.Tauto.find_cut>
                  ltac:(fun id0 id1 X2 =>
                          assert X2; [ exact (id0 id1) | clear id0 ])
             | id:?X1 -> ?X2
               |- _ =>
                   <Coq.Init.Tauto.is_unit_or_eq> flags X1; cut X2;
                    [ intro; clear id
                    | cut X1; [ exact id | constructor 1; fail ] ]
             | id:?X1 -> ?X2
               |- _ =>
                   <Coq.Init.Tauto.flatten_contravariant_conj> flags X1 X2 id
             | id:?X1 <-> ?X2 -> ?X3
               |- _ =>
                   assert ((X1 -> X2) -> (X2 -> X1) -> X3) by
                    (do 2 intro; apply id; split; assumption); clear id
             | id:?X1 -> ?X2
               |- _ =>
                   <Coq.Init.Tauto.flatten_contravariant_disj> flags X1 X2 id
             | |- ?X1 => <Coq.Init.Tauto.is_conj> flags X1; split
             | |- _ <-> _ => split
             | |- ~ _ => red
             end; <Coq.Init.Tauto.not_dep_intros>)

Goals:

DEBUG:Going to execute:
<Coq.Init.Tauto.axioms> flags ||
             match reverse goal with
             | id:(?X1 -> ?X2) -> ?X3
               |- _ =>
                   cut X3;
                    [ intro; clear id; t_tauto_intuit
                    | cut (X1 -> X2);
                       [ exact
                       id
                       | generalize (fun y : X2 => id (fun x : X1 => y));
                          intro; clear id; (solve 
                          [ t_tauto_intuit ]) ] ]
             | id:~ ?X1 -> ?X3
               |- _ =>
                   cut X3;
                    [ intro; clear id; t_tauto_intuit
                    | cut (~ X1);
                       [ exact
                       id
                       | clear id; intro; (solve [ t_tauto_intuit ]) ] ]
             | |- ?X1 =>
                   <Coq.Init.Tauto.is_disj> flags X1; (solve
                    [ left; t_tauto_intuit | right; t_tauto_intuit ])
             end ||
               match goal with
               | |- _ -> _ => intro; t_tauto_intuit
               | |- _ => t_reduce; t_solver
               end || t_solver