1 (*********************************************************************************************************************************)
2 (* HaskWeakToStrong: convert HaskWeak to HaskStrong *)
3 (*********************************************************************************************************************************)
5 Generalizable All Variables.
6 Require Import Preamble.
7 Require Import General.
8 Require Import NaturalDeduction.
9 Require Import Coq.Strings.String.
10 Require Import Coq.Lists.List.
11 Require Import Coq.Init.Specif.
12 Require Import HaskKinds.
13 Require Import HaskCoreLiterals.
14 Require Import HaskWeakTypes.
15 Require Import HaskWeakVars.
16 Require Import HaskWeak.
17 Require Import HaskWeakToCore.
18 Require Import HaskStrongTypes.
19 Require Import HaskStrong.
20 Require Import HaskCoreTypes.
21 Require Import HaskCoreVars.
23 Open Scope string_scope.
24 Definition TyVarResolver Γ := forall wt:WeakTypeVar, ???(HaskTyVar Γ wt).
25 Definition CoVarResolver Γ Δ := forall wt:WeakCoerVar, ???(HaskCoVar Γ Δ).
27 Definition upφ {Γ}(tv:WeakTypeVar)(φ:TyVarResolver Γ) : TyVarResolver ((tv:Kind)::Γ).
31 then let fresh := @FreshHaskTyVar Γ tv in OK _
32 else φ tv' >>= fun tv'' => OK (fun TV ite => tv'' TV (weakITE ite))).
33 rewrite <- _H; apply fresh.
36 Definition upφ' {Γ}(tvs:list WeakTypeVar)(φ:TyVarResolver Γ)
37 : (TyVarResolver (app (map (fun tv:WeakTypeVar => tv:Kind) tvs) Γ)).
45 Definition substPhi {Γ:TypeEnv}(κ κ':Kind)(θ:HaskType Γ κ) : HaskType (κ::Γ) κ' -> HaskType Γ κ'.
49 unfold HaskType in ht.
52 apply ICons; [ idtac | apply env ].
56 Definition substφ {Γ:TypeEnv}(lk:list Kind)(θ:IList _ (fun κ => HaskType Γ κ) lk){κ} : HaskType (app lk Γ) κ -> HaskType Γ κ.
62 inversion θ; subst; auto.
70 (* this is a StrongAltCon plus some stuff we know about StrongAltCons which we've built ourselves *)
71 Record StrongAltConPlusJunk {tc:TyCon} :=
72 { sacpj_sac : @StrongAltCon tc
73 ; sacpj_φ : forall Γ (φ:TyVarResolver Γ ), (TyVarResolver (sac_Γ sacpj_sac Γ))
74 ; sacpj_ψ : forall Γ Δ atypes (ψ:CoVarResolver Γ Δ), CoVarResolver _ (sac_Δ sacpj_sac Γ atypes (weakCK'' Δ))
76 Implicit Arguments StrongAltConPlusJunk [ ].
77 Coercion sacpj_sac : StrongAltConPlusJunk >-> StrongAltCon.
79 (* yes, I know, this is really clumsy *)
80 Variable emptyφ : TyVarResolver nil.
81 Extract Inlined Constant emptyφ => "(\x -> Prelude.error ""encountered unbound tyvar!"")".
83 Definition mkPhi (lv:list WeakTypeVar)
84 : (TyVarResolver (map (fun x:WeakTypeVar => x:Kind) lv)).
85 set (upφ'(Γ:=nil) lv emptyφ) as φ'.
86 rewrite <- app_nil_end in φ'.
90 Definition dataConExKinds dc := vec_map (fun x:WeakTypeVar => (x:Kind)) (list2vec (dataConExTyVars dc)).
91 Definition tyConKinds tc := vec_map (fun x:WeakTypeVar => (x:Kind)) (list2vec (tyConTyVars tc)).
93 Definition fixkind {κ}(tv:WeakTypeVar) := weakTypeVar tv κ.
94 Notation " ` x " := (@fixkind _ x) (at level 100).
96 Ltac matchThings T1 T2 S :=
97 destruct (eqd_dec T1 T2) as [matchTypeVars_pf|];
98 [ idtac | apply (Error (S +++ T1 +++ " " +++ T2)) ].
100 Definition mkTAll' {κ}{Γ} : HaskType (κ :: Γ) ★ -> (forall TV (ite:InstantiatedTypeEnv TV Γ), TV κ -> RawHaskType TV ★).
102 unfold InstantiatedTypeEnv in ite.
107 Definition mkTAll {κ}{Γ} : HaskType (κ :: Γ) ★ -> HaskType Γ ★.
117 Definition weakTypeToType : forall {Γ:TypeEnv}(φ:TyVarResolver Γ)(t:WeakType), ???(HaskTypeOfSomeKind Γ).
118 refine (fix weakTypeToType {Γ:TypeEnv}(φ:TyVarResolver Γ)(t:WeakType) {struct t} : ???(HaskTypeOfSomeKind Γ) :=
119 addErrorMessage ("weakTypeToType " +++ t)
121 | WFunTyCon => let case_WFunTyCon := tt in OK (haskTypeOfSomeKind (fun TV ite => TArrow))
122 | WTyCon tc => let case_WTyCon := tt in _
123 | WClassP c lt => let case_WClassP := tt in Error "weakTypeToType: WClassP not implemented"
124 | WIParam _ ty => let case_WIParam := tt in Error "weakTypeToType: WIParam not implemented"
125 | WAppTy t1 t2 => let case_WAppTy := tt in weakTypeToType _ φ t1 >>= fun t1' => weakTypeToType _ φ t2 >>= fun t2' => _
126 | WTyVarTy v => let case_WTyVarTy := tt in φ v >>= fun v' => _
127 | WForAllTy wtv t => let case_WForAllTy := tt in weakTypeToType _ (upφ wtv φ) t >>= fun t => _
128 | WCodeTy ec tbody => let case_WCodeTy := tt in weakTypeToType _ φ tbody >>= fun tbody' => φ (@fixkind ★ ec) >>= fun ec' => _
129 | WCoFunTy t1 t2 t3 => let case_WCoFunTy := tt in
130 weakTypeToType _ φ t1 >>= fun t1' =>
131 weakTypeToType _ φ t2 >>= fun t2' =>
132 weakTypeToType _ φ t3 >>= fun t3' => _
134 ((fix weakTypeListToTypeList (lk:list Kind) (lt:list WeakType)
135 { struct lt } : ???(forall TV (ite:InstantiatedTypeEnv TV Γ), @RawHaskTypeList TV lk) :=
137 | nil => match lk as LK return ???(forall TV (ite:InstantiatedTypeEnv TV Γ), @RawHaskTypeList TV LK) with
138 | nil => OK (fun TV _ => TyFunApp_nil)
139 | _ => Error "WTyFunApp not applied to enough types"
141 | tx::lt' => weakTypeToType Γ φ tx >>= fun t' =>
142 match lk as LK return ???(forall TV (ite:InstantiatedTypeEnv TV Γ), @RawHaskTypeList TV LK) with
143 | nil => Error "WTyFunApp applied to too many types"
144 | k::lk' => weakTypeListToTypeList lk' lt' >>= fun rhtl' =>
145 let case_weakTypeListToTypeList := tt in _
148 ) (fst (tyFunKind tc)) lt) >>= fun lt' => let case_WTyFunApp := tt in _
149 end ); clear weakTypeToType.
151 destruct case_WTyVarTy.
152 apply (addErrorMessage "case_WTyVarTy").
154 exact (haskTypeOfSomeKind (fun TV env => TVar (v' TV env))).
156 destruct case_WAppTy.
157 apply (addErrorMessage "case_WAppTy").
158 destruct t1' as [k1' t1'].
159 destruct t2' as [k2' t2'].
161 try (matchThings k1'1 k2' "Kind mismatch in WAppTy: ";
162 subst; apply OK; apply (haskTypeOfSomeKind (fun TV env => TApp (t1' TV env) (t2' TV env))));
163 apply (Error "Kind mismatch in WAppTy:: ").
165 destruct case_weakTypeListToTypeList.
166 apply (addErrorMessage "case_weakTypeListToTypeList").
167 destruct t' as [ k' t' ].
168 matchThings k k' "Kind mismatch in weakTypeListToTypeList".
170 apply (OK (fun TV ite => TyFunApp_cons _ _ (t' TV ite) (rhtl' TV ite))).
172 destruct case_WTyFunApp.
173 apply (addErrorMessage "case_WTyFunApp").
175 eapply haskTypeOfSomeKind.
176 unfold HaskType; intros.
181 destruct case_WTyCon.
182 apply (addErrorMessage "case_WTyCon").
184 eapply haskTypeOfSomeKind.
185 unfold HaskType; intros.
188 destruct case_WCodeTy.
189 apply (addErrorMessage "case_WCodeTy").
191 matchThings κ ★ "Kind mismatch in WCodeTy: ".
193 eapply haskTypeOfSomeKind.
194 unfold HaskType; intros.
196 apply (TVar (ec' TV X)).
201 destruct case_WCoFunTy.
202 apply (addErrorMessage "case_WCoFunTy").
203 destruct t1' as [ k1' t1' ].
204 destruct t2' as [ k2' t2' ].
205 destruct t3' as [ k3' t3' ].
206 matchThings k1' k2' "Kind mismatch in arguments of WCoFunTy".
208 matchThings k3' ★ "Kind mismatch in result of WCoFunTy".
211 apply (haskTypeOfSomeKind (t1' ∼∼ t2' ⇒ t3')).
213 destruct case_WForAllTy.
214 apply (addErrorMessage "case_WForAllTy").
216 matchThings ★ κ "Kind mismatch in WForAllTy: ".
219 apply (@haskTypeOfSomeKind _ ★).
225 Variable Prelude_error : forall {A}, string -> A. Extract Inlined Constant Prelude_error => "Prelude.error".
227 (* information about a datacon/literal/default which is common to all instances of a branch with that tag *)
228 Section StrongAltCon.
229 Context (tc : TyCon)(dc:DataCon tc).
231 Definition weakTypeToType' {Γ} : IList Kind (HaskType Γ) (vec2list (tyConKinds tc))
232 -> WeakType → ???(HaskType (app (vec2list (dataConExKinds dc)) Γ) ★).
235 apply (addErrorMessage "weakTypeToType'").
236 set (ilmap (@weakT' _ (vec2list (dataConExKinds dc))) avars) as avars'.
237 set (@substφ _ _ avars') as q.
238 set (upφ' (tyConTyVars tc) (mkPhi (dataConExTyVars dc))) as φ'.
239 set (@weakTypeToType _ φ' ct) as t.
240 destruct t as [|t]; try apply (Error error_message).
241 destruct t as [tk t].
242 matchThings tk ★ "weakTypeToType'".
245 set (@weakT'' _ Γ _ t) as t'.
246 set (@lamer _ _ _ _ t') as t''.
247 fold (tyConKinds tc) in t''.
248 fold (dataConExKinds dc) in t''.
252 unfold dataConExKinds.
253 rewrite <- vec2list_map_list2vec.
254 rewrite <- vec2list_map_list2vec.
255 rewrite vec2list_list2vec.
256 rewrite vec2list_list2vec.
260 Definition mkStrongAltCon : @StrongAltCon tc.
262 {| sac_altcon := DataAlt dc
263 ; sac_numCoerVars := length (dataConCoerKinds dc)
264 ; sac_numExprVars := length (dataConFieldTypes dc)
265 ; sac_ekinds := dataConExKinds dc
266 ; sac_coercions := fun Γ avars => let case_sac_coercions := tt in _
267 ; sac_types := fun Γ avars => let case_sac_types := tt in _
270 destruct case_sac_coercions.
271 refine (vec_map _ (list2vec (dataConCoerKinds dc))).
274 unfold tyConKind in avars.
275 set (@weakTypeToType' Γ) as q.
276 unfold tyConKinds in q.
277 rewrite <- vec2list_map_list2vec in q.
278 rewrite vec2list_list2vec in q.
281 q avars w >>= fun t1 =>
282 q avars w0 >>= fun t2 =>
283 OK (mkHaskCoercionKind t1 t2)
285 | Error s => Prelude_error s
289 destruct case_sac_types.
290 refine (vec_map _ (list2vec (dataConFieldTypes dc))).
292 unfold tyConKind in avars.
293 set (@weakTypeToType' Γ) as q.
294 unfold tyConKinds in q.
295 rewrite <- vec2list_map_list2vec in q.
296 rewrite vec2list_list2vec in q.
297 set (q avars X) as y.
299 | Error s =>Prelude_error s
305 Lemma weakCV' : forall {Γ}{Δ} Γ',
307 -> HaskCoVar (app Γ' Γ) (weakCK'' Δ).
309 unfold HaskCoVar in *.
310 intros; apply (X TV CV).
311 apply ilist_chop' in env; auto.
312 unfold InstantiatedCoercionEnv in *.
313 unfold weakCK'' in cenv.
315 rewrite <- map_preserves_length in cenv.
317 rewrite <- map_preserves_length in cenv.
321 Definition mkStrongAltConPlusJunk : StrongAltConPlusJunk tc.
323 {| sacpj_sac := mkStrongAltCon
324 ; sacpj_φ := fun Γ φ => (fun htv => φ htv >>= fun htv' => OK (weakV' htv'))
326 fun Γ Δ avars ψ => (fun htv => ψ htv >>= fun htv' => OK (_ (weakCV' (vec2list (sac_ekinds mkStrongAltCon)) htv')))
330 unfold HaskCoVar in *.
335 unfold InstantiatedCoercionEnv in *.
336 apply vec_chop' in cenv.
340 Lemma weakCK'_nil_inert : forall Γ Δ, (@weakCK'' Γ (@nil Kind)) Δ = Δ.
351 Definition mkStrongAltConPlusJunk' (tc : TyCon)(alt:AltCon) : ???(@StrongAltConPlusJunk tc).
353 set (c:DataCon _) as dc.
354 set ((dataConTyCon c):TyCon) as tc' in *.
355 set (eqd_dec tc tc') as eqpf; destruct eqpf;
357 | apply (Error ("in a case of tycon "+++tc+++", found a branch with datacon "+++(dc:CoreDataCon))) ]; subst.
359 eapply mkStrongAltConPlusJunk.
363 apply OK; refine {| sacpj_sac := {|
364 sac_ekinds := vec_nil ; sac_coercions := fun _ _ => vec_nil ; sac_types := fun _ _ => vec_nil
365 ; sac_altcon := LitAlt h
367 intro; intro φ; apply φ.
368 intro; intro; intro; intro ψ. simpl. unfold sac_Γ; simpl. unfold sac_Δ; simpl.
369 rewrite weakCK'_nil_inert. apply ψ.
370 apply OK; refine {| sacpj_sac := {|
371 sac_ekinds := vec_nil ; sac_coercions := fun _ _ => vec_nil ; sac_types := fun _ _ => vec_nil
372 ; sac_altcon := DEFAULT |} |}.
373 intro; intro φ; apply φ.
374 intro; intro; intro; intro ψ. simpl. unfold sac_Γ; simpl. unfold sac_Δ; simpl.
375 rewrite weakCK'_nil_inert. apply ψ.
378 Definition weakExprVarToWeakType : WeakExprVar -> WeakType :=
379 fun wev => match wev with weakExprVar _ t => t end.
380 Coercion weakExprVarToWeakType : WeakExprVar >-> WeakType.
382 Variable weakCoercionToHaskCoercion : forall Γ Δ κ, WeakCoercion -> HaskCoercion Γ Δ κ.
384 Definition weakψ {Γ}{Δ:CoercionEnv Γ} {κ}(ψ:WeakCoerVar -> ???(HaskCoVar Γ Δ)) :
385 WeakCoerVar -> ???(HaskCoVar Γ (κ::Δ)).
392 inversion cenv; auto.
395 (* attempt to "cast" an expression by simply checking if it already had the desired type, and failing otherwise *)
396 Definition castExpr (we:WeakExpr)(err_msg:string) {Γ} {Δ} {ξ} {τ} τ' (e:@Expr _ CoreVarEqDecidable Γ Δ ξ τ)
397 : ???(@Expr _ CoreVarEqDecidable Γ Δ ξ τ').
398 apply (addErrorMessage ("castExpr " +++ err_msg)).
401 destruct τ' as [τ' l'].
402 destruct (eqd_dec l l'); [ idtac
403 | apply (Error ("level mismatch in castExpr, invoked by "+++err_msg+++eol+++
404 " got: " +++(fold_left (fun x y => y+++","+++y) (map haskTyVarToType l) "")+++eol+++
405 " wanted: "+++(fold_left (fun x y => x+++","+++y) (map haskTyVarToType l') "")
407 destruct (eqd_dec τ τ'); [ idtac
408 | apply (Error ("type mismatch in castExpr, invoked by "+++err_msg+++eol+++
409 " got: " +++τ+++eol+++
417 Definition coVarKind (wcv:WeakCoerVar) : Kind :=
418 match wcv with weakCoerVar _ κ _ _ => κ end.
419 Coercion coVarKind : WeakCoerVar >-> Kind.
421 Definition weakTypeToType'' : forall {Γ:TypeEnv}(φ:TyVarResolver Γ)(t:WeakType) κ, ???(HaskType Γ κ).
423 set (weakTypeToType φ t) as wt.
424 destruct wt; try apply (Error error_message).
426 matchThings κ κ0 "Kind mismatch in weakTypeToType'': ".
432 Fixpoint varsTypes {Γ}(t:Tree ??(WeakExprVar * WeakExpr))(φ:TyVarResolver Γ) : Tree ??(CoreVar * HaskType Γ ★) :=
435 | T_Leaf (Some (wev,e)) => match weakTypeToType'' φ wev ★ with
437 | OK t' => [((wev:CoreVar),t')]
439 | T_Branch b1 b2 => (varsTypes b1 φ),,(varsTypes b2 φ)
443 Fixpoint mkAvars {Γ}(wtl:list WeakType)(lk:list Kind)(φ:TyVarResolver Γ) : ???(IList Kind (HaskType Γ) lk) :=
444 match lk as LK return ???(IList Kind (HaskType Γ) LK) with
445 | nil => match wtl with
447 | _ => Error "length mismatch in mkAvars"
449 | k::lk' => match wtl with
450 | nil => Error "length mismatch in mkAvars"
452 weakTypeToType'' φ wt k >>= fun t =>
453 mkAvars wtl' lk' φ >>= fun rest =>
454 OK (ICons _ _ t rest)
458 Definition weakExprToStrongExpr : forall
462 (ψ:CoVarResolver Γ Δ)
463 (ξ:CoreVar -> LeveledHaskType Γ ★)
466 WeakExpr -> ???(@Expr _ CoreVarEqDecidable Γ Δ ξ (τ @@ lev) ).
468 fix weakExprToStrongExpr
472 (ψ:CoVarResolver Γ Δ)
473 (ξ:CoreVar -> LeveledHaskType Γ ★)
476 (we:WeakExpr) : ???(@Expr _ CoreVarEqDecidable Γ Δ ξ (τ @@ lev) ) :=
479 | WEVar v => castExpr we ("WEVar "+++(v:CoreVar)) (τ @@ lev) (EVar Γ Δ ξ v)
481 | WELit lit => castExpr we ("WELit "+++lit) (τ @@ lev) (ELit Γ Δ ξ lit lev)
483 | WELam ev ebody => weakTypeToType'' φ ev ★ >>= fun tv =>
484 weakTypeOfWeakExpr ebody >>= fun tbody =>
485 weakTypeToType'' φ tbody ★ >>= fun tbody' =>
486 let ξ' := update_ξ ξ (((ev:CoreVar),tv@@lev)::nil) in
487 weakExprToStrongExpr Γ Δ φ ψ ξ' tbody' lev ebody >>= fun ebody' =>
488 castExpr we "WELam" (τ@@lev) (ELam Γ Δ ξ tv tbody' lev ev ebody')
490 | WEBrak _ ec e tbody => φ (`ec) >>= fun ec' =>
491 weakTypeToType'' φ tbody ★ >>= fun tbody' =>
492 weakExprToStrongExpr Γ Δ φ ψ ξ tbody' ((ec')::lev) e >>= fun e' =>
493 castExpr we "WEBrak" (τ@@lev) (EBrak Γ Δ ξ ec' tbody' lev e')
495 | WEEsc _ ec e tbody => φ ec >>= fun ec'' =>
496 weakTypeToType'' φ tbody ★ >>= fun tbody' =>
498 | nil => Error "ill-leveled escapification"
499 | ec'::lev' => weakExprToStrongExpr Γ Δ φ ψ ξ (<[ ec' |- tbody' ]>) lev' e
500 >>= fun e' => castExpr we "WEEsc" (τ@@lev) (EEsc Γ Δ ξ ec' tbody' lev' e')
503 | WENote n e => weakExprToStrongExpr Γ Δ φ ψ ξ τ lev e >>= fun e' => OK (ENote _ _ _ _ n e')
505 | WELet v ve ebody => weakTypeToType'' φ v ★ >>= fun tv =>
506 weakExprToStrongExpr Γ Δ φ ψ ξ tv lev ve >>= fun ve' =>
507 weakExprToStrongExpr Γ Δ φ ψ (update_ξ ξ (((v:CoreVar),tv@@lev)::nil)) τ lev ebody
509 OK (ELet _ _ _ tv _ lev (v:CoreVar) ve' ebody')
511 | WEApp e1 e2 => weakTypeOfWeakExpr e2 >>= fun t2 =>
512 weakTypeToType'' φ t2 ★ >>= fun t2' =>
513 weakExprToStrongExpr Γ Δ φ ψ ξ t2' lev e2 >>= fun e2' =>
514 weakExprToStrongExpr Γ Δ φ ψ ξ (t2'--->τ) lev e1 >>= fun e1' =>
515 OK (EApp _ _ _ _ _ _ e1' e2')
517 | WETyLam tv e => let φ' := upφ tv φ in
518 weakTypeOfWeakExpr e >>= fun te =>
519 weakTypeToType'' φ' te ★ >>= fun τ' =>
520 weakExprToStrongExpr _ (weakCE Δ) φ'
521 (fun x => (ψ x) >>= fun y => OK (weakCV y)) (weakLT○ξ) τ' (weakL lev) e
523 castExpr we "WETyLam1" _ e' >>= fun e'' =>
524 castExpr we "WETyLam2" _ (ETyLam Γ Δ ξ tv (mkTAll' τ') lev e'')
526 | WETyApp e t => weakTypeOfWeakExpr e >>= fun te =>
528 | WForAllTy wtv te' =>
529 let φ' := upφ wtv φ in
530 weakTypeToType'' φ' te' ★ >>= fun te'' =>
531 weakExprToStrongExpr Γ Δ φ ψ ξ (mkTAll te'') lev e >>= fun e' =>
532 weakTypeToType'' φ t (wtv:Kind) >>= fun t' =>
533 castExpr we "WETyApp" _ (ETyApp Γ Δ wtv (mkTAll' te'') t' ξ lev e')
534 | _ => Error ("weakTypeToType: WETyApp body with type "+++te)
537 | WECoApp e co => weakTypeOfWeakExpr e >>= fun te =>
539 | WCoFunTy t1 t2 t3 =>
540 weakTypeToType φ t1 >>= fun t1' =>
542 haskTypeOfSomeKind κ t1'' =>
543 weakTypeToType'' φ t2 κ >>= fun t2'' =>
544 weakTypeToType'' φ t3 ★ >>= fun t3'' =>
545 weakExprToStrongExpr Γ Δ φ ψ ξ (t1'' ∼∼ t2'' ⇒ τ) lev e >>= fun e' =>
546 castExpr we "WECoApp" _ e' >>= fun e'' =>
547 OK (ECoApp Γ Δ κ t1'' t2''
548 (weakCoercionToHaskCoercion _ _ _ co) τ ξ lev e'')
550 | _ => Error ("weakTypeToType: WECoApp body with type "+++te)
553 | WECoLam cv e => let (_,_,t1,t2) := cv in
554 weakTypeOfWeakExpr e >>= fun te =>
555 weakTypeToType'' φ te ★ >>= fun te' =>
556 weakTypeToType'' φ t1 cv >>= fun t1' =>
557 weakTypeToType'' φ t2 cv >>= fun t2' =>
558 weakExprToStrongExpr Γ (_ :: Δ) φ (weakψ ψ) ξ te' lev e >>= fun e' =>
559 castExpr we "WECoLam" _ (ECoLam Γ Δ cv te' t1' t2' ξ lev e')
561 | WECast e co => let (t1,t2) := weakCoercionTypes co in
562 weakTypeToType'' φ t1 ★ >>= fun t1' =>
563 weakTypeToType'' φ t2 ★ >>= fun t2' =>
564 weakExprToStrongExpr Γ Δ φ ψ ξ t1' lev e >>= fun e' =>
565 castExpr we "WECast" _
566 (ECast Γ Δ ξ t1' t2' (weakCoercionToHaskCoercion _ _ _ co) lev e')
569 let ξ' := update_ξ ξ (map (fun x => ((fst x),(snd x @@ lev))) _)
571 (fix binds (t:Tree ??(WeakExprVar * WeakExpr))
572 : ???(ELetRecBindings Γ Δ ξ' lev (varsTypes t φ)) :=
574 | T_Leaf None => let case_nil := tt in OK (ELR_nil _ _ _ _)
575 | T_Leaf (Some (wev,e)) => let case_some := tt in (fun e' => _) (fun τ => weakExprToStrongExpr Γ Δ φ ψ ξ' τ lev e)
577 binds b1 >>= fun b1' =>
578 binds b2 >>= fun b2' =>
579 OK (ELR_branch Γ Δ ξ' lev _ _ b1' b2')
581 in binds >>= fun binds' =>
582 weakExprToStrongExpr Γ Δ φ ψ ξ' τ lev e >>= fun e' =>
583 OK (ELetRec Γ Δ ξ lev τ _ binds' e')
585 | WECase vscrut ve tbranches tc avars alts =>
586 weakTypeToType'' φ (vscrut:WeakType) ★ >>= fun tv =>
587 weakExprToStrongExpr Γ Δ φ ψ ξ tv lev ve >>= fun ve' =>
588 let ξ' := update_ξ ξ (((vscrut:CoreVar),tv@@lev)::nil) in
589 mkAvars avars (tyConKind tc) φ >>= fun avars' =>
590 weakTypeToType'' φ tbranches ★ >>= fun tbranches' =>
591 (fix mkTree (t:Tree ??(AltCon*list WeakTypeVar*list WeakCoerVar*list WeakExprVar*WeakExpr)) : ???(Tree
592 ??{scb : StrongCaseBranchWithVVs CoreVar CoreVarEqDecidable tc avars' &
593 Expr (sac_Γ scb Γ) (sac_Δ scb Γ avars' (weakCK'' Δ))(scbwv_ξ scb ξ' lev)(weakLT' (tbranches' @@ lev))}) :=
595 | T_Leaf None => OK []
596 | T_Leaf (Some (ac,extyvars,coervars,exprvars,ebranch)) =>
597 mkStrongAltConPlusJunk' tc ac >>= fun sac =>
598 list2vecOrFail (map (fun ev:WeakExprVar => ev:CoreVar) exprvars) _ (fun _ _ => "WECase")
600 let scb := @Build_StrongCaseBranchWithVVs CoreVar CoreVarEqDecidable tc Γ avars' sac exprvars' in
601 weakExprToStrongExpr (sac_Γ scb Γ) (sac_Δ scb Γ avars' (weakCK'' Δ)) (sacpj_φ sac _ φ)
602 (sacpj_ψ sac _ _ avars' ψ)
603 (scbwv_ξ scb ξ' lev) (weakT' tbranches') (weakL' lev) ebranch >>= fun ebranch' =>
604 let case_case := tt in OK [ _ ]
606 mkTree b1 >>= fun b1' =>
607 mkTree b2 >>= fun b2' =>
609 end) alts >>= fun tree =>
610 castExpr we "ECaseScrut" _ (EVar Γ Δ ξ' vscrut) >>= fun escrut =>
611 castExpr we "ECase" _ (ECase Γ Δ ξ' lev tc tbranches' avars' escrut tree)
612 >>= fun ecase' => OK (ELet _ _ _ tv _ lev (vscrut:CoreVar) ve' ecase')
619 apply (addErrorMessage "case_some").
621 destruct (weakTypeToType'' φ wev ★); try apply (Error error_message).
622 matchThings h (unlev (ξ' wev)) "LetRec".
624 rewrite matchTypeVars_pf.
625 clear matchTypeVars_pf.
626 set (e' (unlev (ξ' (weakExprVar c w)))) as e''.
627 destruct e''; try apply (Error error_message).