

#include "BUILTIN.h"

#include "Nat.h"
extern OBJ _ANat_Asucc(OBJ);OBJ __ANat_Asucc; /* succ */
extern OBJ _ANat_Asucc_(OBJ);OBJ __ANat_Asucc_; /* succ? */
extern OBJ _ANat_Apred(OBJ);OBJ __ANat_Apred; /* pred */
OBJ __ANat_A0; /* 0 */
extern OBJ _ANat_A0_(OBJ);OBJ __ANat_A0_; /* 0? */
OBJ __ANat_A1; /* 1 */
OBJ __ANat_A2; /* 2 */
OBJ __ANat_A3; /* 3 */
OBJ __ANat_A4; /* 4 */
OBJ __ANat_A5; /* 5 */
OBJ __ANat_A6; /* 6 */
OBJ __ANat_A7; /* 7 */
OBJ __ANat_A8; /* 8 */
OBJ __ANat_A9; /* 9 */
OBJ __ANat_A10; /* 10 */
OBJ __ANat_A11; /* 11 */
OBJ __ANat_A12; /* 12 */
OBJ __ANat_A13; /* 13 */
OBJ __ANat_A14; /* 14 */
OBJ __ANat_A15; /* 15 */
OBJ __ANat_A16; /* 16 */
OBJ __ANat_A17; /* 17 */
OBJ __ANat_A18; /* 18 */
OBJ __ANat_A19; /* 19 */
OBJ __ANat_A20; /* 20 */
OBJ __ANat_A21; /* 21 */
OBJ __ANat_A22; /* 22 */
OBJ __ANat_A23; /* 23 */
OBJ __ANat_A24; /* 24 */
OBJ __ANat_A25; /* 25 */
OBJ __ANat_A26; /* 26 */
OBJ __ANat_A27; /* 27 */
OBJ __ANat_A28; /* 28 */
OBJ __ANat_A29; /* 29 */
OBJ __ANat_A30; /* 30 */
OBJ __ANat_A31; /* 31 */
OBJ __ANat_A32; /* 32 */
OBJ __ANat_A64; /* 64 */
OBJ __ANat_A128; /* 128 */
OBJ __ANat_A256; /* 256 */
OBJ __ANat_A512; /* 512 */
OBJ __ANat_A1024; /* 1024 */
OBJ __ANat_A100; /* 100 */
OBJ __ANat_A1000; /* 1000 */
OBJ __ANat_A10000; /* 10000 */
OBJ __ANat_A100000; /* 100000 */
OBJ __ANat_A1000000; /* 1000000 */
OBJ __ANat_Amin; /* min */
OBJ __ANat_Amax; /* max */
extern OBJ _ANat_S1(OBJ);OBJ __ANat_S1; /* ! */
extern OBJ _ANat_Sp(OBJ,OBJ);OBJ __ANat_Sp; /* + */
extern OBJ _ANat_Sm(OBJ,OBJ);OBJ __ANat_Sm; /* - */
extern OBJ _ANat_S8(OBJ,OBJ);OBJ __ANat_S8; /* * */
extern OBJ _ANat_Ss(OBJ,OBJ);OBJ __ANat_Ss; /* / */
extern OBJ _ANat_Adiv(OBJ,OBJ);OBJ __ANat_Adiv; /* div */
extern OBJ _ANat_S5(OBJ,OBJ);OBJ __ANat_S5; /* % */
extern OBJ _ANat_Amod(OBJ,OBJ);OBJ __ANat_Amod; /* mod */
extern OBJ _ANat_S6(OBJ,OBJ);OBJ __ANat_S6; /* ^ */
extern OBJ _ANat_Apow(OBJ,OBJ);OBJ __ANat_Apow; /* pow */
extern OBJ _ANat_Adouble(OBJ);OBJ __ANat_Adouble; /* double */
extern OBJ _ANat_Ahalf(OBJ);OBJ __ANat_Ahalf; /* half */
extern OBJ _ANat_Amin_O1(OBJ,OBJ);OBJ __ANat_Amin_O1; /* min,1 */
extern OBJ _ANat_Amax_O1(OBJ,OBJ);OBJ __ANat_Amax_O1; /* max,1 */
extern OBJ _ANat_Aeven_(OBJ);OBJ __ANat_Aeven_; /* even? */
extern OBJ _ANat_Aodd_(OBJ);OBJ __ANat_Aodd_; /* odd? */
extern OBJ _ANat_Se(OBJ,OBJ);OBJ __ANat_Se; /* = */
extern OBJ _ANat_SSe(OBJ,OBJ);OBJ __ANat_SSe; /* |= */
extern OBJ _ANat_Sle(OBJ,OBJ);OBJ __ANat_Sle; /* <= */
extern OBJ _ANat_Sge(OBJ,OBJ);OBJ __ANat_Sge; /* >= */
extern OBJ _ANat_Sl(OBJ,OBJ);OBJ __ANat_Sl; /* < */
extern OBJ _ANat_Sg(OBJ,OBJ);OBJ __ANat_Sg; /* > */
OBJ __ANat_Aprimitive; /* primitive */
extern OBJ _ANat_Aprimitive_(OBJ);OBJ __ANat_Aprimitive_; /* primitive? */
extern OBJ _ANat_AuncheckedSucc(OBJ);OBJ __ANat_AuncheckedSucc; /* uncheckedSucc */
extern OBJ _ANat_AuncheckedPred(OBJ);OBJ __ANat_AuncheckedPred; /* uncheckedPred */
extern OBJ _ANat_AuncheckedAdd(OBJ,OBJ);OBJ __ANat_AuncheckedAdd; /* uncheckedAdd */
extern OBJ _ANat_AuncheckedSub(OBJ,OBJ);OBJ __ANat_AuncheckedSub; /* uncheckedSub */
extern OBJ _ANat_AuncheckedMul(OBJ,OBJ);OBJ __ANat_AuncheckedMul; /* uncheckedMul */
extern OBJ _ANat_AuncheckedDiv(OBJ,OBJ);OBJ __ANat_AuncheckedDiv; /* uncheckedDiv */
extern OBJ _ANat_AuncheckedMod(OBJ,OBJ);OBJ __ANat_AuncheckedMod; /* uncheckedMod */

