Goal:
    A : Type  B : Type  p : A → B → bool  l : list A  l' : list B
  ============================
   (forallb2 p l l' → All2 (λ (x : A) (y : B), p x y) l l')


DEBUG:Going to execute:
induction l in l' |- *

Goals:
    A : Type  B : Type  p : A → B → bool  l' : list B
  ============================
   (forallb2 p [] l' → All2 (λ (x : A) (y : B), p x y) [] l')

  
  A : Type
  B : Type
  p : A → B → bool
  a : A
  l : list A
  l' : list B
  IHl : ∀ l' : list B, forallb2 p l l' → All2 (λ (x : A) (y : B), p x y) l l'
  ============================
   (forallb2 p (a :: l) l' → All2 (λ (x : A) (y : B), p x y) (a :: l) l')


DEBUG:Going to execute:
destruct l'
DEBUG LTAC Evaluated term: l

Goals:
    A : Type  B : Type  p : A → B → bool
  ============================
   (forallb2 p [] [] → All2 (λ (x : A) (y : B), p x y) [] [])

    A : Type  B : Type  p : A → B → bool  b : B  l' : list B
  ============================
   (forallb2 p [] (b :: l') → All2 (λ (x : A) (y : B), p x y) [] (b :: l'))

  
  A : Type
  B : Type
  p : A → B → bool
  a : A
  l : list A
  IHl : ∀ l' : list B, forallb2 p l l' → All2 (λ (x : A) (y : B), p x y) l l'
  ============================
   (forallb2 p (a :: l) [] → All2 (λ (x : A) (y : B), p x y) (a :: l) [])

  
  A : Type
  B : Type
  p : A → B → bool
  a : A
  l : list A
  b : B
  l' : list B
  IHl : ∀ l' : list B, forallb2 p l l' → All2 (λ (x : A) (y : B), p x y) l l'
  ============================
   (forallb2 p (a :: l) (b :: l')
    → All2 (λ (x : A) (y : B), p x y) (a :: l) (b :: l'))


DEBUG:Going to execute:
simpl
DEBUG LTAC Evaluated term: l'
DEBUG LTAC Evaluated term: l'

Goals:
    A : Type  B : Type  p : A → B → bool
  ============================
   (true → All2 (λ (x : A) (y : B), p x y) [] [])

    A : Type  B : Type  p : A → B → bool  b : B  l' : list B
  ============================
   (false → All2 (λ (x : A) (y : B), p x y) [] (b :: l'))

  
  A : Type
  B : Type
  p : A → B → bool
  a : A
  l : list A
  IHl : ∀ l' : list B, forallb2 p l l' → All2 (λ (x : A) (y : B), p x y) l l'
  ============================
   (false → All2 (λ (x : A) (y : B), p x y) (a :: l) [])

  
  A : Type
  B : Type
  p : A → B → bool
  a : A
  l : list A
  b : B
  l' : list B
  IHl : ∀ l' : list B, forallb2 p l l' → All2 (λ (x : A) (y : B), p x y) l l'
  ============================
   (p a b && forallb2 p l l'
    → All2 (λ (x : A) (y : B), p x y) (a :: l) (b :: l'))


DEBUG:Going to execute:
intros

Goals:
    A : Type  B : Type  p : A → B → bool  H : is_true true
  ============================
   (All2 (λ (x : A) (y : B), p x y) [] [])

  
  A : Type
  B : Type
  p : A → B → bool
  b : B
  l' : list B
  H : is_true false
  ============================
   (All2 (λ (x : A) (y : B), p x y) [] (b :: l'))

  
  A : Type
  B : Type
  p : A → B → bool
  a : A
  l : list A
  IHl : ∀ l' : list B, forallb2 p l l' → All2 (λ (x : A) (y : B), p x y) l l'
  H : is_true false
  ============================
   (All2 (λ (x : A) (y : B), p x y) (a :: l) [])

  
  A : Type
  B : Type
  p : A → B → bool
  a : A
  l : list A
  b : B
  l' : list B
  IHl : ∀ l' : list B, forallb2 p l l' → All2 (λ (x : A) (y : B), p x y) l l'
  H : is_true (p a b && forallb2 p l l')
  ============================
   (All2 (λ (x : A) (y : B), p x y) (a :: l) (b :: l'))


DEBUG:Going to execute:
try congruence