< 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.