val universes_to_ast_string (us: universes) : Tac string
let universes_to_ast_string (us:universes) : Tac string =
  print_list universe_to_ast_string us
val universes_to_ast_string (us: universes) : Tac string
let universes_to_ast_string (us: universes) : Tac string =
print_list universe_to_ast_string us
FStar.Tactics.Print.fst.checked
prims.fst.checked FStar.Tactics.V2.Derived.fst.checked FStar.Tactics.V2.Builtins.fsti.checked FStar.Tactics.NamedView.fsti.checked FStar.Tactics.Effect.fsti.checked FStar.Reflection.V2.fst.checked FStar.Pervasives.fsti.checked
FStar.Tactics.Print.fst
FStar.Reflection.V2.Data.universes FStar.Tactics.Print.print_list FStar.Reflection.Types.universe FStar.Tactics.Print.universe_to_ast_string Prims.string
module FStar.Tactics.Print

open FStar.Reflection.V2
open FStar.Tactics.Effect
open FStar.Tactics.V2.Builtins
open FStar.Tactics.V2.Derived
open FStar.Tactics.NamedView

let namedv_to_string (x:namedv) : Tac string=
  unseal x.ppname ^ "#" ^ string_of_int x.uniq

private
let paren (s:string) : string = "(" ^ s ^ ")"

(* TODO: making this a local definition in print_list fails to extract. *)
private
let rec print_list_aux (f:'a -> Tac string) (xs:list 'a) : Tac string =
  match xs with
  | [] -> ""
  | [x] -> f x
  | x::xs -> f x ^ "; " ^ print_list_aux f xs

private
let print_list (f:'a -> Tac string) (l:list 'a) : Tac string =
   "[" ^ print_list_aux f l ^ "]"

let rec universe_to_ast_string (u:universe) : Tac string =
  match inspect_universe u with
  | Uv_Zero -> "Uv_Zero"
  | Uv_Succ u -> "Uv_Succ" ^ paren (universe_to_ast_string u)
  | Uv_Max us -> "Uv_Max" ^ print_list universe_to_ast_string us
  | Uv_BVar n -> "Uv_BVar" ^ paren (string_of_int n)
  | Uv_Name i -> "Uv_Name" ^ paren (fst i)
  | Uv_Unif _ -> "Uv_Unif"
  | Uv_Unk -> "Uv_Unk"
val universes_to_ast_string (us: universes) : Tac string
us: FStar.Reflection.V2.Data.universes -> FStar.Tactics.Effect.Tac Prims.string