Reasoning Details

 < Module soundX:pair.
 < Prove_Constraint soundX:host:proj_ty_is.

Variables: Ty1
Proj : |{ty}- pairTy Ty1 ~~> arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1
IsTy : is_ty (pairTy Ty1)
============================
 is_ty (arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1)
 < case IsTy.

Variables: Ty1
Proj : |{ty}- pairTy Ty1 ~~> arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1
H1 : is_ty Ty1
============================
 is_ty (arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1)
 < search.

Proof completed.
 < Prove soundX:host:type_is.

Subgoal 6:

Variables: Ctx Ty1 T2 T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
IsT : is_tm (pair T1 T2)
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
============================
 is_ty (pairTy Ty1)
 < Is: case IsT.

Subgoal 6:

Variables: Ctx Ty1 T2 T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
Is : is_tm T1
Is1 : is_tm T2
============================
 is_ty (pairTy Ty1)
 < apply IH to _ _ Ty1.

Subgoal 6:

Variables: Ctx Ty1 T2 T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
Is : is_tm T1
Is1 : is_tm T2
H1 : is_ty Ty1
============================
 is_ty (pairTy Ty1)
 < search.

Subgoal 7:

Variables: Ctx Ty T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
IsT : is_tm (fst T1)
Ty : typeOf Ctx (fst T1) Ty @
Ty1 : typeOf Ctx T1 (pairTy Ty) *
============================
 is_ty Ty
 < Is: case IsT.

Subgoal 7:

Variables: Ctx Ty T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
Ty1 : typeOf Ctx T1 (pairTy Ty) *
Is : is_tm T1
============================
 is_ty Ty
 < IsTy: apply IH to _ _ Ty1.

Subgoal 7:

Variables: Ctx Ty T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
Ty1 : typeOf Ctx T1 (pairTy Ty) *
Is : is_tm T1
IsTy : is_ty (pairTy Ty)
============================
 is_ty Ty
 < case IsTy.

Subgoal 7:

Variables: Ctx Ty T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
Ty1 : typeOf Ctx T1 (pairTy Ty) *
Is : is_tm T1
H1 : is_ty Ty
============================
 is_ty Ty
 < search.

Subgoal 8:

Variables: Ctx Ty T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
IsT : is_tm (snd T1)
Ty : typeOf Ctx (snd T1) Ty @
Ty1 : typeOf Ctx T1 (pairTy Ty) *
============================
 is_ty Ty
 < Is: case IsT.

Subgoal 8:

Variables: Ctx Ty T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
Ty1 : typeOf Ctx T1 (pairTy Ty) *
Is : is_tm T1
============================
 is_ty Ty
 < IsTy: apply IH to _ _ Ty1.

Subgoal 8:

Variables: Ctx Ty T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
Ty1 : typeOf Ctx T1 (pairTy Ty) *
Is : is_tm T1
IsTy : is_ty (pairTy Ty)
============================
 is_ty Ty
 < case IsTy.

Subgoal 8:

Variables: Ctx Ty T1
IH : forall Ctx T Ty,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T Ty * -> is_ty Ty
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
Ty1 : typeOf Ctx T1 (pairTy Ty) *
Is : is_tm T1
H1 : is_ty Ty
============================
 is_ty Ty
 < search.

Proof completed.
 < Prove_Constraint soundX:host:proj_is.

Subgoal 1:

Variables: Ctx T2 T1 Ty
Proj : Ctx |{tm}- pair T1 T2 ~~> app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsCtx : is_list (is_pair is_string is_ty) Ctx
IsT : is_tm (pair T1 T2)
Proj1 : typeOf Ctx T1 Ty
============================
 is_tm (app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2)
 < case IsT.

Subgoal 1:

Variables: Ctx T2 T1 Ty
Proj : Ctx |{tm}- pair T1 T2 ~~> app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsCtx : is_list (is_pair is_string is_ty) Ctx
Proj1 : typeOf Ctx T1 Ty
H1 : is_tm T1
H2 : is_tm T2
============================
 is_tm (app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2)
 < apply type_is to _ _ Proj1.

Subgoal 1:

Variables: Ctx T2 T1 Ty
Proj : Ctx |{tm}- pair T1 T2 ~~> app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsCtx : is_list (is_pair is_string is_ty) Ctx
Proj1 : typeOf Ctx T1 Ty
H1 : is_tm T1
H2 : is_tm T2
H3 : is_ty Ty
============================
 is_tm (app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2)
 < search 11.

Subgoal 2:

Variables: Ctx Ty T1
Proj : Ctx |{tm}- fst T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "A")))
IsCtx : is_list (is_pair is_string is_ty) Ctx
IsT : is_tm (fst T1)
Proj1 : typeOf Ctx T1 (pairTy Ty)
============================
 is_tm (app T1 (abs "A" Ty (abs "B" Ty (var "A"))))
 < case IsT.

Subgoal 2:

Variables: Ctx Ty T1
Proj : Ctx |{tm}- fst T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "A")))
IsCtx : is_list (is_pair is_string is_ty) Ctx
Proj1 : typeOf Ctx T1 (pairTy Ty)
H1 : is_tm T1
============================
 is_tm (app T1 (abs "A" Ty (abs "B" Ty (var "A"))))
 < IsTy: apply type_is to _ _ Proj1.

Subgoal 2:

Variables: Ctx Ty T1
Proj : Ctx |{tm}- fst T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "A")))
IsCtx : is_list (is_pair is_string is_ty) Ctx
Proj1 : typeOf Ctx T1 (pairTy Ty)
H1 : is_tm T1
IsTy : is_ty (pairTy Ty)
============================
 is_tm (app T1 (abs "A" Ty (abs "B" Ty (var "A"))))
 < case IsTy.

Subgoal 2:

Variables: Ctx Ty T1
Proj : Ctx |{tm}- fst T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "A")))
IsCtx : is_list (is_pair is_string is_ty) Ctx
Proj1 : typeOf Ctx T1 (pairTy Ty)
H1 : is_tm T1
H2 : is_ty Ty
============================
 is_tm (app T1 (abs "A" Ty (abs "B" Ty (var "A"))))
 < search 7.

Subgoal 3:

Variables: Ctx Ty T1
Proj : Ctx |{tm}- snd T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "B")))
IsCtx : is_list (is_pair is_string is_ty) Ctx
IsT : is_tm (snd T1)
Proj1 : typeOf Ctx T1 (pairTy Ty)
============================
 is_tm (app T1 (abs "A" Ty (abs "B" Ty (var "B"))))
 < case IsT.

Subgoal 3:

Variables: Ctx Ty T1
Proj : Ctx |{tm}- snd T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "B")))
IsCtx : is_list (is_pair is_string is_ty) Ctx
Proj1 : typeOf Ctx T1 (pairTy Ty)
H1 : is_tm T1
============================
 is_tm (app T1 (abs "A" Ty (abs "B" Ty (var "B"))))
 < IsTy: apply type_is to _ _ Proj1.

Subgoal 3:

Variables: Ctx Ty T1
Proj : Ctx |{tm}- snd T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "B")))
IsCtx : is_list (is_pair is_string is_ty) Ctx
Proj1 : typeOf Ctx T1 (pairTy Ty)
H1 : is_tm T1
IsTy : is_ty (pairTy Ty)
============================
 is_tm (app T1 (abs "A" Ty (abs "B" Ty (var "B"))))
 < case IsTy.

Subgoal 3:

