Reasoning Details

 < Module mtc:arith.
 < Extensible_Theorem
      fix_nat : forall N,
         IsN : is_nat N ->
         N = z \/
         (exists N', N = s N')
      on IsN.

Subgoal 1:

IH : forall N, is_nat N * -> N = z \/ (exists N', N = s N')
IsN : is_nat z @
============================
 z = z \/ (exists N', z = s N')
 < search.

Subgoal 2:

Variables: Nat
IH : forall N, is_nat N * -> N = z \/ (exists N', N = s N')
IsN : is_nat (s Nat) @
IsN1 : is_nat Nat *
============================
 s Nat = z \/ (exists N', s Nat = s N')
 < search.

Proof completed.
 < Prove mtc:shared_declarations:type_preservation.

Subgoal 1:

Variables: TG Ty EG N
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 (num N) Ty
Ev : eval EG (num N) (numVal N) @
============================
 valueType (numVal N) Ty
 < case Ty.

Subgoal 1:

Variables: TG EG N
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 (num N) (numVal N) @
============================
 valueType (numVal N) natTy
 < search.

Subgoal 2:

Variables: TG Ty EG N1 N2 N E2 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 (plus E1 E2) Ty
Ev : eval EG (plus E1 E2) (numVal N) @
Ev1 : eval EG E1 (numVal N1) *
Ev2 : eval EG E2 (numVal N2) *
Ev3 : plusRel N1 N2 N
============================
 valueType (numVal N) Ty
 < case Ty.

Subgoal 2:

Variables: TG EG N1 N2 N E2 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 (plus E1 E2) (numVal N) @
Ev1 : eval EG E1 (numVal N1) *
Ev2 : eval EG E2 (numVal N2) *
Ev3 : plusRel N1 N2 N
H1 : typeOf TG E1 natTy
H2 : typeOf TG E2 natTy
============================
 valueType (numVal N) natTy
 < search.

Proof completed.
 < Prove mtc:shared_declarations:value_evalStep_false.

Subgoal 1:

Variables: E' N
IH : forall E E', value E * -> evalStep E E' -> false
V : value (num N) @
Ev : evalStep (num N) E'
============================
 false
 < case Ev.

Proof completed.
 < Theorem plusRel_unique :
     forall N1 N2 A B, plusRel N1 N2 A -> plusRel N1 N2 B -> A = B.

============================
 forall N1 N2 A B, plusRel N1 N2 A -> plusRel N1 N2 B -> A = B
 < induction on 1.

IH : forall N1 N2 A B, plusRel N1 N2 A * -> plusRel N1 N2 B -> A = B
============================
 forall N1 N2 A B, plusRel N1 N2 A @ -> plusRel N1 N2 B -> A = B
 < intros PA PB.

Variables: N1 N2 A B
IH : forall N1 N2 A B, plusRel N1 N2 A * -> plusRel N1 N2 B -> A = B
PA : plusRel N1 N2 A @
PB : plusRel N1 N2 B
============================
 A = B
 < PA: case PA.

Subgoal 1:

Variables: A B
IH : forall N1 N2 A B, plusRel N1 N2 A * -> plusRel N1 N2 B -> A = B
PB : plusRel z A B
============================
 A = B
 < case PB.

Subgoal 1:

Variables: B
IH : forall N1 N2 A B, plusRel N1 N2 A * -> plusRel N1 N2 B -> A = B
============================
 B = B
 < search.

Subgoal 2:

Variables: N2 B N5 N3
IH : forall N1 N2 A B, plusRel N1 N2 A * -> plusRel N1 N2 B -> A = B
PB : plusRel (s N3) N2 B
PA : plusRel N3 N2 N5 *
============================
 s N5 = B
 < PB: case PB.

Subgoal 2:

Variables: N2 N5 N3 N7
IH : forall N1 N2 A B, plusRel N1 N2 A * -> plusRel N1 N2 B -> A = B
PA : plusRel N3 N2 N5 *
PB : plusRel N3 N2 N7
============================
 s N5 = s N7
 < apply IH to PA PB.

Subgoal 2:

Variables: N2 N3 N7
IH : forall N1 N2 A B, plusRel N1 N2 A * -> plusRel N1 N2 B -> A = B
PA : plusRel N3 N2 N7 *
PB : plusRel N3 N2 N7
============================
 s N7 = s N7
 < search.

Proof completed.
 < Prove mtc:shared_declarations:subst_unique.

Subgoal 1:

Variables: X R EB N
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (num N) (num N) @
SB : subst X R (num N) EB
============================
 num N = EB
 < case SB.

Subgoal 1:

Variables: X R N
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (num N) (num N) @
============================
 num N = num N
 < search.

Subgoal 2:

Variables: X R EB E21 E11 E2 E1
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (plus E1 E2) (plus E11 E21) @
SB : subst X R (plus E1 E2) EB
SA1 : subst X R E1 E11 *
SA2 : subst X R E2 E21 *
============================
 plus E11 E21 = EB
 < SB: case SB.

Subgoal 2:

Variables: X R E21 E11 E2 E1 E6 E5
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (plus E1 E2) (plus E11 E21) @
SA1 : subst X R E1 E11 *
SA2 : subst X R E2 E21 *
SB : subst X R E1 E5
SB1 : subst X R E2 E6
============================
 plus E11 E21 = plus E5 E6
 < apply IH to SA1 SB.

Subgoal 2:

Variables: X R E21 E2 E1 E6 E5
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (plus E1 E2) (plus E5 E21) @
SA1 : subst X R E1 E5 *
SA2 : subst X R E2 E21 *
SB : subst X R E1 E5
SB1 : subst X R E2 E6
============================
 plus E5 E21 = plus E5 E6
 < apply IH to SA2 SB1.

Subgoal 2:

Variables: X R E2 E1 E6 E5
IH : forall X R E EA EB, subst X R E EA * -> subst X R E EB -> EA = EB
SA : subst X R (plus E1 E2) (plus E5 E6) @
SA1 : subst X R E1 E5 *
SA2 : subst X R E2 E6 *
SB : subst X R E1 E5
SB1 : subst X R E2 E6
============================
 plus E5 E6 = plus E5 E6
 < search.

Proof completed.
 < Prove mtc:shared_declarations:evalStep_unique.

Subgoal 1:

Variables: EB E2 E11 E1
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus E1 E2) (plus E11 E2) @
EvB : evalStep (plus E1 E2) EB
EvA1 : evalStep E1 E11 *
============================
 plus E11 E2 = EB
 < EvB: case EvB.

Subgoal 1.1:

Variables: E2 E11 E1 E5
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus E1 E2) (plus E11 E2) @
EvA1 : evalStep E1 E11 *
EvB : evalStep E1 E5
============================
 plus E11 E2 = plus E5 E2
 < apply IH to EvA1 EvB.

Subgoal 1.1:

Variables: E2 E1 E5
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus E1 E2) (plus E5 E2) @
EvA1 : evalStep E1 E5 *
EvB : evalStep E1 E5
============================
 plus E5 E2 = plus E5 E2
 < search.

Subgoal 1.2:

Variables: E2 E11 E1 E21
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus E1 E2) (plus E11 E2) @
EvA1 : evalStep E1 E11 *
EvB : value E1
EvB1 : evalStep E2 E21
============================
 plus E11 E2 = plus E1 E21
 < apply value_evalStep_false to EvB EvA1.

Subgoal 1.3:

Variables: E11 N N2 N1
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus (num N1) (num N2)) (plus E11 (num N2)) @
EvA1 : evalStep (num N1) E11 *
EvB : plusRel N1 N2 N
============================
 plus E11 (num N2) = num N
 < case EvA1.

Subgoal 2:

Variables: EB E21 E1 E2
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus E1 E2) (plus E1 E21) @
EvB : evalStep (plus E1 E2) EB
EvA1 : value E1
EvA2 : evalStep E2 E21 *
============================
 plus E1 E21 = EB
 < EvB: case EvB.

Subgoal 2.1:

Variables: E21 E1 E2 E11
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus E1 E2) (plus E1 E21) @
EvA1 : value E1
EvA2 : evalStep E2 E21 *
EvB : evalStep E1 E11
============================
 plus E1 E21 = plus E11 E2
 < apply value_evalStep_false to EvA1 EvB.