#include "Nat.hc.c"

extern OBJ _ANat_Asucc(OBJ x1) /* succ */
{OBJ r;
 {OBJ x2;
  ANat_Sl(x1,__ANat_Amax,x2);
  if(ISTGPRM(x2,1)){
   ANat_AuncheckedSucc(x1,r);
  }else{
   HLT("succ\'Nat: applied to max");}}
 return r;}

extern OBJ _ANat_Apred(OBJ x1) /* pred */
{OBJ r;
 {OBJ x2;
  ANat_SSe(x1,__ANat_A0,x2);
  if(ISTGPRM(x2,1)){
   ANat_AuncheckedPred(x1,r);
  }else{
   HLT("pred\'Nat: applied to zero");}}
 return r;}

extern OBJ _ANat_S1(OBJ x1) /* ! */
{OBJ r;
 r=inline_opal_nat(x1);
 return r;}

extern OBJ _ANat_Sp(OBJ x1,OBJ x2) /* + */
{OBJ r;
 {OBJ x3;OBJ x4;
  ANat_AuncheckedSub(__ANat_Amax,x2,x3);
  ANat_Sge(x3,x1,x4);
  if(ISTGPRM(x4,1)){
   ANat_AuncheckedAdd(x1,x2,r);
  }else{
   HLT("+\'Nat: sum is too large");}}
 return r;}

extern OBJ _ANat_Sm(OBJ x1,OBJ x2) /* - */
{OBJ r;
 {OBJ x3;
  ANat_Sle(x2,x1,x3);
  if(ISTGPRM(x3,1)){
   ANat_AuncheckedSub(x1,x2,r);
  }else{
   HLT("-\'Nat: right operand greater than left");}}
 return r;}

extern OBJ _ANat_S8(OBJ x1,OBJ x2) /* * */
{OBJ r;
 {OBJ x3;OBJ x5;
  ANat_A0_(x2,x3);
  if(ISTGPRM(x3,1)){
   x5=__ABUILTIN_5;
  }else{
   {OBJ x4;
    ANat_AuncheckedDiv(__ANat_Amax,x2,x4);
    ANat_Sge(x4,x1,x5);}}
  if(ISTGPRM(x5,1)){
   ANat_AuncheckedMul(x1,x2,r);
  }else{
   HLT("*\'Nat: product too large");}}
 return r;}

extern OBJ _ANat_Ss(OBJ x1,OBJ x2) /* / */
{OBJ r;
 {OBJ x3;
  ANat_Asucc_(x2,x3);
  if(ISTGPRM(x3,1)){
   ANat_AuncheckedDiv(x1,x2,r);
  }else{
   HLT("/\'Nat: divisor zero");}}
 return r;}

extern OBJ _ANat_Adiv(OBJ x1,OBJ x2) /* div */
{OBJ r;
 {OBJ x3;
  ANat_Asucc_(x2,x3);
  if(ISTGPRM(x3,1)){
   ANat_AuncheckedDiv(x1,x2,r);
  }else{
   HLT("div\'Nat: divisor zero");}}
 return r;}

extern OBJ _ANat_S5(OBJ x1,OBJ x2) /* % */
{OBJ r;
 {OBJ x3;
  ANat_Asucc_(x2,x3);
  if(ISTGPRM(x3,1)){
   ANat_AuncheckedMod(x1,x2,r);
  }else{
   HLT("%\'Nat: divisor zero");}}
 return r;}