Variables: Ctx Ty T1
Proj : Ctx |{tm}- snd T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "B")))
IsCtx : is_list (is_pair is_string is_ty) Ctx
Proj1 : typeOf Ctx T1 (pairTy Ty)
H1 : is_tm T1
H2 : is_ty Ty
============================
 is_tm (app T1 (abs "A" Ty (abs "B" Ty (var "B"))))
 < search 7.

Proof completed.
 < Prove soundX:host:type_unique.

Subgoal 6:

Variables: Ctx TyB Ty T2 T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
IsT : is_tm (pair T1 T2)
TyA : typeOf Ctx (pair T1 T2) (pairTy Ty) @
TyB : typeOf Ctx (pair T1 T2) TyB
TyA1 : typeOf Ctx T1 Ty *
TyA2 : typeOf Ctx T2 Ty *
============================
 pairTy Ty = TyB
 < case IsT.

Subgoal 6:

Variables: Ctx TyB Ty T2 T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
TyA : typeOf Ctx (pair T1 T2) (pairTy Ty) @
TyB : typeOf Ctx (pair T1 T2) TyB
TyA1 : typeOf Ctx T1 Ty *
TyA2 : typeOf Ctx T2 Ty *
H1 : is_tm T1
H2 : is_tm T2
============================
 pairTy Ty = TyB
 < TyB: case TyB.

Subgoal 6:

Variables: Ctx Ty T2 T1 Ty1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
TyA : typeOf Ctx (pair T1 T2) (pairTy Ty) @
TyA1 : typeOf Ctx T1 Ty *
TyA2 : typeOf Ctx T2 Ty *
H1 : is_tm T1
H2 : is_tm T2
TyB : typeOf Ctx T1 Ty1
TyB1 : typeOf Ctx T2 Ty1
============================
 pairTy Ty = pairTy Ty1
 < apply IH to _ _ TyA1 TyB.

Subgoal 6:

Variables: Ctx T2 T1 Ty1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
TyA : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
TyA1 : typeOf Ctx T1 Ty1 *
TyA2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
TyB : typeOf Ctx T1 Ty1
TyB1 : typeOf Ctx T2 Ty1
============================
 pairTy Ty1 = pairTy Ty1
 < search.

Subgoal 7:

Variables: Ctx TyA TyB T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
IsT : is_tm (fst T1)
TyA : typeOf Ctx (fst T1) TyA @
TyB : typeOf Ctx (fst T1) TyB
TyA1 : typeOf Ctx T1 (pairTy TyA) *
============================
 TyA = TyB
 < case IsT.

Subgoal 7:

Variables: Ctx TyA TyB T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
TyA : typeOf Ctx (fst T1) TyA @
TyB : typeOf Ctx (fst T1) TyB
TyA1 : typeOf Ctx T1 (pairTy TyA) *
H1 : is_tm T1
============================
 TyA = TyB
 < TyB: case TyB.

Subgoal 7:

Variables: Ctx TyA TyB T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
TyA : typeOf Ctx (fst T1) TyA @
TyA1 : typeOf Ctx T1 (pairTy TyA) *
H1 : is_tm T1
TyB : typeOf Ctx T1 (pairTy TyB)
============================
 TyA = TyB
 < apply IH to _ _ TyA1 TyB.

Subgoal 7:

Variables: Ctx TyB T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
TyA : typeOf Ctx (fst T1) TyB @
TyA1 : typeOf Ctx T1 (pairTy TyB) *
H1 : is_tm T1
TyB : typeOf Ctx T1 (pairTy TyB)
============================
 TyB = TyB
 < search.

Subgoal 8:

Variables: Ctx TyA TyB T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
IsT : is_tm (snd T1)
TyA : typeOf Ctx (snd T1) TyA @
TyB : typeOf Ctx (snd T1) TyB
TyA1 : typeOf Ctx T1 (pairTy TyA) *
============================
 TyA = TyB
 < case IsT.

Subgoal 8:

Variables: Ctx TyA TyB T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
TyA : typeOf Ctx (snd T1) TyA @
TyB : typeOf Ctx (snd T1) TyB
TyA1 : typeOf Ctx T1 (pairTy TyA) *
H1 : is_tm T1
============================
 TyA = TyB
 < TyB: case TyB.

Subgoal 8:

Variables: Ctx TyA TyB T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
TyA : typeOf Ctx (snd T1) TyA @
TyA1 : typeOf Ctx T1 (pairTy TyA) *
H1 : is_tm T1
TyB : typeOf Ctx T1 (pairTy TyB)
============================
 TyA = TyB
 < apply IH to _ _ TyA1 TyB.

Subgoal 8:

Variables: Ctx TyB T1
IH : forall Ctx T TyA TyB,
       is_list (is_pair is_string is_ty) Ctx -> is_tm T -> typeOf Ctx T TyA * ->
       typeOf Ctx T TyB -> TyA = TyB
IsCtx : is_list (is_pair is_string is_ty) Ctx
TyA : typeOf Ctx (snd T1) TyB @
TyA1 : typeOf Ctx T1 (pairTy TyB) *
H1 : is_tm T1
TyB : typeOf Ctx T1 (pairTy TyB)
============================
 TyB = TyB
 < search.

Proof completed.
 < Prove soundX:host:ty_lookup.

Subgoal 6:

Variables: Ctx1 Ctx2 Ty1 T2 T1
IH : forall Ctx1 Ctx2 T Ty,
       typeOf Ctx1 T Ty * -> (forall X XTy,
         lookup Ctx1 X XTy -> lookup Ctx2 X XTy) -> typeOf Ctx2 T Ty
Ty : typeOf Ctx1 (pair T1 T2) (pairTy Ty1) @
L : forall X XTy, lookup Ctx1 X XTy -> lookup Ctx2 X XTy
Ty1 : typeOf Ctx1 T1 Ty1 *
Ty2 : typeOf Ctx1 T2 Ty1 *
============================
 typeOf Ctx2 (pair T1 T2) (pairTy Ty1)
 < apply IH to Ty1 L.

Subgoal 6:

Variables: Ctx1 Ctx2 Ty1 T2 T1
IH : forall Ctx1 Ctx2 T Ty,
       typeOf Ctx1 T Ty * -> (forall X XTy,
         lookup Ctx1 X XTy -> lookup Ctx2 X XTy) -> typeOf Ctx2 T Ty
Ty : typeOf Ctx1 (pair T1 T2) (pairTy Ty1) @
L : forall X XTy, lookup Ctx1 X XTy -> lookup Ctx2 X XTy
Ty1 : typeOf Ctx1 T1 Ty1 *
Ty2 : typeOf Ctx1 T2 Ty1 *
H1 : typeOf Ctx2 T1 Ty1
============================
 typeOf Ctx2 (pair T1 T2) (pairTy Ty1)
 < apply IH to Ty2 L.

Subgoal 6:

Variables: Ctx1 Ctx2 Ty1 T2 T1
IH : forall Ctx1 Ctx2 T Ty,
       typeOf Ctx1 T Ty * -> (forall X XTy,
         lookup Ctx1 X XTy -> lookup Ctx2 X XTy) -> typeOf Ctx2 T Ty
Ty : typeOf Ctx1 (pair T1 T2) (pairTy Ty1) @
L : forall X XTy, lookup Ctx1 X XTy -> lookup Ctx2 X XTy
Ty1 : typeOf Ctx1 T1 Ty1 *
Ty2 : typeOf Ctx1 T2 Ty1 *
H1 : typeOf Ctx2 T1 Ty1
H2 : typeOf Ctx2 T2 Ty1
============================
 typeOf Ctx2 (pair T1 T2) (pairTy Ty1)
 < search.