Subgoal 2.2:

Variables: E21 E1 E2 E5
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus E1 E2) (plus E1 E21) @
EvA1 : value E1
EvA2 : evalStep E2 E21 *
EvB : value E1
EvB1 : evalStep E2 E5
============================
 plus E1 E21 = plus E1 E5
 < apply IH to EvA2 EvB1.

Subgoal 2.2:

Variables: E1 E2 E5
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus E1 E2) (plus E1 E5) @
EvA1 : value E1
EvA2 : evalStep E2 E5 *
EvB : value E1
EvB1 : evalStep E2 E5
============================
 plus E1 E5 = plus E1 E5
 < search.

Subgoal 2.3:

Variables: E21 N N2 N1
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus (num N1) (num N2)) (plus (num N1) E21) @
EvA1 : value (num N1)
EvA2 : evalStep (num N2) E21 *
EvB : plusRel N1 N2 N
============================
 plus (num N1) E21 = num N
 < case EvA2.

Subgoal 3:

Variables: EB N N2 N1
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus (num N1) (num N2)) (num N) @
EvB : evalStep (plus (num N1) (num N2)) EB
EvA1 : plusRel N1 N2 N
============================
 num N = EB
 < EvB: case EvB.

Subgoal 3.1:

Variables: N N2 N1 E11
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus (num N1) (num N2)) (num N) @
EvA1 : plusRel N1 N2 N
EvB : evalStep (num N1) E11
============================
 num N = plus E11 (num N2)
 < case EvB.

Subgoal 3.2:

Variables: N N2 N1 E21
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus (num N1) (num N2)) (num N) @
EvA1 : plusRel N1 N2 N
EvB : value (num N1)
EvB1 : evalStep (num N2) E21
============================
 num N = plus (num N1) E21
 < case EvB1.

Subgoal 3.3:

Variables: N N2 N1 N5
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus (num N1) (num N2)) (num N) @
EvA1 : plusRel N1 N2 N
EvB : plusRel N1 N2 N5
============================
 num N = num N5
 < apply plusRel_unique to EvA1 EvB.

Subgoal 3.3:

Variables: N2 N1 N5
IH : forall E EA EB, evalStep E EA * -> evalStep E EB -> EA = EB
EvA : evalStep (plus (num N1) (num N2)) (num N5) @
EvA1 : plusRel N1 N2 N5
EvB : plusRel N1 N2 N5
============================
 num N5 = num N5
 < search.

Proof completed.
 < Prove mtc:shared_declarations:ty_lookup.

Subgoal 1:

Variables: G1 G2 N
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 (num N) natTy @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
============================
 typeOf G2 (num N) natTy
 < search.

Subgoal 2:

Variables: G1 G2 E2 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 (plus E1 E2) natTy @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 E2 natTy *
============================
 typeOf G2 (plus E1 E2) natTy
 < apply IH to Ty1 L.

Subgoal 2:

Variables: G1 G2 E2 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 (plus E1 E2) natTy @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 E2 natTy *
H1 : typeOf G2 E1 natTy
============================
 typeOf G2 (plus E1 E2) natTy
 < apply IH to Ty2 L.

Subgoal 2:

Variables: G1 G2 E2 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 (plus E1 E2) natTy @
L : forall X XTy, lookup G1 X XTy -> lookup G2 X XTy
Ty1 : typeOf G1 E1 natTy *
Ty2 : typeOf G1 E2 natTy *
H1 : typeOf G2 E1 natTy
H2 : typeOf G2 E2 natTy
============================
 typeOf G2 (plus E1 E2) natTy
 < search.

Proof completed.
 < Prove mtc:shared_declarations:subst_preservation.

Subgoal 1:

Variables: X XTy TG Ty R N
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) (num N) Ty
S : subst X R (num N) (num N) @
RTy : typeOf [] R XTy
============================
 typeOf TG (num N) Ty
 < case Ty.

Subgoal 1:

Variables: X XTy TG R N
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 (num N) (num N) @
RTy : typeOf [] R XTy
============================
 typeOf TG (num N) natTy
 < search.

Subgoal 2:

Variables: X XTy TG Ty R E21 E11 E2 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) (plus E1 E2) Ty
S : subst X R (plus E1 E2) (plus E11 E21) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E11 *
S2 : subst X R E2 E21 *
============================
 typeOf TG (plus E11 E21) Ty
 < Ty: case Ty.

Subgoal 2:

Variables: X XTy TG R E21 E11 E2 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 (plus E1 E2) (plus E11 E21) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E11 *
S2 : subst X R E2 E21 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) E2 natTy
============================
 typeOf TG (plus E11 E21) natTy
 < apply IH to Ty S1 RTy.

Subgoal 2:

Variables: X XTy TG R E21 E11 E2 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 (plus E1 E2) (plus E11 E21) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E11 *
S2 : subst X R E2 E21 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) E2 natTy
H1 : typeOf TG E11 natTy
============================
 typeOf TG (plus E11 E21) natTy
 < apply IH to Ty1 S2 RTy.

Subgoal 2:

Variables: X XTy TG R E21 E11 E2 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 (plus E1 E2) (plus E11 E21) @
RTy : typeOf [] R XTy
S1 : subst X R E1 E11 *
S2 : subst X R E2 E21 *
Ty : typeOf ((X, XTy)::TG) E1 natTy
Ty1 : typeOf ((X, XTy)::TG) E2 natTy
H1 : typeOf TG E11 natTy
H2 : typeOf TG E21 natTy
============================
 typeOf TG (plus E11 E21) natTy
 < search.

Proof completed.
 < Prove mtc:shared_declarations:evalStep_type_preservation.

Subgoal 1:

Variables: Ty E2 E11 E1
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ty : typeOf [] (plus E1 E2) Ty
Ev : evalStep (plus E1 E2) (plus E11 E2) @
Ev1 : evalStep E1 E11 *
============================
 typeOf [] (plus E11 E2) Ty
 < Ty: case Ty.

Subgoal 1:

Variables: E2 E11 E1
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (plus E1 E2) (plus E11 E2) @
Ev1 : evalStep E1 E11 *
Ty : typeOf [] E1 natTy
Ty1 : typeOf [] E2 natTy
============================
 typeOf [] (plus E11 E2) natTy
 < apply IH to Ty Ev1.

Subgoal 1:

Variables: E2 E11 E1
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (plus E1 E2) (plus E11 E2) @
Ev1 : evalStep E1 E11 *
Ty : typeOf [] E1 natTy
Ty1 : typeOf [] E2 natTy
H1 : typeOf [] E11 natTy
============================
 typeOf [] (plus E11 E2) natTy
 < search.

Subgoal 2:

Variables: Ty E21 E1 E2
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ty : typeOf [] (plus E1 E2) Ty
Ev : evalStep (plus E1 E2) (plus E1 E21) @
Ev1 : value E1
Ev2 : evalStep E2 E21 *
============================
 typeOf [] (plus E1 E21) Ty
 < Ty: case Ty.

Subgoal 2:

Variables: E21 E1 E2
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (plus E1 E2) (plus E1 E21) @
Ev1 : value E1
Ev2 : evalStep E2 E21 *
Ty : typeOf [] E1 natTy
Ty1 : typeOf [] E2 natTy
============================
 typeOf [] (plus E1 E21) natTy
 < apply IH to Ty1 Ev2.

Subgoal 2:

Variables: E21 E1 E2
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (plus E1 E2) (plus E1 E21) @
Ev1 : value E1
Ev2 : evalStep E2 E21 *
Ty : typeOf [] E1 natTy
Ty1 : typeOf [] E2 natTy
H1 : typeOf [] E21 natTy
============================
 typeOf [] (plus E1 E21) natTy
 < search.

Subgoal 3:

Variables: Ty N N2 N1
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ty : typeOf [] (plus (num N1) (num N2)) Ty
Ev : evalStep (plus (num N1) (num N2)) (num N) @
Ev1 : plusRel N1 N2 N
============================
 typeOf [] (num N) Ty
 < case Ty.

Subgoal 3:

Variables: N N2 N1
IH : forall E Ty E', typeOf [] E Ty -> evalStep E E' * -> typeOf [] E' Ty
Ev : evalStep (plus (num N1) (num N2)) (num N) @
Ev1 : plusRel N1 N2 N
H1 : typeOf [] (num N1) natTy
H2 : typeOf [] (num N2) natTy
============================
 typeOf [] (num N) natTy
 < search.

Proof completed.
 < Prove mtc:shared_declarations:canonical_form.

Subgoal 1:

Variables: Ty N
IH : forall V Ty, value V * -> typeOf [] V Ty -> canon Ty V
V : value (num N) @
Ty : typeOf [] (num N) Ty
============================
 canon Ty (num N)
 < case Ty.

Subgoal 1:

Variables: N
IH : forall V Ty, value V * -> typeOf [] V Ty -> canon Ty V
V : value (num N) @
============================
 canon natTy (num N)
 < search.

Proof completed.
 < Prove mtc:shared_declarations:subst_is.

Subgoal 1:

Variables: X R N
IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E'
IsE : is_e (num N)
IsR : is_e R
S : subst X R (num N) (num N) @
============================
 is_e (num N)
 < search.

Subgoal 2:

Variables: X R E21 E11 E2 E1
IH : forall X R E E', is_e E -> is_e R -> subst X R E E' * -> is_e E'
IsE : is_e (plus E1 E2)
IsR : is_e R
S : subst X R (plus E1 E2) (plus E11 E21) @
S1 : subst X R E1 E11 *
S2 : subst X R E2 E21 *
============================
 is_e (plus E11 E21)
 < case IsE.

Subgoal 2:

Variables: X R E21 E11 E2 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 (plus E1 E2) (plus E11 E21) @
S1 : subst X R E1 E11 *
S2 : subst X R E2 E21 *
H1 : is_e E1
H2 : is_e E2
============================
 is_e (plus E11 E21)
 < apply IH to _ _ S1.

Subgoal 2:

Variables: X R E21 E11 E2 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 (plus E1 E2) (plus E11 E21) @
S1 : subst X R E1 E11 *
S2 : subst X R E2 E21 *
H1 : is_e E1
H2 : is_e E2
H3 : is_e E11
============================
 is_e (plus E11 E21)
 < apply IH to _ _ S2.

Subgoal 2:

Variables: X R E21 E11 E2 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 (plus E1 E2) (plus E11 E21) @
S1 : subst X R E1 E11 *
S2 : subst X R E2 E21 *
H1 : is_e E1
H2 : is_e E2
H3 : is_e E11
H4 : is_e E21
============================
 is_e (plus E11 E21)
 < search.

Proof completed.
 < Theorem plusRel_is :
     forall A B C, is_nat A -> is_nat B -> plusRel A B C -> is_nat C.

============================
 forall A B C, is_nat A -> is_nat B -> plusRel A B C -> is_nat C
 < induction on 3.

IH : forall A B C, is_nat A -> is_nat B -> plusRel A B C * -> is_nat C
============================
 forall A B C, is_nat A -> is_nat B -> plusRel A B C @ -> is_nat C
 < intros IsA IsB P.

Variables: A B C
IH : forall A B C, is_nat A -> is_nat B -> plusRel A B C * -> is_nat C
IsA : is_nat A
IsB : is_nat B
P : plusRel A B C @
============================
 is_nat C
 < P: case P.

Subgoal 1:

Variables: C
IH : forall A B C, is_nat A -> is_nat B -> plusRel A B C * -> is_nat C
IsA : is_nat z
IsB : is_nat C
============================
 is_nat C
 < search.

Subgoal 2:

Variables: B N3 N1
IH : forall A B C, is_nat A -> is_nat B -> plusRel A B C * -> is_nat C
IsA : is_nat (s N1)
IsB : is_nat B
P : plusRel N1 B N3 *
============================
 is_nat (s N3)
 < case IsA.

Subgoal 2:

Variables: B N3 N1
IH : forall A B C, is_nat A -> is_nat B -> plusRel A B C * -> is_nat C
IsB : is_nat B
P : plusRel N1 B N3 *
H1 : is_nat N1
============================
 is_nat (s N3)
 < apply IH to _ _ P.

Subgoal 2:

Variables: B N3 N1
IH : forall A B C, is_nat A -> is_nat B -> plusRel A B C * -> is_nat C
IsB : is_nat B
P : plusRel N1 B N3 *
H1 : is_nat N1
H2 : is_nat N3
============================
 is_nat (s N3)
 < search.

Proof completed.
 < Prove mtc:shared_declarations:evalStep_is.

Subgoal 1:

Variables: E2 E11 E1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
IsE : is_e (plus E1 E2)
Ev : evalStep (plus E1 E2) (plus E11 E2) @
Ev1 : evalStep E1 E11 *
============================
 is_e (plus E11 E2)
 < case IsE.

Subgoal 1:

Variables: E2 E11 E1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (plus E1 E2) (plus E11 E2) @
Ev1 : evalStep E1 E11 *
H1 : is_e E1
H2 : is_e E2
============================
 is_e (plus E11 E2)
 < apply IH to _ Ev1.

Subgoal 1:

Variables: E2 E11 E1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (plus E1 E2) (plus E11 E2) @
Ev1 : evalStep E1 E11 *
H1 : is_e E1
H2 : is_e E2
H3 : is_e E11
============================
 is_e (plus E11 E2)
 < search.

Subgoal 2:

Variables: E21 E1 E2
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
IsE : is_e (plus E1 E2)
Ev : evalStep (plus E1 E2) (plus E1 E21) @
Ev1 : value E1
Ev2 : evalStep E2 E21 *
============================
 is_e (plus E1 E21)
 < case IsE.

Subgoal 2:

Variables: E21 E1 E2
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (plus E1 E2) (plus E1 E21) @
Ev1 : value E1
Ev2 : evalStep E2 E21 *
H1 : is_e E1
H2 : is_e E2
============================
 is_e (plus E1 E21)
 < apply IH to _ Ev2.

Subgoal 2:

Variables: E21 E1 E2
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (plus E1 E2) (plus E1 E21) @
Ev1 : value E1
Ev2 : evalStep E2 E21 *
H1 : is_e E1
H2 : is_e E2
H3 : is_e E21
============================
 is_e (plus E1 E21)
 < search.

Subgoal 3:

Variables: N N2 N1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
IsE : is_e (plus (num N1) (num N2))
Ev : evalStep (plus (num N1) (num N2)) (num N) @
Ev1 : plusRel N1 N2 N
============================
 is_e (num N)
 < Is: case IsE.

Subgoal 3:

Variables: N N2 N1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (plus (num N1) (num N2)) (num N) @
Ev1 : plusRel N1 N2 N
Is : is_e (num N1)
Is1 : is_e (num N2)
============================
 is_e (num N)
 < case Is.

Subgoal 3:

Variables: N N2 N1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (plus (num N1) (num N2)) (num N) @
Ev1 : plusRel N1 N2 N
Is1 : is_e (num N2)
H1 : is_nat N1
============================
 is_e (num N)
 < case Is1.

Subgoal 3:

Variables: N N2 N1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (plus (num N1) (num N2)) (num N) @
Ev1 : plusRel N1 N2 N
H1 : is_nat N1
H2 : is_nat N2
============================
 is_e (num N)
 < apply plusRel_is to _ _ Ev1.

Subgoal 3:

Variables: N N2 N1
IH : forall E E', is_e E -> evalStep E E' * -> is_e E'
Ev : evalStep (plus (num N1) (num N2)) (num N) @
Ev1 : plusRel N1 N2 N
H1 : is_nat N1
H2 : is_nat N2
H3 : is_nat N
============================
 is_e (num N)
 < search.

Proof completed.
 < Prove mtc:shared_declarations:subst_total.

Subgoal 2:

Variables: X R Nat
IH : forall X R E,
       is_e E * -> is_string X -> is_e R -> exists E', subst X R E E'
IsE : is_e (num Nat) @
IsX : is_string X
IsR : is_e R
IsE1 : is_nat Nat
============================
 exists E', subst X R (num Nat) E'
 < search.

Subgoal 3:

Variables: X R E2 E1
IH : forall X R E,
       is_e E * -> is_string X -> is_e R -> exists E', subst X R E E'
IsE : is_e (plus E1 E2) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 exists E', subst X R (plus E1 E2) E'
 < apply IH to IsE1 IsX IsR.

