This PR introduces resugaring for dependent tuples (we had none, except for printing out dtupleN explicitly) and fixes some other problems with resugaring of tuples. See this snippet:
(* Basic dtuple3 *)
let _ = (a:int & b:int & z:int{z == a+b})
(* tuple3 and nested tuple2: all printed the same *)
let _ = int & int & int
let _ = ((int & int) & int)
let _ = (int & (int & int))
(* printed as int * bool *)
let _ = tuple4 int bool
Before (output with --dump_module):
Exports: [
private
let _ =
FStar.Pervasives.dtuple3 Prims.int (fun _ -> Prims.int) (fun a b -> z: Prims.int{z == a + b})
private
let _ = Prims.int * Prims.int * Prims.int
private
let _ = Prims.int * Prims.int * Prims.int
private
let _ = Prims.int * Prims.int * Prims.int
private
let _ = Prims.int * Prims.bool
]
After:
Exports: [
private
let _ = a: Prims.int & b: Prims.int & z: Prims.int{z == a + b}
private
let _ = Prims.int & Prims.int & Prims.int
private
let _ = (Prims.int & Prims.int) & Prims.int
private
let _ = Prims.int & (Prims.int & Prims.int)
private
let _ = FStar.Pervasives.Native.tuple4 Prims.int Prims.bool
]
This PR introduces resugaring for dependent tuples (we had none, except for printing out
dtupleN
explicitly) and fixes some other problems with resugaring of tuples. See this snippet:Before (output with --dump_module):
After:
Also: Fixes #2245