< Module stlc:pair.
< Prove_Constraint stlc: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 stlc: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 stlc: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 stlc: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_Constraint stlc: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 stlc: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 stlc:host:subst_is. Subgoal 8: Variables: X R T21 T11 T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsT : is_tm (pair T1 T2) IsX : is_string X IsR : is_tm R S : subst X R (pair T1 T2) (pair T11 T21) @ S1 : subst X R T1 T11 * S2 : subst X R T2 T21 * ============================ is_tm (pair T11 T21)
< Is: case IsT. Subgoal 8: Variables: X R T21 T11 T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsX : is_string X IsR : is_tm R S : subst X R (pair T1 T2) (pair T11 T21) @ S1 : subst X R T1 T11 * S2 : subst X R T2 T21 * Is : is_tm T1 Is1 : is_tm T2 ============================ is_tm (pair T11 T21)
< apply IH to _ _ _ S1. Subgoal 8: Variables: X R T21 T11 T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsX : is_string X IsR : is_tm R S : subst X R (pair T1 T2) (pair T11 T21) @ S1 : subst X R T1 T11 * S2 : subst X R T2 T21 * Is : is_tm T1 Is1 : is_tm T2 H1 : is_tm T11 ============================ is_tm (pair T11 T21)
< apply IH to _ _ _ S2. Subgoal 8: Variables: X R T21 T11 T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsX : is_string X IsR : is_tm R S : subst X R (pair T1 T2) (pair T11 T21) @ S1 : subst X R T1 T11 * S2 : subst X R T2 T21 * Is : is_tm T1 Is1 : is_tm T2 H1 : is_tm T11 H2 : is_tm T21 ============================ is_tm (pair T11 T21)
< search. Subgoal 9: Variables: X R T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsT : is_tm (fst T1) IsX : is_string X IsR : is_tm R S : subst X R (fst T1) (fst T2) @ S1 : subst X R T1 T2 * ============================ is_tm (fst T2)
< Is: case IsT. Subgoal 9: Variables: X R T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsX : is_string X IsR : is_tm R S : subst X R (fst T1) (fst T2) @ S1 : subst X R T1 T2 * Is : is_tm T1 ============================ is_tm (fst T2)
< apply IH to _ _ _ S1. Subgoal 9: Variables: X R T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsX : is_string X IsR : is_tm R S : subst X R (fst T1) (fst T2) @ S1 : subst X R T1 T2 * Is : is_tm T1 H1 : is_tm T2 ============================ is_tm (fst T2)
< search. Subgoal 10: Variables: X R T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsT : is_tm (snd T1) IsX : is_string X IsR : is_tm R S : subst X R (snd T1) (snd T2) @ S1 : subst X R T1 T2 * ============================ is_tm (snd T2)
< Is: case IsT. Subgoal 10: Variables: X R T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsX : is_string X IsR : is_tm R S : subst X R (snd T1) (snd T2) @ S1 : subst X R T1 T2 * Is : is_tm T1 ============================ is_tm (snd T2)
< apply IH to _ _ _ S1. Subgoal 10: Variables: X R T2 T1 IH : forall X R T S, is_tm T -> is_string X -> is_tm R -> subst X R T S * -> is_tm S IsX : is_string X IsR : is_tm R S : subst X R (snd T1) (snd T2) @ S1 : subst X R T1 T2 * Is : is_tm T1 H1 : is_tm T2 ============================ is_tm (snd T2)
< search. Proof completed.
< Prove stlc:host:eval_is. Subgoal 7: Variables: T2 T11 T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' IsT : is_tm (pair T1 T2) Ev : eval (pair T1 T2) (pair T11 T2) @ Ev1 : eval T1 T11 * ============================ is_tm (pair T11 T2)
< Is: case IsT. Subgoal 7: Variables: T2 T11 T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (pair T1 T2) (pair T11 T2) @ Ev1 : eval T1 T11 * Is : is_tm T1 Is1 : is_tm T2 ============================ is_tm (pair T11 T2)
< apply IH to _ Ev1. Subgoal 7: Variables: T2 T11 T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (pair T1 T2) (pair T11 T2) @ Ev1 : eval T1 T11 * Is : is_tm T1 Is1 : is_tm T2 H1 : is_tm T11 ============================ is_tm (pair T11 T2)
< search. Subgoal 8: Variables: T21 T1 T2 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' IsT : is_tm (pair T1 T2) Ev : eval (pair T1 T2) (pair T1 T21) @ Ev1 : value T1 Ev2 : eval T2 T21 * ============================ is_tm (pair T1 T21)
< Is: case IsT. Subgoal 8: Variables: T21 T1 T2 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (pair T1 T2) (pair T1 T21) @ Ev1 : value T1 Ev2 : eval T2 T21 * Is : is_tm T1 Is1 : is_tm T2 ============================ is_tm (pair T1 T21)
< apply IH to _ Ev2. Subgoal 8: Variables: T21 T1 T2 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (pair T1 T2) (pair T1 T21) @ Ev1 : value T1 Ev2 : eval T2 T21 * Is : is_tm T1 Is1 : is_tm T2 H1 : is_tm T21 ============================ is_tm (pair T1 T21)
< search. Subgoal 9: Variables: T2 T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' IsT : is_tm (fst T1) Ev : eval (fst T1) (fst T2) @ Ev1 : eval T1 T2 * ============================ is_tm (fst T2)
< Is: case IsT. Subgoal 9: Variables: T2 T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (fst T1) (fst T2) @ Ev1 : eval T1 T2 * Is : is_tm T1 ============================ is_tm (fst T2)
< apply IH to _ Ev1. Subgoal 9: Variables: T2 T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (fst T1) (fst T2) @ Ev1 : eval T1 T2 * Is : is_tm T1 H1 : is_tm T2 ============================ is_tm (fst T2)
< search. Subgoal 10: Variables: T' T2 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' IsT : is_tm (fst (pair T' T2)) Ev : eval (fst (pair T' T2)) T' @ Ev1 : value (pair T' T2) ============================ is_tm T'
< Is: case IsT. Subgoal 10: Variables: T' T2 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (fst (pair T' T2)) T' @ Ev1 : value (pair T' T2) Is : is_tm (pair T' T2) ============================ is_tm T'
< case Is. Subgoal 10: Variables: T' T2 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (fst (pair T' T2)) T' @ Ev1 : value (pair T' T2) H1 : is_tm T' H2 : is_tm T2 ============================ is_tm T'
< search. Subgoal 11: Variables: T2 T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' IsT : is_tm (snd T1) Ev : eval (snd T1) (snd T2) @ Ev1 : eval T1 T2 * ============================ is_tm (snd T2)
< Is: case IsT. Subgoal 11: Variables: T2 T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (snd T1) (snd T2) @ Ev1 : eval T1 T2 * Is : is_tm T1 ============================ is_tm (snd T2)
< apply IH to _ Ev1. Subgoal 11: Variables: T2 T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (snd T1) (snd T2) @ Ev1 : eval T1 T2 * Is : is_tm T1 H1 : is_tm T2 ============================ is_tm (snd T2)
< search. Subgoal 12: Variables: T' T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' IsT : is_tm (snd (pair T1 T')) Ev : eval (snd (pair T1 T')) T' @ Ev1 : value (pair T1 T') ============================ is_tm T'
< Is: case IsT. Subgoal 12: Variables: T' T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (snd (pair T1 T')) T' @ Ev1 : value (pair T1 T') Is : is_tm (pair T1 T') ============================ is_tm T'
< case Is. Subgoal 12: Variables: T' T1 IH : forall T T', is_tm T -> eval T T' * -> is_tm T' Ev : eval (snd (pair T1 T')) T' @ Ev1 : value (pair T1 T') H1 : is_tm T1 H2 : is_tm T' ============================ is_tm T'
< search. Proof completed.
< Prove stlc:host:subst_unique. Subgoal 8: Variables: X R VB T21 T11 T2 T1 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (pair T1 T2) (pair T11 T21) @ SB : subst X R (pair T1 T2) VB SA1 : subst X R T1 T11 * SA2 : subst X R T2 T21 * ============================ pair T11 T21 = VB
< SB: case SB. Subgoal 8: Variables: X R T21 T11 T2 T1 T6 T5 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (pair T1 T2) (pair T11 T21) @ SA1 : subst X R T1 T11 * SA2 : subst X R T2 T21 * SB : subst X R T1 T5 SB1 : subst X R T2 T6 ============================ pair T11 T21 = pair T5 T6
< apply IH to SA1 SB. Subgoal 8: Variables: X R T21 T2 T1 T6 T5 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (pair T1 T2) (pair T5 T21) @ SA1 : subst X R T1 T5 * SA2 : subst X R T2 T21 * SB : subst X R T1 T5 SB1 : subst X R T2 T6 ============================ pair T5 T21 = pair T5 T6
< apply IH to SA2 SB1. Subgoal 8: Variables: X R T2 T1 T6 T5 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (pair T1 T2) (pair T5 T6) @ SA1 : subst X R T1 T5 * SA2 : subst X R T2 T6 * SB : subst X R T1 T5 SB1 : subst X R T2 T6 ============================ pair T5 T6 = pair T5 T6
< search. Subgoal 9: Variables: X R VB T2 T1 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (fst T1) (fst T2) @ SB : subst X R (fst T1) VB SA1 : subst X R T1 T2 * ============================ fst T2 = VB
< SB: case SB. Subgoal 9: Variables: X R T2 T1 T4 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (fst T1) (fst T2) @ SA1 : subst X R T1 T2 * SB : subst X R T1 T4 ============================ fst T2 = fst T4
< apply IH to SA1 SB. Subgoal 9: Variables: X R T1 T4 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (fst T1) (fst T4) @ SA1 : subst X R T1 T4 * SB : subst X R T1 T4 ============================ fst T4 = fst T4
< search. Subgoal 10: Variables: X R VB T2 T1 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (snd T1) (snd T2) @ SB : subst X R (snd T1) VB SA1 : subst X R T1 T2 * ============================ snd T2 = VB
< SB: case SB. Subgoal 10: Variables: X R T2 T1 T4 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (snd T1) (snd T2) @ SA1 : subst X R T1 T2 * SB : subst X R T1 T4 ============================ snd T2 = snd T4
< apply IH to SA1 SB. Subgoal 10: Variables: X R T1 T4 IH : forall X R T VA VB, subst X R T VA * -> subst X R T VB -> VA = VB SA : subst X R (snd T1) (snd T4) @ SA1 : subst X R T1 T4 * SB : subst X R T1 T4 ============================ snd T4 = snd T4
< search. Proof completed.
< Prove stlc:host:value_eval_false. Subgoal 3: Variables: V T2 T1 IH : forall T V, value T * -> eval T V -> false Val : value (pair T1 T2) @ Ev : eval (pair T1 T2) V Val1 : value T1 * Val2 : value T2 * ============================ false
< Ev: case Ev. Subgoal 3.1: Variables: T2 T1 T11 IH : forall T V, value T * -> eval T V -> false Val : value (pair T1 T2) @ Val1 : value T1 * Val2 : value T2 * Ev : eval T1 T11 ============================ false
< apply IH to Val1 Ev. Subgoal 3.2: Variables: T2 T1 T21 IH : forall T V, value T * -> eval T V -> false Val : value (pair T1 T2) @ Val1 : value T1 * Val2 : value T2 * Ev : value T1 Ev1 : eval T2 T21 ============================ false
< apply IH to Val2 Ev1. Proof completed.
< Prove stlc:host:eval_unique. Subgoal 7: Variables: VB T2 T11 T1 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (pair T1 T2) (pair T11 T2) @ EvB : eval (pair T1 T2) VB EvA1 : eval T1 T11 * ============================ pair T11 T2 = VB
< EvB: case EvB. Subgoal 7.1: Variables: T2 T11 T1 T5 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (pair T1 T2) (pair T11 T2) @ EvA1 : eval T1 T11 * EvB : eval T1 T5 ============================ pair T11 T2 = pair T5 T2
< apply IH to EvA1 EvB. Subgoal 7.1: Variables: T2 T1 T5 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (pair T1 T2) (pair T5 T2) @ EvA1 : eval T1 T5 * EvB : eval T1 T5 ============================ pair T5 T2 = pair T5 T2
< search. Subgoal 7.2: Variables: T2 T11 T1 T21 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (pair T1 T2) (pair T11 T2) @ EvA1 : eval T1 T11 * EvB : value T1 EvB1 : eval T2 T21 ============================ pair T11 T2 = pair T1 T21
< apply value_eval_false to EvB EvA1. Subgoal 8: Variables: VB T21 T1 T2 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (pair T1 T2) (pair T1 T21) @ EvB : eval (pair T1 T2) VB EvA1 : value T1 EvA2 : eval T2 T21 * ============================ pair T1 T21 = VB
< EvB: case EvB. Subgoal 8.1: Variables: T21 T1 T2 T11 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (pair T1 T2) (pair T1 T21) @ EvA1 : value T1 EvA2 : eval T2 T21 * EvB : eval T1 T11 ============================ pair T1 T21 = pair T11 T2
< apply value_eval_false to EvA1 EvB. Subgoal 8.2: Variables: T21 T1 T2 T5 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (pair T1 T2) (pair T1 T21) @ EvA1 : value T1 EvA2 : eval T2 T21 * EvB : value T1 EvB1 : eval T2 T5 ============================ pair T1 T21 = pair T1 T5
< apply IH to EvA2 EvB1. Subgoal 8.2: Variables: T1 T2 T5 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (pair T1 T2) (pair T1 T5) @ EvA1 : value T1 EvA2 : eval T2 T5 * EvB : value T1 EvB1 : eval T2 T5 ============================ pair T1 T5 = pair T1 T5
< search. Subgoal 9: Variables: VB T2 T1 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (fst T1) (fst T2) @ EvB : eval (fst T1) VB EvA1 : eval T1 T2 * ============================ fst T2 = VB
< EvB: case EvB. Subgoal 9.1: Variables: T2 T1 T4 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (fst T1) (fst T2) @ EvA1 : eval T1 T2 * EvB : eval T1 T4 ============================ fst T2 = fst T4
< apply IH to EvA1 EvB. Subgoal 9.1: Variables: T1 T4 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (fst T1) (fst T4) @ EvA1 : eval T1 T4 * EvB : eval T1 T4 ============================ fst T4 = fst T4
< search. Subgoal 9.2: Variables: VB T2 T4 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (fst (pair VB T4)) (fst T2) @ EvA1 : eval (pair VB T4) T2 * EvB : value (pair VB T4) ============================ fst T2 = VB
< apply value_eval_false to EvB EvA1. Subgoal 10: Variables: VA VB T2 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (fst (pair VA T2)) VA @ EvB : eval (fst (pair VA T2)) VB EvA1 : value (pair VA T2) ============================ VA = VB
< EvB: case EvB. Subgoal 10.1: Variables: VA T2 T3 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (fst (pair VA T2)) VA @ EvA1 : value (pair VA T2) EvB : eval (pair VA T2) T3 ============================ VA = fst T3
< apply value_eval_false to EvA1 EvB. Subgoal 10.2: Variables: VB T2 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (fst (pair VB T2)) VB @ EvA1 : value (pair VB T2) EvB : value (pair VB T2) ============================ VB = VB
< search. Subgoal 11: Variables: VB T2 T1 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (snd T1) (snd T2) @ EvB : eval (snd T1) VB EvA1 : eval T1 T2 * ============================ snd T2 = VB
< EvB: case EvB. Subgoal 11.1: Variables: T2 T1 T4 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (snd T1) (snd T2) @ EvA1 : eval T1 T2 * EvB : eval T1 T4 ============================ snd T2 = snd T4
< apply IH to EvA1 EvB. Subgoal 11.1: Variables: T1 T4 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (snd T1) (snd T4) @ EvA1 : eval T1 T4 * EvB : eval T1 T4 ============================ snd T4 = snd T4
< search. Subgoal 11.2: Variables: VB T2 T3 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (snd (pair T3 VB)) (snd T2) @ EvA1 : eval (pair T3 VB) T2 * EvB : value (pair T3 VB) ============================ snd T2 = VB
< apply value_eval_false to EvB EvA1. Subgoal 12: Variables: VA VB T1 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (snd (pair T1 VA)) VA @ EvB : eval (snd (pair T1 VA)) VB EvA1 : value (pair T1 VA) ============================ VA = VB
< EvB: case EvB. Subgoal 12.1: Variables: VA T1 T3 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (snd (pair T1 VA)) VA @ EvA1 : value (pair T1 VA) EvB : eval (pair T1 VA) T3 ============================ VA = snd T3
< apply value_eval_false to EvA1 EvB. Subgoal 12.2: Variables: VB T1 IH : forall T VA VB, eval T VA * -> eval T VB -> VA = VB EvA : eval (snd (pair T1 VB)) VB @ EvA1 : value (pair T1 VB) EvB : value (pair T1 VB) ============================ VB = VB
< search. Proof completed.
< Prove stlc: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 stlc:host:subst_type_preservation. Subgoal 8: Variables: Ctx X XTy Ty R T21 T11 T2 T1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty TTy : typeOf ((X, XTy)::Ctx) (pair T1 T2) Ty S : subst X R (pair T1 T2) (pair T11 T21) @ RTy : typeOf [] R XTy S1 : subst X R T1 T11 * S2 : subst X R T2 T21 * ============================ typeOf Ctx (pair T11 T21) Ty
< Ty: case TTy. Subgoal 8: Variables: Ctx X XTy R T21 T11 T2 T1 Ty1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty S : subst X R (pair T1 T2) (pair T11 T21) @ RTy : typeOf [] R XTy S1 : subst X R T1 T11 * S2 : subst X R T2 T21 * Ty : typeOf ((X, XTy)::Ctx) T1 Ty1 Ty1 : typeOf ((X, XTy)::Ctx) T2 Ty1 ============================ typeOf Ctx (pair T11 T21) (pairTy Ty1)
< apply IH to Ty S1 RTy. Subgoal 8: Variables: Ctx X XTy R T21 T11 T2 T1 Ty1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty S : subst X R (pair T1 T2) (pair T11 T21) @ RTy : typeOf [] R XTy S1 : subst X R T1 T11 * S2 : subst X R T2 T21 * Ty : typeOf ((X, XTy)::Ctx) T1 Ty1 Ty1 : typeOf ((X, XTy)::Ctx) T2 Ty1 H1 : typeOf Ctx T11 Ty1 ============================ typeOf Ctx (pair T11 T21) (pairTy Ty1)
< apply IH to Ty1 S2 RTy. Subgoal 8: Variables: Ctx X XTy R T21 T11 T2 T1 Ty1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty S : subst X R (pair T1 T2) (pair T11 T21) @ RTy : typeOf [] R XTy S1 : subst X R T1 T11 * S2 : subst X R T2 T21 * Ty : typeOf ((X, XTy)::Ctx) T1 Ty1 Ty1 : typeOf ((X, XTy)::Ctx) T2 Ty1 H1 : typeOf Ctx T11 Ty1 H2 : typeOf Ctx T21 Ty1 ============================ typeOf Ctx (pair T11 T21) (pairTy Ty1)
< search. Subgoal 9: Variables: Ctx X XTy Ty R T2 T1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty TTy : typeOf ((X, XTy)::Ctx) (fst T1) Ty S : subst X R (fst T1) (fst T2) @ RTy : typeOf [] R XTy S1 : subst X R T1 T2 * ============================ typeOf Ctx (fst T2) Ty
< Ty: case TTy. Subgoal 9: Variables: Ctx X XTy Ty R T2 T1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty S : subst X R (fst T1) (fst T2) @ RTy : typeOf [] R XTy S1 : subst X R T1 T2 * Ty : typeOf ((X, XTy)::Ctx) T1 (pairTy Ty) ============================ typeOf Ctx (fst T2) Ty
< apply IH to Ty S1 RTy. Subgoal 9: Variables: Ctx X XTy Ty R T2 T1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty S : subst X R (fst T1) (fst T2) @ RTy : typeOf [] R XTy S1 : subst X R T1 T2 * Ty : typeOf ((X, XTy)::Ctx) T1 (pairTy Ty) H1 : typeOf Ctx T2 (pairTy Ty) ============================ typeOf Ctx (fst T2) Ty
< search. Subgoal 10: Variables: Ctx X XTy Ty R T2 T1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty TTy : typeOf ((X, XTy)::Ctx) (snd T1) Ty S : subst X R (snd T1) (snd T2) @ RTy : typeOf [] R XTy S1 : subst X R T1 T2 * ============================ typeOf Ctx (snd T2) Ty
< Ty: case TTy. Subgoal 10: Variables: Ctx X XTy Ty R T2 T1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty S : subst X R (snd T1) (snd T2) @ RTy : typeOf [] R XTy S1 : subst X R T1 T2 * Ty : typeOf ((X, XTy)::Ctx) T1 (pairTy Ty) ============================ typeOf Ctx (snd T2) Ty
< apply IH to Ty S1 RTy. Subgoal 10: Variables: Ctx X XTy Ty R T2 T1 IH : forall T Ctx X XTy Ty R S, typeOf ((X, XTy)::Ctx) T Ty -> subst X R T S * -> typeOf [] R XTy -> typeOf Ctx S Ty S : subst X R (snd T1) (snd T2) @ RTy : typeOf [] R XTy S1 : subst X R T1 T2 * Ty : typeOf ((X, XTy)::Ctx) T1 (pairTy Ty) H1 : typeOf Ctx T2 (pairTy Ty) ============================ typeOf Ctx (snd T2) Ty
< search. Proof completed.
< Prove stlc:host:type_preservation. Subgoal 7: Variables: Ty T2 T11 T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ty : typeOf [] (pair T1 T2) Ty Ev : eval (pair T1 T2) (pair T11 T2) @ Ev1 : eval T1 T11 * ============================ typeOf [] (pair T11 T2) Ty
< Ty: case Ty. Subgoal 7: Variables: T2 T11 T1 Ty1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (pair T1 T2) (pair T11 T2) @ Ev1 : eval T1 T11 * Ty : typeOf [] T1 Ty1 Ty1 : typeOf [] T2 Ty1 ============================ typeOf [] (pair T11 T2) (pairTy Ty1)
< apply IH to Ty Ev1. Subgoal 7: Variables: T2 T11 T1 Ty1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (pair T1 T2) (pair T11 T2) @ Ev1 : eval T1 T11 * Ty : typeOf [] T1 Ty1 Ty1 : typeOf [] T2 Ty1 H1 : typeOf [] T11 Ty1 ============================ typeOf [] (pair T11 T2) (pairTy Ty1)
< search. Subgoal 8: Variables: Ty T21 T1 T2 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ty : typeOf [] (pair T1 T2) Ty Ev : eval (pair T1 T2) (pair T1 T21) @ Ev1 : value T1 Ev2 : eval T2 T21 * ============================ typeOf [] (pair T1 T21) Ty
< Ty: case Ty. Subgoal 8: Variables: T21 T1 T2 Ty1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (pair T1 T2) (pair T1 T21) @ Ev1 : value T1 Ev2 : eval T2 T21 * Ty : typeOf [] T1 Ty1 Ty1 : typeOf [] T2 Ty1 ============================ typeOf [] (pair T1 T21) (pairTy Ty1)
< apply IH to Ty1 Ev2. Subgoal 8: Variables: T21 T1 T2 Ty1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (pair T1 T2) (pair T1 T21) @ Ev1 : value T1 Ev2 : eval T2 T21 * Ty : typeOf [] T1 Ty1 Ty1 : typeOf [] T2 Ty1 H1 : typeOf [] T21 Ty1 ============================ typeOf [] (pair T1 T21) (pairTy Ty1)
< search. Subgoal 9: Variables: Ty T2 T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ty : typeOf [] (fst T1) Ty Ev : eval (fst T1) (fst T2) @ Ev1 : eval T1 T2 * ============================ typeOf [] (fst T2) Ty
< Ty: case Ty. Subgoal 9: Variables: Ty T2 T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (fst T1) (fst T2) @ Ev1 : eval T1 T2 * Ty : typeOf [] T1 (pairTy Ty) ============================ typeOf [] (fst T2) Ty
< apply IH to Ty Ev1. Subgoal 9: Variables: Ty T2 T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (fst T1) (fst T2) @ Ev1 : eval T1 T2 * Ty : typeOf [] T1 (pairTy Ty) H1 : typeOf [] T2 (pairTy Ty) ============================ typeOf [] (fst T2) Ty
< search. Subgoal 10: Variables: Ty T' T2 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ty : typeOf [] (fst (pair T' T2)) Ty Ev : eval (fst (pair T' T2)) T' @ Ev1 : value (pair T' T2) ============================ typeOf [] T' Ty
< Ty: case Ty. Subgoal 10: Variables: Ty T' T2 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (fst (pair T' T2)) T' @ Ev1 : value (pair T' T2) Ty : typeOf [] (pair T' T2) (pairTy Ty) ============================ typeOf [] T' Ty
< case Ty. Subgoal 10: Variables: Ty T' T2 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (fst (pair T' T2)) T' @ Ev1 : value (pair T' T2) H1 : typeOf [] T' Ty H2 : typeOf [] T2 Ty ============================ typeOf [] T' Ty
< search. Subgoal 11: Variables: Ty T2 T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ty : typeOf [] (snd T1) Ty Ev : eval (snd T1) (snd T2) @ Ev1 : eval T1 T2 * ============================ typeOf [] (snd T2) Ty
< Ty: case Ty. Subgoal 11: Variables: Ty T2 T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (snd T1) (snd T2) @ Ev1 : eval T1 T2 * Ty : typeOf [] T1 (pairTy Ty) ============================ typeOf [] (snd T2) Ty
< apply IH to Ty Ev1. Subgoal 11: Variables: Ty T2 T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (snd T1) (snd T2) @ Ev1 : eval T1 T2 * Ty : typeOf [] T1 (pairTy Ty) H1 : typeOf [] T2 (pairTy Ty) ============================ typeOf [] (snd T2) Ty
< search. Subgoal 12: Variables: Ty T' T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ty : typeOf [] (snd (pair T1 T')) Ty Ev : eval (snd (pair T1 T')) T' @ Ev1 : value (pair T1 T') ============================ typeOf [] T' Ty
< Ty: case Ty. Subgoal 12: Variables: Ty T' T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (snd (pair T1 T')) T' @ Ev1 : value (pair T1 T') Ty : typeOf [] (pair T1 T') (pairTy Ty) ============================ typeOf [] T' Ty
< case Ty. Subgoal 12: Variables: Ty T' T1 IH : forall T Ty T', typeOf [] T Ty -> eval T T' * -> typeOf [] T' Ty Ev : eval (snd (pair T1 T')) T' @ Ev1 : value (pair T1 T') H1 : typeOf [] T1 Ty H2 : typeOf [] T' Ty ============================ typeOf [] T' Ty
< search. Proof completed.
< Prove stlc:host:subst_total. Subgoal 6: Variables: X R Tm Tm1 IH : forall X R T, is_tm T * -> is_string X -> exists S, subst X R T S IsT : is_tm (pair Tm1 Tm) @ IsX : is_string X IsT1 : is_tm Tm1 * IsT2 : is_tm Tm * ============================ exists S, subst X R (pair Tm1 Tm) S
< apply IH to IsT1 IsX with R = R. Subgoal 6: Variables: X R Tm Tm1 S IH : forall X R T, is_tm T * -> is_string X -> exists S, subst X R T S IsT : is_tm (pair Tm1 Tm) @ IsX : is_string X IsT1 : is_tm Tm1 * IsT2 : is_tm Tm * H1 : subst X R Tm1 S ============================ exists S, subst X R (pair Tm1 Tm) S
< apply IH to IsT2 IsX with R = R. Subgoal 6: Variables: X R Tm Tm1 S S1 IH : forall X R T, is_tm T * -> is_string X -> exists S, subst X R T S IsT : is_tm (pair Tm1 Tm) @ IsX : is_string X IsT1 : is_tm Tm1 * IsT2 : is_tm Tm * H1 : subst X R Tm1 S H2 : subst X R Tm S1 ============================ exists S, subst X R (pair Tm1 Tm) S
< search. Subgoal 7: Variables: X R Tm IH : forall X R T, is_tm T * -> is_string X -> exists S, subst X R T S IsT : is_tm (fst Tm) @ IsX : is_string X IsT1 : is_tm Tm * ============================ exists S, subst X R (fst Tm) S
< apply IH to IsT1 IsX with R = R. Subgoal 7: Variables: X R Tm S IH : forall X R T, is_tm T * -> is_string X -> exists S, subst X R T S IsT : is_tm (fst Tm) @ IsX : is_string X IsT1 : is_tm Tm * H1 : subst X R Tm S ============================ exists S, subst X R (fst Tm) S
< search. Subgoal 8: Variables: X R Tm IH : forall X R T, is_tm T * -> is_string X -> exists S, subst X R T S IsT : is_tm (snd Tm) @ IsX : is_string X IsT1 : is_tm Tm * ============================ exists S, subst X R (snd Tm) S
< apply IH to IsT1 IsX with R = R. Subgoal 8: Variables: X R Tm S IH : forall X R T, is_tm T * -> is_string X -> exists S, subst X R T S IsT : is_tm (snd Tm) @ IsX : is_string X IsT1 : is_tm Tm * H1 : subst X R Tm S ============================ exists S, subst X R (snd Tm) S
< search. Proof completed.
< Prove stlc:host:canonical_forms. Subgoal 3: Variables: Ty T2 T1 IH : forall V Ty, value V * -> typeOf [] V Ty -> canonicalForm Ty V V : value (pair T1 T2) @ Ty : typeOf [] (pair T1 T2) Ty V1 : value T1 * V2 : value T2 * ============================ canonicalForm Ty (pair T1 T2)
< Ty: case Ty. Subgoal 3: Variables: T2 T1 Ty1 IH : forall V Ty, value V * -> typeOf [] V Ty -> canonicalForm Ty V V : value (pair T1 T2) @ V1 : value T1 * V2 : value T2 * Ty : typeOf [] T1 Ty1 Ty1 : typeOf [] T2 Ty1 ============================ canonicalForm (pairTy Ty1) (pair T1 T2)
< search. Proof completed.
< Theorem canonical_form_pairTy : forall V Ty, value V -> typeOf [] V (pairTy Ty) -> exists A B, V = pair A B. ============================ forall V Ty, value V -> typeOf [] V (pairTy Ty) -> exists A B, V = pair A B
< intros V Ty. Variables: V Ty V : value V Ty : typeOf [] V (pairTy Ty) ============================ exists A B, V = pair A B
< CF: apply canonical_forms to V Ty. Variables: V Ty V : value V Ty : typeOf [] V (pairTy Ty) CF : canonicalForm (pairTy Ty) V ============================ exists A B, V = pair A B
< case CF. Variables: Ty B A V : value (pair A B) Ty : typeOf [] (pair A B) (pairTy Ty) ============================ exists A1 B1, pair A B = pair A1 B1
< search. Proof completed.
< Prove stlc:host:progress. Subgoal 6: Variables: Ty1 T2 T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T IsT : is_tm (pair T1 T2) Ty : typeOf [] (pair T1 T2) (pairTy Ty1) @ Ty1 : typeOf [] T1 Ty1 * Ty2 : typeOf [] T2 Ty1 * ============================ (exists T', eval (pair T1 T2) T') \/ value (pair T1 T2)
< Is: case IsT. Subgoal 6: Variables: Ty1 T2 T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (pair T1 T2) (pairTy Ty1) @ Ty1 : typeOf [] T1 Ty1 * Ty2 : typeOf [] T2 Ty1 * Is : is_tm T1 Is1 : is_tm T2 ============================ (exists T', eval (pair T1 T2) T') \/ value (pair T1 T2)
< Or1: apply IH to _ Ty1. Subgoal 6: Variables: Ty1 T2 T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (pair T1 T2) (pairTy Ty1) @ Ty1 : typeOf [] T1 Ty1 * Ty2 : typeOf [] T2 Ty1 * Is : is_tm T1 Is1 : is_tm T2 Or1 : (exists T', eval T1 T') \/ value T1 ============================ (exists T', eval (pair T1 T2) T') \/ value (pair T1 T2)
< Or2: apply IH to _ Ty2. Subgoal 6: Variables: Ty1 T2 T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (pair T1 T2) (pairTy Ty1) @ Ty1 : typeOf [] T1 Ty1 * Ty2 : typeOf [] T2 Ty1 * Is : is_tm T1 Is1 : is_tm T2 Or1 : (exists T', eval T1 T') \/ value T1 Or2 : (exists T', eval T2 T') \/ value T2 ============================ (exists T', eval (pair T1 T2) T') \/ value (pair T1 T2)
< EV1: case Or1. Subgoal 6.1: Variables: Ty1 T2 T1 T' IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (pair T1 T2) (pairTy Ty1) @ Ty1 : typeOf [] T1 Ty1 * Ty2 : typeOf [] T2 Ty1 * Is : is_tm T1 Is1 : is_tm T2 Or2 : (exists T', eval T2 T') \/ value T2 EV1 : eval T1 T' ============================ (exists T', eval (pair T1 T2) T') \/ value (pair T1 T2)
< search. Subgoal 6.2: Variables: Ty1 T2 T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (pair T1 T2) (pairTy Ty1) @ Ty1 : typeOf [] T1 Ty1 * Ty2 : typeOf [] T2 Ty1 * Is : is_tm T1 Is1 : is_tm T2 Or2 : (exists T', eval T2 T') \/ value T2 EV1 : value T1 ============================ (exists T', eval (pair T1 T2) T') \/ value (pair T1 T2)
< EV2: case Or2. Subgoal 6.2.1: Variables: Ty1 T2 T1 T' IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (pair T1 T2) (pairTy Ty1) @ Ty1 : typeOf [] T1 Ty1 * Ty2 : typeOf [] T2 Ty1 * Is : is_tm T1 Is1 : is_tm T2 EV1 : value T1 EV2 : eval T2 T' ============================ (exists T', eval (pair T1 T2) T') \/ value (pair T1 T2)
< search. Subgoal 6.2.2: Variables: Ty1 T2 T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (pair T1 T2) (pairTy Ty1) @ Ty1 : typeOf [] T1 Ty1 * Ty2 : typeOf [] T2 Ty1 * Is : is_tm T1 Is1 : is_tm T2 EV1 : value T1 EV2 : value T2 ============================ (exists T', eval (pair T1 T2) T') \/ value (pair T1 T2)
< search. Subgoal 7: Variables: Ty T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T IsT : is_tm (fst T1) Ty : typeOf [] (fst T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * ============================ (exists T', eval (fst T1) T') \/ value (fst T1)
< Is: case IsT. Subgoal 7: Variables: Ty T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (fst T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * Is : is_tm T1 ============================ (exists T', eval (fst T1) T') \/ value (fst T1)
< Or: apply IH to _ Ty1. Subgoal 7: Variables: Ty T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (fst T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * Is : is_tm T1 Or : (exists T', eval T1 T') \/ value T1 ============================ (exists T', eval (fst T1) T') \/ value (fst T1)
< EV: case Or. Subgoal 7.1: Variables: Ty T1 T' IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (fst T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * Is : is_tm T1 EV : eval T1 T' ============================ (exists T', eval (fst T1) T') \/ value (fst T1)
< search. Subgoal 7.2: Variables: Ty T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (fst T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * Is : is_tm T1 EV : value T1 ============================ (exists T', eval (fst T1) T') \/ value (fst T1)
< apply canonical_form_pairTy to EV Ty1. Subgoal 7.2: Variables: Ty A B IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (fst (pair A B)) Ty @ Ty1 : typeOf [] (pair A B) (pairTy Ty) * Is : is_tm (pair A B) EV : value (pair A B) ============================ (exists T', eval (fst (pair A B)) T') \/ value (fst (pair A B))
< search. Subgoal 8: Variables: Ty T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T IsT : is_tm (snd T1) Ty : typeOf [] (snd T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * ============================ (exists T', eval (snd T1) T') \/ value (snd T1)
< Is: case IsT. Subgoal 8: Variables: Ty T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (snd T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * Is : is_tm T1 ============================ (exists T', eval (snd T1) T') \/ value (snd T1)
< Or: apply IH to _ Ty1. Subgoal 8: Variables: Ty T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (snd T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * Is : is_tm T1 Or : (exists T', eval T1 T') \/ value T1 ============================ (exists T', eval (snd T1) T') \/ value (snd T1)
< EV: case Or. Subgoal 8.1: Variables: Ty T1 T' IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (snd T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * Is : is_tm T1 EV : eval T1 T' ============================ (exists T', eval (snd T1) T') \/ value (snd T1)
< search. Subgoal 8.2: Variables: Ty T1 IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (snd T1) Ty @ Ty1 : typeOf [] T1 (pairTy Ty) * Is : is_tm T1 EV : value T1 ============================ (exists T', eval (snd T1) T') \/ value (snd T1)
< apply canonical_form_pairTy to EV Ty1. Subgoal 8.2: Variables: Ty A B IH : forall T Ty, is_tm T -> typeOf [] T Ty * -> (exists T', eval T T') \/ value T Ty : typeOf [] (snd (pair A B)) Ty @ Ty1 : typeOf [] (pair A B) (pairTy Ty) * Is : is_tm (pair A B) EV : value (pair A B) ============================ (exists T', eval (snd (pair A B)) T') \/ value (snd (pair A B))
< search. Proof completed.