Subgoal 3:

Variables: X R E2 E1 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 (plus E1 E2) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
IsE2 : is_e E2 *
H1 : subst X R E1 E'
============================
 exists E', subst X R (plus E1 E2) E'
 < apply IH to IsE2 IsX IsR.

Subgoal 3:

Variables: X R E2 E1 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 (plus E1 E2) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
IsE2 : is_e E2 *
H1 : subst X R E1 E'
H2 : subst X R E2 E'1
============================
 exists E', subst X R (plus E1 E2) E'
 < search.

Proof completed.
 < Theorem plusRel_total :
     forall N1 N2, is_nat N1 -> exists N, plusRel N1 N2 N.

============================
 forall N1 N2, is_nat N1 -> exists N, plusRel N1 N2 N
 < induction on 1.

IH : forall N1 N2, is_nat N1 * -> exists N, plusRel N1 N2 N
============================
 forall N1 N2, is_nat N1 @ -> exists N, plusRel N1 N2 N
 < intros Is.

Variables: N1 N2
IH : forall N1 N2, is_nat N1 * -> exists N, plusRel N1 N2 N
Is : is_nat N1 @
============================
 exists N, plusRel N1 N2 N
 < Or: apply fix_nat to Is.

Variables: N1 N2
IH : forall N1 N2, is_nat N1 * -> exists N, plusRel N1 N2 N
Is : is_nat N1 @
Or : N1 = z \/ (exists N', N1 = s N')
============================
 exists N, plusRel N1 N2 N
 < case Or.

Subgoal 1:

Variables: N2
IH : forall N1 N2, is_nat N1 * -> exists N, plusRel N1 N2 N
Is : is_nat z @
============================
 exists N, plusRel z N2 N
 < search.

Subgoal 2:

Variables: N2 N'
IH : forall N1 N2, is_nat N1 * -> exists N, plusRel N1 N2 N
Is : is_nat (s N') @
============================
 exists N, plusRel (s N') N2 N
 < Is: case Is.

Subgoal 2:

Variables: N2 N'
IH : forall N1 N2, is_nat N1 * -> exists N, plusRel N1 N2 N
Is : is_nat N' *
============================
 exists N, plusRel (s N') N2 N
 < apply IH to Is with
     N2 = N2.

Subgoal 2:

Variables: N2 N' N
IH : forall N1 N2, is_nat N1 * -> exists N, plusRel N1 N2 N
Is : is_nat N' *
H1 : plusRel N' N2 N
============================
 exists N, plusRel (s N') N2 N
 < search.

Proof completed.
 < Prove mtc:shared_declarations:progress.

Subgoal 1:

Variables: N
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
IsE : is_e (num N)
Ty : typeOf [] (num N) natTy @
============================
 value (num N) \/ (exists E', evalStep (num N) E')
 < search.

Subgoal 2:

Variables: E2 E1
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
IsE : is_e (plus E1 E2)
Ty : typeOf [] (plus E1 E2) natTy @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] E2 natTy *
============================
 value (plus E1 E2) \/ (exists E', evalStep (plus E1 E2) E')
 < Is: case IsE.

Subgoal 2:

Variables: E2 E1
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus E1 E2) natTy @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e E1
Is1 : is_e E2
============================
 value (plus E1 E2) \/ (exists E', evalStep (plus E1 E2) E')
 < Or1: apply IH to _ Ty1.

Subgoal 2:

Variables: E2 E1
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus E1 E2) natTy @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e E1
Is1 : is_e E2
Or1 : value E1 \/ (exists E', evalStep E1 E')
============================
 value (plus E1 E2) \/ (exists E', evalStep (plus E1 E2) E')
 < Or2: apply IH to _ Ty2.

Subgoal 2:

Variables: E2 E1
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus E1 E2) natTy @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e E1
Is1 : is_e E2
Or1 : value E1 \/ (exists E', evalStep E1 E')
Or2 : value E2 \/ (exists E', evalStep E2 E')
============================
 value (plus E1 E2) \/ (exists E', evalStep (plus E1 E2) E')
 < Ev1: case Or1.

Subgoal 2.1:

