< Module mtc:bool.
< Prove mtc:shared_declarations:type_preservation. Subgoal 1: Variables: TG Ty EG IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ty : typeOf TG trueE Ty Ev : eval EG trueE trueVal @ ============================ valueType trueVal Ty
< case Ty. Subgoal 1: Variables: TG EG IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ev : eval EG trueE trueVal @ ============================ valueType trueVal boolTy
< search. Subgoal 2: Variables: TG Ty EG IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ty : typeOf TG falseE Ty Ev : eval EG falseE falseVal @ ============================ valueType falseVal Ty
< case Ty. Subgoal 2: Variables: TG EG IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ev : eval EG falseE falseVal @ ============================ valueType falseVal boolTy
< search. Subgoal 3: Variables: TG Ty EG V F T C IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ty : typeOf TG (ifThenElse C T F) Ty Ev : eval EG (ifThenElse C T F) V @ Ev1 : eval EG C trueVal * Ev2 : eval EG T V * ============================ valueType V Ty
< Ty: case Ty. Subgoal 3: Variables: TG Ty EG V F T C IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ev : eval EG (ifThenElse C T F) V @ Ev1 : eval EG C trueVal * Ev2 : eval EG T V * Ty : typeOf TG C boolTy Ty1 : typeOf TG T Ty Ty2 : typeOf TG F Ty ============================ valueType V Ty
< apply IH to _ Ty1 Ev2. Subgoal 3: Variables: TG Ty EG V F T C IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ev : eval EG (ifThenElse C T F) V @ Ev1 : eval EG C trueVal * Ev2 : eval EG T V * Ty : typeOf TG C boolTy Ty1 : typeOf TG T Ty Ty2 : typeOf TG F Ty H1 : valueType V Ty ============================ valueType V Ty
< search. Subgoal 4: Variables: TG Ty EG V F T C IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ty : typeOf TG (ifThenElse C T F) Ty Ev : eval EG (ifThenElse C T F) V @ Ev1 : eval EG C falseVal * Ev2 : eval EG F V * ============================ valueType V Ty
< Ty: case Ty. Subgoal 4: Variables: TG Ty EG V F T C IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ev : eval EG (ifThenElse C T F) V @ Ev1 : eval EG C falseVal * Ev2 : eval EG F V * Ty : typeOf TG C boolTy Ty1 : typeOf TG T Ty Ty2 : typeOf TG F Ty ============================ valueType V Ty
< apply IH to _ Ty2 Ev2. Subgoal 4: Variables: TG Ty EG V F T C IH : forall TG E Ty EG V, typeOfCtx TG EG -> typeOf TG E Ty -> eval EG E V * -> valueType V Ty Rel : typeOfCtx TG EG Ev : eval EG (ifThenElse C T F) V @ Ev1 : eval EG C falseVal * Ev2 : eval EG F V * Ty : typeOf TG C boolTy Ty1 : typeOf TG T Ty Ty2 : typeOf TG F Ty H1 : valueType V Ty ============================ valueType V Ty
< search. Proof completed.
< Prove mtc:shared_declarations:value_evalStep_false. Subgoal 1: Variables: E' IH : forall E E', value E * -> evalStep E E' -> false V : value trueE @ Ev : evalStep trueE E' ============================ false
< case Ev. Subgoal 2: Variables: E' IH : forall E E', value E * -> evalStep E E' -> false V : value falseE @ Ev : evalStep falseE E' ============================ false
< case Ev. Proof completed.
< Prove mtc:shared_declarations:subst_unique. Subgoal 1: Variables: X R EB IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB SA : subst X R trueE trueE @ SB : subst X R trueE EB ============================ trueE = EB
< case SB. Subgoal 1: Variables: X R IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB SA : subst X R trueE trueE @ ============================ trueE = trueE
< search. Subgoal 2: Variables: X R EB IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB SA : subst X R falseE falseE @ SB : subst X R falseE EB ============================ falseE = EB
< case SB. Subgoal 2: Variables: X R IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB SA : subst X R falseE falseE @ ============================ falseE = falseE
< search. Subgoal 3: Variables: X R EB F1 T1 C1 F T C IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB SA : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ SB : subst X R (ifThenElse C T F) EB SA1 : subst X R C C1 * SA2 : subst X R T T1 * SA3 : subst X R F F1 * ============================ ifThenElse C1 T1 F1 = EB
< SB: case SB. Subgoal 3: Variables: X R F1 T1 C1 F T C F3 T3 C3 IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB SA : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ SA1 : subst X R C C1 * SA2 : subst X R T T1 * SA3 : subst X R F F1 * SB : subst X R C C3 SB1 : subst X R T T3 SB2 : subst X R F F3 ============================ ifThenElse C1 T1 F1 = ifThenElse C3 T3 F3
< apply IH to SA1 SB. Subgoal 3: Variables: X R F1 T1 F T C F3 T3 C3 IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB SA : subst X R (ifThenElse C T F) (ifThenElse C3 T1 F1) @ SA1 : subst X R C C3 * SA2 : subst X R T T1 * SA3 : subst X R F F1 * SB : subst X R C C3 SB1 : subst X R T T3 SB2 : subst X R F F3 ============================ ifThenElse C3 T1 F1 = ifThenElse C3 T3 F3
< apply IH to SA2 SB1. Subgoal 3: Variables: X R F1 F T C F3 T3 C3 IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB SA : subst X R (ifThenElse C T F) (ifThenElse C3 T3 F1) @ SA1 : subst X R C C3 * SA2 : subst X R T T3 * SA3 : subst X R F F1 * SB : subst X R C C3 SB1 : subst X R T T3 SB2 : subst X R F F3 ============================ ifThenElse C3 T3 F1 = ifThenElse C3 T3 F3
< apply IH to SA3 SB2. Subgoal 3: Variables: X R F T C F3 T3 C3 IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB SA : subst X R (ifThenElse C T F) (ifThenElse C3 T3 F3) @ SA1 : subst X R C C3 * SA2 : subst X R T T3 * SA3 : subst X R F F3 * SB : subst X R C C3 SB1 : subst X R T T3 SB2 : subst X R F F3 ============================ ifThenElse C3 T3 F3 = ifThenElse C3 T3 F3
< search. Proof completed.
< Prove mtc:shared_declarations:evalStep_unique. Subgoal 1: Variables: EB F T C1 C IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse C T F) (ifThenElse C1 T F) @ EvB : evalStep (ifThenElse C T F) EB EvA1 : evalStep C C1 * ============================ ifThenElse C1 T F = EB
< EvB: case EvB. Subgoal 1.1: Variables: F T C1 C C3 IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse C T F) (ifThenElse C1 T F) @ EvA1 : evalStep C C1 * EvB : evalStep C C3 ============================ ifThenElse C1 T F = ifThenElse C3 T F
< apply IH to EvA1 EvB. Subgoal 1.1: Variables: F T C C3 IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse C T F) (ifThenElse C3 T F) @ EvA1 : evalStep C C3 * EvB : evalStep C C3 ============================ ifThenElse C3 T F = ifThenElse C3 T F
< search. Subgoal 1.2: Variables: EB F C1 IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse trueE EB F) (ifThenElse C1 EB F) @ EvA1 : evalStep trueE C1 * ============================ ifThenElse C1 EB F = EB
< case EvA1. Subgoal 1.3: Variables: EB T C1 IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse falseE T EB) (ifThenElse C1 T EB) @ EvA1 : evalStep falseE C1 * ============================ ifThenElse C1 T EB = EB
< case EvA1. Subgoal 2: Variables: EA EB F IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse trueE EA F) EA @ EvB : evalStep (ifThenElse trueE EA F) EB ============================ EA = EB
< EvB: case EvB. Subgoal 2.1: Variables: EA F C1 IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse trueE EA F) EA @ EvB : evalStep trueE C1 ============================ EA = ifThenElse C1 EA F
< case EvB. Subgoal 2.2: Variables: EB F IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse trueE EB F) EB @ ============================ EB = EB
< search. Subgoal 3: Variables: EA EB T IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse falseE T EA) EA @ EvB : evalStep (ifThenElse falseE T EA) EB ============================ EA = EB
< EvB: case EvB. Subgoal 3.1: Variables: EA T C1 IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse falseE T EA) EA @ EvB : evalStep falseE C1 ============================ EA = ifThenElse C1 T EA
< case EvB. Subgoal 3.2: Variables: EB T IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB EvA : evalStep (ifThenElse falseE T EB) EB @ ============================ EB = EB
< search. Proof completed.
< Prove mtc:shared_declarations:ty_lookup. Subgoal 1: Variables: G1 G2 IH : forall G1 G2 E Ty, typeOf G1 E Ty * -> (forall X XTy, lookup G1 X XTy -> lookup G2 X XTy) -> typeOf G2 E Ty Ty : typeOf G1 trueE boolTy @ L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy ============================ typeOf G2 trueE boolTy
< search. Subgoal 2: Variables: G1 G2 IH : forall G1 G2 E Ty, typeOf G1 E Ty * -> (forall X XTy, lookup G1 X XTy -> lookup G2 X XTy) -> typeOf G2 E Ty Ty : typeOf G1 falseE boolTy @ L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy ============================ typeOf G2 falseE boolTy
< search. Subgoal 3: Variables: G1 G2 Ty F T C IH : forall G1 G2 E Ty, typeOf G1 E Ty * -> (forall X XTy, lookup G1 X XTy -> lookup G2 X XTy) -> typeOf G2 E Ty Ty : typeOf G1 (ifThenElse C T F) Ty @ L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy Ty1 : typeOf G1 C boolTy * Ty2 : typeOf G1 T Ty * Ty3 : typeOf G1 F Ty * ============================ typeOf G2 (ifThenElse C T F) Ty
< apply IH to Ty1 L. Subgoal 3: Variables: G1 G2 Ty F T C IH : forall G1 G2 E Ty, typeOf G1 E Ty * -> (forall X XTy, lookup G1 X XTy -> lookup G2 X XTy) -> typeOf G2 E Ty Ty : typeOf G1 (ifThenElse C T F) Ty @ L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy Ty1 : typeOf G1 C boolTy * Ty2 : typeOf G1 T Ty * Ty3 : typeOf G1 F Ty * H1 : typeOf G2 C boolTy ============================ typeOf G2 (ifThenElse C T F) Ty
< apply IH to Ty2 L. Subgoal 3: Variables: G1 G2 Ty F T C IH : forall G1 G2 E Ty, typeOf G1 E Ty * -> (forall X XTy, lookup G1 X XTy -> lookup G2 X XTy) -> typeOf G2 E Ty Ty : typeOf G1 (ifThenElse C T F) Ty @ L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy Ty1 : typeOf G1 C boolTy * Ty2 : typeOf G1 T Ty * Ty3 : typeOf G1 F Ty * H1 : typeOf G2 C boolTy H2 : typeOf G2 T Ty ============================ typeOf G2 (ifThenElse C T F) Ty
< apply IH to Ty3 L. Subgoal 3: Variables: G1 G2 Ty F T C IH : forall G1 G2 E Ty, typeOf G1 E Ty * -> (forall X XTy, lookup G1 X XTy -> lookup G2 X XTy) -> typeOf G2 E Ty Ty : typeOf G1 (ifThenElse C T F) Ty @ L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy Ty1 : typeOf G1 C boolTy * Ty2 : typeOf G1 T Ty * Ty3 : typeOf G1 F Ty * H1 : typeOf G2 C boolTy H2 : typeOf G2 T Ty H3 : typeOf G2 F Ty ============================ typeOf G2 (ifThenElse C T F) Ty
< search. Proof completed.
< Prove mtc:shared_declarations:subst_preservation. Subgoal 1: Variables: X XTy TG Ty R IH : forall X XTy TG E Ty R E', typeOf ((X, XTy)::TG) E Ty -> subst X R E E' * -> typeOf [] R XTy -> typeOf TG E' Ty Ty : typeOf ((X, XTy)::TG) trueE Ty S : subst X R trueE trueE @ RTy : typeOf [] R XTy ============================ typeOf TG trueE Ty
< case Ty. Subgoal 1: Variables: X XTy TG R IH : forall X XTy TG E Ty R E', typeOf ((X, XTy)::TG) E Ty -> subst X R E E' * -> typeOf [] R XTy -> typeOf TG E' Ty S : subst X R trueE trueE @ RTy : typeOf [] R XTy ============================ typeOf TG trueE boolTy
< search. Subgoal 2: Variables: X XTy TG Ty R IH : forall X XTy TG E Ty R E', typeOf ((X, XTy)::TG) E Ty -> subst X R E E' * -> typeOf [] R XTy -> typeOf TG E' Ty Ty : typeOf ((X, XTy)::TG) falseE Ty S : subst X R falseE falseE @ RTy : typeOf [] R XTy ============================ typeOf TG falseE Ty
< case Ty. Subgoal 2: Variables: X XTy TG R IH : forall X XTy TG E Ty R E', typeOf ((X, XTy)::TG) E Ty -> subst X R E E' * -> typeOf [] R XTy -> typeOf TG E' Ty S : subst X R falseE falseE @ RTy : typeOf [] R XTy ============================ typeOf TG falseE boolTy
< search. Subgoal 3: Variables: X XTy TG Ty R F1 T1 C1 F T C IH : forall X XTy TG E Ty R E', typeOf ((X, XTy)::TG) E Ty -> subst X R E E' * -> typeOf [] R XTy -> typeOf TG E' Ty Ty : typeOf ((X, XTy)::TG) (ifThenElse C T F) Ty S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ RTy : typeOf [] R XTy S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * ============================ typeOf TG (ifThenElse C1 T1 F1) Ty
< Ty: case Ty. Subgoal 3: Variables: X XTy TG Ty R F1 T1 C1 F T C IH : forall X XTy TG E Ty R E', typeOf ((X, XTy)::TG) E Ty -> subst X R E E' * -> typeOf [] R XTy -> typeOf TG E' Ty S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ RTy : typeOf [] R XTy S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * Ty : typeOf ((X, XTy)::TG) C boolTy Ty1 : typeOf ((X, XTy)::TG) T Ty Ty2 : typeOf ((X, XTy)::TG) F Ty ============================ typeOf TG (ifThenElse C1 T1 F1) Ty
< apply IH to Ty S1 RTy. Subgoal 3: Variables: X XTy TG Ty R F1 T1 C1 F T C IH : forall X XTy TG E Ty R E', typeOf ((X, XTy)::TG) E Ty -> subst X R E E' * -> typeOf [] R XTy -> typeOf TG E' Ty S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ RTy : typeOf [] R XTy S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * Ty : typeOf ((X, XTy)::TG) C boolTy Ty1 : typeOf ((X, XTy)::TG) T Ty Ty2 : typeOf ((X, XTy)::TG) F Ty H1 : typeOf TG C1 boolTy ============================ typeOf TG (ifThenElse C1 T1 F1) Ty
< apply IH to Ty1 S2 RTy. Subgoal 3: Variables: X XTy TG Ty R F1 T1 C1 F T C IH : forall X XTy TG E Ty R E', typeOf ((X, XTy)::TG) E Ty -> subst X R E E' * -> typeOf [] R XTy -> typeOf TG E' Ty S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ RTy : typeOf [] R XTy S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * Ty : typeOf ((X, XTy)::TG) C boolTy Ty1 : typeOf ((X, XTy)::TG) T Ty Ty2 : typeOf ((X, XTy)::TG) F Ty H1 : typeOf TG C1 boolTy H2 : typeOf TG T1 Ty ============================ typeOf TG (ifThenElse C1 T1 F1) Ty
< apply IH to Ty2 S3 RTy. Subgoal 3: Variables: X XTy TG Ty R F1 T1 C1 F T C IH : forall X XTy TG E Ty R E', typeOf ((X, XTy)::TG) E Ty -> subst X R E E' * -> typeOf [] R XTy -> typeOf TG E' Ty S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ RTy : typeOf [] R XTy S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * Ty : typeOf ((X, XTy)::TG) C boolTy Ty1 : typeOf ((X, XTy)::TG) T Ty Ty2 : typeOf ((X, XTy)::TG) F Ty H1 : typeOf TG C1 boolTy H2 : typeOf TG T1 Ty H3 : typeOf TG F1 Ty ============================ typeOf TG (ifThenElse C1 T1 F1) Ty
< search. Proof completed.
< Prove mtc:shared_declarations:evalStep_type_preservation. Subgoal 1: Variables: Ty F T C1 C IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty Ty : typeOf [] (ifThenElse C T F) Ty Ev : evalStep (ifThenElse C T F) (ifThenElse C1 T F) @ Ev1 : evalStep C C1 * ============================ typeOf [] (ifThenElse C1 T F) Ty
< Ty: case Ty. Subgoal 1: Variables: Ty F T C1 C IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty Ev : evalStep (ifThenElse C T F) (ifThenElse C1 T F) @ Ev1 : evalStep C C1 * Ty : typeOf [] C boolTy Ty1 : typeOf [] T Ty Ty2 : typeOf [] F Ty ============================ typeOf [] (ifThenElse C1 T F) Ty
< apply IH to Ty Ev1. Subgoal 1: Variables: Ty F T C1 C IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty Ev : evalStep (ifThenElse C T F) (ifThenElse C1 T F) @ Ev1 : evalStep C C1 * Ty : typeOf [] C boolTy Ty1 : typeOf [] T Ty Ty2 : typeOf [] F Ty H1 : typeOf [] C1 boolTy ============================ typeOf [] (ifThenElse C1 T F) Ty
< search. Subgoal 2: Variables: Ty E' F IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty Ty : typeOf [] (ifThenElse trueE E' F) Ty Ev : evalStep (ifThenElse trueE E' F) E' @ ============================ typeOf [] E' Ty
< case Ty. Subgoal 2: Variables: Ty E' F IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty Ev : evalStep (ifThenElse trueE E' F) E' @ H1 : typeOf [] trueE boolTy H2 : typeOf [] E' Ty H3 : typeOf [] F Ty ============================ typeOf [] E' Ty
< search. Subgoal 3: Variables: Ty E' T IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty Ty : typeOf [] (ifThenElse falseE T E') Ty Ev : evalStep (ifThenElse falseE T E') E' @ ============================ typeOf [] E' Ty
< case Ty. Subgoal 3: Variables: Ty E' T IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty Ev : evalStep (ifThenElse falseE T E') E' @ H1 : typeOf [] falseE boolTy H2 : typeOf [] T Ty H3 : typeOf [] E' Ty ============================ typeOf [] E' Ty
< search. Proof completed.
< Prove mtc:shared_declarations:canonical_form. Subgoal 1: Variables: Ty IH : forall V Ty, value V * -> typeOf [] V Ty -> canon Ty V V : value trueE @ Ty : typeOf [] trueE Ty ============================ canon Ty trueE
< case Ty. Subgoal 1: IH : forall V Ty, value V * -> typeOf [] V Ty -> canon Ty V V : value trueE @ ============================ canon boolTy trueE
< search. Subgoal 2: Variables: Ty IH : forall V Ty, value V * -> typeOf [] V Ty -> canon Ty V V : value falseE @ Ty : typeOf [] falseE Ty ============================ canon Ty falseE
< case Ty. Subgoal 2: IH : forall V Ty, value V * -> typeOf [] V Ty -> canon Ty V V : value falseE @ ============================ canon boolTy falseE
< search. Proof completed.
< Prove mtc:shared_declarations:subst_is. Subgoal 1: Variables: X R IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E' IsE : is_e trueE IsR : is_e R S : subst X R trueE trueE @ ============================ is_e trueE
< search. Subgoal 2: Variables: X R IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E' IsE : is_e falseE IsR : is_e R S : subst X R falseE falseE @ ============================ is_e falseE
< search. Subgoal 3: Variables: X R F1 T1 C1 F T C IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E' IsE : is_e (ifThenElse C T F) IsR : is_e R S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * ============================ is_e (ifThenElse C1 T1 F1)
< case IsE. Subgoal 3: Variables: X R F1 T1 C1 F T C IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E' IsR : is_e R S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * H1 : is_e C H2 : is_e T H3 : is_e F ============================ is_e (ifThenElse C1 T1 F1)
< apply IH to _ _ S1. Subgoal 3: Variables: X R F1 T1 C1 F T C IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E' IsR : is_e R S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * H1 : is_e C H2 : is_e T H3 : is_e F H4 : is_e C1 ============================ is_e (ifThenElse C1 T1 F1)
< apply IH to _ _ S2. Subgoal 3: Variables: X R F1 T1 C1 F T C IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E' IsR : is_e R S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * H1 : is_e C H2 : is_e T H3 : is_e F H4 : is_e C1 H5 : is_e T1 ============================ is_e (ifThenElse C1 T1 F1)
< apply IH to _ _ S3. Subgoal 3: Variables: X R F1 T1 C1 F T C IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E' IsR : is_e R S : subst X R (ifThenElse C T F) (ifThenElse C1 T1 F1) @ S1 : subst X R C C1 * S2 : subst X R T T1 * S3 : subst X R F F1 * H1 : is_e C H2 : is_e T H3 : is_e F H4 : is_e C1 H5 : is_e T1 H6 : is_e F1 ============================ is_e (ifThenElse C1 T1 F1)
< search. Proof completed.
< Prove mtc:shared_declarations:evalStep_is. Subgoal 1: Variables: F T C1 C IH : forall E E', is_e E -> evalStep E E' * -> is_e E' IsE : is_e (ifThenElse C T F) Ev : evalStep (ifThenElse C T F) (ifThenElse C1 T F) @ Ev1 : evalStep C C1 * ============================ is_e (ifThenElse C1 T F)
< case IsE. Subgoal 1: Variables: F T C1 C IH : forall E E', is_e E -> evalStep E E' * -> is_e E' Ev : evalStep (ifThenElse C T F) (ifThenElse C1 T F) @ Ev1 : evalStep C C1 * H1 : is_e C H2 : is_e T H3 : is_e F ============================ is_e (ifThenElse C1 T F)
< apply IH to _ Ev1. Subgoal 1: Variables: F T C1 C IH : forall E E', is_e E -> evalStep E E' * -> is_e E' Ev : evalStep (ifThenElse C T F) (ifThenElse C1 T F) @ Ev1 : evalStep C C1 * H1 : is_e C H2 : is_e T H3 : is_e F H4 : is_e C1 ============================ is_e (ifThenElse C1 T F)
< search. Subgoal 2: Variables: E' F IH : forall E E', is_e E -> evalStep E E' * -> is_e E' IsE : is_e (ifThenElse trueE E' F) Ev : evalStep (ifThenElse trueE E' F) E' @ ============================ is_e E'
< case IsE. Subgoal 2: Variables: E' F IH : forall E E', is_e E -> evalStep E E' * -> is_e E' Ev : evalStep (ifThenElse trueE E' F) E' @ H1 : is_e trueE H2 : is_e E' H3 : is_e F ============================ is_e E'
< search. Subgoal 3: Variables: E' T IH : forall E E', is_e E -> evalStep E E' * -> is_e E' IsE : is_e (ifThenElse falseE T E') Ev : evalStep (ifThenElse falseE T E') E' @ ============================ is_e E'
< case IsE. Subgoal 3: Variables: E' T IH : forall E E', is_e E -> evalStep E E' * -> is_e E' Ev : evalStep (ifThenElse falseE T E') E' @ H1 : is_e falseE H2 : is_e T H3 : is_e E' ============================ is_e E'
< search. Proof completed.
< Prove mtc:shared_declarations:subst_total. Subgoal 2: Variables: X R IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists E', subst X R E E' IsE : is_e trueE @ IsX : is_string X IsR : is_e R ============================ exists E', subst X R trueE E'
< search. Subgoal 3: Variables: X R IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists E', subst X R E E' IsE : is_e falseE @ IsX : is_string X IsR : is_e R ============================ exists E', subst X R falseE E'
< search. Subgoal 4: Variables: X R E3 E1 E2 IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists E', subst X R E E' IsE : is_e (ifThenElse E2 E1 E3) @ IsX : is_string X IsR : is_e R IsE1 : is_e E2 * IsE2 : is_e E1 * IsE3 : is_e E3 * ============================ exists E', subst X R (ifThenElse E2 E1 E3) E'
< apply IH to IsE1 IsX IsR. Subgoal 4: Variables: X R E3 E1 E2 E' IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists E', subst X R E E' IsE : is_e (ifThenElse E2 E1 E3) @ IsX : is_string X IsR : is_e R IsE1 : is_e E2 * IsE2 : is_e E1 * IsE3 : is_e E3 * H1 : subst X R E2 E' ============================ exists E', subst X R (ifThenElse E2 E1 E3) E'
< apply IH to IsE2 IsX IsR. Subgoal 4: Variables: X R E3 E1 E2 E' E'1 IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists E', subst X R E E' IsE : is_e (ifThenElse E2 E1 E3) @ IsX : is_string X IsR : is_e R IsE1 : is_e E2 * IsE2 : is_e E1 * IsE3 : is_e E3 * H1 : subst X R E2 E' H2 : subst X R E1 E'1 ============================ exists E', subst X R (ifThenElse E2 E1 E3) E'
< apply IH to IsE3 IsX IsR. Subgoal 4: Variables: X R E3 E1 E2 E' E'1 E'2 IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists E', subst X R E E' IsE : is_e (ifThenElse E2 E1 E3) @ IsX : is_string X IsR : is_e R IsE1 : is_e E2 * IsE2 : is_e E1 * IsE3 : is_e E3 * H1 : subst X R E2 E' H2 : subst X R E1 E'1 H3 : subst X R E3 E'2 ============================ exists E', subst X R (ifThenElse E2 E1 E3) E'
< search. Proof completed.
< Prove mtc:shared_declarations:progress. Subgoal 1: IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') IsE : is_e trueE Ty : typeOf [] trueE boolTy @ ============================ value trueE \/ (exists E', evalStep trueE E')
< search. Subgoal 2: IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') IsE : is_e falseE Ty : typeOf [] falseE boolTy @ ============================ value falseE \/ (exists E', evalStep falseE E')
< search. Subgoal 3: Variables: Ty F T C IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') IsE : is_e (ifThenElse C T F) Ty : typeOf [] (ifThenElse C T F) Ty @ Ty1 : typeOf [] C boolTy * Ty2 : typeOf [] T Ty * Ty3 : typeOf [] F Ty * ============================ value (ifThenElse C T F) \/ (exists E', evalStep (ifThenElse C T F) E')
< case IsE. Subgoal 3: Variables: Ty F T C IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') Ty : typeOf [] (ifThenElse C T F) Ty @ Ty1 : typeOf [] C boolTy * Ty2 : typeOf [] T Ty * Ty3 : typeOf [] F Ty * H1 : is_e C H2 : is_e T H3 : is_e F ============================ value (ifThenElse C T F) \/ (exists E', evalStep (ifThenElse C T F) E')
< Or: apply IH to _ Ty1. Subgoal 3: Variables: Ty F T C IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') Ty : typeOf [] (ifThenElse C T F) Ty @ Ty1 : typeOf [] C boolTy * Ty2 : typeOf [] T Ty * Ty3 : typeOf [] F Ty * H1 : is_e C H2 : is_e T H3 : is_e F Or : value C \/ (exists E', evalStep C E') ============================ value (ifThenElse C T F) \/ (exists E', evalStep (ifThenElse C T F) E')
< E: case Or. Subgoal 3.1: Variables: Ty F T C IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') Ty : typeOf [] (ifThenElse C T F) Ty @ Ty1 : typeOf [] C boolTy * Ty2 : typeOf [] T Ty * Ty3 : typeOf [] F Ty * H1 : is_e C H2 : is_e T H3 : is_e F E : value C ============================ value (ifThenElse C T F) \/ (exists E', evalStep (ifThenElse C T F) E')
< C: apply canonical_form to E Ty1. Subgoal 3.1: Variables: Ty F T C IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') Ty : typeOf [] (ifThenElse C T F) Ty @ Ty1 : typeOf [] C boolTy * Ty2 : typeOf [] T Ty * Ty3 : typeOf [] F Ty * H1 : is_e C H2 : is_e T H3 : is_e F E : value C C : canon boolTy C ============================ value (ifThenElse C T F) \/ (exists E', evalStep (ifThenElse C T F) E')
< case C. Subgoal 3.1.1: Variables: Ty F T IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') Ty : typeOf [] (ifThenElse trueE T F) Ty @ Ty1 : typeOf [] trueE boolTy * Ty2 : typeOf [] T Ty * Ty3 : typeOf [] F Ty * H1 : is_e trueE H2 : is_e T H3 : is_e F E : value trueE ============================ value (ifThenElse trueE T F) \/ (exists E', evalStep (ifThenElse trueE T F) E')
< search. Subgoal 3.1.2: Variables: Ty F T IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') Ty : typeOf [] (ifThenElse falseE T F) Ty @ Ty1 : typeOf [] falseE boolTy * Ty2 : typeOf [] T Ty * Ty3 : typeOf [] F Ty * H1 : is_e falseE H2 : is_e T H3 : is_e F E : value falseE ============================ value (ifThenElse falseE T F) \/ (exists E', evalStep (ifThenElse falseE T F) E')
< search. Subgoal 3.2: Variables: Ty F T C E' IH : forall E Ty, is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E') Ty : typeOf [] (ifThenElse C T F) Ty @ Ty1 : typeOf [] C boolTy * Ty2 : typeOf [] T Ty * Ty3 : typeOf [] F Ty * H1 : is_e C H2 : is_e T H3 : is_e F E : evalStep C E' ============================ value (ifThenElse C T F) \/ (exists E', evalStep (ifThenElse C T F) E')
< search. Proof completed.