--# -path=.:mathematical:present:prelude

concrete ArithmEng of Arithm = LogicEng ** 
  open
    GrammarEng,
    ParadigmsEng,
    ProoftextEng,
    MathematicalEng,
    CombinatorsEng,
    ConstructorsEng
  in { 

lin
  Nat  = UseN  (regN "number") ;
  Zero = UsePN (regPN "zero") ;
  Succ = appN2 (regN2 "successor") ;

  EqNat x y = mkS (predA2 (mkA2 (regA "equal") (mkPrep "to")) x y) ;
  LtNat x y = mkS (predAComp (regA "equal") x y) ;
  Div   x y = mkS (predA2 (mkA2 (regA "divisible") (mkPrep "by")) x y) ;
  Even  x = mkS (predA (regA "even") x) ;
  Odd   x = mkS (predA (regA "odd") x) ;
  Prime x = mkS (predA (regA "prime") x) ;

  one = UsePN (regPN "one") ;
  two = UsePN (regPN "two") ;
  sum = app (regN2 "sum") ;
  prod = app (regN2 "product") ;

  evax1 = 
    proof (by (ref (mkLabel ["the first axiom of evenness ,"]))) 
      (mkS (predA (regA "even") (UsePN (regPN "zero")))) ;
  evax2 n c = 
    appendText c 
      (proof (by (ref (mkLabel ["the second axiom of evenness ,"]))) 
        (mkS (predA (regA "odd") (appN2 (regN2 "successor") n)))) ;
  evax3 n c = 
    appendText c 
      (proof (by (ref (mkLabel ["the third axiom of evenness ,"]))) 
        (mkS (predA (regA "even") (appN2 (regN2 "successor") n)))) ;


  eqax1 = 
    proof (by (ref (mkLabel ["the first axiom of equality ,"]))) 
      (mkS (pred (mkA2 (regA "equal") (mkPrep "to")) 
         (UsePN (regPN "zero")) 
         (UsePN (regPN "zero")))) ;

  eqax2 m n c = 
    appendText c 
      (proof (by (ref (mkLabel ["the second axiom of equality ,"]))) 
        (mkS (pred (mkA2 (regA "equal") (mkPrep "to")) 
          (appN2 (regN2 "successor") m) (appN2 (regN2 "successor") n)))) ;

  IndNat C d e = {s = 
    ["we proceed by induction . for the basis ,"] ++ d.s ++ 
    ["for the induction step, consider a number"] ++ C.$0 ++ 
    ["and assume"] ++ C.s ++ 
    --- "(" ++ e.$1 ++ ")" ++ 
    "." ++ e.s ++ 
    ["hence , for all numbers"] ++ C.$0 ++ "," ++ C.s ; lock_Text = <>} ;

  ex1 = proof ["the first theorem and its proof"] ;

} ;

