1 (*********************************************************************************************************************************)
4 (* The Flattening Functor. *)
6 (*********************************************************************************************************************************)
8 Generalizable All Variables.
9 Require Import Preamble.
10 Require Import General.
11 Require Import NaturalDeduction.
12 Require Import Coq.Strings.String.
13 Require Import Coq.Lists.List.
15 Require Import HaskKinds.
16 Require Import HaskCoreTypes.
17 Require Import HaskCoreVars.
18 Require Import HaskWeakTypes.
19 Require Import HaskWeakVars.
20 Require Import HaskLiterals.
21 Require Import HaskTyCons.
22 Require Import HaskStrongTypes.
23 Require Import HaskProof.
24 Require Import NaturalDeduction.
26 Require Import HaskStrongTypes.
27 Require Import HaskStrong.
28 Require Import HaskProof.
29 Require Import HaskStrongToProof.
30 Require Import HaskProofToStrong.
31 Require Import HaskWeakToStrong.
33 Require Import HaskSkolemizer.
36 Set Printing Width 130.
39 * The flattening transformation. Currently only TWO-level languages are
40 * supported, and the level-1 sublanguage is rather limited.
42 * This file abuses terminology pretty badly. For purposes of this file,
43 * "PCF" means "the level-1 sublanguage" and "FC" (aka System FC) means
44 * the whole language (level-0 language including bracketed level-1 terms)
46 Section HaskFlattener.
48 Definition getlev {Γ}{κ}(lht:LeveledHaskType Γ κ) : HaskLevel Γ :=
49 match lht with t @@ l => l end.
52 forall {T} (Σ:Tree ??T) (f:T -> bool),
53 Arrange Σ (dropT (mkFlags (liftBoolFunc false f) Σ),,( (dropT (mkFlags (liftBoolFunc false (bnot ○ f)) Σ)))).
59 destruct (f t); simpl.
65 eapply RComp; [ idtac | apply arrangeSwapMiddle ].
74 forall {T} (Σ:Tree ??T) (f:T -> bool),
75 Arrange (dropT (mkFlags (liftBoolFunc false f) Σ),,( (dropT (mkFlags (liftBoolFunc false (bnot ○ f)) Σ)))) Σ.
81 destruct (f t); simpl.
87 eapply RComp; [ apply arrangeSwapMiddle | idtac ].
97 | [ |- context[@eqd_dec ?T ?V ?X ?X] ] =>
98 destruct (@eqd_dec T V X X) as [eqd_dec1 | eqd_dec2];
99 [ clear eqd_dec1 | set (eqd_dec2 (refl_equal _)) as eqd_dec2'; inversion eqd_dec2' ]
102 Definition v2t {Γ}(ec:HaskTyVar Γ ECKind) : HaskType Γ ECKind := fun TV ite => TVar (ec TV ite).
104 Definition levelMatch {Γ}(lev:HaskLevel Γ) : LeveledHaskType Γ ★ -> bool :=
105 fun t => match t with ttype@@tlev => if eqd_dec tlev lev then true else false end.
107 (* In a tree of types, replace any type at depth "lev" or greater None *)
108 Definition mkDropFlags {Γ}(lev:HaskLevel Γ)(tt:Tree ??(LeveledHaskType Γ ★)) : TreeFlags tt :=
109 mkFlags (liftBoolFunc false (levelMatch lev)) tt.
111 Definition drop_lev {Γ}(lev:HaskLevel Γ)(tt:Tree ??(LeveledHaskType Γ ★)) : Tree ??(LeveledHaskType Γ ★) :=
112 dropT (mkDropFlags lev tt).
114 (* The opposite: replace any type which is NOT at level "lev" with None *)
115 Definition mkTakeFlags {Γ}(lev:HaskLevel Γ)(tt:Tree ??(LeveledHaskType Γ ★)) : TreeFlags tt :=
116 mkFlags (liftBoolFunc true (bnot ○ levelMatch lev)) tt.
118 Definition take_lev {Γ}(lev:HaskLevel Γ)(tt:Tree ??(LeveledHaskType Γ ★)) : Tree ??(LeveledHaskType Γ ★) :=
119 dropT (mkTakeFlags lev tt).
121 mapOptionTree (fun x => flatten_type (unlev x))
122 (maybeTree (takeT tt (mkFlags (
123 fun t => match t with
124 | Some (ttype @@ tlev) => if eqd_dec tlev lev then true else false
129 Definition maybeTree {T}(t:??(Tree ??T)) : Tree ??T :=
136 Lemma drop_lev_lemma : forall Γ (lev:HaskLevel Γ) x, drop_lev lev [x @@ lev] = [].
148 Lemma drop_lev_lemma_s : forall Γ (lev:HaskLevel Γ) ec x, drop_lev (ec::lev) [x @@ (ec :: lev)] = [].
159 Lemma take_lemma : forall Γ (lev:HaskLevel Γ) x, take_lev lev [x @@ lev] = [x @@ lev].
170 Lemma take_lemma' : forall Γ (lev:HaskLevel Γ) x, take_lev lev (x @@@ lev) = x @@@ lev.
173 destruct a; simpl; try reflexivity.
176 rewrite <- IHx1 at 2.
177 rewrite <- IHx2 at 2.
181 Lemma drop_lev_lemma' : forall Γ (lev:HaskLevel Γ) x, drop_lev lev (x @@@ lev) = [].
184 destruct a; simpl; try reflexivity.
185 apply drop_lev_lemma.
187 change (@drop_lev _ lev (x1 @@@ lev ,, x2 @@@ lev))
188 with ((@drop_lev _ lev (x1 @@@ lev)) ,, (@drop_lev _ lev (x2 @@@ lev))).
195 Ltac drop_simplify :=
197 | [ |- context[@drop_lev ?G ?L [ ?X @@ ?L ] ] ] =>
198 rewrite (drop_lev_lemma G L X)
200 | [ |- context[@drop_lev ?G ?L [ ?X @@@ ?L ] ] ] =>
201 rewrite (drop_lev_lemma' G L X)
203 | [ |- context[@drop_lev ?G (?E :: ?L) [ ?X @@ (?E :: ?L) ] ] ] =>
204 rewrite (drop_lev_lemma_s G L E X)
205 | [ |- context[@drop_lev ?G ?N (?A,,?B)] ] =>
206 change (@drop_lev G N (A,,B)) with ((@drop_lev G N A),,(@drop_lev G N B))
207 | [ |- context[@drop_lev ?G ?N (T_Leaf None)] ] =>
208 change (@drop_lev G N (T_Leaf (@None (LeveledHaskType G ★)))) with (T_Leaf (@None (LeveledHaskType G ★)))
211 Ltac take_simplify :=
213 | [ |- context[@take_lev ?G ?L [ ?X @@ ?L ] ] ] =>
214 rewrite (take_lemma G L X)
215 | [ |- context[@take_lev ?G ?L [ ?X @@@ ?L ] ] ] =>
216 rewrite (take_lemma' G L X)
217 | [ |- context[@take_lev ?G ?N (?A,,?B)] ] =>
218 change (@take_lev G N (A,,B)) with ((@take_lev G N A),,(@take_lev G N B))
219 | [ |- context[@take_lev ?G ?N (T_Leaf None)] ] =>
220 change (@take_lev G N (T_Leaf (@None (LeveledHaskType G ★)))) with (T_Leaf (@None (LeveledHaskType G ★)))
224 (*******************************************************************************)
227 Context (hetmet_flatten : WeakExprVar).
228 Context (hetmet_unflatten : WeakExprVar).
229 Context (hetmet_id : WeakExprVar).
230 Context {unitTy : forall TV, RawHaskType TV ECKind -> RawHaskType TV ★ }.
231 Context {prodTy : forall TV, RawHaskType TV ECKind -> RawHaskType TV ★ -> RawHaskType TV ★ -> RawHaskType TV ★ }.
232 Context {gaTy : forall TV, RawHaskType TV ECKind -> RawHaskType TV ★ -> RawHaskType TV ★ -> RawHaskType TV ★ }.
234 Definition ga_mk_tree' {TV}(ec:RawHaskType TV ECKind)(tr:Tree ??(RawHaskType TV ★)) : RawHaskType TV ★ :=
235 reduceTree (unitTy TV ec) (prodTy TV ec) tr.
237 Definition ga_mk_tree {Γ}(ec:HaskType Γ ECKind)(tr:Tree ??(HaskType Γ ★)) : HaskType Γ ★ :=
238 fun TV ite => ga_mk_tree' (ec TV ite) (mapOptionTree (fun x => x TV ite) tr).
240 Definition ga_mk_raw {TV}(ec:RawHaskType TV ECKind)(ant suc:Tree ??(RawHaskType TV ★)) : RawHaskType TV ★ :=
243 (ga_mk_tree' ec suc).
245 Definition ga_mk {Γ}(ec:HaskType Γ ECKind)(ant suc:Tree ??(HaskType Γ ★)) : HaskType Γ ★ :=
246 fun TV ite => gaTy TV (ec TV ite) (ga_mk_tree ec ant TV ite) (ga_mk_tree ec suc TV ite).
250 * - code types <[t]>@c become garrows c () t
251 * - free variables of type t at a level lev deeper than the succedent become garrows c () t
252 * - free variables at the level of the succedent become
254 Fixpoint flatten_rawtype {TV}{κ}(exp: RawHaskType TV κ) : RawHaskType TV κ :=
257 | TAll _ y => TAll _ (fun v => flatten_rawtype (y v))
258 | TApp _ _ x y => TApp (flatten_rawtype x) (flatten_rawtype y)
260 | TCoerc _ t1 t2 t => TCoerc (flatten_rawtype t1) (flatten_rawtype t2) (flatten_rawtype t)
262 | TCode ec e => let e' := flatten_rawtype e
263 in ga_mk_raw ec (unleaves_ (take_arg_types e')) [drop_arg_types e']
264 | TyFunApp tfc kl k lt => TyFunApp tfc kl k (flatten_rawtype_list _ lt)
266 with flatten_rawtype_list {TV}(lk:list Kind)(exp:@RawHaskTypeList TV lk) : @RawHaskTypeList TV lk :=
267 match exp in @RawHaskTypeList _ LK return @RawHaskTypeList TV LK with
268 | TyFunApp_nil => TyFunApp_nil
269 | TyFunApp_cons κ kl t rest => TyFunApp_cons _ _ (flatten_rawtype t) (flatten_rawtype_list _ rest)
272 Definition flatten_type {Γ}{κ}(ht:HaskType Γ κ) : HaskType Γ κ :=
273 fun TV ite => flatten_rawtype (ht TV ite).
275 Fixpoint levels_to_tcode {Γ}(ht:HaskType Γ ★)(lev:HaskLevel Γ) : HaskType Γ ★ :=
277 | nil => flatten_type ht
278 | ec::lev' => @ga_mk _ (v2t ec) [] [levels_to_tcode ht lev']
281 Definition flatten_leveled_type {Γ}(ht:LeveledHaskType Γ ★) : LeveledHaskType Γ ★ :=
282 levels_to_tcode (unlev ht) (getlev ht) @@ nil.
286 Axiom literal_types_unchanged : forall Γ l, flatten_type (literalType l) = literalType(Γ:=Γ) l.
288 Axiom flatten_coercion : forall Γ Δ κ (σ τ:HaskType Γ κ) (γ:HaskCoercion Γ Δ (σ ∼∼∼ τ)),
289 HaskCoercion Γ Δ (flatten_type σ ∼∼∼ flatten_type τ).
291 Axiom flatten_commutes_with_substT :
292 forall κ Γ (Δ:CoercionEnv Γ) (σ:∀ TV, InstantiatedTypeEnv TV Γ → TV κ → RawHaskType TV ★) (τ:HaskType Γ κ),
293 flatten_type (substT σ τ) = substT (fun TV ite v => flatten_rawtype (σ TV ite v))
296 Axiom flatten_commutes_with_HaskTAll :
297 forall κ Γ (Δ:CoercionEnv Γ) (σ:∀ TV, InstantiatedTypeEnv TV Γ → TV κ → RawHaskType TV ★),
298 flatten_type (HaskTAll κ σ) = HaskTAll κ (fun TV ite v => flatten_rawtype (σ TV ite v)).
300 Axiom flatten_commutes_with_HaskTApp :
301 forall κ Γ (Δ:CoercionEnv Γ) (σ:∀ TV, InstantiatedTypeEnv TV Γ → TV κ → RawHaskType TV ★),
302 flatten_type (HaskTApp (weakF σ) (FreshHaskTyVar κ)) =
303 HaskTApp (weakF (fun TV ite v => flatten_rawtype (σ TV ite v))) (FreshHaskTyVar κ).
305 Axiom flatten_commutes_with_weakLT : forall (Γ:TypeEnv) κ t,
306 flatten_leveled_type (weakLT(Γ:=Γ)(κ:=κ) t) = weakLT(Γ:=Γ)(κ:=κ) (flatten_leveled_type t).
308 Axiom globals_do_not_have_code_types : forall (Γ:TypeEnv) (g:Global Γ) v,
309 flatten_type (g v) = g v.
311 (* "n" is the maximum depth remaining AFTER flattening *)
312 Definition flatten_judgment (j:Judg) :=
313 match j as J return Judg with
314 | Γ > Δ > ant |- suc @ nil => Γ > Δ > mapOptionTree flatten_leveled_type ant
315 |- mapOptionTree flatten_type suc @ nil
316 | Γ > Δ > ant |- suc @ (ec::lev') => Γ > Δ > mapOptionTree flatten_leveled_type (drop_lev (ec::lev') ant)
318 (mapOptionTree (flatten_type ○ unlev) (take_lev (ec::lev') ant))
319 (mapOptionTree flatten_type suc )
324 { ga_id : ∀ Γ Δ ec l a , ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec a a ]@l ]
325 ; ga_cancelr : ∀ Γ Δ ec l a , ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec (a,,[]) a ]@l ]
326 ; ga_cancell : ∀ Γ Δ ec l a , ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec ([],,a) a ]@l ]
327 ; ga_uncancelr : ∀ Γ Δ ec l a , ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec a (a,,[]) ]@l ]
328 ; ga_uncancell : ∀ Γ Δ ec l a , ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec a ([],,a) ]@l ]
329 ; ga_assoc : ∀ Γ Δ ec l a b c, ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec ((a,,b),,c) (a,,(b,,c)) ]@l ]
330 ; ga_unassoc : ∀ Γ Δ ec l a b c, ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec (a,,(b,,c)) ((a,,b),,c) ]@l ]
331 ; ga_swap : ∀ Γ Δ ec l a b , ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec (a,,b) (b,,a) ]@l ]
332 ; ga_drop : ∀ Γ Δ ec l a , ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec a [] ]@l ]
333 ; ga_copy : ∀ Γ Δ ec l a , ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec a (a,,a) ]@l ]
334 ; ga_first : ∀ Γ Δ ec l a b x, ND Rule [] [Γ > Δ > [@ga_mk Γ ec a b @@l] |- [@ga_mk Γ ec (a,,x) (b,,x) ]@l ]
335 ; ga_second : ∀ Γ Δ ec l a b x, ND Rule [] [Γ > Δ > [@ga_mk Γ ec a b @@l] |- [@ga_mk Γ ec (x,,a) (x,,b) ]@l ]
336 ; ga_lit : ∀ Γ Δ ec l lit , ND Rule [] [Γ > Δ > [] |- [@ga_mk Γ ec [] [literalType lit] ]@l ]
337 ; ga_curry : ∀ Γ Δ ec l a b c, ND Rule [] [Γ > Δ > [@ga_mk Γ ec (a,,[b]) [c] @@ l] |- [@ga_mk Γ ec a [b ---> c] ]@ l ]
338 ; ga_comp : ∀ Γ Δ ec l a b c, ND Rule [] [Γ > Δ > [@ga_mk Γ ec a b @@ l],,[@ga_mk Γ ec b c @@ l] |- [@ga_mk Γ ec a c ]@l ]
339 ; ga_apply : ∀ Γ Δ ec l a a' b c,
340 ND Rule [] [Γ > Δ > [@ga_mk Γ ec a [b ---> c] @@ l],,[@ga_mk Γ ec a' [b] @@ l] |- [@ga_mk Γ ec (a,,a') [c] ]@l ]
341 ; ga_kappa : ∀ Γ Δ ec l a b Σ, ND Rule
342 [Γ > Δ > Σ,,[@ga_mk Γ ec [] a @@ l] |- [@ga_mk Γ ec [] b ]@l ]
343 [Γ > Δ > Σ |- [@ga_mk Γ ec a b ]@l ]
345 Context `(gar:garrow).
347 Notation "a ~~~~> b" := (@ga_mk _ _ a b) (at level 20).
349 Definition boost : forall Γ Δ ant x y {lev},
350 ND Rule [] [ Γ > Δ > [x@@lev] |- [y]@lev ] ->
351 ND Rule [ Γ > Δ > ant |- [x]@lev ] [ Γ > Δ > ant |- [y]@lev ].
353 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RCanR ].
354 eapply nd_comp; [ idtac | eapply nd_rule; apply RLet ].
355 eapply nd_comp; [ apply nd_rlecnac | idtac ].
365 Definition precompose Γ Δ ec : forall a x y z lev,
367 [ Γ > Δ > a |- [@ga_mk _ ec y z ]@lev ]
368 [ Γ > Δ > a,,[@ga_mk _ ec x y @@ lev] |- [@ga_mk _ ec x z ]@lev ].
370 eapply nd_comp; [ idtac | eapply nd_rule; eapply RLet ].
371 eapply nd_comp; [ apply nd_rlecnac | idtac ].
374 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RExch ].
378 Definition precompose' Γ Δ ec : forall a b x y z lev,
380 [ Γ > Δ > a,,b |- [@ga_mk _ ec y z ]@lev ]
381 [ Γ > Δ > a,,([@ga_mk _ ec x y @@ lev],,b) |- [@ga_mk _ ec x z ]@lev ].
383 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RLeft; eapply RExch ].
384 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RCossa ].
388 Definition postcompose_ Γ Δ ec : forall a x y z lev,
390 [ Γ > Δ > a |- [@ga_mk _ ec x y ]@lev ]
391 [ Γ > Δ > a,,[@ga_mk _ ec y z @@ lev] |- [@ga_mk _ ec x z ]@lev ].
393 eapply nd_comp; [ idtac | eapply nd_rule; eapply RLet ].
394 eapply nd_comp; [ apply nd_rlecnac | idtac ].
400 Definition postcompose Γ Δ ec : forall x y z lev,
401 ND Rule [] [ Γ > Δ > [] |- [@ga_mk _ ec x y ]@lev ] ->
402 ND Rule [] [ Γ > Δ > [@ga_mk _ ec y z @@ lev] |- [@ga_mk _ ec x z ]@lev ].
404 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RCanL ].
405 eapply nd_comp; [ idtac | eapply postcompose_ ].
409 Definition first_nd : ∀ Γ Δ ec lev a b c Σ,
410 ND Rule [ Γ > Δ > Σ |- [@ga_mk Γ ec a b ]@lev ]
411 [ Γ > Δ > Σ |- [@ga_mk Γ ec (a,,c) (b,,c) ]@lev ].
413 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RCanR ].
414 eapply nd_comp; [ idtac | eapply nd_rule; apply RLet ].
415 eapply nd_comp; [ apply nd_rlecnac | idtac ].
418 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RuCanR ].
422 Definition firstify : ∀ Γ Δ ec lev a b c Σ,
423 ND Rule [] [ Γ > Δ > Σ |- [@ga_mk Γ ec a b ]@lev ] ->
424 ND Rule [] [ Γ > Δ > Σ |- [@ga_mk Γ ec (a,,c) (b,,c) ]@lev ].
431 Definition second_nd : ∀ Γ Δ ec lev a b c Σ,
433 [ Γ > Δ > Σ |- [@ga_mk Γ ec a b ]@lev ]
434 [ Γ > Δ > Σ |- [@ga_mk Γ ec (c,,a) (c,,b) ]@lev ].
436 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RCanR ].
437 eapply nd_comp; [ idtac | eapply nd_rule; apply RLet ].
438 eapply nd_comp; [ apply nd_rlecnac | idtac ].
441 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RuCanR ].
445 Definition secondify : ∀ Γ Δ ec lev a b c Σ,
446 ND Rule [] [ Γ > Δ > Σ |- [@ga_mk Γ ec a b ]@lev ] ->
447 ND Rule [] [ Γ > Δ > Σ |- [@ga_mk Γ ec (c,,a) (c,,b) ]@lev ].
454 Lemma ga_unkappa : ∀ Γ Δ ec l a b Σ x,
456 [Γ > Δ > Σ |- [@ga_mk Γ ec (a,,x) b ]@l ]
457 [Γ > Δ > Σ,,[@ga_mk Γ ec [] a @@ l] |- [@ga_mk Γ ec x b ]@l ].
459 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RExch ].
460 eapply nd_comp; [ idtac | eapply nd_rule; eapply RLet ].
461 eapply nd_comp; [ apply nd_llecnac | idtac ].
465 eapply nd_comp; [ idtac | eapply nd_rule; eapply RLet ].
466 eapply nd_comp; [ apply nd_llecnac | idtac ].
470 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RExch ].
474 (* useful for cutting down on the pretty-printed noise
476 Notation "` x" := (take_lev _ x) (at level 20).
477 Notation "`` x" := (mapOptionTree unlev x) (at level 20).
478 Notation "``` x" := (drop_lev _ x) (at level 20).
480 Definition flatten_arrangement' :
481 forall Γ (Δ:CoercionEnv Γ)
482 (ec:HaskTyVar Γ ECKind) (lev:HaskLevel Γ) (ant1 ant2:Tree ??(LeveledHaskType Γ ★)) (r:Arrange ant1 ant2),
483 ND Rule [] [Γ > Δ > [] |- [@ga_mk _ (v2t ec) (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) ant2))
484 (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) ant1)) ]@nil ].
487 refine (fix flatten ant1 ant2 (r:Arrange ant1 ant2):
488 ND Rule [] [Γ > Δ > [] |- [@ga_mk _ (v2t ec)
489 (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) ant2))
490 (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) ant1)) ]@nil] :=
491 match r as R in Arrange A B return
492 ND Rule [] [Γ > Δ > [] |- [@ga_mk _ (v2t ec)
493 (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) B))
494 (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) A)) ]@nil]
496 | RId a => let case_RId := tt in ga_id _ _ _ _ _
497 | RCanL a => let case_RCanL := tt in ga_uncancell _ _ _ _ _
498 | RCanR a => let case_RCanR := tt in ga_uncancelr _ _ _ _ _
499 | RuCanL a => let case_RuCanL := tt in ga_cancell _ _ _ _ _
500 | RuCanR a => let case_RuCanR := tt in ga_cancelr _ _ _ _ _
501 | RAssoc a b c => let case_RAssoc := tt in ga_assoc _ _ _ _ _ _ _
502 | RCossa a b c => let case_RCossa := tt in ga_unassoc _ _ _ _ _ _ _
503 | RExch a b => let case_RExch := tt in ga_swap _ _ _ _ _ _
504 | RWeak a => let case_RWeak := tt in ga_drop _ _ _ _ _
505 | RCont a => let case_RCont := tt in ga_copy _ _ _ _ _
506 | RLeft a b c r' => let case_RLeft := tt in flatten _ _ r' ;; boost _ _ _ _ _ (ga_second _ _ _ _ _ _ _)
507 | RRight a b c r' => let case_RRight := tt in flatten _ _ r' ;; boost _ _ _ _ _ (ga_first _ _ _ _ _ _ _)
508 | RComp c b a r1 r2 => let case_RComp := tt in (fun r1' r2' => _) (flatten _ _ r1) (flatten _ _ r2)
509 end); clear flatten; repeat take_simplify; repeat drop_simplify; intros.
512 set (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) a)) as a' in *.
513 set (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) b)) as b' in *.
514 set (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) c)) as c' in *.
515 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; apply RCanL ].
516 eapply nd_comp; [ idtac | eapply nd_rule; apply
517 (@RLet Γ Δ [] [] (@ga_mk _ (v2t ec) a' b') (@ga_mk _ (v2t ec) a' c')) ].
518 eapply nd_comp; [ apply nd_llecnac | idtac ].
521 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; apply RuCanR ].
522 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; apply RCanL ].
523 eapply nd_comp; [ idtac | eapply nd_rule; apply RLet ].
524 eapply nd_comp; [ apply nd_llecnac | idtac ].
527 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RExch ].
531 Definition flatten_arrangement :
532 forall Γ (Δ:CoercionEnv Γ) n
533 (ec:HaskTyVar Γ ECKind) (lev:HaskLevel Γ) (ant1 ant2:Tree ??(LeveledHaskType Γ ★)) (r:Arrange ant1 ant2) succ,
535 [Γ > Δ > mapOptionTree (flatten_leveled_type ) (drop_lev n ant1)
536 |- [@ga_mk _ (v2t ec)
537 (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) ant1))
538 (mapOptionTree (flatten_type ) succ) ]@nil]
539 [Γ > Δ > mapOptionTree (flatten_leveled_type ) (drop_lev n ant2)
540 |- [@ga_mk _ (v2t ec)
541 (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) ant2))
542 (mapOptionTree (flatten_type ) succ) ]@nil].
544 refine ( _ ;; (boost _ _ _ _ _ (postcompose _ _ _ _ _ _ _ (flatten_arrangement' Γ Δ ec lev ant1 ant2 r)))).
547 refine ((fix flatten ant1 ant2 (r:Arrange ant1 ant2) :=
548 match r as R in Arrange A B return
549 Arrange (mapOptionTree (flatten_leveled_type ) (drop_lev _ A))
550 (mapOptionTree (flatten_leveled_type ) (drop_lev _ B)) with
551 | RId a => let case_RId := tt in RId _
552 | RCanL a => let case_RCanL := tt in RCanL _
553 | RCanR a => let case_RCanR := tt in RCanR _
554 | RuCanL a => let case_RuCanL := tt in RuCanL _
555 | RuCanR a => let case_RuCanR := tt in RuCanR _
556 | RAssoc a b c => let case_RAssoc := tt in RAssoc _ _ _
557 | RCossa a b c => let case_RCossa := tt in RCossa _ _ _
558 | RExch a b => let case_RExch := tt in RExch _ _
559 | RWeak a => let case_RWeak := tt in RWeak _
560 | RCont a => let case_RCont := tt in RCont _
561 | RLeft a b c r' => let case_RLeft := tt in RLeft _ (flatten _ _ r')
562 | RRight a b c r' => let case_RRight := tt in RRight _ (flatten _ _ r')
563 | RComp a b c r1 r2 => let case_RComp := tt in RComp (flatten _ _ r1) (flatten _ _ r2)
564 end) ant1 ant2 r); clear flatten; repeat take_simplify; repeat drop_simplify; intros.
567 Definition flatten_arrangement'' :
568 forall Γ Δ ant1 ant2 succ l (r:Arrange ant1 ant2),
569 ND Rule (mapOptionTree (flatten_judgment ) [Γ > Δ > ant1 |- succ @ l])
570 (mapOptionTree (flatten_judgment ) [Γ > Δ > ant2 |- succ @ l]).
584 apply RExch. (* TO DO: check for all-leaf trees here *)
589 eapply RComp; [ apply IHr1 | apply IHr2 ].
591 apply flatten_arrangement.
595 Definition ga_join Γ Δ Σ₁ Σ₂ a b ec :
596 ND Rule [] [Γ > Δ > Σ₁ |- [@ga_mk _ ec [] a ]@nil] ->
597 ND Rule [] [Γ > Δ > Σ₂ |- [@ga_mk _ ec [] b ]@nil] ->
598 ND Rule [] [Γ > Δ > Σ₁,,Σ₂ |- [@ga_mk _ ec [] (a,,b) ]@nil].
601 apply secondify with (c:=a) in pfb.
602 apply firstify with (c:=[]) in pfa.
603 eapply nd_comp; [ idtac | eapply nd_rule; eapply RLet ].
604 eapply nd_comp; [ eapply nd_llecnac | idtac ].
609 eapply nd_comp; [ idtac | eapply nd_rule; eapply RLet ].
610 eapply nd_comp; [ apply nd_llecnac | idtac ].
612 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RCanL ].
613 eapply nd_comp; [ idtac | eapply postcompose_ ].
616 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RExch ].
617 eapply nd_comp; [ idtac | eapply precompose ].
621 Definition arrange_brak : forall Γ Δ ec succ t,
624 [(@ga_mk _ (v2t ec) [] (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: nil) succ))) @@ nil],,
625 mapOptionTree (flatten_leveled_type ) (drop_lev (ec :: nil) succ) |- [t]@nil]
626 [Γ > Δ > mapOptionTree (flatten_leveled_type ) succ |- [t]@nil].
630 set (@arrange' _ succ (levelMatch (ec::nil))) as q.
631 set (arrangeMap _ _ flatten_leveled_type q) as y.
639 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RExch ].
641 eapply nd_comp; [ apply nd_llecnac | idtac ].
642 eapply nd_comp; [ idtac | eapply nd_rule; eapply RLet ].
647 induction succ; try destruct a; simpl.
653 destruct l as [t' lev'].
654 destruct lev' as [|ec' lev'].
658 set (@eqd_dec (HaskLevel Γ) (haskLevelEqDecidable Γ) (ec' :: lev') (ec :: nil)) as q.
663 unfold flatten_leveled_type.
680 Definition arrange_empty_tree : forall {T}{A}(q:Tree A)(t:Tree ??T),
681 t = mapTree (fun _:A => None) q ->
689 destruct t; try destruct o; inversion H.
690 set (IHq1 _ H1) as x1.
691 set (IHq2 _ H2) as x2.
702 (* Definition unarrange_empty_tree : forall {T}{A}(t:Tree ??T)(q:Tree A),
703 t = mapTree (fun _:A => None) q ->
707 Definition decide_tree_empty : forall {T:Type}(t:Tree ??T),
708 sum { q:Tree unit & t = mapTree (fun _ => None) q } unit.
713 | T_Branch b1 b2 => let b1' := foo b1 in let b2' := foo b2 in _
733 Definition arrange_esc : forall Γ Δ ec succ t,
735 [Γ > Δ > mapOptionTree (flatten_leveled_type ) succ |- [t]@nil]
737 [(@ga_mk _ (v2t ec) [] (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: nil) succ))) @@ nil],,
738 mapOptionTree (flatten_leveled_type ) (drop_lev (ec :: nil) succ) |- [t]@nil].
740 set (@arrange _ succ (levelMatch (ec::nil))) as q.
741 set (@drop_lev Γ (ec::nil) succ) as q'.
742 assert (@drop_lev Γ (ec::nil) succ=q') as H.
744 unfold drop_lev in H.
745 unfold mkDropFlags in H.
748 set (arrangeMap _ _ flatten_leveled_type q) as y.
755 set (mapOptionTree flatten_leveled_type (dropT (mkFlags (liftBoolFunc false (bnot ○ levelMatch (ec :: nil))) succ))) as q.
756 destruct (decide_tree_empty q); [ idtac | apply (Prelude_error "escapifying open code not yet supported") ].
760 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; apply RExch ].
761 set (fun z z' => @RLet Γ Δ z (mapOptionTree flatten_leveled_type q') t z' nil) as q''.
762 eapply nd_comp; [ idtac | eapply nd_rule; apply RLet ].
764 eapply nd_comp; [ apply nd_rlecnac | idtac ].
768 eapply RComp; [ idtac | apply RCanR ].
770 apply (@arrange_empty_tree _ _ _ _ e).
774 eapply (@RVar Γ Δ t nil).
782 eapply decide_tree_empty.
785 set (dropT (mkFlags (liftBoolFunc false (bnot ○ levelMatch (ec :: nil))) succ)) as escapified.
786 destruct (decide_tree_empty escapified).
793 unfold mkDropFlags; simpl.
797 destruct (General.list_eq_dec h0 (ec :: nil)).
813 apply (Prelude_error "escapifying code with multi-leaf antecedents is not supported").
817 Lemma mapOptionTree_distributes
818 : forall T R (a b:Tree ??T) (f:T->R),
819 mapOptionTree f (a,,b) = (mapOptionTree f a),,(mapOptionTree f b).
823 Lemma unlev_relev : forall {Γ}(t:Tree ??(HaskType Γ ★)) lev, mapOptionTree unlev (t @@@ lev) = t.
826 destruct a; reflexivity.
827 rewrite <- IHt1 at 2.
828 rewrite <- IHt2 at 2.
832 Lemma tree_of_nothing : forall Γ ec t,
833 Arrange (mapOptionTree flatten_leveled_type (drop_lev(Γ:=Γ) (ec :: nil) (t @@@ (ec :: nil)))) [].
835 induction t; try destruct o; try destruct a.
842 eapply RComp; [ idtac | apply RCanL ].
843 eapply RComp; [ idtac | eapply RLeft; apply IHt2 ].
846 Transparent drop_lev.
853 Lemma tree_of_nothing' : forall Γ ec t,
854 Arrange [] (mapOptionTree flatten_leveled_type (drop_lev(Γ:=Γ) (ec :: nil) (t @@@ (ec :: nil)))).
856 induction t; try destruct o; try destruct a.
863 eapply RComp; [ apply RuCanL | idtac ].
864 eapply RComp; [ eapply RRight; apply IHt1 | idtac ].
867 Transparent drop_lev.
874 Lemma krunk : forall Γ (ec:HaskTyVar Γ ECKind) t,
875 flatten_type (<[ ec |- t ]>)
877 (mapOptionTree flatten_type (take_arg_types_as_tree t))
878 [ flatten_type (drop_arg_types_as_tree t)].
880 unfold flatten_type at 1.
883 apply phoas_extensionality.
888 rewrite <- mapOptionTree_compose.
889 unfold take_arg_types_as_tree.
891 replace (flatten_type (drop_arg_types_as_tree t) tv ite)
892 with (drop_arg_types (flatten_rawtype (t tv ite))).
893 replace (unleaves_ (take_arg_types (flatten_rawtype (t tv ite))))
894 with ((mapOptionTree (fun x : HaskType Γ ★ => flatten_type x tv ite)
896 (take_trustme (count_arg_types (t (fun _ : Kind => unit) (ite_unit Γ)))
897 (fun TV : Kind → Type => take_arg_types ○ t TV))))).
900 clear hetmet_flatten.
901 clear hetmet_unflatten.
909 Definition flatten_proof :
912 ND Rule (mapOptionTree (flatten_judgment ) h) (mapOptionTree (flatten_judgment ) c).
914 eapply nd_map'; [ idtac | apply X ].
920 (match X as R in SRule H C with
921 | SBrak Γ Δ t ec succ lev => let case_SBrak := tt in _
922 | SEsc Γ Δ t ec succ lev => let case_SEsc := tt in _
923 | SFlat h c r => let case_SFlat := tt in _
927 refine (match r as R in Rule H C with
928 | RArrange Γ Δ a b x l d => let case_RArrange := tt in _
929 | RNote Γ Δ Σ τ l n => let case_RNote := tt in _
930 | RLit Γ Δ l _ => let case_RLit := tt in _
931 | RVar Γ Δ σ lev => let case_RVar := tt in _
932 | RGlobal Γ Δ σ l wev => let case_RGlobal := tt in _
933 | RLam Γ Δ Σ tx te lev => let case_RLam := tt in _
934 | RCast Γ Δ Σ σ τ lev γ => let case_RCast := tt in _
935 | RAbsT Γ Δ Σ κ σ lev => let case_RAbsT := tt in _
936 | RAppT Γ Δ Σ κ σ τ lev => let case_RAppT := tt in _
937 | RAppCo Γ Δ Σ κ σ₁ σ₂ γ σ lev => let case_RAppCo := tt in _
938 | RAbsCo Γ Δ Σ κ σ σ₁ σ₂ lev => let case_RAbsCo := tt in _
939 | RApp Γ Δ Σ₁ Σ₂ tx te lev => let case_RApp := tt in _
940 | RLet Γ Δ Σ₁ Σ₂ σ₁ σ₂ lev => let case_RLet := tt in _
941 | RWhere Γ Δ Σ₁ Σ₂ Σ₃ σ₁ σ₂ lev => let case_RWhere := tt in _
942 | RJoin Γ p lri m x q l => let case_RJoin := tt in _
943 | RVoid _ _ l => let case_RVoid := tt in _
944 | RBrak Γ Δ t ec succ lev => let case_RBrak := tt in _
945 | REsc Γ Δ t ec succ lev => let case_REsc := tt in _
946 | RCase Γ Δ lev tc Σ avars tbranches alts => let case_RCase := tt in _
947 | RLetRec Γ Δ lri x y t => let case_RLetRec := tt in _
950 destruct case_RArrange.
951 apply (flatten_arrangement'' Γ Δ a b x _ d).
954 apply (Prelude_error "found unskolemized Brak rule; this shouldn't happen").
957 apply (Prelude_error "found unskolemized Esc rule; this shouldn't happen").
962 apply nd_rule; apply RNote; auto.
963 apply nd_rule; apply RNote; auto.
968 unfold flatten_leveled_type.
970 rewrite literal_types_unchanged.
971 apply nd_rule; apply RLit.
972 unfold take_lev; simpl.
973 unfold drop_lev; simpl.
975 rewrite literal_types_unchanged.
979 Opaque flatten_judgment.
981 Transparent flatten_judgment.
983 unfold flatten_judgment.
985 apply nd_rule. apply RVar.
986 repeat drop_simplify.
987 repeat take_simplify.
991 destruct case_RGlobal.
995 destruct l as [|ec lev]; simpl.
996 destruct (eqd_dec (g:CoreVar) (hetmet_flatten:CoreVar)).
997 set (flatten_type (g wev)) as t.
998 set (RGlobal _ Δ nil (mkGlobal Γ t hetmet_id)) as q.
1003 destruct (eqd_dec (g:CoreVar) (hetmet_unflatten:CoreVar)).
1004 set (flatten_type (g wev)) as t.
1005 set (RGlobal _ Δ nil (mkGlobal Γ t hetmet_id)) as q.
1010 unfold flatten_leveled_type. simpl.
1011 apply nd_rule; rewrite globals_do_not_have_code_types.
1013 apply (Prelude_error "found RGlobal at depth >0; globals should never appear inside code brackets unless escaped").
1019 destruct lev as [|ec lev]; simpl; [ apply nd_rule; apply RLam; auto | idtac ].
1020 repeat drop_simplify.
1021 repeat take_simplify.
1031 destruct case_RCast.
1033 destruct lev as [|ec lev]; simpl; [ apply nd_rule; apply RCast; auto | idtac ].
1035 apply flatten_coercion; auto.
1036 apply (Prelude_error "RCast at level >0; casting inside of code brackets is currently not supported").
1038 destruct case_RJoin.
1041 [ apply nd_rule; apply RJoin | idtac ];
1042 apply (Prelude_error "RJoin at depth >0").
1047 destruct lev as [|ec lev].
1048 unfold flatten_type at 1.
1053 repeat drop_simplify.
1054 repeat take_simplify.
1055 rewrite mapOptionTree_distributes.
1056 set (mapOptionTree (flatten_leveled_type ) (drop_lev (ec :: lev) Σ₁)) as Σ₁'.
1057 set (mapOptionTree (flatten_leveled_type ) (drop_lev (ec :: lev) Σ₂)) as Σ₂'.
1058 set (take_lev (ec :: lev) Σ₁) as Σ₁''.
1059 set (take_lev (ec :: lev) Σ₂) as Σ₂''.
1060 replace (flatten_type (tx ---> te)) with ((flatten_type tx) ---> (flatten_type te)).
1061 apply (Prelude_error "FIXME: ga_apply").
1065 Notation "` x" := (take_lev _ x).
1066 Notation "`` x" := (mapOptionTree unlev x) (at level 20).
1067 Notation "``` x" := ((drop_lev _ x)) (at level 20).
1068 Notation "!<[]> x" := (flatten_type _ x) (at level 1).
1069 Notation "!<[@]> x" := (mapOptionTree flatten_leveled_type x) (at level 1).
1074 destruct lev as [|ec lev]; simpl; [ apply nd_rule; apply RLet; auto | idtac ].
1075 repeat drop_simplify.
1076 repeat take_simplify.
1079 set (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) Σ₁)) as Σ₁'.
1080 set (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) Σ₂)) as Σ₂'.
1081 set (mapOptionTree flatten_leveled_type (drop_lev (ec :: lev) Σ₁)) as Σ₁''.
1082 set (mapOptionTree flatten_leveled_type (drop_lev (ec :: lev) Σ₂)) as Σ₂''.
1085 eapply nd_prod; [ idtac | apply nd_id ].
1087 apply (ga_first _ _ _ _ _ _ Σ₂').
1089 eapply nd_comp; [ idtac | eapply nd_rule; eapply RLet ].
1092 eapply nd_comp; [ eapply nd_rule; eapply RArrange; eapply RCanL | idtac ].
1093 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RExch (* okay *)].
1096 destruct case_RWhere.
1098 destruct lev as [|ec lev]; simpl; [ apply nd_rule; apply RWhere; auto | idtac ].
1099 repeat take_simplify.
1100 repeat drop_simplify.
1103 set (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) Σ₁)) as Σ₁'.
1104 set (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) Σ₂)) as Σ₂'.
1105 set (mapOptionTree (flatten_type ○ unlev) (take_lev (ec :: lev) Σ₃)) as Σ₃'.
1106 set (mapOptionTree flatten_leveled_type (drop_lev (ec :: lev) Σ₁)) as Σ₁''.
1107 set (mapOptionTree flatten_leveled_type (drop_lev (ec :: lev) Σ₂)) as Σ₂''.
1108 set (mapOptionTree flatten_leveled_type (drop_lev (ec :: lev) Σ₃)) as Σ₃''.
1111 eapply nd_prod; [ eapply nd_id | idtac ].
1112 eapply (first_nd _ _ _ _ _ _ Σ₃').
1114 eapply nd_prod; [ eapply nd_id | idtac ].
1115 eapply (second_nd _ _ _ _ _ _ Σ₁').
1117 eapply nd_comp; [ idtac | eapply nd_rule; eapply RWhere ].
1118 apply nd_prod; [ idtac | apply nd_id ].
1119 eapply nd_comp; [ idtac | eapply precompose' ].
1125 destruct case_RVoid.
1130 apply (Prelude_error "RVoid at level >0").
1132 destruct case_RAppT.
1133 simpl. destruct lev; simpl.
1134 unfold flatten_leveled_type.
1136 rewrite flatten_commutes_with_HaskTAll.
1137 rewrite flatten_commutes_with_substT.
1142 apply (Prelude_error "found type application at level >0; this is not supported").
1144 destruct case_RAbsT.
1145 simpl. destruct lev; simpl.
1146 rewrite flatten_commutes_with_HaskTAll.
1147 rewrite flatten_commutes_with_HaskTApp.
1148 eapply nd_comp; [ idtac | eapply nd_rule; eapply RAbsT ].
1150 set (mapOptionTree (flatten_leveled_type ) (mapOptionTree (weakLT(κ:=κ)) Σ)) as a.
1151 set (mapOptionTree (weakLT(κ:=κ)) (mapOptionTree (flatten_leveled_type ) Σ)) as q'.
1159 rewrite flatten_commutes_with_weakLT.
1170 apply (Prelude_error "found type abstraction at level >0; this is not supported").
1172 destruct case_RAppCo.
1173 simpl. destruct lev; simpl.
1174 unfold flatten_type.
1178 apply flatten_coercion.
1180 apply (Prelude_error "found coercion application at level >0; this is not supported").
1182 destruct case_RAbsCo.
1183 simpl. destruct lev; simpl.
1184 unfold flatten_type.
1186 apply (Prelude_error "AbsCo not supported (FIXME)").
1187 apply (Prelude_error "found coercion abstraction at level >0; this is not supported").
1189 destruct case_RLetRec.
1191 simpl. destruct lev; simpl.
1193 set (@RLetRec Γ Δ (mapOptionTree flatten_leveled_type lri) (flatten_type x) (mapOptionTree flatten_type y) nil) as q.
1194 replace (mapOptionTree flatten_leveled_type (y @@@ nil)) with (mapOptionTree flatten_type y @@@ nil).
1196 induction y; try destruct a; auto.
1201 apply (Prelude_error "LetRec not supported inside brackets yet (FIXME)").
1203 destruct case_RCase.
1205 apply (Prelude_error "Case not supported (BIG FIXME)").
1207 destruct case_SBrak.
1211 set (drop_lev (ec :: nil) (take_arg_types_as_tree t @@@ (ec :: nil))) as empty_tree.
1213 rewrite take_lemma'.
1215 rewrite mapOptionTree_compose.
1216 rewrite mapOptionTree_compose.
1217 rewrite unlev_relev.
1218 rewrite <- mapOptionTree_compose.
1221 set (mapOptionTree flatten_leveled_type (drop_lev (ec :: nil) succ)) as succ_host.
1222 set (mapOptionTree (flatten_type ○ unlev)(take_lev (ec :: nil) succ)) as succ_guest.
1223 set (mapOptionTree flatten_type (take_arg_types_as_tree t)) as succ_args.
1225 eapply nd_comp; [ eapply nd_rule; eapply RArrange; eapply RLeft; apply tree_of_nothing | idtac ].
1226 eapply nd_comp; [ eapply nd_rule; eapply RArrange; eapply RCanR | idtac ].
1227 refine (ga_unkappa Γ Δ (v2t ec) nil _ _ _ _ ;; _).
1228 eapply nd_comp; [ idtac | eapply arrange_brak ].
1234 apply (Prelude_error "found Brak at depth >0 indicating 3-level code; only two-level code is currently supported").
1240 unfold flatten_leveled_type at 2.
1243 rewrite mapOptionTree_compose.
1247 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RLeft; apply tree_of_nothing' ].
1248 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RCanR ].
1250 rewrite take_lemma'.
1251 rewrite unlev_relev.
1252 rewrite <- mapOptionTree_compose.
1253 eapply nd_comp; [ apply (arrange_esc _ _ ec) | idtac ].
1255 set (decide_tree_empty (take_lev (ec :: nil) succ)) as q'.
1261 set (mapOptionTree flatten_leveled_type (drop_lev (ec :: nil) succ)) as succ_host.
1262 set (mapOptionTree flatten_type (take_arg_types_as_tree t)) as succ_args.
1264 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; apply RuCanR ].
1265 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; apply RuCanR ].
1266 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; apply RCanL ].
1267 eapply nd_comp; [ idtac | eapply nd_rule; eapply RLet ].
1268 eapply nd_comp; [ apply nd_llecnac | idtac ].
1269 apply nd_prod; [ idtac | eapply boost ].
1272 eapply nd_comp; [ idtac | eapply nd_rule; eapply RArrange; eapply RCanL ].
1280 refine ( _ ;; (boost _ _ _ _ _ (postcompose _ _ _ _ _ _ _ _))).
1288 refine ( _ ;; (boost _ _ _ _ _ (postcompose _ _ _ _ _ _ _ _))).
1290 refine ( _ ;; (boost _ _ _ _ _ (postcompose _ _ _ _ _ _ _ _))).
1296 (* environment has non-empty leaves *)
1297 apply (Prelude_error "ga_kappa not supported yet (BIG FIXME)").
1299 (* nesting too deep *)
1300 apply (Prelude_error "found Esc at depth >0 indicating 3-level code; only two-level code is currently supported").
1303 Definition skolemize_and_flatten_proof :
1307 (mapOptionTree (flatten_judgment ○ skolemize_judgment) h)
1308 (mapOptionTree (flatten_judgment ○ skolemize_judgment) c).
1310 rewrite mapOptionTree_compose.
1311 rewrite mapOptionTree_compose.
1312 apply flatten_proof.
1313 apply skolemize_proof.
1318 (* to do: establish some metric on judgments (max length of level of any succedent type, probably), show how to
1319 * calculate it, and show that the flattening procedure above drives it down by one *)
1322 Instance FlatteningFunctor {Γ}{Δ}{ec} : Functor (JudgmentsL (PCF Γ Δ ec)) (TypesL (SystemFCa Γ Δ)) (obact) :=
1323 { fmor := FlatteningFunctor_fmor }.
1325 Definition ReificationFunctor Γ Δ : Functor (JudgmentsL _ _ (PCF n Γ Δ)) SystemFCa' (mapOptionTree brakifyJudg).
1326 refine {| fmor := ReificationFunctor_fmor Γ Δ |}; unfold hom; unfold ob; simpl ; intros.
1328 Definition PCF_SMME (n:nat)(Γ:TypeEnv)(Δ:CoercionEnv Γ) : ProgrammingLanguageSMME.
1329 refine {| plsmme_pl := PCF n Γ Δ |}.
1332 Definition SystemFCa_SMME (n:nat)(Γ:TypeEnv)(Δ:CoercionEnv Γ) : ProgrammingLanguageSMME.
1333 refine {| plsmme_pl := SystemFCa n Γ Δ |}.
1336 Definition ReificationFunctorMonoidal n : MonoidalFunctor (JudgmentsN n) (JudgmentsN (S n)) (ReificationFunctor n).
1340 Definition PCF_SystemFCa_two_level n Γ Δ : TwoLevelLanguage (PCF_SMME n Γ Δ) (SystemFCa_SMME (S n) Γ Δ).
1343 (* ... and the retraction exists *)
1347 Implicit Arguments garrow [ ].