anchor.diff:      subst:      list<uvi>;           //the partial solution derived so far
       guard:      guard_formula;       //the logical condition gathered so far
       ctr:        int;                 //a counter incremented each time we extend subst, used to detect if we've made progress
  +    slack_vars: list<typ>;           //all the slack variables introduced so far
  +    defer_ok:   bool;                //whether or not carrying constraints is ok---at the top-level, this flag is false
   }
   
   type solution = 
       | Success of list<uvi> * guard_t
       | Failed  of prob * string
  +(* --------------------------------------------------------- *)
  +(* </type defs>                                              *)
  +(* --------------------------------------------------------- *)
   
   (* ------------------------------------------------*)
   (* <Printing> (mainly for debugging) *)
  
positive.code:    See the License for the specific language governing permissions and
     limitations under the License.
  *)
  #light "off"
  module Microsoft.FStar.Tc.Rel
  
  
negative.code: 
              | _ -> None) //not a pattern
  
  let destruct_flex_t t = match t.n with
      | Typ_uvar(uv, k) -> (t, uv, k, [])
      | Typ_app({n=Typ_uvar(uv, k)}, args) -> (t, uv, k, args)
      | _ -> failwith "Not a flex-uvar"
  (* ------------------------------------------------ *)
  (* </variable ops>                                  *)
  (* ------------------------------------------------ *)
  