Subgoal 7:

Variables: Ctx1 Ctx2 Ty T1
IH : forall Ctx1 Ctx2 T Ty,
       typeOf Ctx1 T Ty * -> (forall X XTy,
         lookup Ctx1 X XTy -> lookup Ctx2 X XTy) -> typeOf Ctx2 T Ty
Ty : typeOf Ctx1 (fst T1) Ty @
L : forall X XTy, lookup Ctx1 X XTy -> lookup Ctx2 X XTy
Ty1 : typeOf Ctx1 T1 (pairTy Ty) *
============================
 typeOf Ctx2 (fst T1) Ty
 < apply IH to Ty1 L.

Subgoal 7:

Variables: Ctx1 Ctx2 Ty T1
IH : forall Ctx1 Ctx2 T Ty,
       typeOf Ctx1 T Ty * -> (forall X XTy,
         lookup Ctx1 X XTy -> lookup Ctx2 X XTy) -> typeOf Ctx2 T Ty
Ty : typeOf Ctx1 (fst T1) Ty @
L : forall X XTy, lookup Ctx1 X XTy -> lookup Ctx2 X XTy
Ty1 : typeOf Ctx1 T1 (pairTy Ty) *
H1 : typeOf Ctx2 T1 (pairTy Ty)
============================
 typeOf Ctx2 (fst T1) Ty
 < search.

Subgoal 8:

Variables: Ctx1 Ctx2 Ty T1
IH : forall Ctx1 Ctx2 T Ty,
       typeOf Ctx1 T Ty * -> (forall X XTy,
         lookup Ctx1 X XTy -> lookup Ctx2 X XTy) -> typeOf Ctx2 T Ty
Ty : typeOf Ctx1 (snd T1) Ty @
L : forall X XTy, lookup Ctx1 X XTy -> lookup Ctx2 X XTy
Ty1 : typeOf Ctx1 T1 (pairTy Ty) *
============================
 typeOf Ctx2 (snd T1) Ty
 < apply IH to Ty1 L.

Subgoal 8:

Variables: Ctx1 Ctx2 Ty T1
IH : forall Ctx1 Ctx2 T Ty,
       typeOf Ctx1 T Ty * -> (forall X XTy,
         lookup Ctx1 X XTy -> lookup Ctx2 X XTy) -> typeOf Ctx2 T Ty
Ty : typeOf Ctx1 (snd T1) Ty @
L : forall X XTy, lookup Ctx1 X XTy -> lookup Ctx2 X XTy
Ty1 : typeOf Ctx1 T1 (pairTy Ty) *
H1 : typeOf Ctx2 T1 (pairTy Ty)
============================
 typeOf Ctx2 (snd T1) Ty
 < search.

Proof completed.
 < Prove_Constraint soundX:host:proj_ty_unique.

Variables: TyB Ty1
Hyp : |{ty}- pairTy Ty1 ~~> arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1
Hyp1 : |{ty}- pairTy Ty1 ~~> TyB
Hyp2 : is_ty (pairTy Ty1)
============================
 arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1 = TyB
 < case Hyp1.

Variables: Ty1
Hyp : |{ty}- pairTy Ty1 ~~> arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1
Hyp2 : is_ty (pairTy Ty1)
============================
 arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1 = arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1
 < search.

Proof completed.
 < Prove_Constraint soundX:host:proj_tm_unique.

Subgoal 1:

Variables: Ctx TB T2 T1 Ty
Hyp : Ctx |{tm}- pair T1 T2 ~~> app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Hyp1 : Ctx |{tm}- pair T1 T2 ~~> TB
Hyp2 : is_tm (pair T1 T2)
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 Ty
============================
 app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2 = TB
 < case Hyp1.

Subgoal 1:

Variables: Ctx T2 T1 Ty Ty1
Hyp : Ctx |{tm}- pair T1 T2 ~~> app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Hyp2 : is_tm (pair T1 T2)
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 Ty
H1 : typeOf Ctx T1 Ty1
============================
 app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2 = app (app (abs "A" Ty1 (abs "B" Ty1 (abs "S" (arrowTy Ty1 (arrowTy Ty1 Ty1)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
 < case Hyp2.

Subgoal 1:

Variables: Ctx T2 T1 Ty Ty1
Hyp : Ctx |{tm}- pair T1 T2 ~~> app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 Ty
H1 : typeOf Ctx T1 Ty1
H2 : is_tm T1
H3 : is_tm T2
============================
 app (app (abs "A" Ty (abs "B" Ty (abs "S" (arrowTy Ty (arrowTy Ty Ty)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2 = app (app (abs "A" Ty1 (abs "B" Ty1 (abs "S" (arrowTy Ty1 (arrowTy Ty1 Ty1)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
 < apply type_unique to _ _ Hyp4 H1.

Subgoal 1:

Variables: Ctx T2 T1 Ty1
Hyp : Ctx |{tm}- pair T1 T2 ~~> app (app (abs "A" Ty1 (abs "B" Ty1 (abs "S" (arrowTy Ty1 (arrowTy Ty1 Ty1)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 Ty1
H1 : typeOf Ctx T1 Ty1
H2 : is_tm T1
H3 : is_tm T2
============================
 app (app (abs "A" Ty1 (abs "B" Ty1 (abs "S" (arrowTy Ty1 (arrowTy Ty1 Ty1)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2 = app (app (abs "A" Ty1 (abs "B" Ty1 (abs "S" (arrowTy Ty1 (arrowTy Ty1 Ty1)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2
 < search.

Subgoal 2:

Variables: Ctx TB Ty T1
Hyp : Ctx |{tm}- fst T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "A")))
Hyp1 : Ctx |{tm}- fst T1 ~~> TB
Hyp2 : is_tm (fst T1)
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 (pairTy Ty)
============================
 app T1 (abs "A" Ty (abs "B" Ty (var "A"))) = TB
 < case Hyp1.

Subgoal 2:

Variables: Ctx Ty T1 Ty1
Hyp : Ctx |{tm}- fst T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "A")))
Hyp2 : is_tm (fst T1)
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 (pairTy Ty)
H1 : typeOf Ctx T1 (pairTy Ty1)
============================
 app T1 (abs "A" Ty (abs "B" Ty (var "A"))) = app T1 (abs "A" Ty1 (abs "B" Ty1 (var "A")))
 < case Hyp2.

Subgoal 2:

Variables: Ctx Ty T1 Ty1
Hyp : Ctx |{tm}- fst T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "A")))
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 (pairTy Ty)
H1 : typeOf Ctx T1 (pairTy Ty1)
H2 : is_tm T1
============================
 app T1 (abs "A" Ty (abs "B" Ty (var "A"))) = app T1 (abs "A" Ty1 (abs "B" Ty1 (var "A")))
 < apply type_unique to _ _ Hyp4 H1.

Subgoal 2:

Variables: Ctx T1 Ty1
Hyp : Ctx |{tm}- fst T1 ~~> app T1 (abs "A" Ty1 (abs "B" Ty1 (var "A")))
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 (pairTy Ty1)
H1 : typeOf Ctx T1 (pairTy Ty1)
H2 : is_tm T1
============================
 app T1 (abs "A" Ty1 (abs "B" Ty1 (var "A"))) = app T1 (abs "A" Ty1 (abs "B" Ty1 (var "A")))
 < search.

Subgoal 3:

Variables: Ctx TB Ty T1
Hyp : Ctx |{tm}- snd T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "B")))
Hyp1 : Ctx |{tm}- snd T1 ~~> TB
Hyp2 : is_tm (snd T1)
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 (pairTy Ty)
============================
 app T1 (abs "A" Ty (abs "B" Ty (var "B"))) = TB
 < case Hyp1.

Subgoal 3:

Variables: Ctx Ty T1 Ty1
Hyp : Ctx |{tm}- snd T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "B")))
Hyp2 : is_tm (snd T1)
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 (pairTy Ty)
H1 : typeOf Ctx T1 (pairTy Ty1)
============================
 app T1 (abs "A" Ty (abs "B" Ty (var "B"))) = app T1 (abs "A" Ty1 (abs "B" Ty1 (var "B")))
 < case Hyp2.

Subgoal 3:

Variables: Ctx Ty T1 Ty1
Hyp : Ctx |{tm}- snd T1 ~~> app T1 (abs "A" Ty (abs "B" Ty (var "B")))
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 (pairTy Ty)
H1 : typeOf Ctx T1 (pairTy Ty1)
H2 : is_tm T1
============================
 app T1 (abs "A" Ty (abs "B" Ty (var "B"))) = app T1 (abs "A" Ty1 (abs "B" Ty1 (var "B")))
 < apply type_unique to _ _ Hyp4 H1.

Subgoal 3:

Variables: Ctx T1 Ty1
Hyp : Ctx |{tm}- snd T1 ~~> app T1 (abs "A" Ty1 (abs "B" Ty1 (var "B")))
Hyp3 : is_list (is_pair is_string is_ty) Ctx
Hyp4 : typeOf Ctx T1 (pairTy Ty1)
H1 : typeOf Ctx T1 (pairTy Ty1)
H2 : is_tm T1
============================
 app T1 (abs "A" Ty1 (abs "B" Ty1 (var "B"))) = app T1 (abs "A" Ty1 (abs "B" Ty1 (var "B")))
 < search.

Proof completed.
 < Prove soundX:host:desugar_ty_exists.

Subgoal 3:

Variables: Ty1
IH : forall Ty, is_ty Ty * -> exists Ty', desugar_ty Ty Ty'
IsTy : is_ty (pairTy Ty1) @
IsTy1 : is_ty Ty1 *
============================
 exists Ty', desugar_ty (pairTy Ty1) Ty'
 < apply IH to IsTy1.

Subgoal 3:

Variables: Ty1 Ty'
IH : forall Ty, is_ty Ty * -> exists Ty', desugar_ty Ty Ty'
IsTy : is_ty (pairTy Ty1) @
IsTy1 : is_ty Ty1 *
H1 : desugar_ty Ty1 Ty'
============================
 exists Ty', desugar_ty (pairTy Ty1) Ty'
 < search.

Proof completed.
 < Prove soundX:host:desugar_ty_rel.

Subgoal 6:

Variables: Ctx T' Ty' Ctx' Ty1 T2 T1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsT : is_tm (pair T1 T2)
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DT : desugar_tm Ctx (pair T1 T2) T'
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
============================
 typeOf Ctx' T' Ty'
 < case IsT.

Subgoal 6:

Variables: Ctx T' Ty' Ctx' Ty1 T2 T1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DT : desugar_tm Ctx (pair T1 T2) T'
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
============================
 typeOf Ctx' T' Ty'
 < DT: case DT.

Subgoal 6:

Variables: Ctx T' Ty' Ctx' Ty1 T2 T1 T_P
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : Ctx |{tm}- pair T1 T2 ~~> T_P
DT1 : desugar_tm Ctx T_P T'
============================
 typeOf Ctx' T' Ty'
 < DT: case DT.

Subgoal 6:

Variables: Ctx T' Ty' Ctx' Ty1 T2 T1 Ty2
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT1 : desugar_tm Ctx (app (app (abs "A" Ty2 (abs "B" Ty2 (abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2) T'
DT : typeOf Ctx T1 Ty2
============================
 typeOf Ctx' T' Ty'
 < DT: case DT1.

Subgoal 6.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DA
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT1 : desugar_tm Ctx (app (abs "A" Ty2 (abs "B" Ty2 (abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B"))))) T1) DA
DT2 : desugar_tm Ctx T2 DB
============================
 typeOf Ctx' (app DA DB) Ty'
 < DT: case DT1.

Subgoal 6.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DA1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT1 : desugar_tm Ctx (abs "A" Ty2 (abs "B" Ty2 (abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B"))))) DA1
DT3 : desugar_tm Ctx T1 DB1
============================
 typeOf Ctx' (app (app DA1 DB1) DB) Ty'
 < DT: case DT1.

Subgoal 6.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTm DTy
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_tm (("A", Ty2)::Ctx) (abs "B" Ty2 (abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B")))) DTm
============================
 typeOf Ctx' (app (app (abs "A" DTy DTm) DB1) DB) Ty'
 < DT: case DT4.

Subgoal 6.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTm1 DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_tm (("B", Ty2)::(("A", Ty2)::Ctx)) (abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B"))) DTm1
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 DTm1)) DB1) DB) Ty'
 < DT: case DT5.

Subgoal 6.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DTm2 DTy2
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty (arrowTy Ty2 (arrowTy Ty2 Ty2)) DTy2
DT6 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (app (app (var "S") (var "A")) (var "B")) DTm2
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" DTy2 DTm2))) DB1) DB) Ty'
 < DT: case DT5.

Subgoal 6.1.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DTm2 DB2 DA2
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT6 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (app (app (var "S") (var "A")) (var "B")) DTm2
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty (arrowTy Ty2 Ty2) DB2
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 DB2) DTm2))) DB1) DB) Ty'
 < DT: case DT6.

Subgoal 6.1.1.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DB2 DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty (arrowTy Ty2 Ty2) DB2
DT6 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (app (var "S") (var "A")) DA3
DT8 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "B") DB3
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 DB2) (app DA3 DB3)))) DB1) DB) Ty'
 < DT: case DT7.

Subgoal 6.1.1.1.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB3 DA3 DB4 DA4
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT6 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (app (var "S") (var "A")) DA3
DT8 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "B") DB3
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app DA3 DB3)))) DB1) DB) Ty'
 < DT: case DT6.

Subgoal 6.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB3 DB4 DA4 DB5 DA5
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT8 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "B") DB3
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DT6 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "S") DA5
DT10 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "A") DB5
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app DA5 DB5) DB3)))) DB1) DB) Ty'
 < DT: case DT8.

Subgoal 6.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB5 DA5
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DT6 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "S") DA5
DT10 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "A") DB5
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app DA5 DB5) (var "B"))))) DB1) DB) Ty'
 < DT: case DT6.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB5
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DT10 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "A") DB5
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") DB5) (var "B"))))) DB1) DB) Ty'
 < DT: case DT10.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) Ty'
 < DTy: case DTy.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 Ty_P
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy : |{ty}- pairTy Ty1 ~~> Ty_P
DTy1 : desugar_ty Ty_P Ty'
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) Ty'
 < DTy: case DTy.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty (arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1) Ty'
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) Ty'
 < DTy: case DTy1.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB6 DA6
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy : desugar_ty (arrowTy Ty1 (arrowTy Ty1 Ty1)) DA6
DTy1 : desugar_ty Ty1 DB6
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy DA6 DB6)
 < DTy: case DTy.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB6 DB7 DA7
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty1 DB6
DTy : desugar_ty Ty1 DA7
DTy2 : desugar_ty (arrowTy Ty1 Ty1) DB7
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 DB7) DB6)
 < DTy: case DTy2.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB6 DA7 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty1 DB6
DTy : desugar_ty Ty1 DA7
DTy2 : desugar_ty Ty1 DA8
DTy3 : desugar_ty Ty1 DB8
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 (arrowTy DA8 DB8)) DB6)
 < apply type_is to _ _ DT.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB6 DA7 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty1 DB6
DTy : desugar_ty Ty1 DA7
DTy2 : desugar_ty Ty1 DA8
DTy3 : desugar_ty Ty1 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 (arrowTy DA8 DB8)) DB6)
 < apply type_unique to _ _ Ty1 DT.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB6 DA7 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty2 DB6
DTy : desugar_ty Ty2 DA7
DTy2 : desugar_ty Ty2 DA8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 (arrowTy DA8 DB8)) DB6)
 < apply desugar_ty_unique to _ DT1 DT4.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DTy1 DA2 DB4 DA4 DB6 DA7 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy1
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty2 DB6
DTy : desugar_ty Ty2 DA7
DTy2 : desugar_ty Ty2 DA8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DTy1 (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 (arrowTy DA8 DB8)) DB6)
 < apply desugar_ty_unique to _ DT1 DT5.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DA2 DB4 DA4 DB6 DA7 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DA2
DT4 : desugar_ty Ty2 DA2
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty2 DB6
DTy : desugar_ty Ty2 DA7
DTy2 : desugar_ty Ty2 DA8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DA2 (abs "B" DA2 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 (arrowTy DA8 DB8)) DB6)
 < apply desugar_ty_unique to _ DT1 DT7.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DB4 DA4 DB6 DA7 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DA4
DT4 : desugar_ty Ty2 DA4
DT5 : desugar_ty Ty2 DA4
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty2 DB6
DTy : desugar_ty Ty2 DA7
DTy2 : desugar_ty Ty2 DA8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DA4 (abs "B" DA4 (abs "S" (arrowTy DA4 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 (arrowTy DA8 DB8)) DB6)
 < apply desugar_ty_unique to _ DT1 DT9.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DB4 DB6 DA7 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DB4
DT4 : desugar_ty Ty2 DB4
DT5 : desugar_ty Ty2 DB4
DT7 : desugar_ty Ty2 DB4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty2 DB6
DTy : desugar_ty Ty2 DA7
DTy2 : desugar_ty Ty2 DA8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DB4 (abs "B" DB4 (abs "S" (arrowTy DB4 (arrowTy DB4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 (arrowTy DA8 DB8)) DB6)
 < apply desugar_ty_unique to _ DT1 DTy1.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DB6 DA7 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DB6
DT4 : desugar_ty Ty2 DB6
DT5 : desugar_ty Ty2 DB6
DT7 : desugar_ty Ty2 DB6
DT9 : desugar_ty Ty2 DB6
DTy1 : desugar_ty Ty2 DB6
DTy : desugar_ty Ty2 DA7
DTy2 : desugar_ty Ty2 DA8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DB6 (abs "B" DB6 (abs "S" (arrowTy DB6 (arrowTy DB6 DB6)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 (arrowTy DA8 DB8)) DB6)
 < apply desugar_ty_unique to _ DT1 DTy.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DA7 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DA7
DT4 : desugar_ty Ty2 DA7
DT5 : desugar_ty Ty2 DA7
DT7 : desugar_ty Ty2 DA7
DT9 : desugar_ty Ty2 DA7
DTy1 : desugar_ty Ty2 DA7
DTy : desugar_ty Ty2 DA7
DTy2 : desugar_ty Ty2 DA8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DA7 (abs "B" DA7 (abs "S" (arrowTy DA7 (arrowTy DA7 DA7)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 (arrowTy DA8 DB8)) DA7)
 < apply desugar_ty_unique to _ DT1 DTy2.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DB8 DA8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DA8
DT4 : desugar_ty Ty2 DA8
DT5 : desugar_ty Ty2 DA8
DT7 : desugar_ty Ty2 DA8
DT9 : desugar_ty Ty2 DA8
DTy1 : desugar_ty Ty2 DA8
DTy : desugar_ty Ty2 DA8
DTy2 : desugar_ty Ty2 DA8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DA8 (abs "B" DA8 (abs "S" (arrowTy DA8 (arrowTy DA8 DA8)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA8 (arrowTy DA8 DB8)) DA8)
 < apply desugar_ty_unique to _ DT1 DTy3.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DB8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DB8
DT4 : desugar_ty Ty2 DB8
DT5 : desugar_ty Ty2 DB8
DT7 : desugar_ty Ty2 DB8
DT9 : desugar_ty Ty2 DB8
DTy1 : desugar_ty Ty2 DB8
DTy : desugar_ty Ty2 DB8
DTy2 : desugar_ty Ty2 DB8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
============================
 typeOf Ctx' (app (app (abs "A" DB8 (abs "B" DB8 (abs "S" (arrowTy DB8 (arrowTy DB8 DB8)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DB8 (arrowTy DB8 DB8)) DB8)
 < apply IH to _ _ Ty1 DT3 _ _.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DB8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DB8
DT4 : desugar_ty Ty2 DB8
DT5 : desugar_ty Ty2 DB8
DT7 : desugar_ty Ty2 DB8
DT9 : desugar_ty Ty2 DB8
DTy1 : desugar_ty Ty2 DB8
DTy : desugar_ty Ty2 DB8
DTy2 : desugar_ty Ty2 DB8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
H4 : typeOf Ctx' DB1 DB8
============================
 typeOf Ctx' (app (app (abs "A" DB8 (abs "B" DB8 (abs "S" (arrowTy DB8 (arrowTy DB8 DB8)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DB8 (arrowTy DB8 DB8)) DB8)
 < apply IH to _ _ Ty2 DT2 _ _.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1:

Variables: Ctx Ctx' T2 T1 Ty2 DB DB1 DB8
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty2) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty2 *
Ty2 : typeOf Ctx T2 Ty2 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DB8
DT4 : desugar_ty Ty2 DB8
DT5 : desugar_ty Ty2 DB8
DT7 : desugar_ty Ty2 DB8
DT9 : desugar_ty Ty2 DB8
DTy1 : desugar_ty Ty2 DB8
DTy : desugar_ty Ty2 DB8
DTy2 : desugar_ty Ty2 DB8
DTy3 : desugar_ty Ty2 DB8
H3 : is_ty Ty2
H4 : typeOf Ctx' DB1 DB8
H5 : typeOf Ctx' DB DB8
============================
 typeOf Ctx' (app (app (abs "A" DB8 (abs "B" DB8 (abs "S" (arrowTy DB8 (arrowTy DB8 DB8)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DB8 (arrowTy DB8 DB8)) DB8)
 < search 11.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2:

Variables: Ctx Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB6 DB7 DA7 Ty_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty1 DB6
DTy : desugar_ty Ty1 DA7
DTy2 : |{ty}- arrowTy Ty1 Ty1 ~~> Ty_P1
DTy3 : desugar_ty Ty_P1 DB7
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy (arrowTy DA7 DB7) DB6)
 < case DTy2.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.1.2:

Variables: Ctx Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB6 DA6 Ty_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy1 : desugar_ty Ty1 DB6
DTy : |{ty}- arrowTy Ty1 (arrowTy Ty1 Ty1) ~~> Ty_P1
DTy2 : desugar_ty Ty_P1 DA6
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) (arrowTy DA6 DB6)
 < case DTy.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 Ty_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DTy : |{ty}- arrowTy (arrowTy Ty1 (arrowTy Ty1 Ty1)) Ty1 ~~> Ty_P1
DTy1 : desugar_ty Ty_P1 Ty'
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") (var "A")) (var "B"))))) DB1) DB) Ty'
 < case DTy.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB5 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DT6 : (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) |{tm}- var "A" ~~> T_P1
DT8 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) T_P1 DB5
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app (var "S") DB5) (var "B"))))) DB1) DB) Ty'
 < case DT6.

