anchor.diff:  
   /// Applies constant to list of arguments, instantiating constant type as needed.
   let list_mk_icomb cname args = 
  -    let atys, _ = nsplit dest_fun_ty args (Choice.get <| get_const_type cname)
  +    let atys, _ = nsplit (Choice.get << dest_fun_ty) args (Choice.get <| get_const_type cname)
       let tyin = itlist2 (fun g a -> type_match g (Choice.get <| type_of a)) atys args []
       list_mk_comb(Choice.get <| mk_const(cname, tyin), args)
   
  
positive.code:     let lefts, rights = unzip assigs
      let lend = Choice.get <| mk_comb(Choice.get <| mk_const("LET_END", [Choice.get <| type_of bod, aty]), bod)
      let lbod = list_mk_gabs(lefts, lend)
      let ty1, ty2 = dest_fun_ty(Choice.get <| type_of lbod)
      let ltm = 
          Choice.get <| mk_const("LET", [ty1, aty;
                           ty2, bty])
  
negative.code: /// Break apart a function type into domain and range.
  let dest_fun_ty ty = 
      match ty with
      | Tyapp("fun", [ty1; ty2]) -> Choice.succeed (ty1, ty2)
      | _ -> Choice.failwith "dest_fun_ty"
  
  /// Tests if one type occurs in another.
  let rec occurs_in ty bigty =
  