@@ -3073,6 +3073,11 @@ namespace nlsat {
3073
3073
return out;
3074
3074
}
3075
3075
3076
+ std::ostream& display_polynomial_smt2 (std::ostream & out, poly const * p, display_var_proc const & proc) const {
3077
+ m_pm.display_smt2 (out, p, proc);
3078
+ return out;
3079
+ }
3080
+
3076
3081
std::ostream& display_ineq_smt2 (std::ostream & out, ineq_atom const & a, display_var_proc const & proc) const {
3077
3082
switch (a.get_kind ()) {
3078
3083
case atom::LT: out << " (< " ; break ;
@@ -3087,13 +3092,13 @@ namespace nlsat {
3087
3092
if (i > 0 ) out << " " ;
3088
3093
if (a.is_even (i)) {
3089
3094
out << " (* " ;
3090
- m_pm. display_smt2 (out, a.p (i), proc);
3095
+ display_polynomial_smt2 (out, a.p (i), proc);
3091
3096
out << " " ;
3092
- m_pm. display_smt2 (out, a.p (i), proc);
3097
+ display_polynomial_smt2 (out, a.p (i), proc);
3093
3098
out << " )" ;
3094
3099
}
3095
3100
else {
3096
- m_pm. display_smt2 (out, a.p (i), proc);
3101
+ display_polynomial_smt2 (out, a.p (i), proc);
3097
3102
}
3098
3103
}
3099
3104
if (sz > 1 )
@@ -3102,12 +3107,21 @@ namespace nlsat {
3102
3107
return out;
3103
3108
}
3104
3109
3110
+ std::ostream& display_poly_root (std::ostream& out, char const * y, root_atom const & a, display_var_proc const & proc) const {
3111
+ out << " (exists ((" ; proc (out,a.x ()); out << " Real))\n " ;
3112
+ out << " (and (= " << y << " " ;
3113
+ proc (out, a.x ());
3114
+ out << " ) (= 0 " ;
3115
+ display_polynomial_smt2 (out, a.p (), proc);
3116
+ out << " )))\n " ;
3117
+ return out;
3118
+ }
3105
3119
3106
3120
std::ostream& display_binary_smt2 (std::ostream& out, poly const * p1, char const * rel, poly const * p2, display_var_proc const & proc) const {
3107
3121
out << " (" << rel << " " ;
3108
- m_pm. display_smt2 (out, p1, proc);
3122
+ display_polynomial_smt2 (out, p1, proc);
3109
3123
out << " " ;
3110
- m_pm. display_smt2 (out, p2, proc);
3124
+ display_polynomial_smt2 (out, p2, proc);
3111
3125
out << " )" ;
3112
3126
return out;
3113
3127
}
@@ -3147,9 +3161,39 @@ namespace nlsat {
3147
3161
3148
3162
std::ostream& display_root_smt2 (std::ostream& out, root_atom const & a, display_var_proc const & proc) const {
3149
3163
if (a.i () == 1 && m_pm.degree (a.p (), a.x ()) == 1 )
3150
- return display_linear_root_smt2 (out, a, proc);
3151
- else
3152
- return display_root (out, a, proc);
3164
+ return display_linear_root_smt2 (out, a, proc);
3165
+ #if 1
3166
+ out << " (exists (" ;
3167
+ for (unsigned j = 0 ; j < a.i (); ++j) {
3168
+ std::string y = std::string (" y" ) + std::to_string (j);
3169
+ out << " (" << y << " Real) " ;
3170
+ }
3171
+ out << " )\n " ;
3172
+ out << " (and\n " ;
3173
+ for (unsigned j = 0 ; j < a.i (); ++j) {
3174
+ std::string y = std::string (" y" ) + std::to_string (j);
3175
+ display_poly_root (out, y.c_str (), a, proc);
3176
+ }
3177
+ for (unsigned j = 0 ; j + 1 < a.i (); ++j) {
3178
+ std::string y1 = std::string (" y" ) + std::to_string (j);
3179
+ std::string y2 = std::string (" y" ) + std::to_string (j+1 );
3180
+ out << " (< " << y1 << " " << y2 << " )\n " ;
3181
+ }
3182
+ std::string y0 = " y0" ;
3183
+ std::string yn = " y" + std::to_string (a.i () - 1 );
3184
+ switch (a.get_kind ()) {
3185
+ case atom::ROOT_LT: out << " (< " ; proc (out, a.x ()); out << " " << y0 << " )" ; break ;
3186
+ case atom::ROOT_GT: out << " (> " ; proc (out, a.x ()); out << " " << yn << " )" ; break ;
3187
+ case atom::ROOT_LE: out << " (<= " ; proc (out, a.x ()); out << " " << y0 << " )" ; break ;
3188
+ case atom::ROOT_GE: out << " (>= " ; proc (out, a.x ()); out << " " << yn << " )" ; break ;
3189
+ case atom::ROOT_EQ: out << " (= " ; proc (out, a.x ()); out << " " << y0 << " )" ; NOT_IMPLEMENTED_YET (); break ;
3190
+ }
3191
+ out << " ))" ;
3192
+ return out;
3193
+ #endif
3194
+
3195
+
3196
+ return display_root (out, a, proc);
3153
3197
}
3154
3198
3155
3199
std::ostream& display_root (std::ostream & out, root_atom const & a, display_var_proc const & proc) const {
0 commit comments