Subgoal 6.1.1.1.1.1.1.1.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB4 DA4 DB5 DA5 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DT10 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "A") DB5
DT6 : (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) |{tm}- var "S" ~~> T_P1
DT8 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) T_P1 DA5
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app DA5 DB5) (var "B"))))) DB1) DB) Ty'
 < case DT6.

Subgoal 6.1.1.1.1.1.1.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB3 DB4 DA4 DB5 DA5 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DT6 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "S") DA5
DT10 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "A") DB5
DT8 : (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) |{tm}- var "B" ~~> T_P1
DT11 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) T_P1 DB3
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app (app DA5 DB5) DB3)))) DB1) DB) Ty'
 < case DT8.

Subgoal 6.1.1.1.1.1.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DA2 DB3 DA3 DB4 DA4 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT8 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "B") DB3
DT7 : desugar_ty Ty2 DA4
DT9 : desugar_ty Ty2 DB4
DT6 : (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) |{tm}- app (var "S") (var "A") ~~> T_P1
DT10 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) T_P1 DA3
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 (arrowTy DA4 DB4)) (app DA3 DB3)))) DB1) DB) Ty'
 < case DT6.

Subgoal 6.1.1.1.1.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DB2 DA2 DB3 DA3 Ty_P
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT6 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (app (var "S") (var "A")) DA3
DT8 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (var "B") DB3
DT7 : |{ty}- arrowTy Ty2 Ty2 ~~> Ty_P
DT9 : desugar_ty Ty_P DB2
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 DB2) (app DA3 DB3)))) DB1) DB) Ty'
 < case DT7.

Subgoal 6.1.1.1.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DTm2 DB2 DA2 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : desugar_ty Ty2 DA2
DT7 : desugar_ty (arrowTy Ty2 Ty2) DB2
DT6 : (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) |{tm}- app (app (var "S") (var "A")) (var "B") ~~> T_P1
DT8 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) T_P1 DTm2
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" (arrowTy DA2 DB2) DTm2))) DB1) DB) Ty'
 < case DT6.

Subgoal 6.1.1.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTy1 DTm2 DTy2 Ty_P
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT6 : desugar_tm (("S", arrowTy Ty2 (arrowTy Ty2 Ty2))::(("B", Ty2)::(("A", Ty2)::Ctx))) (app (app (var "S") (var "A")) (var "B")) DTm2
DT5 : |{ty}- arrowTy Ty2 (arrowTy Ty2 Ty2) ~~> Ty_P
DT7 : desugar_ty Ty_P DTy2
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 (abs "S" DTy2 DTm2))) DB1) DB) Ty'
 < case DT5.

Subgoal 6.1.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTy DTm1 DTy1 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : desugar_ty Ty2 DTy1
DT5 : (("B", Ty2)::(("A", Ty2)::Ctx)) |{tm}- abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B")) ~~> T_P1
DT6 : desugar_tm (("B", Ty2)::(("A", Ty2)::Ctx)) T_P1 DTm1
============================
 typeOf Ctx' (app (app (abs "A" DTy (abs "B" DTy1 DTm1)) DB1) DB) Ty'
 < case DT5.

Subgoal 6.1.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DTm DTy T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : desugar_ty Ty2 DTy
DT4 : (("A", Ty2)::Ctx) |{tm}- abs "B" Ty2 (abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B"))) ~~> T_P1
DT5 : desugar_tm (("A", Ty2)::Ctx) T_P1 DTm
============================
 typeOf Ctx' (app (app (abs "A" DTy DTm) DB1) DB) Ty'
 < case DT4.

Subgoal 6.1.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DB1 DA1 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT3 : desugar_tm Ctx T1 DB1
DT1 : Ctx |{tm}- abs "A" Ty2 (abs "B" Ty2 (abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B")))) ~~> T_P1
DT4 : desugar_tm Ctx T_P1 DA1
============================
 typeOf Ctx' (app (app DA1 DB1) DB) Ty'
 < case DT1.

Subgoal 6.1.2:

Variables: Ctx Ty' Ctx' Ty1 T2 T1 Ty2 DB DA T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT2 : desugar_tm Ctx T2 DB
DT1 : Ctx |{tm}- app (abs "A" Ty2 (abs "B" Ty2 (abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B"))))) T1 ~~> T_P1
DT3 : desugar_tm Ctx T_P1 DA
============================
 typeOf Ctx' (app DA DB) Ty'
 < case DT1.

Subgoal 6.2:

Variables: Ctx T' Ty' Ctx' Ty1 T2 T1 Ty2 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (pair T1 T2) (pairTy Ty1) @
DTy : desugar_ty (pairTy Ty1) Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 Ty1 *
Ty2 : typeOf Ctx T2 Ty1 *
H1 : is_tm T1
H2 : is_tm T2
DT : typeOf Ctx T1 Ty2
DT1 : Ctx |{tm}- app (app (abs "A" Ty2 (abs "B" Ty2 (abs "S" (arrowTy Ty2 (arrowTy Ty2 Ty2)) (app (app (var "S") (var "A")) (var "B"))))) T1) T2 ~~> T_P1
DT2 : desugar_tm Ctx T_P1 T'
============================
 typeOf Ctx' T' Ty'
 < case DT1.

Subgoal 7:

Variables: Ctx Ty T' Ty' Ctx' T1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsT : is_tm (fst T1)
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DT : desugar_tm Ctx (fst T1) T'
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
============================
 typeOf Ctx' T' Ty'
 < case IsT.

Subgoal 7:

Variables: Ctx Ty T' Ty' Ctx' T1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DT : desugar_tm Ctx (fst T1) T'
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
============================
 typeOf Ctx' T' Ty'
 < DT: case DT.

Subgoal 7:

Variables: Ctx Ty T' Ty' Ctx' T1 T_P
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : Ctx |{tm}- fst T1 ~~> T_P
DT1 : desugar_tm Ctx T_P T'
============================
 typeOf Ctx' T' Ty'
 < DT: case DT.

Subgoal 7:

Variables: Ctx Ty T' Ty' Ctx' T1 Ty1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT1 : desugar_tm Ctx (app T1 (abs "A" Ty1 (abs "B" Ty1 (var "A")))) T'
DT : typeOf Ctx T1 (pairTy Ty1)
============================
 typeOf Ctx' T' Ty'
 < DT: case DT1.

Subgoal 7.1:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DB DA
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_tm Ctx (abs "A" Ty1 (abs "B" Ty1 (var "A"))) DB
============================
 typeOf Ctx' (app DA DB) Ty'
 < DT: case DT2.

Subgoal 7.1.1:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTm DTy
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : desugar_tm (("A", Ty1)::Ctx) (abs "B" Ty1 (var "A")) DTm
============================
 typeOf Ctx' (app DA (abs "A" DTy DTm)) Ty'
 < DT: case DT3.

Subgoal 7.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTy DTm1 DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : desugar_ty Ty1 DTy1
DT4 : desugar_tm (("B", Ty1)::(("A", Ty1)::Ctx)) (var "A") DTm1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 DTm1))) Ty'
 < DT: case DT4.

Subgoal 7.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTy DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : desugar_ty Ty1 DTy1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < apply type_unique to _ _ DT Ty1.

Subgoal 7.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < IsP: apply type_is to _ _ Ty1.

Subgoal 7.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
IsP : is_ty (pairTy Ty)
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < case IsP.

Subgoal 7.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < DP: apply desugar_ty_exists to _ with
         Ty = pairTy Ty.

Subgoal 7.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
DP : desugar_ty (pairTy Ty) Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < apply IH to _ _ Ty1 DT1 _ _.

Subgoal 7.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
DP : desugar_ty (pairTy Ty) Ty'1
H3 : typeOf Ctx' DA Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < DP: case DP.

Subgoal 7.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1 Ty_P
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA Ty'1
DP : |{ty}- pairTy Ty ~~> Ty_P
DP1 : desugar_ty Ty_P Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < DP: case DP.

Subgoal 7.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA Ty'1
DP1 : desugar_ty (arrowTy (arrowTy Ty (arrowTy Ty Ty)) Ty) Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < DP: case DP1.

Subgoal 7.1.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DA1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy DA1 DB1)
DP : desugar_ty (arrowTy Ty (arrowTy Ty Ty)) DA1
DP1 : desugar_ty Ty DB1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < DP: case DP.

Subgoal 7.1.1.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DB2 DA2
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 DB2) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty (arrowTy Ty Ty) DB2
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < DP: case DP2.

Subgoal 7.1.1.1.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < apply desugar_ty_unique to _ DTy DT2.

Subgoal 7.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DTy DTy1 DB1 DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty DTy
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) DTy
 < apply desugar_ty_unique to _ DTy DT3.