extern OBJ _ANat_Amod(OBJ x1,OBJ x2) /* mod */
{OBJ r;
 {OBJ x3;
  ANat_Asucc_(x2,x3);
  if(ISTGPRM(x3,1)){
   ANat_AuncheckedMod(x1,x2,r);
  }else{
   HLT("mod\'Nat: divisor zero");}}
 return r;}

extern OBJ _ANat_S6(OBJ x1,OBJ x2) /* ^ */
{OBJ r;
 ANat_Apow(x1,x2,r);
 return r;}

extern OBJ _ANat_Adouble(OBJ x1) /* double */
{OBJ r;
 {OBJ x2;OBJ x3;
  ANat_AuncheckedSub(__ANat_Amax,x1,x2);
  ANat_Sg(x2,x1,x3);
  if(ISTGPRM(x3,1)){
   ANat_AuncheckedAdd(x1,x1,r);
  }else{
   HLT("double\'Nat:operand too large");}}
 return r;}

extern OBJ _ANat_Ahalf(OBJ x1) /* half */
{OBJ r;
 ANat_AuncheckedDiv(x1,__ANat_A2,r);
 return r;}

extern OBJ _ANat_Amin_O1(OBJ x1,OBJ x2) /* min,1 */
{OBJ r;
 {OBJ x3;
  ANat_Sle(x1,x2,x3);
  if(ISTGPRM(x3,1)){
   r=x1;
  }else{
   r=x2;}}
 return r;}

extern OBJ _ANat_Amax_O1(OBJ x1,OBJ x2) /* max,1 */
{OBJ r;
 {OBJ x3;
  ANat_Sge(x1,x2,x3);
  if(ISTGPRM(x3,1)){
   r=x1;
  }else{
   r=x2;}}
 return r;}

extern OBJ _ANat_Aprimitive_(OBJ x1) /* primitive? */
{OBJ r;
 r=__ABUILTIN_5;
 return r;}













































static OBJ _mt_1_0_1(OBJ t,OBJ t1) 
{OBJ r;
 DCCLS(t,1);
 r=(*(OBJ(*)(OBJ))ENTRY(t))(t1);
 return r;}
static OBJ _mt_1_0_1_l(OBJ t,OBJ t1) 
{OBJ r;
 DCCLS(t,1);
 r=(*(OBJ(*)(OBJ))ENTRY(t))(t1);
 COPY(r,1);LZYCLS(t,r);
 return r;}

static OBJ _mt_2_0_2(OBJ t,OBJ t1,OBJ t2) 
{OBJ r;
 DCCLS(t,1);
 r=(*(OBJ(*)(OBJ,OBJ))ENTRY(t))(t1,t2);
 return r;}

