-type var = int * int
-type 'nf i_var_ = [ `I of var * 'nf Listx.listx | `Var of var ]
-type 'nf i_n_var_ = [ `N of int | 'nf i_var_ ]
-type 'nf i_num_var_ =
- [ `I of var * 'nf Listx.listx
- | `Match of 'nf i_num_var_ * var * int * (int * 'nf) list ref * 'nf list
- | `N of int
- | `Var of var ]
-type 'nf nf_ =
- [ `I of var * 'nf Listx.listx
- | `Lam of bool * 'nf nf_
- | `Match of 'nf i_num_var_ * var * int * (int * 'nf) list ref * 'nf list
- | `N of int
- | `Var of var ]
-type nf = nf nf_
-type i_var = nf i_var_
-type i_n_var = nf i_n_var_
-type i_num_var = nf i_num_var_
+type var = int * (* arity of variable*) int;;
+type 'nf_nob i_var_ = [ `I of var * 'nf_nob Listx.listx | `Var of var ]
+type 'nf_nob i_n_var_ = [ `N of int | 'nf_nob i_var_ ]
+type ('nf_nob,'nf) i_num_var_ = [
+ | 'nf_nob i_n_var_
+ | `Match of ('nf_nob,'nf) i_num_var_ * (* originating var *) var * (*lift*) int * (*branches*)(int * 'nf) list ref * (*args*)'nf_nob list
+]
+type 'nf nf_nob_ = [ `Lam of (* was_unpacked *) bool * 'nf | `Pacman | ('nf nf_nob_,'nf) i_num_var_ ]
+type nf = [ nf nf_nob_ | `Bottom ]
+type nf_nob = nf nf_nob_
+type i_var = nf_nob i_var_;;
+type i_n_var = nf_nob i_n_var_;;
+type i_num_var = (nf_nob,nf) i_num_var_;;