< Module mtc:natCase.
< Prove mtc:arith:fix_nat.
Proof completed.
< Prove mtc:shared_declarations:type_preservation.
Subgoal 3:
Variables: TG Ty EG V S X Z E1
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 (natCase E1 Z X S) Ty
Ev : eval EG (natCase E1 Z X S) V @
Ev1 : eval EG E1 (numVal z) *
Ev2 : eval EG Z V *
============================
valueType V Ty
< Ty: case Ty.
Subgoal 3:
Variables: TG Ty EG V S X Z E1
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 (natCase E1 Z X S) V @
Ev1 : eval EG E1 (numVal z) *
Ev2 : eval EG Z V *
Ty : typeOf TG E1 natTy
Ty1 : typeOf TG Z Ty
Ty2 : typeOf ((X, natTy)::TG) S Ty
============================
valueType V Ty
< apply IH to _ Ty1 Ev2.
Subgoal 3:
Variables: TG Ty EG V S X Z E1
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 (natCase E1 Z X S) V @
Ev1 : eval EG E1 (numVal z) *
Ev2 : eval EG Z V *
Ty : typeOf TG E1 natTy
Ty1 : typeOf TG Z Ty
Ty2 : typeOf ((X, natTy)::TG) S Ty
H1 : valueType V Ty
============================
valueType V Ty
< search.
Subgoal 4:
Variables: TG Ty EG V N S X Z E1
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 (natCase E1 Z X S) Ty
Ev : eval EG (natCase E1 Z X S) V @
Ev1 : eval EG E1 (numVal (s N)) *
Ev2 : eval ((X, numVal N)::EG) S V *
============================
valueType V Ty
< Ty: case Ty.
Subgoal 4:
Variables: TG Ty EG V N S X Z E1
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 (natCase E1 Z X S) V @
Ev1 : eval EG E1 (numVal (s N)) *
Ev2 : eval ((X, numVal N)::EG) S V *
Ty : typeOf TG E1 natTy
Ty1 : typeOf TG Z Ty
Ty2 : typeOf ((X, natTy)::TG) S Ty
============================
valueType V Ty
< apply IH to _ Ty2 Ev2.
Subgoal 4:
Variables: TG Ty EG V N S X Z E1
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 (natCase E1 Z X S) V @
Ev1 : eval EG E1 (numVal (s N)) *
Ev2 : eval ((X, numVal N)::EG) S V *
Ty : typeOf TG E1 natTy
Ty1 : typeOf TG Z Ty
Ty2 : typeOf ((X, natTy)::TG) S Ty
H1 : valueType V Ty
============================
valueType V Ty
< search.
Proof completed.
< Prove mtc:shared_declarations:value_evalStep_false.
Proof completed.
< Prove mtc:shared_declarations:subst_unique.
Subgoal 3:
Variables: X R EB S Z1 E2 Z E1
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z X S) (natCase E2 Z1 X S) @
SB : subst X R (natCase E1 Z X S) EB
SA1 : subst X R E1 E2 *
SA2 : subst X R Z Z1 *
============================
natCase E2 Z1 X S = EB
< SB: case SB.
Subgoal 3.1:
Variables: X R S Z1 E2 Z E1 Z3 E4
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z X S) (natCase E2 Z1 X S) @
SA1 : subst X R E1 E2 *
SA2 : subst X R Z Z1 *
SB : subst X R E1 E4
SB1 : subst X R Z Z3
============================
natCase E2 Z1 X S = natCase E4 Z3 X S
< apply IH to SA1 SB.
Subgoal 3.1:
Variables: X R S Z1 Z E1 Z3 E4
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z X S) (natCase E4 Z1 X S) @
SA1 : subst X R E1 E4 *
SA2 : subst X R Z Z1 *
SB : subst X R E1 E4
SB1 : subst X R Z Z3
============================
natCase E4 Z1 X S = natCase E4 Z3 X S
< apply IH to SA2 SB1.
Subgoal 3.1:
Variables: X R S Z E1 Z3 E4
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z X S) (natCase E4 Z3 X S) @
SA1 : subst X R E1 E4 *
SA2 : subst X R Z Z3 *
SB : subst X R E1 E4
SB1 : subst X R Z Z3
============================
natCase E4 Z3 X S = natCase E4 Z3 X S
< search.
Subgoal 3.2:
Variables: X R S Z1 E2 Z E1 S2 Z3 E4
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z X S) (natCase E2 Z1 X S) @
SA1 : subst X R E1 E2 *
SA2 : subst X R Z Z1 *
SB : X = X -> false
SB1 : subst X R E1 E4
SB2 : subst X R Z Z3
SB3 : subst X R S S2
============================
natCase E2 Z1 X S = natCase E4 Z3 X S2
< apply SB to _.
Subgoal 4:
Variables: X R EB S1 Y Z1 E2 S Z E1
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
SB : subst X R (natCase E1 Z Y S) EB
SA1 : X = Y -> false
SA2 : subst X R E1 E2 *
SA3 : subst X R Z Z1 *
SA4 : subst X R S S1 *
============================
natCase E2 Z1 Y S1 = EB
< SB: case SB.
Subgoal 4.1:
Variables: R S1 Y Z1 E2 S Z E1 Z3 E4
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst Y R (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
SA1 : Y = Y -> false
SA2 : subst Y R E1 E2 *
SA3 : subst Y R Z Z1 *
SA4 : subst Y R S S1 *
SB : subst Y R E1 E4
SB1 : subst Y R Z Z3
============================
natCase E2 Z1 Y S1 = natCase E4 Z3 Y S
< apply SA1 to _.
Subgoal 4.2:
Variables: X R S1 Y Z1 E2 S Z E1 S3 Z3 E4
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
SA1 : X = Y -> false
SA2 : subst X R E1 E2 *
SA3 : subst X R Z Z1 *
SA4 : subst X R S S1 *
SB : X = Y -> false
SB1 : subst X R E1 E4
SB2 : subst X R Z Z3
SB3 : subst X R S S3
============================
natCase E2 Z1 Y S1 = natCase E4 Z3 Y S3
< apply IH to SA2 SB1.
Subgoal 4.2:
Variables: X R S1 Y Z1 S Z E1 S3 Z3 E4
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z Y S) (natCase E4 Z1 Y S1) @
SA1 : X = Y -> false
SA2 : subst X R E1 E4 *
SA3 : subst X R Z Z1 *
SA4 : subst X R S S1 *
SB : X = Y -> false
SB1 : subst X R E1 E4
SB2 : subst X R Z Z3
SB3 : subst X R S S3
============================
natCase E4 Z1 Y S1 = natCase E4 Z3 Y S3
< apply IH to SA3 SB2.
Subgoal 4.2:
Variables: X R S1 Y S Z E1 S3 Z3 E4
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z Y S) (natCase E4 Z3 Y S1) @
SA1 : X = Y -> false
SA2 : subst X R E1 E4 *
SA3 : subst X R Z Z3 *
SA4 : subst X R S S1 *
SB : X = Y -> false
SB1 : subst X R E1 E4
SB2 : subst X R Z Z3
SB3 : subst X R S S3
============================
natCase E4 Z3 Y S1 = natCase E4 Z3 Y S3
< apply IH to SA4 SB3.
Subgoal 4.2:
Variables: X R Y S Z E1 S3 Z3 E4
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (natCase E1 Z Y S) (natCase E4 Z3 Y S3) @
SA1 : X = Y -> false
SA2 : subst X R E1 E4 *
SA3 : subst X R Z Z3 *
SA4 : subst X R S S3 *
SB : X = Y -> false
SB1 : subst X R E1 E4
SB2 : subst X R Z Z3
SB3 : subst X R S S3
============================
natCase E4 Z3 Y S3 = natCase E4 Z3 Y S3
< search.
Proof completed.
< Prove mtc:shared_declarations:evalStep_unique.
Subgoal 4:
Variables: EB S X Z E2 E1
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase E1 Z X S) (natCase E2 Z X S) @
EvB : evalStep (natCase E1 Z X S) EB
EvA1 : evalStep E1 E2 *
============================
natCase E2 Z X S = EB
< EvB: case EvB.
Subgoal 4.1:
Variables: S X Z E2 E1 E4
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase E1 Z X S) (natCase E2 Z X S) @
EvA1 : evalStep E1 E2 *
EvB : evalStep E1 E4
============================
natCase E2 Z X S = natCase E4 Z X S
< apply IH to EvA1 EvB.
Subgoal 4.1:
Variables: S X Z E1 E4
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase E1 Z X S) (natCase E4 Z X S) @
EvA1 : evalStep E1 E4 *
EvB : evalStep E1 E4
============================
natCase E4 Z X S = natCase E4 Z X S
< search.
Subgoal 4.2:
Variables: EB S X E2
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase (num z) EB X S) (natCase E2 EB X S) @
EvA1 : evalStep (num z) E2 *
============================
natCase E2 EB X S = EB
< case EvA1.
Subgoal 4.3:
Variables: EB S X Z E2 N
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase (num (s N)) Z X S) (natCase E2 Z X S) @
EvA1 : evalStep (num (s N)) E2 *
EvB : subst X (num N) S EB
============================
natCase E2 Z X S = EB
< case EvA1.
Subgoal 5:
Variables: EA EB S X
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase (num z) EA X S) EA @
EvB : evalStep (natCase (num z) EA X S) EB
============================
EA = EB
< EvB: case EvB.
Subgoal 5.1:
Variables: EA S X E2
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase (num z) EA X S) EA @
EvB : evalStep (num z) E2
============================
EA = natCase E2 EA X S
< case EvB.
Subgoal 5.2:
Variables: EB S X
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase (num z) EB X S) EB @
============================
EB = EB
< search.
Subgoal 6:
Variables: EA EB S X Z N
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase (num (s N)) Z X S) EA @
EvB : evalStep (natCase (num (s N)) Z X S) EB
EvA1 : subst X (num N) S EA
============================
EA = EB
< EvB: case EvB.
Subgoal 6.1:
Variables: EA S X Z N E2
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase (num (s N)) Z X S) EA @
EvA1 : subst X (num N) S EA
EvB : evalStep (num (s N)) E2
============================
EA = natCase E2 Z X S
< case EvB.
Subgoal 6.2:
Variables: EA EB S X Z N
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase (num (s N)) Z X S) EA @
EvA1 : subst X (num N) S EA
EvB : subst X (num N) S EB
============================
EA = EB
< apply subst_unique to EvA1 EvB.
Subgoal 6.2:
Variables: EB S X Z N
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (natCase (num (s N)) Z X S) EB @
EvA1 : subst X (num N) S EB
EvB : subst X (num N) S EB
============================
EB = EB
< search.
Proof completed.
< Prove mtc:shared_declarations:ty_lookup.
Subgoal 3:
Variables: G1 G2 Ty S X Z E1
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 (natCase E1 Z X S) Ty @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 Z Ty *
Ty3 : typeOf ((X, natTy)::G1) S Ty *
============================
typeOf G2 (natCase E1 Z X S) Ty
< apply IH to Ty1 L.
Subgoal 3:
Variables: G1 G2 Ty S X Z E1
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 (natCase E1 Z X S) Ty @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 Z Ty *
Ty3 : typeOf ((X, natTy)::G1) S Ty *
H1 : typeOf G2 E1 natTy
============================
typeOf G2 (natCase E1 Z X S) Ty
< apply IH to Ty2 L.
Subgoal 3:
Variables: G1 G2 Ty S X Z E1
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 (natCase E1 Z X S) Ty @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 Z Ty *
Ty3 : typeOf ((X, natTy)::G1) S Ty *
H1 : typeOf G2 E1 natTy
H2 : typeOf G2 Z Ty
============================
typeOf G2 (natCase E1 Z X S) Ty
< apply IH to Ty3 _ with
G2 = (X, natTy)::G2.
Subgoal 3.1:
Variables: G1 G2 Ty S X Z E1
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 (natCase E1 Z X S) Ty @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 Z Ty *
Ty3 : typeOf ((X, natTy)::G1) S Ty *
H1 : typeOf G2 E1 natTy
H2 : typeOf G2 Z Ty
============================
forall X1 XTy, lookup ((X, natTy)::G1) X1 XTy -> lookup ((X, natTy)::G2) X1 XTy
< intros L'.
Subgoal 3.1:
Variables: G1 G2 Ty S X Z E1 X1 XTy
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 (natCase E1 Z X S) Ty @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 Z Ty *
Ty3 : typeOf ((X, natTy)::G1) S Ty *
H1 : typeOf G2 E1 natTy
H2 : typeOf G2 Z Ty
L' : lookup ((X, natTy)::G1) X1 XTy
============================
lookup ((X, natTy)::G2) X1 XTy
< L': case L'.
Subgoal 3.1.1:
Variables: G1 G2 Ty S Z E1 X1
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 (natCase E1 Z X1 S) Ty @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 Z Ty *
Ty3 : typeOf ((X1, natTy)::G1) S Ty *
H1 : typeOf G2 E1 natTy
H2 : typeOf G2 Z Ty
============================
lookup ((X1, natTy)::G2) X1 natTy
< search.
Subgoal 3.1.2:
Variables: G1 G2 Ty S X Z E1 X1 XTy
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 (natCase E1 Z X S) Ty @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 Z Ty *
Ty3 : typeOf ((X, natTy)::G1) S Ty *
H1 : typeOf G2 E1 natTy
H2 : typeOf G2 Z Ty
L' : X = X1 -> false
L'1 : lookup G1 X1 XTy
============================
lookup ((X, natTy)::G2) X1 XTy
< apply L to L'1.
Subgoal 3.1.2:
Variables: G1 G2 Ty S X Z E1 X1 XTy
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 (natCase E1 Z X S) Ty @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 Z Ty *
Ty3 : typeOf ((X, natTy)::G1) S Ty *
H1 : typeOf G2 E1 natTy
H2 : typeOf G2 Z Ty
L' : X = X1 -> false
L'1 : lookup G1 X1 XTy
H3 : lookup G2 X1 XTy
============================
lookup ((X, natTy)::G2) X1 XTy
< search.
Subgoal 3:
Variables: G1 G2 Ty S X Z E1
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 (natCase E1 Z X S) Ty @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 Z Ty *
Ty3 : typeOf ((X, natTy)::G1) S Ty *
H1 : typeOf G2 E1 natTy
H2 : typeOf G2 Z Ty
H3 : typeOf ((X, natTy)::G2) S Ty
============================
typeOf G2 (natCase E1 Z X S) Ty
< search.
Proof completed.
< Prove mtc:shared_declarations:subst_preservation.
Subgoal 3:
Variables: X XTy TG Ty R S Z1 E2 Z E1
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) (natCase E1 Z X S) Ty
S : subst X R (natCase E1 Z X S) (natCase E2 Z1 X S) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
============================
typeOf TG (natCase E2 Z1 X S) Ty
< Ty: case Ty.
Subgoal 3:
Variables: X XTy TG Ty R S Z1 E2 Z E1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((X, natTy)::((X, XTy)::TG)) S Ty
============================
typeOf TG (natCase E2 Z1 X S) Ty
< apply IH to Ty S1 RTy.
Subgoal 3:
Variables: X XTy TG Ty R S Z1 E2 Z E1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((X, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
============================
typeOf TG (natCase E2 Z1 X S) Ty
< apply IH to Ty1 S2 RTy.
Subgoal 3:
Variables: X XTy TG Ty R S Z1 E2 Z E1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((X, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
============================
typeOf TG (natCase E2 Z1 X S) Ty
< apply ty_lookup to Ty2 _ with
G2 = (X, natTy)::TG.
Subgoal 3.1:
Variables: X XTy TG Ty R S Z1 E2 Z E1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((X, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
============================
forall X1 XTy1,
lookup ((X, natTy)::((X, XTy)::TG)) X1 XTy1 -> lookup ((X, natTy)::TG) X1 XTy1
< intros L.
Subgoal 3.1:
Variables: X XTy TG Ty R S Z1 E2 Z E1 X1 XTy1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((X, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
L : lookup ((X, natTy)::((X, XTy)::TG)) X1 XTy1
============================
lookup ((X, natTy)::TG) X1 XTy1
< L: case L.
Subgoal 3.1.1:
Variables: XTy TG Ty R S Z1 E2 Z E1 X1
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 X1 R (natCase E1 Z X1 S) (natCase E2 Z1 X1 S) @
RTy : typeOf [] R XTy
S1 : subst X1 R E1 E2 *
S2 : subst X1 R Z Z1 *
Ty : typeOf ((X1, XTy)::TG) E1 natTy
Ty1 : typeOf ((X1, XTy)::TG) Z Ty
Ty2 : typeOf ((X1, natTy)::((X1, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
============================
lookup ((X1, natTy)::TG) X1 natTy
< search.
Subgoal 3.1.2:
Variables: X XTy TG Ty R S Z1 E2 Z E1 X1 XTy1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((X, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
L : X = X1 -> false
L1 : lookup ((X, XTy)::TG) X1 XTy1
============================
lookup ((X, natTy)::TG) X1 XTy1
< L': case L1.
Subgoal 3.1.2.1:
Variables: TG Ty R S Z1 E2 Z E1 X1 XTy1
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 X1 R (natCase E1 Z X1 S) (natCase E2 Z1 X1 S) @
RTy : typeOf [] R XTy1
S1 : subst X1 R E1 E2 *
S2 : subst X1 R Z Z1 *
Ty : typeOf ((X1, XTy1)::TG) E1 natTy
Ty1 : typeOf ((X1, XTy1)::TG) Z Ty
Ty2 : typeOf ((X1, natTy)::((X1, XTy1)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
L : X1 = X1 -> false
============================
lookup ((X1, natTy)::TG) X1 XTy1
< apply L to _.
Subgoal 3.1.2.2:
Variables: X XTy TG Ty R S Z1 E2 Z E1 X1 XTy1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((X, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
L : X = X1 -> false
L' : X = X1 -> false
L'1 : lookup TG X1 XTy1
============================
lookup ((X, natTy)::TG) X1 XTy1
< search.
Subgoal 3:
Variables: X XTy TG Ty R S Z1 E2 Z E1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((X, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
H3 : typeOf ((X, natTy)::TG) S Ty
============================
typeOf TG (natCase E2 Z1 X S) Ty
< search.
Subgoal 4:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1
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) (natCase E1 Z Y S) Ty
S : subst X R (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
============================
typeOf TG (natCase E2 Z1 Y S1) Ty
< Ty: case Ty.
Subgoal 4:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X, XTy)::TG)) S Ty
============================
typeOf TG (natCase E2 Z1 Y S1) Ty
< apply IH to Ty S2 RTy.
Subgoal 4:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
============================
typeOf TG (natCase E2 Z1 Y S1) Ty
< apply IH to Ty1 S3 RTy.
Subgoal 4:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
============================
typeOf TG (natCase E2 Z1 Y S1) Ty
< Ty': apply ty_lookup to Ty2 _ with
G2 = (X, XTy)::((Y, natTy)::TG).
Subgoal 4.1:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
============================
forall X1 XTy1,
lookup ((Y, natTy)::((X, XTy)::TG)) X1 XTy1 -> lookup ((X, XTy)::((Y, natTy)::TG)) X1 XTy1
< intros L.
Subgoal 4.1:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1 X1 XTy1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
L : lookup ((Y, natTy)::((X, XTy)::TG)) X1 XTy1
============================
lookup ((X, XTy)::((Y, natTy)::TG)) X1 XTy1
< L: case L.
Subgoal 4.1.1:
Variables: X XTy TG Ty R S1 Z1 E2 S Z E1 X1
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 (natCase E1 Z X1 S) (natCase E2 Z1 X1 S1) @
RTy : typeOf [] R XTy
S1 : X = X1 -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((X1, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
============================
lookup ((X, XTy)::((X1, natTy)::TG)) X1 natTy
< search.
Subgoal 4.1.2:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1 X1 XTy1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
L : Y = X1 -> false
L1 : lookup ((X, XTy)::TG) X1 XTy1
============================
lookup ((X, XTy)::((Y, natTy)::TG)) X1 XTy1
< L': case L1.
Subgoal 4.1.2.1:
Variables: TG Ty R S1 Y Z1 E2 S Z E1 X1 XTy1
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 X1 R (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy1
S1 : X1 = Y -> false
S2 : subst X1 R E1 E2 *
S3 : subst X1 R Z Z1 *
S4 : subst X1 R S S1 *
Ty : typeOf ((X1, XTy1)::TG) E1 natTy
Ty1 : typeOf ((X1, XTy1)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X1, XTy1)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
L : Y = X1 -> false
============================
lookup ((X1, XTy1)::((Y, natTy)::TG)) X1 XTy1
< search.
Subgoal 4.1.2.2:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1 X1 XTy1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
L : Y = X1 -> false
L' : X = X1 -> false
L'1 : lookup TG X1 XTy1
============================
lookup ((X, XTy)::((Y, natTy)::TG)) X1 XTy1
< search.
Subgoal 4:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
Ty' : typeOf ((X, XTy)::((Y, natTy)::TG)) S Ty
============================
typeOf TG (natCase E2 Z1 Y S1) Ty
< apply IH to Ty' S4 RTy.
Subgoal 4:
Variables: X XTy TG Ty R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
RTy : typeOf [] R XTy
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) Z Ty
Ty2 : typeOf ((Y, natTy)::((X, XTy)::TG)) S Ty
H1 : typeOf TG E2 natTy
H2 : typeOf TG Z1 Ty
Ty' : typeOf ((X, XTy)::((Y, natTy)::TG)) S Ty
H3 : typeOf ((Y, natTy)::TG) S1 Ty
============================
typeOf TG (natCase E2 Z1 Y S1) Ty
< search.
Proof completed.
< Prove mtc:shared_declarations:evalStep_type_preservation.
Subgoal 4:
Variables: Ty S X Z E2 E1
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ty : typeOf [] (natCase E1 Z X S) Ty
Ev : evalStep (natCase E1 Z X S) (natCase E2 Z X S) @
Ev1 : evalStep E1 E2 *
============================
typeOf [] (natCase E2 Z X S) Ty
< Ty: case Ty.
Subgoal 4:
Variables: Ty S X Z E2 E1
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (natCase E1 Z X S) (natCase E2 Z X S) @
Ev1 : evalStep E1 E2 *
Ty : typeOf [] E1 natTy
Ty1 : typeOf [] Z Ty
Ty2 : typeOf [(X, natTy)] S Ty
============================
typeOf [] (natCase E2 Z X S) Ty
< apply IH to Ty Ev1.
Subgoal 4:
Variables: Ty S X Z E2 E1
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (natCase E1 Z X S) (natCase E2 Z X S) @
Ev1 : evalStep E1 E2 *
Ty : typeOf [] E1 natTy
Ty1 : typeOf [] Z Ty
Ty2 : typeOf [(X, natTy)] S Ty
H1 : typeOf [] E2 natTy
============================
typeOf [] (natCase E2 Z X S) Ty
< search.
Subgoal 5:
Variables: Ty E' S X
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ty : typeOf [] (natCase (num z) E' X S) Ty
Ev : evalStep (natCase (num z) E' X S) E' @
============================
typeOf [] E' Ty
< Ty: case Ty.
Subgoal 5:
Variables: Ty E' S X
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (natCase (num z) E' X S) E' @
Ty : typeOf [] (num z) natTy
Ty1 : typeOf [] E' Ty
Ty2 : typeOf [(X, natTy)] S Ty
============================
typeOf [] E' Ty
< search.
Subgoal 6:
Variables: Ty E' S X Z N
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ty : typeOf [] (natCase (num (s N)) Z X S) Ty
Ev : evalStep (natCase (num (s N)) Z X S) E' @
Ev1 : subst X (num N) S E'
============================
typeOf [] E' Ty
< Ty: case Ty.
Subgoal 6:
Variables: Ty E' S X Z N
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (natCase (num (s N)) Z X S) E' @
Ev1 : subst X (num N) S E'
Ty : typeOf [] (num (s N)) natTy
Ty1 : typeOf [] Z Ty
Ty2 : typeOf [(X, natTy)] S Ty
============================
typeOf [] E' Ty
< apply subst_preservation to Ty2 Ev1 _.
Subgoal 6:
Variables: Ty E' S X Z N
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (natCase (num (s N)) Z X S) E' @
Ev1 : subst X (num N) S E'
Ty : typeOf [] (num (s N)) natTy
Ty1 : typeOf [] Z Ty
Ty2 : typeOf [(X, natTy)] S Ty
H1 : typeOf [] E' Ty
============================
typeOf [] E' Ty
< search.
Proof completed.
< Prove mtc:shared_declarations:canonical_form.
Proof completed.
< Prove mtc:shared_declarations:subst_is.
Subgoal 3:
Variables: X R S Z1 E2 Z E1
IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E'
IsE : is_e (natCase E1 Z X S)
IsR : is_e R
S : subst X R (natCase E1 Z X S) (natCase E2 Z1 X S) @
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
============================
is_e (natCase E2 Z1 X S)
< case IsE.
Subgoal 3:
Variables: X R S Z1 E2 Z E1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
H1 : is_e E1
H2 : is_e Z
H3 : is_string X
H4 : is_e S
============================
is_e (natCase E2 Z1 X S)
< apply IH to _ _ S1.
Subgoal 3:
Variables: X R S Z1 E2 Z E1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
H1 : is_e E1
H2 : is_e Z
H3 : is_string X
H4 : is_e S
H5 : is_e E2
============================
is_e (natCase E2 Z1 X S)
< apply IH to _ _ S2.
Subgoal 3:
Variables: X R S Z1 E2 Z E1
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 (natCase E1 Z X S) (natCase E2 Z1 X S) @
S1 : subst X R E1 E2 *
S2 : subst X R Z Z1 *
H1 : is_e E1
H2 : is_e Z
H3 : is_string X
H4 : is_e S
H5 : is_e E2
H6 : is_e Z1
============================
is_e (natCase E2 Z1 X S)
< search.
Subgoal 4:
Variables: X R S1 Y Z1 E2 S Z E1
IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E'
IsE : is_e (natCase E1 Z Y S)
IsR : is_e R
S : subst X R (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
============================
is_e (natCase E2 Z1 Y S1)
< case IsE.
Subgoal 4:
Variables: X R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
H1 : is_e E1
H2 : is_e Z
H3 : is_string Y
H4 : is_e S
============================
is_e (natCase E2 Z1 Y S1)
< apply IH to _ _ S2.
Subgoal 4:
Variables: X R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
H1 : is_e E1
H2 : is_e Z
H3 : is_string Y
H4 : is_e S
H5 : is_e E2
============================
is_e (natCase E2 Z1 Y S1)
< apply IH to _ _ S3.
Subgoal 4:
Variables: X R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
H1 : is_e E1
H2 : is_e Z
H3 : is_string Y
H4 : is_e S
H5 : is_e E2
H6 : is_e Z1
============================
is_e (natCase E2 Z1 Y S1)
< apply IH to _ _ S4.
Subgoal 4:
Variables: X R S1 Y Z1 E2 S Z E1
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 (natCase E1 Z Y S) (natCase E2 Z1 Y S1) @
S1 : X = Y -> false
S2 : subst X R E1 E2 *
S3 : subst X R Z Z1 *
S4 : subst X R S S1 *
H1 : is_e E1
H2 : is_e Z
H3 : is_string Y
H4 : is_e S
H5 : is_e E2
H6 : is_e Z1
H7 : is_e S1
============================
is_e (natCase E2 Z1 Y S1)
< search.
Proof completed.
< Prove mtc:shared_declarations:evalStep_is.
Subgoal 4:
Variables: S X Z E2 E1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
IsE : is_e (natCase E1 Z X S)
Ev : evalStep (natCase E1 Z X S) (natCase E2 Z X S) @
Ev1 : evalStep E1 E2 *
============================
is_e (natCase E2 Z X S)
< case IsE.
Subgoal 4:
Variables: S X Z E2 E1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (natCase E1 Z X S) (natCase E2 Z X S) @
Ev1 : evalStep E1 E2 *
H1 : is_e E1
H2 : is_e Z
H3 : is_string X
H4 : is_e S
============================
is_e (natCase E2 Z X S)
< apply IH to _ Ev1.
Subgoal 4:
Variables: S X Z E2 E1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (natCase E1 Z X S) (natCase E2 Z X S) @
Ev1 : evalStep E1 E2 *
H1 : is_e E1
H2 : is_e Z
H3 : is_string X
H4 : is_e S
H5 : is_e E2
============================
is_e (natCase E2 Z X S)
< search.
Subgoal 5:
Variables: E' S X
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
IsE : is_e (natCase (num z) E' X S)
Ev : evalStep (natCase (num z) E' X S) E' @
============================
is_e E'
< case IsE.
Subgoal 5:
Variables: E' S X
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (natCase (num z) E' X S) E' @
H1 : is_e (num z)
H2 : is_e E'
H3 : is_string X
H4 : is_e S
============================
is_e E'
< search.
Subgoal 6:
Variables: E' S X Z N
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
IsE : is_e (natCase (num (s N)) Z X S)
Ev : evalStep (natCase (num (s N)) Z X S) E' @
Ev1 : subst X (num N) S E'
============================
is_e E'
< Is: case IsE.
Subgoal 6:
Variables: E' S X Z N
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (natCase (num (s N)) Z X S) E' @
Ev1 : subst X (num N) S E'
Is : is_e (num (s N))
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
============================
is_e E'
< Is: case Is.
Subgoal 6:
Variables: E' S X Z N
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (natCase (num (s N)) Z X S) E' @
Ev1 : subst X (num N) S E'
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Is : is_nat (s N)
============================
is_e E'
< case Is.
Subgoal 6:
Variables: E' S X Z N
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (natCase (num (s N)) Z X S) E' @
Ev1 : subst X (num N) S E'
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
H1 : is_nat N
============================
is_e E'
< apply subst_is to _ _ Ev1.
Subgoal 6:
Variables: E' S X Z N
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (natCase (num (s N)) Z X S) E' @
Ev1 : subst X (num N) S E'
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
H1 : is_nat N
H2 : is_e E'
============================
is_e E'
< search.
Proof completed.
< Prove mtc:shared_declarations:subst_total.
Subgoal 4:
Variables: X R E3 S 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 (natCase E2 E1 S E3) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E2 *
IsE2 : is_e E1 *
IsE3 : is_string S
IsE4 : is_e E3 *
============================
exists E', subst X R (natCase E2 E1 S E3) E'
< apply IH to IsE1 IsX IsR.
Subgoal 4:
Variables: X R E3 S 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 (natCase E2 E1 S E3) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E2 *
IsE2 : is_e E1 *
IsE3 : is_string S
IsE4 : is_e E3 *
H1 : subst X R E2 E'
============================
exists E', subst X R (natCase E2 E1 S E3) E'
< apply IH to IsE2 IsX IsR.
Subgoal 4:
Variables: X R E3 S 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 (natCase E2 E1 S E3) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E2 *
IsE2 : is_e E1 *
IsE3 : is_string S
IsE4 : is_e E3 *
H1 : subst X R E2 E'
H2 : subst X R E1 E'1
============================
exists E', subst X R (natCase E2 E1 S E3) E'
< apply IH to IsE4 IsX IsR.
Subgoal 4:
Variables: X R E3 S 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 (natCase E2 E1 S E3) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E2 *
IsE2 : is_e E1 *
IsE3 : is_string S
IsE4 : 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 (natCase E2 E1 S E3) E'
< Or: apply is_string_eq_or_not to IsX IsE3.
Subgoal 4:
Variables: X R E3 S 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 (natCase E2 E1 S E3) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E2 *
IsE2 : is_e E1 *
IsE3 : is_string S
IsE4 : is_e E3 *
H1 : subst X R E2 E'
H2 : subst X R E1 E'1
H3 : subst X R E3 E'2
Or : X = S \/ (X = S -> false)
============================
exists E', subst X R (natCase E2 E1 S E3) E'
< case Or.
Subgoal 4.1:
Variables: R E3 S 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 (natCase E2 E1 S E3) @
IsX : is_string S
IsR : is_e R
IsE1 : is_e E2 *
IsE2 : is_e E1 *
IsE3 : is_string S
IsE4 : is_e E3 *
H1 : subst S R E2 E'
H2 : subst S R E1 E'1
H3 : subst S R E3 E'2
============================
exists E', subst S R (natCase E2 E1 S E3) E'
< search.
Subgoal 4.2:
Variables: X R E3 S 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 (natCase E2 E1 S E3) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E2 *
IsE2 : is_e E1 *
IsE3 : is_string S
IsE4 : is_e E3 *
H1 : subst X R E2 E'
H2 : subst X R E1 E'1
H3 : subst X R E3 E'2
H4 : X = S -> false
============================
exists E', subst X R (natCase E2 E1 S E3) E'
< search.
Proof completed.
< Prove mtc:shared_declarations:progress.
Subgoal 3:
Variables: Ty S X Z E1
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
IsE : is_e (natCase E1 Z X S)
Ty : typeOf [] (natCase E1 Z X S) Ty @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
============================
value (natCase E1 Z X S) \/ (exists E', evalStep (natCase E1 Z X S) E')
< Is: case IsE.
Subgoal 3:
Variables: Ty S X Z E1
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase E1 Z X S) Ty @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is : is_e E1
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
============================
value (natCase E1 Z X S) \/ (exists E', evalStep (natCase E1 Z X S) E')
< Or: apply IH to _ Ty1.
Subgoal 3:
Variables: Ty S X Z E1
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase E1 Z X S) Ty @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is : is_e E1
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Or : value E1 \/ (exists E', evalStep E1 E')
============================
value (natCase E1 Z X S) \/ (exists E', evalStep (natCase E1 Z X S) E')
< Ev: case Or.
Subgoal 3.1:
Variables: Ty S X Z E1
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase E1 Z X S) Ty @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is : is_e E1
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : value E1
============================
value (natCase E1 Z X S) \/ (exists E', evalStep (natCase E1 Z X S) E')
< C: apply canonical_form to Ev Ty1.
Subgoal 3.1:
Variables: Ty S X Z E1
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase E1 Z X S) Ty @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is : is_e E1
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : value E1
C : canon natTy E1
============================
value (natCase E1 Z X S) \/ (exists E', evalStep (natCase E1 Z X S) E')
< case C.
Subgoal 3.1:
Variables: Ty S X Z N
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase (num N) Z X S) Ty @
Ty1 : typeOf [] (num N) natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is : is_e (num N)
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : value (num N)
============================
value (natCase (num N) Z X S) \/
(exists E', evalStep (natCase (num N) Z X S) E')
< IsN: case Is.
Subgoal 3.1:
Variables: Ty S X Z N
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase (num N) Z X S) Ty @
Ty1 : typeOf [] (num N) natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : value (num N)
IsN : is_nat N
============================
value (natCase (num N) Z X S) \/
(exists E', evalStep (natCase (num N) Z X S) E')
< Or: apply fix_nat to IsN.
Subgoal 3.1:
Variables: Ty S X Z N
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase (num N) Z X S) Ty @
Ty1 : typeOf [] (num N) natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : value (num N)
IsN : is_nat N
Or : N = z \/ (exists N', N = s N')
============================
value (natCase (num N) Z X S) \/
(exists E', evalStep (natCase (num N) Z X S) E')
< case Or.
Subgoal 3.1.1:
Variables: Ty S X Z
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase (num z) Z X S) Ty @
Ty1 : typeOf [] (num z) natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : value (num z)
IsN : is_nat z
============================
value (natCase (num z) Z X S) \/
(exists E', evalStep (natCase (num z) Z X S) E')
< search.
Subgoal 3.1.2:
Variables: Ty S X Z N'
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase (num (s N')) Z X S) Ty @
Ty1 : typeOf [] (num (s N')) natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : value (num (s N'))
IsN : is_nat (s N')
============================
value (natCase (num (s N')) Z X S) \/
(exists E', evalStep (natCase (num (s N')) Z X S) E')
< case IsN.
Subgoal 3.1.2:
Variables: Ty S X Z N'
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase (num (s N')) Z X S) Ty @
Ty1 : typeOf [] (num (s N')) natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : value (num (s N'))
H1 : is_nat N'
============================
value (natCase (num (s N')) Z X S) \/
(exists E', evalStep (natCase (num (s N')) Z X S) E')
< apply subst_total to Is3 Is2 _ with
R = num N'.
Subgoal 3.1.2:
Variables: Ty S X Z N' E'
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase (num (s N')) Z X S) Ty @
Ty1 : typeOf [] (num (s N')) natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : value (num (s N'))
H1 : is_nat N'
H2 : subst X (num N') S E'
============================
value (natCase (num (s N')) Z X S) \/
(exists E', evalStep (natCase (num (s N')) Z X S) E')
< search.
Subgoal 3.2:
Variables: Ty S X Z E1 E'
IH : forall E Ty,
is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (natCase E1 Z X S) Ty @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] Z Ty *
Ty3 : typeOf [(X, natTy)] S Ty *
Is : is_e E1
Is1 : is_e Z
Is2 : is_string X
Is3 : is_e S
Ev : evalStep E1 E'
============================
value (natCase E1 Z X S) \/ (exists E', evalStep (natCase E1 Z X S) E')
< search.
Proof completed.