Variables: E2 E1
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus E1 E2) natTy @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e E1
Is1 : is_e E2
Or2 : value E2 \/ (exists E', evalStep E2 E')
Ev1 : value E1
============================
 value (plus E1 E2) \/ (exists E', evalStep (plus E1 E2) E')
 < Ev2: case Or2.

Subgoal 2.1.1:

Variables: E2 E1
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus E1 E2) natTy @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e E1
Is1 : is_e E2
Ev1 : value E1
Ev2 : value E2
============================
 value (plus E1 E2) \/ (exists E', evalStep (plus E1 E2) E')
 < C1: apply canonical_form to Ev1 Ty1.

Subgoal 2.1.1:

Variables: E2 E1
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus E1 E2) natTy @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e E1
Is1 : is_e E2
Ev1 : value E1
Ev2 : value E2
C1 : canon natTy E1
============================
 value (plus E1 E2) \/ (exists E', evalStep (plus E1 E2) E')
 < case C1.

Subgoal 2.1.1:

Variables: E2 N
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus (num N) E2) natTy @
Ty1 : typeOf [] (num N) natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e (num N)
Is1 : is_e E2
Ev1 : value (num N)
Ev2 : value E2
============================
 value (plus (num N) E2) \/ (exists E', evalStep (plus (num N) E2) E')
 < C2: apply canonical_form to Ev2 Ty2.

Subgoal 2.1.1:

Variables: E2 N
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus (num N) E2) natTy @
Ty1 : typeOf [] (num N) natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e (num N)
Is1 : is_e E2
Ev1 : value (num N)
Ev2 : value E2
C2 : canon natTy E2
============================
 value (plus (num N) E2) \/ (exists E', evalStep (plus (num N) E2) E')
 < case C2.

Subgoal 2.1.1:

Variables: N N1
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus (num N) (num N1)) natTy @
Ty1 : typeOf [] (num N) natTy *
Ty2 : typeOf [] (num N1) natTy *
Is : is_e (num N)
Is1 : is_e (num N1)
Ev1 : value (num N)
Ev2 : value (num N1)
============================
 value (plus (num N) (num N1)) \/
 (exists E', evalStep (plus (num N) (num N1)) E')
 < Is: case Is.

Subgoal 2.1.1:

Variables: N N1
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus (num N) (num N1)) natTy @
Ty1 : typeOf [] (num N) natTy *
Ty2 : typeOf [] (num N1) natTy *
Is1 : is_e (num N1)
Ev1 : value (num N)
Ev2 : value (num N1)
Is : is_nat N
============================
 value (plus (num N) (num N1)) \/
 (exists E', evalStep (plus (num N) (num N1)) E')
 < apply plusRel_total to Is with
     N2 = N1.

Subgoal 2.1.1:

Variables: N N1 N2
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus (num N) (num N1)) natTy @
Ty1 : typeOf [] (num N) natTy *
Ty2 : typeOf [] (num N1) natTy *
Is1 : is_e (num N1)
Ev1 : value (num N)
Ev2 : value (num N1)
Is : is_nat N
H1 : plusRel N N1 N2
============================
 value (plus (num N) (num N1)) \/
 (exists E', evalStep (plus (num N) (num N1)) E')
 < search.

Subgoal 2.1.2:

Variables: E2 E1 E'
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus E1 E2) natTy @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e E1
Is1 : is_e E2
Ev1 : value E1
Ev2 : evalStep E2 E'
============================
 value (plus E1 E2) \/ (exists E', evalStep (plus E1 E2) E')
 < search.

Subgoal 2.2:

Variables: E2 E1 E'
IH : forall E Ty,
       is_e E -> typeOf [] E Ty * -> value E \/ (exists E', evalStep E E')
Ty : typeOf [] (plus E1 E2) natTy @
Ty1 : typeOf [] E1 natTy *
Ty2 : typeOf [] E2 natTy *
Is : is_e E1
Is1 : is_e E2
Or2 : value E2 \/ (exists E', evalStep E2 E')
Ev1 : evalStep E1 E'
============================
 value (plus E1 E2) \/ (exists E', evalStep (plus E1 E2) E')
 < search.

Proof completed.
Back to example home