< 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.