virtual void VisitExpr( const  SymbolicExpr& e2) 
          {  SymOpType t1 = e1.GetOpType(), t2 = e2.GetOpType(); 
             unsigned c1 = e1.NumOfOpds(), c2 = e2.NumOfOpds();
             if (t2 == SYMOP_MULTIPLY || t2 == SYMOP_PLUS )
                    Default0(); 
             else if (t1 == t2) {
                 Matrix<CompareRel> rel(c1,c2,0);
                 ExprTermCompare(e1,e2,rel,GetFunc()); 
                 MatchCompare(rel,c2);
             }
             else if (t1 == SYMOP_MIN && t2 == SYMOP_MAX) {
                size_t le = 0, lt = 0, ge = 0, gt = 0;
                SymbolicExpr::OpdIterator p2 = e2.GetOpdIterator();
                for ( ; !p2.ReachEnd(); ++p2) {
                    CompareRel r = CompareValHelp(v1, e2.Term2Val(p2.Current()),GetFunc());
                    if (CountLE(r)) 
                        ++le; 
                    if (CountGE(r)) 
                        ++ge;
                    if (CountLT(r))
                        ++lt;
                    if (CountGT(r))
                        ++gt;
                } 
                if (gt == e2.NumOfOpds()) 
                     result = REL_GT;
                else if (lt > 0)
                      result = REL_LT;
                else if (ge == e2.NumOfOpds()) 
                     result = REL_GE;
                else if (le > 0)
                      result = REL_LE;
             } 
             else if (t1 == SYMOP_MAX && t2 == SYMOP_MIN) 
                 result = Reverse( SelectCompare(v2, e2, GetFunc())(v1) );
             else
                 assert(false);
          }