150 val nn = length perm_ctrss; |
150 val nn = length perm_ctrss; |
151 val kks = 0 upto nn - 1; |
151 val kks = 0 upto nn - 1; |
152 |
152 |
153 val perm_ctr_offsets = map (fn kk => Integer.sum (map length (take kk perm_ctrss))) kks; |
153 val perm_ctr_offsets = map (fn kk => Integer.sum (map length (take kk perm_ctrss))) kks; |
154 |
154 |
155 val perm_lfpTs = map (body_type o fastype_of o hd) perm_ctrss; |
155 val perm_fpTs = map #T perm_basic_lfp_sugars; |
156 val perm_Cs = map #C perm_basic_lfp_sugars; |
156 val perm_Cs = map #C perm_basic_lfp_sugars; |
157 val perm_fun_arg_Tssss = map #fun_arg_Tsss perm_basic_lfp_sugars; |
157 val perm_fun_arg_Tssss = map #fun_arg_Tsss perm_basic_lfp_sugars; |
158 |
158 |
159 fun unpermute0 perm0_xs = permute_like_unique (op =) perm0_kks kks perm0_xs; |
159 fun unpermute0 perm0_xs = permute_like_unique (op =) perm0_kks kks perm0_xs; |
160 fun unpermute perm_xs = permute_like_unique (op =) perm_indices indices perm_xs; |
160 fun unpermute perm_xs = permute_like_unique (op =) perm_indices indices perm_xs; |
161 |
161 |
162 val inducts = unpermute0 (conj_dests nn common_induct); |
162 val inducts = unpermute0 (conj_dests nn common_induct); |
163 |
163 |
164 val lfpTs = unpermute perm_lfpTs; |
164 val fpTs = unpermute perm_fpTs; |
165 val Cs = unpermute perm_Cs; |
165 val Cs = unpermute perm_Cs; |
166 val ctr_offsets = unpermute perm_ctr_offsets; |
166 val ctr_offsets = unpermute perm_ctr_offsets; |
167 |
167 |
168 val As_rho = tvar_subst thy (take nn0 lfpTs) arg_Ts; |
168 val As_rho = tvar_subst thy (take nn0 fpTs) arg_Ts; |
169 val Cs_rho = map (fst o dest_TVar) Cs ~~ pad_list HOLogic.unitT nn res_Ts; |
169 val Cs_rho = map (fst o dest_TVar) Cs ~~ pad_list HOLogic.unitT nn res_Ts; |
170 |
170 |
171 val substA = Term.subst_TVars As_rho; |
171 val substA = Term.subst_TVars As_rho; |
172 val substAT = Term.typ_subst_TVars As_rho; |
172 val substAT = Term.typ_subst_TVars As_rho; |
173 val substCT = Term.typ_subst_TVars Cs_rho; |
173 val substCT = Term.typ_subst_TVars Cs_rho; |