Subgoal 7.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DTy1 DB1 DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty DTy1
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy1
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DTy1 (abs "B" DTy1 (var "A")))) DTy1
 < apply desugar_ty_unique to _ DTy DP1.

Subgoal 7.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DB1 DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty DB1
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DB1
DT3 : desugar_ty Ty DB1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DB1 (abs "B" DB1 (var "A")))) DB1
 < apply desugar_ty_unique to _ DTy DP.

Subgoal 7.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty DA2
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DA2
DT3 : desugar_ty Ty DA2
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DA2)
DP1 : desugar_ty Ty DA2
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DA2 (abs "B" DA2 (var "A")))) DA2
 < apply desugar_ty_unique to _ DTy DP2.

Subgoal 7.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty DA3
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DA3
DT3 : desugar_ty Ty DA3
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA3 (arrowTy DA3 DB3)) DA3)
DP1 : desugar_ty Ty DA3
DP : desugar_ty Ty DA3
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DA3 (abs "B" DA3 (var "A")))) DA3
 < apply desugar_ty_unique to _ DTy DP3.

Subgoal 7.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DB3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty DB3
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DB3
DT3 : desugar_ty Ty DB3
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DB3 (arrowTy DB3 DB3)) DB3)
DP1 : desugar_ty Ty DB3
DP : desugar_ty Ty DB3
DP2 : desugar_ty Ty DB3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DB3 (abs "B" DB3 (var "A")))) DB3
 < search 6.

Subgoal 7.1.1.1.1.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DB2 DA2 Ty_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 DB2) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : |{ty}- arrowTy Ty Ty ~~> Ty_P1
DP3 : desugar_ty Ty_P1 DB2
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < case DP2.

Subgoal 7.1.1.1.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DA1 Ty_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy DA1 DB1)
DP1 : desugar_ty Ty DB1
DP : |{ty}- arrowTy Ty (arrowTy Ty Ty) ~~> Ty_P1
DP2 : desugar_ty Ty_P1 DA1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < case DP.

Subgoal 7.1.1.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1 Ty_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA Ty'1
DP : |{ty}- arrowTy (arrowTy Ty (arrowTy Ty Ty)) Ty ~~> Ty_P1
DP1 : desugar_ty Ty_P1 Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "A")))) Ty'
 < case DP.

Subgoal 7.1.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTy DTm1 DTy1 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : desugar_ty Ty1 DTy1
DT4 : (("B", Ty1)::(("A", Ty1)::Ctx)) |{tm}- var "A" ~~> T_P1
DT5 : desugar_tm (("B", Ty1)::(("A", Ty1)::Ctx)) T_P1 DTm1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 DTm1))) Ty'
 < case DT4.

Subgoal 7.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTm DTy T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : (("A", Ty1)::Ctx) |{tm}- abs "B" Ty1 (var "A") ~~> T_P1
DT4 : desugar_tm (("A", Ty1)::Ctx) T_P1 DTm
============================
 typeOf Ctx' (app DA (abs "A" DTy DTm)) Ty'
 < case DT3.

Subgoal 7.1.2:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DB DA T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : Ctx |{tm}- abs "A" Ty1 (abs "B" Ty1 (var "A")) ~~> T_P1
DT3 : desugar_tm Ctx T_P1 DB
============================
 typeOf Ctx' (app DA DB) Ty'
 < case DT2.

Subgoal 7.2:

Variables: Ctx Ty T' Ty' Ctx' T1 Ty1 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (fst T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : Ctx |{tm}- app T1 (abs "A" Ty1 (abs "B" Ty1 (var "A"))) ~~> T_P1
DT2 : desugar_tm Ctx T_P1 T'
============================
 typeOf Ctx' T' Ty'
 < case DT1.

Subgoal 8:

Variables: Ctx Ty T' Ty' Ctx' T1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsT : is_tm (snd T1)
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DT : desugar_tm Ctx (snd T1) T'
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
============================
 typeOf Ctx' T' Ty'
 < case IsT.

Subgoal 8:

Variables: Ctx Ty T' Ty' Ctx' T1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DT : desugar_tm Ctx (snd T1) T'
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
============================
 typeOf Ctx' T' Ty'
 < DT: case DT.

Subgoal 8:

Variables: Ctx Ty T' Ty' Ctx' T1 T_P
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : Ctx |{tm}- snd T1 ~~> T_P
DT1 : desugar_tm Ctx T_P T'
============================
 typeOf Ctx' T' Ty'
 < DT: case DT.

Subgoal 8:

Variables: Ctx Ty T' Ty' Ctx' T1 Ty1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT1 : desugar_tm Ctx (app T1 (abs "A" Ty1 (abs "B" Ty1 (var "B")))) T'
DT : typeOf Ctx T1 (pairTy Ty1)
============================
 typeOf Ctx' T' Ty'
 < DT: case DT1.

Subgoal 8.1:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DB DA
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_tm Ctx (abs "A" Ty1 (abs "B" Ty1 (var "B"))) DB
============================
 typeOf Ctx' (app DA DB) Ty'
 < DT: case DT2.

Subgoal 8.1.1:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTm DTy
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : desugar_tm (("A", Ty1)::Ctx) (abs "B" Ty1 (var "B")) DTm
============================
 typeOf Ctx' (app DA (abs "A" DTy DTm)) Ty'
 < DT: case DT3.

