1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 2: 3: /* 4: $Header: b1obj.h,v 1.4 85/08/22 16:42:02 timo Exp $ 5: */ 6: 7: /* B values, locations, environments: the B abstract machine */ 8: 9: /****************************** general ******************************/ 10: 11: typedef int relation; /* < 0, == 0, > 0 */ 12: relation compare(); 13: 14: #define Is_text(v) (Type(v) == Tex) 15: #define Is_number(v) (Type(v) == Num) 16: #define Is_compound(v) (Type(v) == Com) 17: #define Is_list(v) (Type(v) == Lis || Type(v) == ELT) 18: #define Is_table(v) (Type(v) == Tab || Type(v) == ELT) 19: #define Is_tlt(v) (Type(v)==Tex || Type(v)==Lis || Type(v)==Tab || Type(v)==ELT) 20: #define Is_ELT(v) (Type(v) == ELT) 21: 22: #define Is_parsetree(v) (Type(v) == Ptn) 23: #define Is_locloc(v) IsSmallInt(v) 24: #define Is_simploc(v) (Type(v) == Sim) 25: #define Is_tbseloc(v) (Type(v) == Tse) 26: #define Is_trimloc(v) (Type(v) == Tri) 27: #define Is_refinement(v) (Type(v) == Ref) 28: #define Is_formal(v) (Type(v) == For) 29: #define Is_filed(v) (Type(v) == Per) 30: #define Is_function(v) (Type(v) == Fun) 31: #define Is_predicate(v) (Type(v) == Prd) 32: #define Is_howto(v) (Type(v) == How) 33: 34: value grab_num(); 35: value regrab_num(); 36: value grab_rat(); 37: value grab_tex(); 38: value grab_com(); 39: value grab_elt(); 40: value grab_lis(); 41: value grab_tab(); 42: value grab_ptn(); 43: value grab_sim(); 44: value grab_tri(); 45: value grab_tse(); 46: value grab_how(); 47: value grab_for(); 48: value grab_per(); 49: value grab_fun(); 50: value grab_prd(); 51: value grab_ref(); 52: 53: value copy(); 54: /* Procedure release(); */ 55: /* Procedure uniql(); */ 56: /* Procedure uniq_assoc(); */ 57: double hash(); 58: 59: /****************************** Texts ******************************/ 60: string strcpy(), strncpy(), strcat(), sprintf(), index(); 61: 62: bool character(); 63: 64: value mk_text(); 65: char charval(); 66: string strval(); 67: 68: value concat(); 69: value behead(); 70: value curtail(); 71: #ifdef INTEGRATION 72: value trim(); 73: #endif 74: value repeat(); 75: 76: value adjleft(); 77: value centre(); 78: value adjright(); 79: 80: value convert(); 81: 82: /****************************** Numbers ******************************/ 83: 84: /* Predicates */ 85: bool integral(); /* is the value an integer? */ 86: bool large(); /* can a number be represented by a C int? */ 87: 88: /* Constants */ 89: #define zero MkSmallInt(0) 90: #define one MkSmallInt(1) 91: 92: /* Conversion of abstract values to concrete objects */ 93: double numval(); /* numeric value of any number */ 94: int intval(); /* numeric value of integral number */ 95: intlet propintlet(); /* converts int to intlet */ 96: string convnum(); /* character string approximation of any number */ 97: relation numcomp(); /* comparison of two numbers: yields -1, 0 or 1 */ 98: double numhash(); /* hashes any abstract number to a 'double' */ 99: 100: /* Conversion of concrete objects to abstract numbers */ 101: value numconst(); /* string argument */ 102: value mk_integer(); /* int argument */ 103: 104: /* Functions on numbers */ 105: value sum(); 106: value diff(); 107: value negated(); 108: value prod(); 109: value quot(); 110: value modulo(); 111: value floorf(); 112: value ceilf(); 113: value round1(); 114: value round2(); 115: value mod(); 116: value power(); 117: value absval(); 118: value signum(); 119: value numerator(); 120: value denominator(); 121: value approximate(); 122: value random(); 123: value root1(); 124: value sin1(); 125: value cos1(); 126: value tan1(); 127: value atn1(); 128: value exp1(); 129: value log1(); 130: value root2(); 131: value atn2(); 132: value log2(); 133: value pi(); 134: value e(); 135: 136: /****************************** Compounds ******************************/ 137: #define Nfields(c) Length(c) 138: #define Field(c, i) ((Ats(c)+(i))) 139: #define k_Overfields for (k= 0; k < len; k++) 140: #define Lastfield(k) ((k) == len-1) 141: 142: #define mk_compound(len) grab_com(len) 143: 144: /****************************** Lists ******************************/ 145: value mk_numrange(); 146: value mk_charrange(); 147: 148: /* Procedure insert(); */ 149: /* Procedure remove(); */ 150: 151: /****************************** Tables ******************************/ 152: 153: value keys(); 154: bool in_keys(); 155: value associate(); 156: 157: /* Procedure replace(); */ 158: /* Procedure delete(); */ 159: 160: value* adrassoc(); 161: value* key(); 162: value* assoc(); 163: 164: /****************************** Texts, Lists, and Tables *******************/ 165: value mk_elt(); 166: 167: bool in(); 168: 169: value size(); 170: value size2(); 171: value min1(); 172: value min2(); 173: value max1(); 174: value max2(); 175: value th_of(); 176: value thof(); 177: 178: int length(); /* The same as size, temporary until part2 is written in B */ 179: bool empty(); /* whether #v=0: also temporary */ 180: 181: /****************************** Other kinds of value ************************/ 182: 183: #define Simploc(l) ((simploc *)Ats(l)) 184: #define Tbseloc(l) ((tbseloc *)Ats(l)) 185: #define Trimloc(l) ((trimloc *)Ats(l)) 186: #define Funprd(f) ((funprd *)Ats(f)) 187: #define How_to(u) ((how *)Ats(u)) 188: #define Formal(f) ((formal *)Ats(f)) 189: #define Refinement(r) ((ref *)Ats(r)) 190: #define Perm(p) ((per *)Ats(p)) 191: 192: loc mk_simploc(); 193: loc mk_trimloc(); 194: loc mk_tbseloc(); 195: 196: value mk_per(); 197: fun mk_fun(); 198: prd mk_prd(); 199: value mk_how(); 200: value mk_ref();