basix_doc 0.1
|
00001 00002 /****************************************************************************** 00003 * MODULE : syntactic.cpp 00004 * DESCRIPTION: Syntactic expressions with basic simplification 00005 * COPYRIGHT : (C) 2008 Joris van der Hoeven 00006 ******************************************************************************* 00007 * This software falls under the GNU general public license and comes WITHOUT 00008 * ANY WARRANTY WHATSOEVER. See the file $TEXMACS_PATH/LICENSE for more details. 00009 * If you don't have this file, write to the Free Software Foundation, Inc., 00010 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00011 ******************************************************************************/ 00012 00013 #include <basix/string.hpp> 00014 #include <basix/identifiers.hpp> 00015 #include <basix/literal.hpp> 00016 #include <basix/compound.hpp> 00017 #include <basix/vector_sort.hpp> 00018 namespace mmx { 00019 00020 /****************************************************************************** 00021 * Basic syntactic operations 00022 ******************************************************************************/ 00023 00024 syntactic::syntactic (const int& i): rep (as_string (i)) {} 00025 bool is_atom (const syntactic& g) { return is<literal> (*g); } 00026 string as_string (const syntactic& g) { return literal_to_string (*g); } 00027 00028 syntactic 00029 apply (const vector<syntactic>& v) { 00030 VERIFY (N(v) != 0, "non-empty vector expected"); 00031 if (is<literal> (*v[0])) { 00032 string s= as_string (as<literal> (*v[0])); 00033 if (N(s) == 1) { 00034 if (s[0] == '-' && N(v) == 2) return -v[1]; 00035 if (s[0] == '+' && N(v) == 3) return v[1] + v[2]; 00036 if (s[0] == '-' && N(v) == 3) return v[1] - v[2]; 00037 if (s[0] == '*' && N(v) == 3) return v[1] * v[2]; 00038 if (s[0] == '/' && N(v) == 3) return v[1] / v[2]; 00039 if (s[0] == '^' && N(v) == 3) return pow (v[1], v[2]); 00040 } 00041 } 00042 return as_syntactic (vector_to_compound (*((vector<generic>*) (void*) &v))); 00043 } 00044 00045 syntactic apply (const syntactic& f) { 00046 return apply (vec (f)); } 00047 syntactic apply (const syntactic& f, const syntactic& a1) { 00048 return apply (vec (f, a1)); } 00049 syntactic apply (const syntactic& f, const syntactic& a1, 00050 const syntactic& a2) { 00051 return apply (vec (f, a1, a2)); } 00052 syntactic apply (const syntactic& f, const syntactic& a1, 00053 const syntactic& a2, const syntactic& a3) { 00054 return apply (vec (f, a1, a2, a3)); } 00055 syntactic apply (const syntactic& f, 00056 const syntactic& a1, const syntactic& a2, 00057 const syntactic& a3, const syntactic& a4) { 00058 return apply (vec (f, a1, a2, a3, a4)); } 00059 syntactic apply (const syntactic& f, 00060 const syntactic& a1, const syntactic& a2, 00061 const syntactic& a3, const syntactic& a4, 00062 const syntactic& a5) { 00063 return apply (vec (f, a1, a2, a3, a4, a5)); } 00064 syntactic apply (const syntactic& f, 00065 const syntactic& a1, const syntactic& a2, 00066 const syntactic& a3, const syntactic& a4, 00067 const syntactic& a5, const syntactic& a6) { 00068 return apply (vec (f, a1, a2, a3, a4, a5, a6)); } 00069 syntactic apply (const syntactic& f, const vector<syntactic>& a) { 00070 return apply (cons (f, a)); } 00071 00072 bool is_func (const syntactic& g, const char* f) { 00073 return is_func (*g, f); } 00074 bool is_func (const syntactic& g, const char* f, nat n) { 00075 return is_func (*g, f, n); } 00076 bool is_func (const syntactic& g, const syntactic& f) { 00077 return is_func (*g, *f); } 00078 bool is_func (const syntactic& g, const syntactic& f, nat n) { 00079 return is_func (*g, *f, n); } 00080 bool is_func (const syntactic& g, const generic& f) { 00081 return is_func (*g, f); } 00082 bool is_func (const syntactic& g, const generic& f, nat n) { 00083 return is_func (*g, f, n); } 00084 00085 vector<syntactic> 00086 components (const syntactic& g) { 00087 vector<syntactic> v= fill<syntactic> (N(g)); 00088 for (nat i=0; i<N(g); i++) v[i]= g[i]; 00089 return v; 00090 } 00091 00092 vector<syntactic> 00093 arguments (const syntactic& g) { 00094 return cdr (components (g)); 00095 } 00096 00097 /****************************************************************************** 00098 * Constants 00099 ******************************************************************************/ 00100 00101 void set_smallest (syntactic& x) { x= as_syntactic (GEN_SMALLEST); } 00102 void set_largest (syntactic& x) { x= as_syntactic (GEN_LARGEST); } 00103 void set_accuracy (syntactic& x) { x= as_syntactic (GEN_ACCURACY); } 00104 void set_pi (syntactic& x) { x= as_syntactic (GEN_PI); } 00105 void set_log2 (syntactic& x) { x= log (as_syntactic (2)); } 00106 void set_euler (syntactic& x) { x= as_syntactic (GEN_EULER); } 00107 void set_catalan (syntactic& x) { x= as_syntactic (GEN_CATALAN); } 00108 void set_imaginary (syntactic& x) { x= as_syntactic (GEN_I); } 00109 void set_nan (syntactic& x) { x= as_syntactic (GEN_NAN); } 00110 void set_fuzz (syntactic& x) { x= as_syntactic (GEN_FUZZ); } 00111 void set_infinity (syntactic& x) { x= as_syntactic (GEN_INFINITY); } 00112 void set_maximal (syntactic& x) { x= as_syntactic (GEN_INFINITY); } 00113 void set_minimal (syntactic& x) { x= -as_syntactic (GEN_INFINITY); } 00114 00115 /****************************************************************************** 00116 * Additive arithmetic with simplifications 00117 ******************************************************************************/ 00118 00119 static void 00120 signed_decompose (const syntactic& g, syntactic& abs_g, int& sgn_g) { 00121 if (is_atom (g)) { 00122 const string s= as_string (g); 00123 if (N(s) > 1 && s[0] == '-' && 00124 (s[1] == '.' || (s[1] >= '0' && s[1] <= '9'))) { 00125 abs_g= syntactic (s (1, N(s))); 00126 sgn_g= -1; 00127 } 00128 else { 00129 abs_g= g; 00130 sgn_g= 1; 00131 } 00132 } 00133 else if (is_func (g, GEN_MINUS, 1)) { 00134 signed_decompose (g[1], abs_g, sgn_g); 00135 sgn_g= -sgn_g; 00136 } 00137 else if (is_func (g, GEN_TIMES, 2) || is_func (g, GEN_OVER, 2)) { 00138 syntactic a1, a2; 00139 int s1, s2; 00140 signed_decompose (g[1], a1, s1); 00141 signed_decompose (g[2], a2, s2); 00142 if (is_func (g, GEN_TIMES, 2)) abs_g= a1 * a2; 00143 else abs_g= a1 / a2; 00144 sgn_g= s1 * s2; 00145 } 00146 else { 00147 abs_g= g; 00148 sgn_g= 1; 00149 } 00150 } 00151 00152 syntactic 00153 operator - (const syntactic& g) { 00154 if (exact_eq (g, 0)) return g; 00155 if (is_func (g, GEN_MINUS, 1)) 00156 return g[1]; 00157 if (is_func (g, GEN_PLUS, 2)) 00158 return (-g[1]) - g[2]; 00159 if (is_func (g, GEN_MINUS, 2)) 00160 return (-g[1]) + g[2]; 00161 syntactic abs_g; int sgn_g; 00162 signed_decompose (g, abs_g, sgn_g); 00163 if (sgn_g > 0) return syn (GEN_MINUS, abs_g); 00164 else return abs_g; 00165 } 00166 00167 syntactic 00168 operator + (const syntactic& g1, const syntactic& g2) { 00169 if (exact_eq (g1, 0)) return g2; 00170 if (exact_eq (g2, 0)) return g1; 00171 if (is_func (g2, GEN_MINUS, 1)) 00172 return g1 - g2[1]; 00173 if (is_func (g2, GEN_PLUS, 2)) 00174 return (g1 + g2[1]) + g2[2]; 00175 if (is_func (g2, GEN_MINUS, 2)) 00176 return (g1 + g2[1]) - g2[2]; 00177 syntactic abs_g2; int sgn_g2; 00178 signed_decompose (g2, abs_g2, sgn_g2); 00179 if (sgn_g2 < 0) return syn (GEN_MINUS, g1, abs_g2); 00180 else return syn (GEN_PLUS, g1, abs_g2); 00181 } 00182 00183 syntactic 00184 operator - (const syntactic& g1, const syntactic& g2) { 00185 if (exact_eq (g2, 0)) return g1; 00186 if (is_func (g2, GEN_MINUS, 1)) 00187 return g1 + g2[1]; 00188 if (is_func (g2, GEN_PLUS, 2)) 00189 return (g1 - g2[1]) - g2[2]; 00190 if (is_func (g2, GEN_MINUS, 2)) 00191 return (g1 - g2[1]) + g2[2]; 00192 syntactic abs_g2; int sgn_g2; 00193 signed_decompose (g2, abs_g2, sgn_g2); 00194 if (exact_eq (g1, 0)) { 00195 if (sgn_g2 > 0) return syn (GEN_MINUS, abs_g2); 00196 else return abs_g2; 00197 } 00198 else { 00199 if (sgn_g2 > 0) return syn (GEN_MINUS, g1, abs_g2); 00200 else return syn (GEN_PLUS, g1, abs_g2); 00201 } 00202 } 00203 00204 static syntactic 00205 migrate_sub (const syntactic& g, const syntactic& h) { 00206 if (is_func (g, GEN_MINUS, 2)) 00207 return syn (GEN_MINUS, migrate_sub (g[1], h), g[2]); 00208 syntactic abs_g; int sgn_g; 00209 signed_decompose (g, abs_g, sgn_g); 00210 return syn (GEN_MINUS, h, abs_g); 00211 } 00212 00213 static syntactic 00214 migrate_sub (const syntactic& g, nat found) { 00215 if (found == 0) return migrate_sub (g[1], g[2]); 00216 return syn (g[0], migrate_sub (g[1], found-1), g[2]); 00217 } 00218 00219 syntactic 00220 migrate_negate (const syntactic& g, nat maximal) { 00221 int i= 0, found= -1; 00222 syntactic h= g; 00223 while (is_func (h, GEN_PLUS, 2) || is_func (h, GEN_MINUS, 2)) { 00224 if (is_func (h, GEN_PLUS, 2)) found= i; 00225 if (maximal == 0) return g; 00226 h= h[1]; 00227 maximal--; 00228 i++; 00229 } 00230 if (found == -1) return g; 00231 syntactic abs_h; int sgn_h; 00232 signed_decompose (h, abs_h, sgn_h); 00233 if (sgn_h >= 0) return g; 00234 return migrate_sub (g, found); 00235 } 00236 00237 /****************************************************************************** 00238 * Multiplicative arithmetic with simplifications 00239 ******************************************************************************/ 00240 00241 static bool frac_flag= false; 00242 00243 bool 00244 set_frac_flag (bool new_val) { 00245 bool ret= frac_flag; 00246 frac_flag= new_val; 00247 return ret; 00248 } 00249 00250 syntactic 00251 operator * (const syntactic& g1, const syntactic& g2) { 00252 if (frac_flag && is_func (g1, GEN_OVER, 2)) { 00253 if (is_func (g2, GEN_OVER, 2)) 00254 return syn (GEN_OVER, g1[1] * g2[1], g1[2] * g2[2]); 00255 else return syn (GEN_OVER, g1[1] * g2, g1[2]); 00256 } 00257 if (frac_flag && is_func (g2, GEN_OVER, 2)) 00258 return syn (GEN_OVER, g1 * g2[1], g2[2]); 00259 if (exact_eq (g1, 0)) return 0; 00260 if (exact_eq (g2, 0)) return 0; 00261 if (exact_eq (g1, 1)) return g2; 00262 if (exact_eq (g2, 1)) return g1; 00263 if (exact_eq (g1, -1)) return -g2; 00264 if (exact_eq (g2, -1)) return -g1; 00265 return syn (GEN_TIMES, g1, g2); 00266 } 00267 00268 syntactic 00269 operator / (const syntactic& g1, const syntactic& g2) { 00270 if (frac_flag && is_func (g2, GEN_OVER, 2)) 00271 return g1 * syn (GEN_OVER, g2[2], g2[1]); 00272 if (exact_eq (g2, 1)) return g1; 00273 if (exact_eq (g2, -1)) return -g1; 00274 if (frac_flag) return g1 * syn (GEN_OVER, 1, g2); 00275 else return syn (GEN_OVER, g1, g2); 00276 } 00277 00278 syntactic 00279 square (const syntactic& g) { 00280 return syn (GEN_POWER, g, syntactic (2)); 00281 } 00282 00283 syntactic 00284 invert (const syntactic& g) { 00285 return syntactic (1) / g; 00286 } 00287 00288 syntactic 00289 pow (const syntactic& g1, const syntactic& g2) { 00290 if (exact_eq (g1, 0)) return 0; 00291 if (exact_eq (g1, 1)) return 1; 00292 if (exact_eq (g2, 0)) return 1; 00293 if (exact_eq (g2, 1)) return g1; 00294 if (exact_eq (g2, syn (GEN_OVER, syntactic (1), syntactic (2)))) 00295 return syn (GEN_SQRT, g1); 00296 if (frac_flag) { 00297 syntactic abs; int sgn; 00298 signed_decompose (g2, abs, sgn); 00299 if (sgn < 0) return syn (GEN_OVER, 1, pow (g1, abs)); 00300 } 00301 return syn (GEN_POWER, g1, g2); 00302 } 00303 00304 syntactic 00305 pow (const syntactic& g1, const int& g2) { 00306 return pow (g1, flatten (g2)); 00307 } 00308 00309 syntactic 00310 pow (const int& g1, const syntactic& g2) { 00311 return pow (flatten (g1), g2); 00312 } 00313 00314 /****************************************************************************** 00315 * Sorting big sums and big products 00316 ******************************************************************************/ 00317 00318 bool is_numeric (const string& s); 00319 00320 struct sum_less_op { 00321 static bool 00322 op (const syntactic& s1, const syntactic& s2) { 00323 generic g1= as_generic (s1); 00324 generic g2= as_generic (s2); 00325 if ((is_func (g1, GEN_TIMES, 2) || is_func (g1, GEN_OVER, 2)) && 00326 is<literal> (g1[1]) && is_numeric (as_string (as<literal> (g1[1])))) 00327 g1= (is_func (g1, GEN_TIMES, 2)? g1[2]: gen (GEN_OVER, 1, g1[2])); 00328 if ((is_func (g2, GEN_TIMES, 2) || is_func (g2, GEN_OVER, 2)) && 00329 is<literal> (g2[1]) && is_numeric (as_string (as<literal> (g2[1])))) 00330 g2= (is_func (g2, GEN_TIMES, 2)? g2[2]: gen (GEN_OVER, 1, g2[2])); 00331 return big_small_compare (g1, g2) <= 0; 00332 } 00333 }; 00334 00335 syntactic 00336 ordered_sum (const vector<syntactic>& v) { 00337 vector<syntactic> w= copy (v); 00338 sort_leq<sum_less_op> (w); 00339 syntactic r= 0; 00340 for (nat i=0; i<N(w); i++) r= r + w[i]; 00341 return migrate_negate (r, 5); 00342 } 00343 00344 struct product_less_op { 00345 static bool 00346 op (const syntactic& s1, const syntactic& s2) { 00347 generic g1= as_generic (s1); 00348 generic g2= as_generic (s2); 00349 if (is_func (g1, GEN_OVER, 2) && exact_eq (g1[1], 1)) g1= g1[2]; 00350 if (is_func (g2, GEN_OVER, 2) && exact_eq (g2[1], 1)) g2= g2[2]; 00351 if (is_func (g1, GEN_POWER, 2) && 00352 is<literal> (g1[2]) && is_numeric (as_string (as<literal> (g1[2])))) 00353 g1= g1[1]; 00354 if (is_func (g2, GEN_POWER, 2) && 00355 is<literal> (g2[2]) && is_numeric (as_string (as<literal> (g2[2])))) 00356 g2= g2[1]; 00357 return small_big_compare (g1, g2) <= 0; 00358 } 00359 }; 00360 00361 syntactic 00362 ordered_product (const vector<syntactic>& v) { 00363 vector<syntactic> w= copy (v); 00364 sort_leq<product_less_op> (w); 00365 bool old= set_frac_flag (true); 00366 syntactic r= 1; 00367 for (nat i=0; i<N(w); i++) r= r * w[i]; 00368 (void) set_frac_flag (old); 00369 return r; 00370 } 00371 00372 /****************************************************************************** 00373 * Gcd 00374 ******************************************************************************/ 00375 00376 syntactic gcd (const syntactic& g1, const syntactic& g2) { 00377 if (exact_eq (g1, 0)) return g2; 00378 if (exact_eq (g2, 0)) return g1; 00379 return syn (GEN_GCD, g1, g2); 00380 } 00381 00382 syntactic lcm (const syntactic& g1, const syntactic& g2) { 00383 if (exact_eq (g1, 0) || exact_eq (g2, 0)) return 0; 00384 return syn (GEN_LCM, g1, g2); 00385 } 00386 00387 syntactic xgcd (const syntactic& g1, const syntactic& g2) { 00388 if (exact_eq (g1, 0)) 00389 return exact_eq (g2, 0) ? 00390 syn (GEN_SQTUPLE, syn (GEN_ROW, 1, 0 ), syn (GEN_ROW, 0, 1)) : 00391 syn (GEN_SQTUPLE, syn (GEN_ROW, 0, 1 / g2), syn (GEN_ROW, 1, 0)); 00392 return exact_eq (g2, 0) ? 00393 syn (GEN_SQTUPLE, syn (GEN_ROW, 1 / g1, 0), syn (GEN_ROW, 0 , 1 )) : 00394 syn (GEN_SQTUPLE, syn (GEN_ROW, 1 / g1, 0), syn (GEN_ROW, -g2, g1)); 00395 } 00396 00397 /****************************************************************************** 00398 * Other functions 00399 ******************************************************************************/ 00400 00401 syntactic sqrt (const syntactic& g) { return syn (GEN_SQRT, g); } 00402 syntactic exp (const syntactic& g) { return syn (GEN_EXP, g); } 00403 syntactic log (const syntactic& g) { return syn (GEN_LOG, g); } 00404 syntactic cos (const syntactic& g) { return syn (GEN_COS, g); } 00405 syntactic sin (const syntactic& g) { return syn (GEN_SIN, g); } 00406 syntactic tan (const syntactic& g) { return syn (GEN_TAN, g); } 00407 syntactic acos (const syntactic& g) { return syn (GEN_ARCCOS, g); } 00408 syntactic asin (const syntactic& g) { return syn (GEN_ARCSIN, g); } 00409 syntactic atan (const syntactic& g) { return syn (GEN_ARCTAN, g); } 00410 syntactic cosh (const syntactic& g) { return syn (GEN_CH, g); } 00411 syntactic sinh (const syntactic& g) { return syn (GEN_SH, g); } 00412 syntactic tanh (const syntactic& g) { return syn (GEN_TH, g); } 00413 syntactic acosh (const syntactic& g) { return syn (GEN_ARGCH, g); } 00414 syntactic asinh (const syntactic& g) { return syn (GEN_ARGSH, g); } 00415 syntactic atanh (const syntactic& g) { return syn (GEN_ARGTH, g); } 00416 00417 syntactic trig (const syntactic& g) { 00418 return syn (GEN_SQTUPLE, cos (g), sin (g)); } 00419 syntactic hypot (const syntactic& g1, const syntactic& g2) { 00420 return syn (GEN_HYPOT, g1, g2); } 00421 syntactic atan2 (const syntactic& g1, const syntactic& g2) { 00422 return syn (GEN_ARCTAN2, g1, g2); } 00423 00424 syntactic Re (const syntactic& g1) { return syn (GEN_RE, g1); } 00425 syntactic Im (const syntactic& g1) { return syn (GEN_IM, g1); } 00426 syntactic abs (const syntactic& g1) { return syn (GEN_ABS, g1); } 00427 syntactic arg (const syntactic& g1) { return syn (GEN_ARG, g1); } 00428 syntactic conj (const syntactic& g1) { return syn (GEN_CONJ, g1); } 00429 syntactic gaussian (const syntactic& g1, const syntactic& g2) { 00430 return g1 + g2 * Imaginary (syntactic); } 00431 syntactic polar (const syntactic& g1, const syntactic& g2) { 00432 return g1 * exp (g2 * Imaginary (syntactic)); } 00433 00434 syntactic center (const syntactic& g1) { return syn (GEN_CENTER, g1); } 00435 syntactic radius (const syntactic& g1) { return syn (GEN_RADIUS, g1); } 00436 syntactic numerator (const syntactic& g1) { 00437 return syn (GEN_NUMERATOR, g1); } 00438 syntactic denominator (const syntactic& g1) { 00439 return syn (GEN_DENOMINATOR, g1); } 00440 00441 syntactic operator << (const syntactic& x1, const syntactic& x2) { 00442 return syn (GEN_LESSLESS, x1, x2); } 00443 syntactic operator >> (const syntactic& x1, const syntactic& x2) { 00444 return syn (GEN_GTRGTR, x1, x2); } 00445 syntactic lshiftz (const syntactic& g, const syntactic& sh) { 00446 return syn ("lshiftz", g, sh); } 00447 syntactic rshiftz (const syntactic& g, const syntactic& sh) { 00448 return syn ("rshiftz", g, sh); } 00449 00450 syntactic derive (const syntactic& g) { 00451 return syn (GEN_DERIVE, g); } 00452 syntactic derive (const syntactic& g, const syntactic& v) { 00453 return syn (GEN_DERIVE, g, v); } 00454 syntactic xderive (const syntactic& g) { 00455 return syn (GEN_XDERIVE, g); } 00456 syntactic xderive (const syntactic& g, const syntactic& v) { 00457 return syn (GEN_XDERIVE, g, v); } 00458 syntactic integrate (const syntactic& g) { 00459 return syn (GEN_INTEGRATE, g); } 00460 syntactic integrate (const syntactic& g, const syntactic& v) { 00461 return syn (GEN_INTEGRATE, g, v); } 00462 00463 syntactic sqrt_init (const syntactic& x, const syntactic& c) { 00464 return syn ("sqrt_init", x, c); } 00465 syntactic log_init (const syntactic& x, const syntactic& c) { 00466 return syn ("log_init", x, c); } 00467 syntactic acos_init (const syntactic& x, const syntactic& c) { 00468 return syn ("acos_init", x, c); } 00469 syntactic asin_init (const syntactic& x, const syntactic& c) { 00470 return syn ("asin_init", x, c); } 00471 syntactic atan_init (const syntactic& x, const syntactic& c) { 00472 return syn ("atan_init", x, c); } 00473 syntactic integrate_init (const syntactic& g, const syntactic& c) { 00474 return syn ("integrate_init", g, c); } 00475 syntactic integrate_init (const syntactic& g, const syntactic& v, 00476 const syntactic& c) { 00477 return syn ("integrate_init", g, v, c); } 00478 syntactic solve_lde_init (const syntactic& x, const syntactic& c) { 00479 return syn ("solve_lde_init", x, c); } 00480 00481 syntactic access (const syntactic& g, const syntactic& i) { 00482 return syn (GEN_ACCESS, g, i); } 00483 syntactic access (const syntactic& g, const syntactic& i, const syntactic& j) { 00484 return syn (GEN_ACCESS, g, i, j); } 00485 syntactic inject (const syntactic& x, const syntactic& y, const syntactic& z) { 00486 return syn ("inject", x, y, z); } 00487 syntactic project (const syntactic& x, const syntactic& y) { 00488 return syn ("project", x, y); } 00489 00490 /****************************************************************************** 00491 * Flattening related routines 00492 ******************************************************************************/ 00493 00494 nat the_series_prec = 10; 00495 nat the_series_zt = 25; 00496 bool the_series_expr = false; 00497 00498 syntactic& 00499 the_series_var () { 00500 static syntactic v ("z"); 00501 return v; 00502 } 00503 00504 syntactic& 00505 the_polynomial_var () { 00506 static syntactic v ("x"); 00507 return v; 00508 } 00509 00510 syntactic flatten (const bool& b) { 00511 return b? syntactic ("true"): syntactic ("false"); } 00512 syntactic flatten (const char& i) { 00513 return syntactic (as_string (i)); } 00514 syntactic flatten (const signed char& i) { 00515 return syntactic (as_string (i)); } 00516 syntactic flatten (const unsigned char& i) { 00517 return syntactic (as_string (i)); } 00518 syntactic flatten (const short int& i) { 00519 return syntactic (as_string (i)); } 00520 syntactic flatten (const short unsigned int& i) { 00521 return syntactic (as_string (i)); } 00522 syntactic flatten (const int& i) { 00523 return syntactic (as_string (i)); } 00524 syntactic flatten (const unsigned int& i) { 00525 return syntactic (as_string (i)); } 00526 syntactic flatten (const long int& i) { 00527 return syntactic (as_string (i)); } 00528 syntactic flatten (const long unsigned int& i) { 00529 return syntactic (as_string (i)); } 00530 syntactic flatten (const long long int& i) { 00531 return syntactic (as_string (i)); } 00532 syntactic flatten (const long long unsigned int& i) { 00533 return syntactic (as_string (i)); } 00534 syntactic flatten (const float& x) { 00535 return syntactic (as_string (x)); } 00536 syntactic flatten (const double& x) { 00537 return syntactic (as_string (x)); } 00538 syntactic flatten (const long double& x) { 00539 return syntactic (as_string (x)); } 00540 syntactic flatten (char* const & s) { 00541 return syn ("$text", syntactic (quote (s))); } 00542 syntactic flatten (const string& s) { 00543 return syn ("$text", syntactic (quote (s))); } 00544 00545 } // namespace mmx