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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  E0 : find k m' = None
  H3 : True
  x : elt
  H2 : None = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


DEBUG:Going to execute:
intuition eauto

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


DEBUG:Going to execute:
eauto

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


DEBUG:Going to execute:
f x
Level 2: evaluation returns
<coq-core.plugins.tauto::with_uniform_flags@0>
where
f := fun flags => <Coq.Init.Tauto.intuition_gen> flags tac
     where
     tac := eauto
     of type
     tacvalue
of type
tacvalue of type tacvalue

Level 2: evaluation returns
<coq-core.plugins.tauto::with_uniform_flags@0>
where
f := fun flags => <Coq.Init.Tauto.intuition_gen> flags tac
     where
     tac := eauto
     of type
     tacvalue
of type
tacvalue of type tacvalue

Level 1: evaluation returns
<coq-core.plugins.tauto::with_uniform_flags@0>
where
f := fun flags => <Coq.Init.Tauto.intuition_gen> flags tac
     where
     tac := eauto
     of type
     tacvalue
of type
tacvalue of type tacvalue

Level 1: evaluation returns
<coq-core.plugins.tauto::with_uniform_flags@0>
where
f := fun flags => <Coq.Init.Tauto.intuition_gen> flags tac
     where
     tac := eauto
     of type
     tacvalue
of type
tacvalue of type tacvalue


Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


DEBUG:Going to execute:
t_tauto_intuit

Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


DEBUG:Going to execute:
<Coq.Init.Tauto.simplif> flags
Level 3: evaluation returns
<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
where
t_tauto_intuit := <tactic closure>
of type
tacvalue
t_solver := eauto
of type
tacvalue
t_reduce := <coq-core.plugins.tauto::reduction_not_iff@0>
of type
tacvalue
flags := 
of type
tauto_flags of type tacvalue

Level 3: evaluation returns
<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
where
t_tauto_intuit := <tactic closure>
of type
tacvalue
t_solver := eauto
of type
tacvalue
t_reduce := <coq-core.plugins.tauto::reduction_not_iff@0>
of type
tacvalue
flags := 
of type
tauto_flags of type tacvalue

Level 2: evaluation returns
<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
where
t_tauto_intuit := <tactic closure>
of type
tacvalue
t_solver := eauto
of type
tacvalue
t_reduce := <coq-core.plugins.tauto::reduction_not_iff@0>
of type
tacvalue
flags := 
of type
tauto_flags of type tacvalue

Level 2: evaluation returns
<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
where
t_tauto_intuit := <tactic closure>
of type
tacvalue
t_solver := eauto
of type
tacvalue
t_reduce := <coq-core.plugins.tauto::reduction_not_iff@0>
of type
tacvalue
flags := 
of type
tauto_flags of type tacvalue

Level 1: evaluation returns
<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
where
t_tauto_intuit := <tactic closure>
of type
tacvalue
t_solver := eauto
of type
tacvalue
t_reduce := <coq-core.plugins.tauto::reduction_not_iff@0>
of type
tacvalue
flags := 
of type
tauto_flags of type tacvalue

Level 1: evaluation returns
<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
where
t_tauto_intuit := <tactic closure>
of type
tacvalue
t_solver := eauto
of type
tacvalue
t_reduce := <coq-core.plugins.tauto::reduction_not_iff@0>
of type
tacvalue
flags := 
of type
tauto_flags of type tacvalue


Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


DEBUG:Going to execute:
<Coq.Init.Tauto.not_dep_intros>
Level 1: evaluation returns
<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>)
where
flags := 
of type
tauto_flags of type tacvalue

Level 1: evaluation returns
<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>)
where
flags := 
of type
tauto_flags of type tacvalue


Goals:
  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  e : elt
  E : find k m = Some e
  e0 : elt
  E0 : find k m' = Some e0
  H3 : eq_elt e e0
  x : elt
  H2 : Some e0 = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e0 : elt, Some e = Some e0)

  
  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'
  H1 : forall (k : key) (e : elt),
       find k m = Some e ->
       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
  k : key
  E : find k m = None
  e : elt
  E0 : find k m' = Some e
  H3 : False
  x : elt
  H2 : Some e = Some x
  H4 : forall k : key, find k m' = find k m'
  H5 : forall k : key, find k m = find k m
  ============================
   (exists e : elt, None = Some e)


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