init_ANat()
{
 static int visited=0; if(visited) return; visited=1;
 CLS(2,_ANat_63,__ANat_63);
 CLS(2,_ANat_62,__ANat_62);
 CLS(2,_ANat_61,__ANat_61);
 CLS(1,_ANat_60,__ANat_60);
 CLS(2,_ANat_90,__ANat_90);
 CLS(2,_ANat_89,__ANat_89);
 CLS(2,_ANat_88,__ANat_88);
 CLS(2,_ANat_87,__ANat_87);
 CLS(2,_ANat_86,__ANat_86);
 CLS(1,_ANat_85,__ANat_85);
 CLS(1,_ANat_84,__ANat_84);
 CLS(1,_ANat_83,__ANat_83);
 CLS(2,_ANat_81,__ANat_81);
 CLS(2,_ANat_80,__ANat_80);
 CLS(2,_ANat_79,__ANat_79);
 CLS(2,_ANat_78,__ANat_78);
 CLS(2,_ANat_77,__ANat_77);
 CLS(2,_ANat_76,__ANat_76);
 CLS(1,_ANat_75,__ANat_75);
 CLS(1,_ANat_74,__ANat_74);
 CLS(2,_ANat_73,__ANat_73);
 CLS(2,_ANat_72,__ANat_72);
 CLS(1,_ANat_71,__ANat_71);
 CLS(1,_ANat_70,__ANat_70);
 CLS(1,_ANat_6,__ANat_6);
 CLS(2,_ANat_69,__ANat_69);
 CLS(2,_ANat_68,__ANat_68);
 CLS(1,_ANat_4,__ANat_4);
 CLS(2,_ANat_67,__ANat_67);
 CLS(1,_ANat_3,__ANat_3);
 CLS(2,_ANat_66,__ANat_66);
 CLS(1,_ANat_2,__ANat_2);
 CLS(2,_ANat_65,__ANat_65);
 CLS(2,_ANat_64,__ANat_64);
 MTH(1,0,1,_mt_1_0_1);LZYMTH(1,0,1,_mt_1_0_1_l);
 MTH(2,0,2,_mt_2_0_2);LZYMTH(2,0,2,_mt_2_0_2);
 init_const_ANat();
 /* __ANat_A1 */
 ANat_Asucc(__ANat_A0,__ANat_A1);
 /* __ANat_A2 */
 ANat_Asucc(__ANat_A1,__ANat_A2);
 /* __ANat_A3 */
 ANat_Asucc(__ANat_A2,__ANat_A3);
 /* __ANat_A4 */
 ANat_Asucc(__ANat_A3,__ANat_A4);
 /* __ANat_A5 */
 ANat_Asucc(__ANat_A4,__ANat_A5);
 /* __ANat_A6 */
 ANat_Asucc(__ANat_A5,__ANat_A6);
 /* __ANat_A7 */
 ANat_Asucc(__ANat_A6,__ANat_A7);
 /* __ANat_A8 */
 ANat_Asucc(__ANat_A7,__ANat_A8);
 /* __ANat_A9 */
 ANat_Asucc(__ANat_A8,__ANat_A9);
 /* __ANat_A10 */
 ANat_Asucc(__ANat_A9,__ANat_A10);
 /* __ANat_A11 */
 ANat_Asucc(__ANat_A10,__ANat_A11);
 /* __ANat_A12 */
 ANat_Asucc(__ANat_A11,__ANat_A12);
 /* __ANat_A13 */
 ANat_Asucc(__ANat_A12,__ANat_A13);
 /* __ANat_A14 */
 ANat_Asucc(__ANat_A13,__ANat_A14);
 /* __ANat_A15 */
 ANat_Asucc(__ANat_A14,__ANat_A15);
 /* __ANat_A16 */
 ANat_Asucc(__ANat_A15,__ANat_A16);
 /* __ANat_A17 */
 ANat_Asucc(__ANat_A16,__ANat_A17);
 /* __ANat_A18 */
 ANat_Asucc(__ANat_A17,__ANat_A18);
 /* __ANat_A19 */
 ANat_Asucc(__ANat_A18,__ANat_A19);
 /* __ANat_A20 */
 ANat_Asucc(__ANat_A19,__ANat_A20);
 /* __ANat_A21 */
 ANat_Asucc(__ANat_A20,__ANat_A21);
 /* __ANat_A22 */
 ANat_Asucc(__ANat_A21,__ANat_A22);
 /* __ANat_A23 */
 ANat_Asucc(__ANat_A22,__ANat_A23);
 /* __ANat_A24 */
 ANat_Asucc(__ANat_A23,__ANat_A24);
 /* __ANat_A25 */
 ANat_Asucc(__ANat_A24,__ANat_A25);
 /* __ANat_A26 */
 ANat_Asucc(__ANat_A25,__ANat_A26);
 /* __ANat_A27 */
 ANat_Asucc(__ANat_A26,__ANat_A27);
 /* __ANat_A28 */
 ANat_Asucc(__ANat_A27,__ANat_A28);
 /* __ANat_A29 */
 ANat_Asucc(__ANat_A28,__ANat_A29);
 /* __ANat_A30 */
 ANat_Asucc(__ANat_A29,__ANat_A30);
 /* __ANat_A31 */
 ANat_Asucc(__ANat_A30,__ANat_A31);
 /* __ANat_A32 */
 ANat_Asucc(__ANat_A31,__ANat_A32);
 /* __ANat_A64 */
 ANat_S8(__ANat_A2,__ANat_A32,__ANat_A64);
 /* __ANat_A128 */
 ANat_S8(__ANat_A2,__ANat_A64,__ANat_A128);
 /* __ANat_A256 */
 ANat_S8(__ANat_A2,__ANat_A128,__ANat_A256);
 /* __ANat_A512 */
 ANat_S8(__ANat_A2,__ANat_A256,__ANat_A512);
 /* __ANat_A1024 */
 ANat_S8(__ANat_A2,__ANat_A512,__ANat_A1024);
 /* __ANat_A100 */
 ANat_S8(__ANat_A10,__ANat_A10,__ANat_A100);
 /* __ANat_A1000 */
 ANat_S8(__ANat_A100,__ANat_A10,__ANat_A1000);
 /* __ANat_A10000 */
 ANat_S8(__ANat_A1000,__ANat_A10,__ANat_A10000);
 /* __ANat_A100000 */
 ANat_S8(__ANat_A10000,__ANat_A10,__ANat_A100000);
 /* __ANat_A1000000 */
 ANat_S8(__ANat_A100000,__ANat_A10,__ANat_A1000000);
 /* __ANat_Amin */
 __ANat_Amin=__ANat_A0;
 /* __ANat_Aprimitive */
 PRM1(__ANat_Aprimitive);}

