Reasoning Details

 < 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.
Back to example home