basix_doc 0.1
/Users/mourrain/Devel/mmx/basix/src/syntactic.cpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines