(* declarations organized and commented and computation axioms added May 22 *) (* modified May 17 to exploit UNEVAL *) (* modified further May 18-19 during Moscow visit *) (* comment, May 18: write a tactic to change ?1 to Nat:?1 so that INDUCTION can be applied --done? *) (* file for Peano arithmetic *) (* now contains most basic axioms of algebra of natural numbers *) (* script "new.quantifiers"; script "typestuff"; *) (* type of natural numbers *) declareconstant "Nat"; declareinfix "+"; declareinfix "*"; declareinfix "-"; (* type axioms for constants and operations *) axiom "ZERONAT" "0" "Nat:0"; axiom "ONENAT" "1" "Nat:1"; axiom "PLUSTYPE" "?x+?y" "Nat:(Nat:?x)+Nat:?y"; axiom "TIMESTYPE" "?x*?y" "Nat:(Nat:?x)*Nat:?y"; axiom "MINUSTYPE" "?x-?y" "Nat:(Nat:?x)-Nat:?y"; (* computation axioms *) axiom "PLUSCOMP" "?x+?y" "?x+!?y"; axiom "TIMESCOMP" "?x*?y" "?x*!?y"; axiom "MINUSCOMP" "?x-?y" "?x-!?y"; (* zero is not a successor *) axiom "SUCCNOTZERO" "0=?x+1" "false"; (* recursive definition of addition *) axiom "PLUSID" "?x+0" "Nat:?x"; axiom "PLUSSUCC" "?x+?y+1" "(?x+?y)+1"; (* recursive definition of multiplication *) axiom "TIMESZERO" "?x*0" "0"; axiom "TIMESSUCC" "?x*?y+1" "(?x*?y)+?x"; (* recursive definition of predecessor *) axiom "ZEROMINUS" "0-1" "0"; axiom "PLUSMINUS" "(?x+1)-1" "Nat:?x"; (* recursive definition of natural number subtraction *) axiom "MINUSZERO" "?x-0" "Nat:?x"; axiom "MINUSSUCC" "?x-?y+1" "(?x-?y)-1"; (* the induction axiom *) axiom "INDUCTION" "forall@[?P@Nat:?1]" "(?P@0)&forall@[(?P@Nat:?1)->?P@?1+1]"; (* typing tactic -- type the parameter where found as a Nat *) dpt "TYPEX"; s "?x+?y"; ri "TADDLEFT@PLUSTYPE"; ex(); p "TYPEXPLUSLEFT@?x"; s "?x*?y"; ri "TADDLEFT@TIMESTYPE"; ex(); p "TYPEXTIMESLEFT@?x"; s "?x-?y"; ri "TADDLEFT@MINUSTYPE"; ex(); p "TYPEXMINUSLEFT@?x"; s "?x+?y"; ri "TADDRIGHT@PLUSTYPE"; ex(); p "TYPEXPLUSRIGHT@?y"; s "?x*?y"; ri "TADDRIGHT@TIMESTYPE"; ex(); p "TYPEXTIMESRIGHT@?y"; s "?x-?y"; ri "TADDRIGHT@MINUSTYPE"; ex(); p "TYPEXMINUSRIGHT@?y"; s "?y"; ri "RL@EVERYWHERE2@TYPEX@?x"; ri "VALUE@[EVERYWHERE2@TYPEX@?x]"; ri "TYPEXPLUSLEFT@?x"; ri "TYPEXTIMESLEFT@?x"; ri "TYPEXMINUSLEFT@?x"; ri "TYPEXPLUSRIGHT@?x"; ri "TYPEXTIMESRIGHT@?x"; ri "TYPEXMINUSRIGHT@?x"; p "TYPEX@?x"; (* induction setup *) s "forall@[?P@?1]"; right(); right(); ri "TYPEX@?1"; ri "BIND@Nat:?1"; p "INDSETUP"; (* completed induction tactic *) s "forall@[?P@?1]"; ri "INDSETUP"; ri "INDUCTION"; ri "EVERYWHERE2@EVAL"; p "IND_TAC"; (* originally an axiom; proved when predecessor was introduced as an operation *) (* SAMESUCC: (?x + 1) = ?y + 1 = (Nat : ?x) = Nat : ?y ["CASEINTRO","EQUATION","PLUSMINUS","PLUSTYPE","REFLEX","TYPES"] *) s "(?x+1)=?y+1"; ri "PCASEINTRO@(Nat:?x)=Nat:?y"; ex(); right();left(); ri "LEFT@(TADDLEFT@PLUSTYPE)**(LEFT@0|-|1)**TREMLEFT@PLUSTYPE"; ex(); ri "REFLEX"; ex(); up(); right(); ri "EQUATION"; ex(); right(); left(); rri "(2|-|1)@false"; ex(); left(); ri "LEFT@($PLUSMINUS)**(LEFT@0|-|2)**PLUSMINUS"; ex(); ri "REFLEX"; up(); ex(); uptors "CASEINTRO"; rri "CASEINTRO"; ex(); top(); rri "EQUATION"; ex(); prove "SAMESUCC"; (* ZEROCOMM: ?x + 0 = 0 + ?x ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMESUCC","TYPES","XOR","forall"] *) s "?x+0"; ri "PCASEINTRO@forall@[(?1+0)=(0+?1)]"; ex(); (* ri "LEFT@forall"; ex(); right();left(); ri "PCASEINTRO@(?x+0)=0+?x"; ex(); ri "PIVOT"; ex(); left(); ri "BIND@?x"; ri "LEFT@0|-|1"; ri "EVAL"; ex(); top(); ri "LEFT@ $forall"; ex(); *) ri "UNIV_EQ_TAC"; ex(); (* this replaces the commented lines *) left(); (* left();right();right(); ri "(LEFT@TADDLEFT@PLUSTYPE)**(RIGHT@TADDRIGHT@PLUSTYPE)"; ex(); ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ex(); ri "EVERYWHERE2@EVAL"; ex(); *) ri "IND_TAC"; ex(); ri "LEFT@REFLEX"; ex(); ri "CSYM**CID"; ex(); right();right();right(); ri "EVERYWHERE@PLUSID"; ri "EVERYWHERE@TYPES"; ex(); ri "TAB_IF"; ex(); right();left();left();right(); ri "PLUSSUCC"; ex(); up(); ri "LEFT@TREMTOP@PLUSTYPE"; ri "SAMESUCC"; ex(); ri "RIGHT@(TREMTOP@PLUSTYPE)**TADDRIGHT@PLUSTYPE"; ex(); up(); ri "1|-|1"; ex(); uptors "CASEINTRO"; rri "CASEINTRO"; ex(); up(); up(); ri "forall**REFLEX"; ex(); up(); ri "AT"; up(); ex(); p "ZEROCOMM"; (* TIMESID: ?x * 1 = Nat : ?x ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","ONENAT","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMESUCC","TIMESSUCC","TIMESZERO","TYPES","XOR","forall"] *) s "?x*1"; right(); ri "ONENAT"; ex(); rri "PLUSID"; ex(); ri "ZEROCOMM"; ex(); up(); ri "TIMESSUCC"; ex(); ri "LEFT@TIMESZERO"; ex(); ri "($ZEROCOMM)**PLUSID"; ex(); prove "TIMESID"; (* ONECOMM: ?x + 1 = 1 + ?x ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMESUCC","TYPES","XOR","forall"] *) s "?x+1"; ri "PCASEINTRO@forall@[(?1+1)=(1+?1)]"; ex(); (* ri "LEFT@forall"; ex(); right();left(); ri "PCASEINTRO@(?x+1)=1+?x"; ex(); ri "PIVOT"; ex(); left(); ri "BIND@?x"; ri "LEFT@0|-|1"; ri "EVAL"; ex(); top(); ri "LEFT@ $forall"; ex(); *) ri "UNIV_EQ_TAC"; ex(); left();right();right(); ri "(LEFT@TADDLEFT@PLUSTYPE)**(RIGHT@TADDRIGHT@PLUSTYPE)"; ex(); ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ex(); ri "EVERYWHERE2@EVAL"; ex(); ri "LEFT@(RIGHT@ZEROCOMM)**REFLEX"; ex(); ri "CSYM**CID"; ex(); right();right();right(); ri "TAB_IF"; ex(); right();left();left();right(); ri "PLUSSUCC"; ex(); up(); ri "SAMESUCC"; ex(); ri "(RL@(TREMTOP@PLUSTYPE))**(LEFT@TADDLEFT@PLUSTYPE)**RIGHT@TADDRIGHT@PLUSTYPE"; ex(); up(); ri "1|-|1"; ex(); uptors "CASEINTRO"; rri "CASEINTRO"; ex(); up(); up(); ri "forall**REFLEX"; ex(); up(); ri "AT"; up(); ex(); p "ONECOMM"; (* ONEASSOC: (?x + 1) + ?y = ?x + ?y + 1 ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMESUCC","TYPES","XOR","forall"] *) s "(?x+1)+?y"; ri "PCASEINTRO@((?x+1)+?y)=?x+(?y+1)"; ri "PIVOT"; ex(); ri "PCASEINTRO@forall@[((?x+1)+?1)=?x+(?1+1)]"; ri "LEFT@forall"; ex(); right(); left(); left(); ri "BIND@?y"; ri "(LEFT@0|-|1)**EVAL"; ex(); up(); ex(); top(); left(); rri "forall"; ex(); right(); right();ri "LEFT@TADDRIGHT@PLUSTYPE"; ex(); ri "RIGHT@RIGHT@TADDLEFT@PLUSTYPE"; ri "BIND@Nat:?1"; ex(); up();up(); ri "INDUCTION"; ex(); ri "EVERYWHERE2@EVAL"; ex(); left(); ri "EVERYWHERE2@($ZEROCOMM)**PLUSID"; ex(); ri "(EVERYWHERE@PLUSTYPE)**(EVERYWHERE@TYPES)**REFLEX"; ex(); up(); ri "CSYM**CID"; ex(); right();right();right(); ri "TAB_IF"; ex(); right(); left(); left(); ri "RL@PLUSSUCC"; ex(); left(); left(); ri "TADDRIGHT@PLUSTYPE"; ri "0|-|1"; ex(); ri "RIGHT@TREMLEFT@PLUSTYPE"; ex(); up();up(); ri "REFLEX"; ex(); up(); ex(); uptors "CASEINTRO"; rri "CASEINTRO"; ex(); uptols "forall"; ri "forall**REFLEX"; ex(); up(); ri "AT"; ex(); up(); ex(); p "ONEASSOC"; (* PLUSCOMM: ?x + ?y = ?y + ?x ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMESUCC","TYPES","XOR","forall"] *) s "?x+?y"; (* set up for induction proof *) ri "PCASEINTRO@forall@[forall@[(?1+?2)=?2+?1]]"; ex(); ri "LEFT@forall"; ex(); right(); left(); ri "PCASEINTRO@forall@[(?x+?1)=?1+?x]"; ex(); ri "LEFT@forall"; ex(); right(); left(); ri "PCASEINTRO@(?x+?y)=?y+?x"; ex(); right(); left(); ri "0|-|3"; ex(); up();up();left(); ri "BIND@?y"; ri "LEFT@0|-|2"; ri "EVAL"; ex(); up(); ex(); up(); up(); left(); rri "forall"; ri "BIND@?x"; ri "LEFT@0|-|1"; ri "EVAL"; ex(); up(); ex(); up(); up(); left(); rri "forall"; ex(); (* the actual induction proof starts here *) ri "EVERYWHERE2@(TADDBOTH@PLUSTYPE)"; ex(); right(); right(); ri "BIND@Nat:?1"; ex(); up(); up(); ri "INDUCTION"; ex(); ri "EVERYWHERE2@EVAL"; ex(); ri "EVERYWHERE2@(RIGHT@ZEROCOMM)**REFLEX"; ex(); ri "EVERYWHERE2@forall**REFLEX"; ex(); ri "EVERYWHERE@CSYM**CID"; ex(); right();left();right(); ri "TAB_IF"; ex(); right();left();left();left();right();right(); ri "PLUSSUCC"; ex(); left();ri "TADDRIGHT@PLUSTYPE"; ex(); ri "PCASEINTRO@((Nat:?1)+Nat:?2)=(Nat:?2)+Nat:?1"; ri "REVPIVOT"; ex(); left(); ri "BIND@?2"; ri "(LEFT@0|-|1)**EVAL"; up(); ex(); up(); up(); left(); ri "ONEASSOC"; ex(); ri "TADDLEFT@PLUSTYPE"; ri "PLUSSUCC"; ex(); up(); ri "REFLEX"; ex(); uptols "REFLEX"; ri "REFLEX"; up(); ex(); uptors "CASEINTRO"; rri "CASEINTRO"; ex(); uptols "REFLEX"; ri "REFLEX"; up(); ex(); ri "AT"; up(); ex(); p "PLUSCOMM"; (* PLUSASSOC: (?x + ?y) + ?z = ?x + ?y + ?z ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMESUCC","TYPES","XOR","forall"] *) s "(?x+?y)+?z"; ri "PCASEINTRO@((?x+?y)+?z)=?x+?y+?z"; ri "PIVOT"; ex(); ri "PCASEINTRO@forall@[((?x+?1)+?z)=?x+?1+?z]"; ri "LEFT@forall"; ex(); right();left();left(); ri "BIND@?y"; ri "(LEFT@0|-|1)**EVAL"; up(); ex(); top(); left(); rri "forall"; ex(); right();right(); ri "LEFT@LEFT@TADDRIGHT@PLUSTYPE"; ex(); ri "RIGHT@RIGHT@TADDLEFT@PLUSTYPE"; ex(); ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ri "EVERYWHERE2@EVAL"; ex(); left(); ri "EVERYWHERE2@($ZEROCOMM)**PLUSID"; ex(); ri "(EVERYWHERE@PLUSTYPE)**(EVERYWHERE@TYPES)**REFLEX"; ex(); up(); ri "CSYM**CID"; ex(); right();right();right(); ri "TAB_IF"; ex(); left(); ri "EVERYWHERE@(TREMLEFT@PLUSTYPE)**(TREMRIGHT@PLUSTYPE)"; ex(); up();right();left();left(); ri "EVERYWHERE@PLUSSUCC"; ex(); ri "EVERYWHERE@ONEASSOC"; ex(); ri "EVERYWHERE@PLUSSUCC"; ex(); ri "EVERYWHERE@0|-|1"; ri "REFLEX"; up(); ex(); uptors "CASEINTRO"; rri "CASEINTRO"; ex(); uptols "forall"; ri "forall**REFLEX"; ex(); up(); ri "AT"; up(); ex(); p "PLUSASSOC"; (* DIST: ?x * ?y + ?z = (?x * ?y) + ?x * ?z ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMES *) s "?x*?y+?z"; ri "PCASEINTRO@(?x*?y+?z)=(?x*?y)+?x*?z"; ri "PIVOT"; ex(); ri "PCASEINTRO@forall@[(?x*?y+?1)=(?x*?y)+?x*?1]"; ri "LEFT@forall"; ex(); right();left();left(); ri "BIND@?z"; ri "(LEFT@0|-|1)**EVAL"; up(); ex(); top(); left(); rri "forall"; ex(); right(); right(); ri "LEFT@RIGHT@TADDRIGHT@PLUSTYPE"; ex(); ri "RIGHT@RIGHT@TADDRIGHT@TIMESTYPE"; ex(); ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ri "EVERYWHERE2@EVAL"; ex(); left(); ri "EVERYWHERE@TIMESZERO"; ri "EVERYWHERE@PLUSID"; ex(); ri "EVERYWHERE@TIMESTYPE"; ri "EVERYWHERE@TYPES"; ri "REFLEX"; ex(); up(); ri "TAB_AND"; ex(); left();right(); right(); ri "TAB_IF"; ex(); left(); ri "EVERYWHERE@(TREMRIGHT@PLUSTYPE)**TREMRIGHT@TIMESTYPE"; ex(); up(); right(); left();left(); ri "EVERYWHERE@PLUSSUCC"; ex(); ri "EVERYWHERE@TIMESSUCC"; ex(); ri "RIGHT@ $PLUSASSOC"; ex(); ri "EVERYWHERE@0|-|1"; ri "REFLEX"; up(); ex(); uptors "CASEINTRO"; rri "CASEINTRO"; ex(); uptols "forall"; ri "forall**REFLEX"; up(); up(); ex(); prove "DIST"; (* COMMDIST: (?y + ?z) * ?x = (?y * ?x) + ?z * ?x ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMESUCC","TIMESSUCC","TIMESTYPE","TIMESZERO","TYPES","XOR","ZERONAT","forall"] *) s "(?y+?z)*?x"; ri "PCASEINTRO@((?y+?z)*?x)=(?y*?x)+?z*?x"; ri "PIVOT"; ex(); ri "PCASEINTRO@forall@[((?y+?z)*?1)=(?y*?1)+?z*?1 ]"; ri "LEFT@forall"; ex(); right();left();left(); ri "BIND@?x"; ri "(LEFT@0|-|1)**EVAL"; up(); ex(); top(); left(); rri "forall"; ex(); right(); right(); ri "LEFT@TADDRIGHT@TIMESTYPE"; ex(); ri "RIGHT@RL@TADDRIGHT@TIMESTYPE"; ex(); ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ri "EVERYWHERE2@EVAL"; ex(); left(); ri "EVERYWHERE@TIMESZERO"; ri "EVERYWHERE@PLUSID"; ex(); ri "EVERYWHERE@ZERONAT**TYPES"; ri "REFLEX"; ex(); up(); ri "TAB_AND"; ex(); left();right(); right(); ri "TAB_IF"; ex(); left(); ri "EVERYWHERE@(TREMRIGHT@PLUSTYPE)**TREMRIGHT@TIMESTYPE"; ex(); up(); right(); left();left(); ri "EVERYWHERE@TIMESSUCC"; ex(); ri "EVERYWHERE@0|-|1"; ex(); right(); ri "PLUSASSOC"; ex(); right(); ri "PLUSCOMM"; ri "PLUSASSOC"; ex(); right(); ri "PLUSCOMM"; ex(); up();up(); rri "PLUSASSOC"; ex(); up(); ri "REFLEX"; up(); ex(); uptors "CASEINTRO"; rri "CASEINTRO"; ex(); uptols "forall"; ri "forall**REFLEX"; up(); up(); ex(); prove "COMMDIST"; (* COMMTIMESZERO: 0 * ?x = 0 ["AND","BOOLDEF","CASEINTRO","EQUATION","IF","INDUCTION","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","REFLEX","TIMESSUCC","TIMESTYPE","TIMESZERO","TYPES","ZERONAT","forall"] *) s "0*?x"; ri "PCASEINTRO@(0*?x)=0"; ri "PIVOT"; ex(); ri "PCASEINTRO@forall@[(0*?1)=0]"; ri "LEFT@forall"; ex(); right(); left(); left(); ri "BIND@?x"; ri "(LEFT@0|-|1)**EVAL"; up(); ex(); top(); left(); rri "forall"; ex(); right(); right(); ri "LEFT@TADDRIGHT@TIMESTYPE"; ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ri "EVERYWHERE2@EVAL"; ex(); ri "EVERYWHERE2@TIMESSUCC"; ri "EVERYWHERE@TIMESZERO"; ex(); ri "EVERYWHERE@REFLEX"; ri "TAB_AND"; ex(); left(); right(); right(); ri "TAB_IF"; ex(); ri "LEFT@LEFT@TREMRIGHT@TIMESTYPE"; ex(); ri "PIVOT"; ex(); ri "EVERYWHERE2@PLUSID"; ex(); ri "EVERYWHERE2@ZERONAT**TYPES**REFLEX"; ex(); rri "CASEINTRO"; ex(); uptols "forall"; ri "forall**REFLEX"; up(); up(); ex(); p "COMMTIMESZERO"; (* COMMTIMESID: 1 * ?x = Nat : ?x ["AND","BOOLDEF","CASEINTRO","EQUATION","IF","INDUCTION","NONTRIV","NOT","ODDCHOICE","OR","PLUSTYPE","REFLEX","TIMESSUCC","TIMESTYPE","TIMESZERO","TYPES","ZERONAT","forall"] *) s "1*?x"; ri "PCASEINTRO@(1*?x)=Nat:?x"; ri "PIVOT"; ex(); ri "PCASEINTRO@forall@[(1*?1)=Nat:?1]"; ri "LEFT@forall"; ex(); right(); left(); left(); ri "BIND@?x"; ri "(LEFT@0|-|1)**EVAL"; up(); ex(); top(); left(); rri "forall"; ex(); ri "EVERYWHERE2@ $TYPES"; ex(); ri "EVERYWHERE2@TADDRIGHT@TIMESTYPE"; ex(); right(); right(); ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ri "EVERYWHERE2@EVAL"; ex(); ri "EVERYWHERE@TIMESZERO"; ex(); ri "EVERYWHERE@ZERONAT**TYPES**REFLEX"; ex(); ri "TAB_AND"; ex(); left(); right(); right(); ri "EVERYWHERE@TYPES**TREMRIGHT@TIMESTYPE"; ex(); ri "TAB_IF"; ri "EVERYWHERE2@TIMESSUCC"; ex(); ri "PIVOT"; ri "EVERYWHERE2@PLUSTYPE"; ri "EVERYWHERE2@TYPES"; ri "EVERYWHERE2@REFLEX"; ex(); rri "CASEINTRO"; up(); ex(); uptols "forall"; ri "forall**REFLEX"; up(); up(); ex(); p "COMMTIMESID"; (* TIMESCOMM: ?x * ?y = ?y * ?x ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","ONENAT","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMESUCC","TIMESSUCC","TIMESTYPE","TIMESZERO","TYPES","XOR","ZERONAT","forall"] *) s "?x*?y"; ri "PCASEINTRO@(?x*?y)=?y*?x"; ri "PIVOT"; ex(); ri "PCASEINTRO@forall@[(?x*?1)=?1*?x]"; ri "LEFT@forall"; ex(); right(); left(); left(); ri "BIND@?y"; ri "(LEFT@0|-|1)**EVAL"; up(); ex(); top(); left(); rri "forall"; ex(); right(); right(); ri "LEFT@TADDRIGHT@TIMESTYPE"; ex(); ri "RIGHT@TADDLEFT@TIMESTYPE"; ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ri "EVERYWHERE2@EVAL"; ex(); ri "EVERYWHERE@TIMESZERO**COMMTIMESZERO**REFLEX"; ex(); ri "TAB_AND"; ex(); left(); right(); right(); ri "TAB_IF"; ex(); ri "LEFT@RL@(TREMLEFT@TIMESTYPE)**(TREMRIGHT@TIMESTYPE)"; ex(); right();left();left(); ri "RL@DIST**COMMDIST"; ex(); ri "EVERYWHERE@0|-|1"; ex(); ri "RL@RIGHT@TIMESID**COMMTIMESID"; ri "REFLEX"; up(); ex(); uptors "CASEINTRO"; rri "CASEINTRO"; up();ex(); uptols "forall"; ri "forall**REFLEX"; up(); up(); ex(); p "TIMESCOMM"; (* TIMESASSOC: (?x * ?y) * ?z = ?x * ?y * ?z ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","NONTRIV","NOT","ODDCHOICE","ONENAT","OR","PLUSID","PLUSSUCC","PLUSTYPE","REFLEX","SAMESUCC","TIMESSUCC","TIMESTYPE","TIMESZERO","TYPES","XOR","ZERONAT","forall"] *) s "(?x*?y)*?z"; ri "PCASEINTRO@((?x*?y)*?z)=?x*?y*?z"; ri "PIVOT"; ex(); ri "PCASEINTRO@forall@[((?x*?1)*?z)=?x*?1*?z]"; ri "LEFT@forall"; ex(); right(); left(); left(); ri "BIND@?y"; ri "(LEFT@0|-|1)**EVAL"; up(); ex(); top(); left(); rri "forall"; ex(); right(); right(); ri "LEFT@LEFT@TADDRIGHT@TIMESTYPE"; ex(); ri "RIGHT@RIGHT@TADDLEFT@TIMESTYPE"; ex(); ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ri "EVERYWHERE2@EVAL"; ex(); left(); ri "EVERYWHERE@TIMESZERO**COMMTIMESZERO"; ri "REFLEX"; ex(); up(); ri "TAB_AND"; ex(); left(); right();right(); ri "TAB_IF"; ex(); ri "LEFT@EVERYWHERE@(TREMRIGHT@TIMESTYPE)**TREMLEFT@TIMESTYPE"; ex(); right(); left(); left(); ri "EVERYWHERE@DIST**COMMDIST"; ex(); ri "EVERYWHERE@TIMESID**COMMTIMESID"; ex(); ri "EVERYWHERE@(TREMRIGHT@TIMESTYPE)**TREMLEFT@TIMESTYPE"; ex(); ri "EVERYWHERE@0|-|1"; ri "REFLEX"; up(); ex(); uptors "CASEINTRO"; rri "CASEINTRO"; up();ex(); uptols "forall"; ri "forall**REFLEX"; up(); up(); ex(); p "TIMESASSOC"; (* PLUSMINUS2: (?x + ?y) - ?y = Nat : ?x ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","MINUSSUCC","MINUSTYPE","MINUSZERO","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","PLUSMINUS","PLUSSUCC","PLUSTYPE","REFLEX","TYPES","XOR","forall"] *) s "(?x+?y)-?y"; ri "PCASEINTRO@forall@[((?1+?y)-?y)=Nat:?1]"; ri "LEFT@forall"; ex(); right(); left(); ri "PCASEINTRO@((?x+?y)-?y)=Nat:?x"; ri "PIVOT"; ex(); left(); ri "(BIND@?x)**(LEFT@0|-|1)**EVAL"; up(); ex(); top(); ri "PCASEINTRO@forall@[forall@[((?2+?1)-?1)=Nat:?2]]"; ri "LEFT@EVERYWHERE2@forall"; ex(); right(); left(); left(); ri "(BIND@?y)**(LEFT@0|-|1)**EVAL"; up(); ex(); top(); left(); rri "forall"; ex(); right(); right(); ri "EVERYWHERE2@(TADDRIGHT@PLUSTYPE)**TADDRIGHT@MINUSTYPE"; ex(); ri "BIND@Nat:?1"; ex(); uptols "INDUCTION"; ri "INDUCTION"; ri "EVERYWHERE2@EVAL"; ex(); ri "LEFT@EVERYWHERE2@MINUSZERO**PLUSID**TYPES**REFLEX"; ex(); ri "TAB_AND"; ex(); left(); right(); right(); ri "TAB_IF"; ex(); ri "LEFT@EVERYWHERE2@(TREMRIGHT@PLUSTYPE)**TREMRIGHT@MINUSTYPE"; ex(); right(); left(); left();left();left();left(); ri "MINUSSUCC"; ex(); left();left();rri "PLUSASSOC"; ri "PLUSCOMM"; rri "PLUSASSOC"; ex(); up(); ri "PCASEINTRO@(((1 + ?2) + ?1) - ?1)=Nat:1+?2"; ri "PIVOT"; ex(); left(); ri "BIND@1+?2"; ri "LEFT@0|-|1"; ri "EVAL"; up(); ex(); ri "TREMTOP@PLUSTYPE"; ri "PLUSCOMM"; ex(); up(); ri "PLUSMINUS"; ex(); up(); ri "REFLEX"; ex(); uptols "REFLEX"; ri "REFLEX"; up(); ex(); uptors "CASEINTRO"; rri "CASEINTRO"; up(); ex(); uptols "forall"; ri "forall**REFLEX"; up(); up(); ex(); prove "PLUSMINUS2"; (* SELFMINUS: ?x - ?x = 0 ["AND","ASSERT","BOOLDEF","CASEINTRO","CONVIF","EQUATION","IF","IFF","INDUCTION","MINUSSUCC","MINUSTYPE","MINUSZERO","NONTRIV","NOT","ODDCHOICE","OR","PLUSID","PLUSMINUS","PLUSSUCC","PLUSTYPE","REFLEX","TYPES","XOR","ZERONAT","forall"] *) s "?x-?x"; ri "TADDLEFT@MINUSTYPE"; ex(); left(); ri "($PLUSID)**ZEROCOMM"; ex(); top(); ri "PLUSMINUS2** $ZERONAT"; ex(); p "SELFMINUS"; (* order relations *) defineinfix "NOT_EQ" "?x<>?y" "~(Nat:?x)=Nat:?y"; defineinfix "LESS" "?xforsome@[(?S@Nat:?1)&forall@[((Nat:?2) ~?S@Nat:?2]]"; ri "CONTP"; ex(); ri "RL@FORALL_NOTFORSOME"; ex(); right(); ri "PCASEINTRO@forall@[(~?S@Nat:?1)&forall@[((Nat:?2) ~?S@?2]]"; ex(); ri "LEFT@FORALLDIST"; ri "TAB_AND_2"; ri "ODDCHOICE"; ex(); right();left();right();left(); rri "0|-|1"; ex(); uptors "ODDCHOICE"; rri "ODDCHOICE"; rri "TAB_AND_2"; ex(); left(); rri "FORALLDIST"; ex(); ri "IND_TAC"; ex(); left(); right(); ri "EVERYWHERE2@ZEROMIN**3pt75**FORALLDROP**AT"; ex(); up(); ri "CID"; ex(); right(); rri "NRULE2"; ex(); right(); rri "CID"; ex(); right(); rri "AT"; rri "FORALLDROP"; ex(); right(); right(); ri "3pt75F@ ~?S@Nat:?1"; ex(); left(); initializecounter(); rri "ZEROMIN"; ex(); assign "?x_1" "[Nat:?1]"; upto "?x&?y"; ri "EVERYWHERE2@ZERONAT"; ex(); up();up();up();right();