Subgoal 8.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTy DTm1 DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : desugar_ty Ty1 DTy1
DT4 : desugar_tm (("B", Ty1)::(("A", Ty1)::Ctx)) (var "B") DTm1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 DTm1))) Ty'
 < DT: case DT4.

Subgoal 8.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTy DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : desugar_ty Ty1 DTy1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < apply type_unique to _ _ DT Ty1.

Subgoal 8.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < IsP: apply type_is to _ _ Ty1.

Subgoal 8.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
IsP : is_ty (pairTy Ty)
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < case IsP.

Subgoal 8.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < DP: apply desugar_ty_exists to _ with
         Ty = pairTy Ty.

Subgoal 8.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
DP : desugar_ty (pairTy Ty) Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < apply IH to _ _ Ty1 DT1 _ _.

Subgoal 8.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
DP : desugar_ty (pairTy Ty) Ty'1
H3 : typeOf Ctx' DA Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < DP: case DP.

Subgoal 8.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1 Ty_P
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA Ty'1
DP : |{ty}- pairTy Ty ~~> Ty_P
DP1 : desugar_ty Ty_P Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < DP: case DP.

Subgoal 8.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA Ty'1
DP1 : desugar_ty (arrowTy (arrowTy Ty (arrowTy Ty Ty)) Ty) Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < DP: case DP1.

Subgoal 8.1.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DA1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy DA1 DB1)
DP : desugar_ty (arrowTy Ty (arrowTy Ty Ty)) DA1
DP1 : desugar_ty Ty DB1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < DP: case DP.

Subgoal 8.1.1.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DB2 DA2
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 DB2) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty (arrowTy Ty Ty) DB2
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < DP: case DP2.

Subgoal 8.1.1.1.1.1.1.1:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < apply desugar_ty_unique to _ DTy DT2.

Subgoal 8.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DTy DTy1 DB1 DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty DTy
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) DTy
 < apply desugar_ty_unique to _ DTy DT3.

Subgoal 8.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DTy1 DB1 DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty DTy1
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy1
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DTy1 (abs "B" DTy1 (var "B")))) DTy1
 < apply desugar_ty_unique to _ DTy DP1.

Subgoal 8.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DB1 DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty DB1
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DB1
DT3 : desugar_ty Ty DB1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DB1 (abs "B" DB1 (var "B")))) DB1
 < apply desugar_ty_unique to _ DTy DP.

Subgoal 8.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DA2 DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty DA2
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DA2
DT3 : desugar_ty Ty DA2
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 (arrowTy DA3 DB3)) DA2)
DP1 : desugar_ty Ty DA2
DP : desugar_ty Ty DA2
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DA2 (abs "B" DA2 (var "B")))) DA2
 < apply desugar_ty_unique to _ DTy DP2.

Subgoal 8.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DB3 DA3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty DA3
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DA3
DT3 : desugar_ty Ty DA3
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA3 (arrowTy DA3 DB3)) DA3)
DP1 : desugar_ty Ty DA3
DP : desugar_ty Ty DA3
DP2 : desugar_ty Ty DA3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DA3 (abs "B" DA3 (var "B")))) DA3
 < apply desugar_ty_unique to _ DTy DP3.

Subgoal 8.1.1.1.1.1.1.1:

Variables: Ctx Ty Ctx' T1 DA DB3
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty DB3
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DB3
DT3 : desugar_ty Ty DB3
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DB3 (arrowTy DB3 DB3)) DB3)
DP1 : desugar_ty Ty DB3
DP : desugar_ty Ty DB3
DP2 : desugar_ty Ty DB3
DP3 : desugar_ty Ty DB3
============================
 typeOf Ctx' (app DA (abs "A" DB3 (abs "B" DB3 (var "B")))) DB3
 < search 6.

Subgoal 8.1.1.1.1.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DB2 DA2 Ty_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy (arrowTy DA2 DB2) DB1)
DP1 : desugar_ty Ty DB1
DP : desugar_ty Ty DA2
DP2 : |{ty}- arrowTy Ty Ty ~~> Ty_P1
DP3 : desugar_ty Ty_P1 DB2
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < case DP2.

Subgoal 8.1.1.1.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 DB1 DA1 Ty_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA (arrowTy DA1 DB1)
DP1 : desugar_ty Ty DB1
DP : |{ty}- arrowTy Ty (arrowTy Ty Ty) ~~> Ty_P1
DP2 : desugar_ty Ty_P1 DA1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < case DP.

Subgoal 8.1.1.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 DA DTy DTy1 Ty'1 Ty_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty DTy
DT3 : desugar_ty Ty DTy1
H2 : is_ty Ty
H3 : typeOf Ctx' DA Ty'1
DP : |{ty}- arrowTy (arrowTy Ty (arrowTy Ty Ty)) Ty ~~> Ty_P1
DP1 : desugar_ty Ty_P1 Ty'1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 (var "B")))) Ty'
 < case DP.

Subgoal 8.1.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTy DTm1 DTy1 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : desugar_ty Ty1 DTy1
DT4 : (("B", Ty1)::(("A", Ty1)::Ctx)) |{tm}- var "B" ~~> T_P1
DT5 : desugar_tm (("B", Ty1)::(("A", Ty1)::Ctx)) T_P1 DTm1
============================
 typeOf Ctx' (app DA (abs "A" DTy (abs "B" DTy1 DTm1))) Ty'
 < case DT4.

Subgoal 8.1.1.2:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DA DTm DTy T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : desugar_ty Ty1 DTy
DT3 : (("A", Ty1)::Ctx) |{tm}- abs "B" Ty1 (var "B") ~~> T_P1
DT4 : desugar_tm (("A", Ty1)::Ctx) T_P1 DTm
============================
 typeOf Ctx' (app DA (abs "A" DTy DTm)) Ty'
 < case DT3.

Subgoal 8.1.2:

Variables: Ctx Ty Ty' Ctx' T1 Ty1 DB DA T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : desugar_tm Ctx T1 DA
DT2 : Ctx |{tm}- abs "A" Ty1 (abs "B" Ty1 (var "B")) ~~> T_P1
DT3 : desugar_tm Ctx T_P1 DB
============================
 typeOf Ctx' (app DA DB) Ty'
 < case DT2.

Subgoal 8.2:

Variables: Ctx Ty T' Ty' Ctx' T1 Ty1 T_P1
IH : forall Ctx T Ty T' Ty' Ctx',
       is_tm T -> is_list (is_pair is_string is_ty) Ctx -> typeOf Ctx T Ty * -> desugar_tm Ctx T T' ->
       desugar_ty Ty Ty' -> desugar_ctx Ctx Ctx' -> typeOf Ctx' T' Ty'
IsCtx : is_list (is_pair is_string is_ty) Ctx
Ty : typeOf Ctx (snd T1) Ty @
DTy : desugar_ty Ty Ty'
DCtx : desugar_ctx Ctx Ctx'
Ty1 : typeOf Ctx T1 (pairTy Ty) *
H1 : is_tm T1
DT : typeOf Ctx T1 (pairTy Ty1)
DT1 : Ctx |{tm}- app T1 (abs "A" Ty1 (abs "B" Ty1 (var "B"))) ~~> T_P1
DT2 : desugar_tm Ctx T_P1 T'
============================
 typeOf Ctx' T' Ty'
 < case DT1.

Proof completed.
Back to example home