Require Import MonoidalCategories_ch7_8.
Require Import Coherence_ch7_8.
-Require Import FreydCategories.
-
+Require Import HaskStrongTypes.
+Require Import HaskStrong.
+Require Import HaskProof.
+Require Import HaskStrongToProof.
+Require Import HaskProofToStrong.
+Require Import ProgrammingLanguage.
Section HaskProofCategory.
+ Definition unitType {Γ} : RawHaskType Γ ★.
+ admit.
+ Defined.
+
+ Definition brakifyType {Γ} (lt:LeveledHaskType Γ ★) : LeveledHaskType (★ ::Γ) ★ :=
+ match lt with
+ t @@ l => HaskBrak (FreshHaskTyVar ★) (weakT t) @@ weakL l
+ end.
+
+ Definition brakify (j:Judg) : Judg :=
+ match j with
+ Γ > Δ > Σ |- τ =>
+ (★ ::Γ) > weakCE Δ > mapOptionTree brakifyType Σ |- mapOptionTree brakifyType τ
+ end.
+
+ (* Rules allowed in PCF; i.e. rules we know how to turn into GArrows *)
+ Section RulePCF.
+
+ Context {Γ:TypeEnv}{Δ:CoercionEnv Γ}.
+
+ (* Rule_PCF consists of the rules allowed in flat PCF: everything except
+ * AppT, AbsT, AppC, AbsC, Cast, Global, and some Case statements *)
+ Inductive Rule_PCF : forall {h}{c}, Rule h c -> Prop :=
+ | PCF_RURule : ∀ h c r , Rule_PCF (RURule Γ Δ h c r)
+ | PCF_RLit : ∀ Γ Δ Σ τ , Rule_PCF (RLit Γ Δ Σ τ )
+ | PCF_RNote : ∀ Σ τ l n , Rule_PCF (RNote Γ Δ Σ τ l n)
+ | PCF_RVar : ∀ σ l, Rule_PCF (RVar Γ Δ σ l)
+ | PCF_RLam : ∀ Σ tx te q , Rule_PCF (RLam Γ Δ Σ tx te q )
+ | PCF_RApp : ∀ Σ tx te p l, Rule_PCF (RApp Γ Δ Σ tx te p l)
+ | PCF_RLet : ∀ Σ σ₁ σ₂ p l, Rule_PCF (RLet Γ Δ Σ σ₁ σ₂ p l)
+ | PCF_RBindingGroup : ∀ q a b c d e , Rule_PCF (RBindingGroup q a b c d e)
+ | PCF_RCase : ∀ T κlen κ θ l x , Rule_PCF (RCase Γ Δ T κlen κ θ l x) (* FIXME: only for boolean and int *)
+ | Flat_REmptyGroup : ∀ q a , Rule_PCF (REmptyGroup q a)
+ | Flat_RLetRec : ∀ Γ Δ Σ₁ τ₁ τ₂ lev , Rule_PCF (RLetRec Γ Δ Σ₁ τ₁ τ₂ lev).
+
+ (* "RulePCF n" is the type of rules permitted in PCF with n-level deep nesting (so, "RulePCF 0" is flat PCF) *)
+ Inductive RulePCF : nat -> Tree ??Judg -> Tree ??Judg -> Type :=
+
+ (* any proof using only PCF rules is an n-bounded proof for any n>0 *)
+ | pcf_flat : forall n h c (r:Rule h c), Rule_PCF r -> RulePCF n h c
+
+ (* any n-bounded proof may be used as an (n+1)-bounded proof by prepending Esc and appending Brak *)
+ | pfc_nest : forall n h c, ND (RulePCF n) h c -> RulePCF (S n) (mapOptionTree brakify h) (mapOptionTree brakify c)
+ .
+ End RulePCF.
+
+ (* "RuleSystemFCa n" is the type of rules permitted in SystemFC^\alpha with n-level-deep nesting
+ * (so, "RuleSystemFCa 0" is damn close to System FC) *)
+ Inductive RuleSystemFCa : nat -> Tree ??Judg -> Tree ??Judg -> Type :=
+ | sfc_flat : forall n h c (r:Rule h c), Rule_Flat r -> RuleSystemFCa n h c
+ | sfc_nest : forall n h c Γ Δ, ND (@RulePCF Γ Δ n) h c -> RuleSystemFCa (S n) h c
+ .
+
+ Context (ndr_pcf :forall n Γ Δ, @ND_Relation _ (@RulePCF Γ Δ n)).
+ Context (ndr_systemfca:forall n, @ND_Relation _ (RuleSystemFCa n)).
+
+ (* 5.1.3 *)
+ Instance PCF n Γ Δ : @ProgrammingLanguage _ _ (mkJudg Γ Δ) (@RulePCF Γ Δ n) :=
+ { pl_eqv := _ (*@ND_Relation Judg Rule where "pf1 === pf2" := (@ndr_eqv _ _ pl_eqv _ _ pf1 pf2)*)
+ ; pl_tsr := _ (*@TreeStructuralRules Judg Rule T sequent*)
+ ; pl_sc := _ (*@SequentCalculus Judg Rule _ sequent*)
+ ; pl_subst := _ (*@CutRule Judg Rule _ sequent pl_eqv pl_sc*)
+ ; pl_sequent_join := _ (*@SequentExpansion Judg Rule T sequent pl_eqv pl_sc pl_subst*)
+ }.
+ Admitted.
+
+ (* 5.1.2 *)
+ Instance SystemFCa n Γ Δ : @ProgrammingLanguage _ _ (mkJudg Γ Δ) (RuleSystemFCa n) :=
+ { pl_eqv := _ (*@ND_Relation Judg Rule where "pf1 === pf2" := (@ndr_eqv _ _ pl_eqv _ _ pf1 pf2)*)
+ ; pl_tsr := _ (*@TreeStructuralRules Judg Rule T sequent*)
+ ; pl_sc := _ (*@SequentCalculus Judg Rule _ sequent*)
+ ; pl_subst := _ (*@CutRule Judg Rule _ sequent pl_eqv pl_sc*)
+ ; pl_sequent_join := _ (*@SequentExpansion Judg Rule T sequent pl_eqv pl_sc pl_subst*)
+ }.
+ Admitted.
+
+ Definition PCF_SMME (n:nat)(Γ:TypeEnv)(Δ:CoercionEnv Γ) : ProgrammingLanguageSMME.
+ refine {| plsmme_pl := PCF n Γ Δ |}.
+ admit.
+ Defined.
+
+ Definition SystemFCa_SMME (n:nat)(Γ:TypeEnv)(Δ:CoercionEnv Γ) : ProgrammingLanguageSMME.
+ refine {| plsmme_pl := SystemFCa n Γ Δ |}.
+ admit.
+ Defined.
+
+ (* 5.1.4 *)
+ Definition PCF_SystemFCa_two_level n Γ Δ : TwoLevelLanguage (PCF_SMME n Γ Δ) (SystemFCa_SMME (S n) Γ Δ).
+ admit.
+ Defined.
+ (* ... and the retraction exists *)
+
+ (* Any particular proof in HaskProof is only finitely large, so it uses only finitely many levels of nesting, so
+ * it falls within (SystemFCa n) for some n. This function calculates that "n" and performs the translation *)
+ (*Definition HaskProof_to_SystemFCa :
+ forall h c (pf:ND Judg h c),
+ { n:nat & h ~~{JudgmentsL SystemFCa_SMME n *)
+
+ (* for every n we have a functor from the category of (n+1)-bounded proofs to the category of n-bounded proofs *)
+ (*
+ Definition ReificationFunctor n : Functor (JudgmentsN n) (JudgmentsN (S n)) (mapOptionTree brakify).
+ refine {| fmor := fun h c (f:h~~{JudgmentsN n}~~>c) => nd_rule (br_nest _ _ _ f) |}; intros; simpl.
+ admit.
+ admit.
+ admit.
+ Defined.
+
+ Definition ReificationFunctorMonoidal n : MonoidalFunctor (JudgmentsN n) (JudgmentsN (S n)) (ReificationFunctor n).
+ admit.
+ Defined.
+
+ Definition makeTree : Tree ??(LeveledHaskType Γ ★) -> HaskType Γ ★.
+ admit.
+ Defined.
+
+ Definition flattenType n (j:JudgmentsN n) : TypesN n.
+ unfold eob_eob.
+ unfold ob in j.
+ refine (mapOptionTree _ j).
+ clear j; intro j.
+ destruct j as [ Γ' Δ' Σ τ ].
+ assert (Γ'=Γ). admit.
+ rewrite H in *.
+ clear H Γ'.
+ refine (_ @@ nil).
+ refine (HaskBrak _ ( (makeTree Σ) ---> (makeTree τ) )); intros.
+ admit.
+ Defined.
+
+ Definition FlattenFunctor_fmor n :
+ forall h c,
+ (h~~{JudgmentsN n}~~>c) ->
+ ((flattenType n h)~~{TypesN n}~~>(flattenType n c)).
+ intros.
+ unfold hom in *; simpl.
+ unfold mon_i.
+ unfold ehom.
+ unfold TypesNmor.
+
+ admit.
+ Defined.
+
+ Definition FlattenFunctor n : Functor (JudgmentsN n) (TypesN n) (flattenType n).
+ refine {| fmor := FlattenFunctor_fmor n |}; intros.
+ admit.
+ admit.
+ admit.
+ Defined.
+
+ End RulePCF.
+ Implicit Arguments Rule_PCF [ [h] [c] ].
+ Implicit Arguments BoundedRule [ ].
+
+*)
+(*
+ Definition code2garrow0 {Γ}(ec t1 t2:RawHaskType Γ ★) : RawHaskType Γ ★.
+ admit.
+ Defined.
+ Definition code2garrow Γ (ec t:RawHaskType Γ ★) :=
+ match t with
+(* | TApp ★ ★ (TApp _ ★ TArrow tx) t' => code2garrow0 ec tx t'*)
+ | _ => code2garrow0 ec unitType t
+ end.
+ Opaque code2garrow.
+ Fixpoint typeMap {TV}{κ}(ty:@RawHaskType TV κ) : @RawHaskType TV κ :=
+ match ty as TY in RawHaskType _ K return RawHaskType TV K with
+ | TCode ec t => code2garrow _ ec t
+ | TApp _ _ t1 t2 => TApp (typeMap t1) (typeMap t2)
+ | TAll _ f => TAll _ (fun tv => typeMap (f tv))
+ | TCoerc _ t1 t2 t3 => TCoerc (typeMap t1) (typeMap t2) (typeMap t3)
+ | TVar _ v => TVar v
+ | TArrow => TArrow
+ | TCon tc => TCon tc
+ | TyFunApp tf rhtl => (* FIXME *) TyFunApp tf rhtl
+ end.
+
+ Definition typeMapL {Γ}(lht:LeveledHaskType Γ ★) : LeveledHaskType Γ ★ :=
+ match lht with
+(* | t @@ nil => (fun TV ite => typeMap (t TV ite)) @@ lev*)
+ | t @@ lev => (fun TV ite => typeMap (t TV ite)) @@ lev
+ end.
+
+ Definition coMap {Γ}(ck:HaskCoercionKind Γ) :=
+ fun TV ite => match ck TV ite with
+ | mkRawCoercionKind _ t1 t2 => mkRawCoercionKind _ (typeMap t1) (typeMap t2)
+ end.
+
+ Definition flattenCoercion {Γ}{Δ}{ck}(hk:HaskCoercion Γ Δ ck) : HaskCoercion Γ (map coMap Δ) (coMap ck).
+ admit.
+ Defined.
+
+ Lemma update_typeMap Γ (lev:HaskLevel Γ) ξ v t
+ : (typeMap ○ (update_ξ ξ lev ((⟨v, t ⟩) :: nil)))
+ = ( update_ξ (typeMap ○ ξ) lev ((⟨v, typeMap_ t ⟩) :: nil)).
+ admit.
+ Qed.
+
+ Lemma foo κ Γ σ τ : typeMap_ (substT σ τ) = substT(Γ:=Γ)(κ₁:=κ) (fun TV ite => typeMap ○ σ TV ite) τ.
+ admit.
+ Qed.
+
+ Lemma lit_lemma lit Γ : typeMap_ (literalType lit) = literalType(Γ:=Γ) lit.
+ admit.
+ Qed.
+*)
+(*
+ Definition flatten : forall h c, Rule h c -> @ND Judg Rule (mapOptionTree flattenJudgment h) (mapOptionTree flattenJudgment c).
+ intros h c r.
+ refine (match r as R in Rule H C return ND Rule (mapOptionTree flattenJudgment H) (mapOptionTree flattenJudgment C) with
+ | RURule a b c d e => let case_RURule := tt in _
+ | RNote Γ Δ Σ τ l n => let case_RNote := tt in _
+ | RLit Γ Δ l _ => let case_RLit := tt in _
+ | RVar Γ Δ σ p => let case_RVar := tt in _
+ | RGlobal Γ Δ σ l wev => let case_RGlobal := tt in _
+ | RLam Γ Δ Σ tx te x => let case_RLam := tt in _
+ | RCast Γ Δ Σ σ τ γ x => let case_RCast := tt in _
+ | RAbsT Γ Δ Σ κ σ a => let case_RAbsT := tt in _
+ | RAppT Γ Δ Σ κ σ τ y => let case_RAppT := tt in _
+ | RAppCo Γ Δ Σ κ σ₁ σ₂ γ σ l => let case_RAppCo := tt in _
+ | RAbsCo Γ Δ Σ κ σ σ₁ σ₂ y => let case_RAbsCo := tt in _
+ | RApp Γ Δ Σ₁ Σ₂ tx te p => let case_RApp := tt in _
+ | RLet Γ Δ Σ₁ Σ₂ σ₁ σ₂ p => let case_RLet := tt in _
+ | RBindingGroup Γ p lri m x q => let case_RBindingGroup := tt in _
+ | REmptyGroup _ _ => let case_REmptyGroup := tt in _
+ | RBrak Σ a b c n m => let case_RBrak := tt in _
+ | REsc Σ a b c n m => let case_REsc := tt in _
+ | RCase Γ Δ lev tc Σ avars tbranches alts => let case_RCase := tt in _
+ | RLetRec Γ Δ lri x y t => let case_RLetRec := tt in _
+ end).
+
+ destruct case_RURule.
+ admit.
+
+ destruct case_RBrak.
+ simpl.
+ admit.
+
+ destruct case_REsc.
+ simpl.
+ admit.
+
+ destruct case_RNote.
+ eapply nd_rule. simpl. apply RNote; auto.
+
+ destruct case_RLit.
+ simpl.
+
+ set (@RNote Γ Δ Σ τ l) as q.
+ Defined.
+
+ Definition flatten' {h}{c} (pf:ND Rule h c) := nd_map' flattenJudgment flatten pf.
+
+
+ @ND Judgment1 Rule1 (mapOptionTree f h) (mapOptionTree f c).
+
+ refine (fix flatten : forall Γ Δ Σ τ
+ (pf:SCND Rule [] [Γ > Δ > Σ |- τ ]) :
+ SCND Rule [] [Γ > Δ > mapOptionTree typeMap Σ |- mapOptionTree typeMap τ ] :=
+ match pf as SCND _ _
+ | scnd_comp : forall ht ct c , SCND ht ct -> Rule ct [c] -> SCND ht [c]
+ | scnd_weak : forall c , SCND c []
+ | scnd_leaf : forall ht c , SCND ht [c] -> SCND ht [c]
+ | scnd_branch : forall ht c1 c2, SCND ht c1 -> SCND ht c2 -> SCND ht (c1,,c2)
+ Expr Γ Δ ξ τ -> Expr Γ (map coMap Δ) (typeMap ○ ξ) (typeMap τ).
+*)
+
+(*
+ Lemma all_lemma Γ κ σ l :
+(@typeMap (κ :: Γ)
+ (@HaskTApp (κ :: Γ) κ (@weakF Γ κ ★ σ) (@FreshHaskTyVar Γ κ) @@
+ @weakL Γ κ l)) = (@typeMap Γ (@HaskTAll Γ κ σ @@ l)).
+*)
+
+(*
+ Definition flatten : forall Γ Δ ξ τ, Expr Γ Δ ξ τ -> Expr Γ (map coMap Δ) (typeMap ○ ξ) (typeMap τ).
+ refine (fix flatten Γ' Δ' ξ' τ' (exp:Expr Γ' Δ' ξ' τ') : Expr Γ' (map coMap Δ') (typeMap ○ ξ') (typeMap τ') :=
+ match exp as E in Expr G D X T return Expr G (map coMap D) (typeMap ○ X) (typeMap T) with
+ | EGlobal Γ Δ ξ t wev => EGlobal _ _ _ _ wev
+ | EVar Γ Δ ξ ev => EVar _ _ _ ev
+ | ELit Γ Δ ξ lit lev => let case_ELit := tt in _
+ | EApp Γ Δ ξ t1 t2 lev e1 e2 => EApp _ _ _ _ _ _ (flatten _ _ _ _ e1) (flatten _ _ _ _ e2)
+ | ELam Γ Δ ξ t1 t2 lev v e => let case_ELam := tt in _
+ | ELet Γ Δ ξ tv t l ev elet ebody => let case_ELet := tt in _
+ | ELetRec Γ Δ ξ lev t tree branches ebody => let case_ELetRec := tt in _
+ | ECast Γ Δ ξ t1 t2 γ lev e => let case_ECast := tt in _
+ | ENote Γ Δ ξ t n e => ENote _ _ _ _ n (flatten _ _ _ _ e)
+ | ETyLam Γ Δ ξ κ σ l e => let case_ETyLam := tt in _
+ | ECoLam Γ Δ κ σ σ₁ σ₂ ξ l e => let case_ECoLam := tt in _
+ | ECoApp Γ Δ κ σ₁ σ₂ γ σ ξ l e => let case_ECoApp := tt in _
+ | ETyApp Γ Δ κ σ τ ξ l e => let case_ETyApp := tt in _
+ | ECase Γ Δ ξ l tc tbranches atypes e alts' => let case_ECase := tt in _
+
+ | EEsc Γ Δ ξ ec t lev e => let case_EEsc := tt in _
+ | EBrak Γ Δ ξ ec t lev e => let case_EBrak := tt in _
+ end); clear exp ξ' τ' Γ' Δ'.
+
+ destruct case_ELit.
+ simpl.
+ rewrite lit_lemma.
+ apply ELit.
+
+ destruct case_ELam.
+ set (flatten _ _ _ _ e) as q.
+ rewrite update_typeMap in q.
+ apply (@ELam _ _ _ _ _ _ _ _ v q).
+
+ destruct case_ELet.
+ set (flatten _ _ _ _ ebody) as ebody'.
+ set (flatten _ _ _ _ elet) as elet'.
+ rewrite update_typeMap in ebody'.
+ apply (@ELet _ _ _ _ _ _ _ _ _ elet' ebody').
+
+ destruct case_EEsc.
+ admit.
+ destruct case_EBrak.
+ admit.
+
+ destruct case_ECast.
+ apply flatten in e.
+ eapply ECast in e.
+ apply e.
+ apply flattenCoercion in γ.
+ apply γ.
+
+ destruct case_ETyApp.
+ apply flatten in e.
+ simpl in e.
+ unfold HaskTAll in e.
+ unfold typeMap_ in e.
+ simpl in e.
+ eapply ETyApp in e.
+ rewrite <- foo in e.
+ apply e.
+
+ destruct case_ECoLam.
+ apply flatten in e.
+ simpl in e.
+ set (@ECoLam _ _ _ _ _ _ _ _ _ _ e) as x.
+ simpl in x.
+ simpl.
+ unfold typeMap_.
+ simpl.
+ apply x.
+
+ destruct case_ECoApp.
+ simpl.
+ apply flatten in e.
+ eapply ECoApp.
+ unfold mkHaskCoercionKind in *.
+ simpl in γ.
+ apply flattenCoercion in γ.
+ unfold coMap in γ at 2.
+ apply γ.
+ apply e.
+
+ destruct case_ETyLam.
+ apply flatten in e.
+ set (@ETyLam Unique _ Γ (map coMap Δ) (typeMap ○ ξ) κ (fun ite x => typeMap (σ x ite))) as e'.
+ unfold HaskTAll in *.
+ unfold typeMap_ in *.
+ rewrite <- foo in e'.
+ unfold typeMap in e'.
+ simpl in e'.
+ apply ETyLam.
+
+Set Printing Implicit.
+idtac.
+idtac.
+
+
+ admit.
+
+ destruct case_ECase.
+ admit.
+
+ destruct case_ELetRec.
+ admit.
+ Defined.
+
(* This proof will work for any dynamic semantics you like, so
* long as those semantics are an ND_Relation (associativity,
* neutrality, etc) *)
Notation "a |= b" := (Γ >> Δ > a |- b).
- (* category of judgments in a fixed type/coercion context *)
- Definition JudgmentsFC :=
- @Judgments_Category_monoidal _ Rule dynamic_semantics (UJudg Γ Δ) UJudg2judg.
-
- Definition identityProof t : [] ~~{JudgmentsFC}~~> [t |= t].
- unfold hom; simpl.
- admit.
- Defined.
-
- Definition cutProof a b c : [a |= b],,[b |= c] ~~{JudgmentsFC}~~> [a |= c].
- unfold hom; simpl.
- admit.
- Defined.
-
- Definition TypesFC : ECategory JudgmentsFC Context (fun x y => [Γ >> Δ > x |- y]).
- refine
- {| eid := identityProof
- ; ecomp := cutProof
- |}; intros.
- apply MonoidalCat_all_central.
- apply MonoidalCat_all_central.
- admit.
- admit.
- admit.
- Defined.
-
- Definition TypesEnrichedInJudgments : Enrichment.
- refine {| enr_c := TypesFC |}.
- Defined.
-
-(*
- Definition TwoLevelLanguage L2 :=
- { L1 : _ &
- Reification (TypesEnrichedInJudgments L1) (TypesEnrichedInJudgments L2) }
+ (*
+ SystemFCa
+ PCF
+ SystemFCa_two_level
+ SystemFCa_initial_GArrow
+ *)
- Inductive NLevelLanguage : nat -> Language -> Type :=
- | NLevelLanguage_zero : forall lang, NLevelLanguage O lang
- | NLevelLanguage_succ : forall L1 L2 n, TwoLevelLanguage L1 L2 -> NLevelLanguage n L1 -> NLevelLanguage (S n) L2
+ Context (nd_eqv:@ND_Relation _ (@URule Γ Δ)).
+ Check (@ProgrammingLanguage).
+ Context (PL:@ProgrammingLanguage (LeveledHaskType Γ ★)
+ (fun x y => match x with x1|=x2 => match y with y1|=y2 => @URule Γ Δ)).
+ Definition JudgmentsFC := @Judgments_Category_CartesianCat _ (@URule Γ Δ) nd_eqv.
+ Definition TypesFC := @TypesL _ (@URule Γ Δ) nd_eqv.
- Definition OmegaLevelLanguage : Language -> Type :=
- forall n:nat, NLevelLanguage n L.
-*)
-
-
(* The full subcategory of SystemFC(Γ,Δ) consisting only of judgments involving types at a fixed level. Note that
* code types are still permitted! *)
Section SingleLevel.
Inductive JudgmentsAtLevel : JudgmentsFC -> Prop :=
| judgmentsAtLevel_nil : JudgmentsAtLevel []
- | judgmentsAtLevel_leaf : forall c1 c2, ContextAtLevel c1 -> ContextAtLevel c2 -> JudgmentsAtLevel [c1 |= c2]
+ | judgmentsAtLevel_leaf : forall c1 c2, ContextAtLevel c1 -> ContextAtLevel c2 -> JudgmentsAtLevel [c1 |= c2]
| judgmentsAtLevel_branch : forall j1 j2, JudgmentsAtLevel j1 -> JudgmentsAtLevel j2 -> JudgmentsAtLevel (j1,,j2).
Definition JudgmentsFCAtLevel := FullSubcategory JudgmentsFC JudgmentsAtLevel.
End SystemFC_Category.
Implicit Arguments TypesFC [ ].
-
- Definition Types_first c : EFunctor (TypesFC nil nil) (TypesFC nil nil) (fun x => x,,c ).
- admit.
- Defined.
- Definition Types_second c : EFunctor (TypesFC nil nil) (TypesFC nil nil) (fun x => c,,x ).
- admit.
- Defined.
-
- Definition Types_binoidal : BinoidalCat (TypesFC nil nil) (@T_Branch _).
- refine
- {| bin_first := Types_first
- ; bin_second := Types_second
- |}.
- Defined.
-
- Definition Types_premonoidal : PreMonoidalCat Types_binoidal [].
- admit.
- Defined.
-
-(*
- Definition ArrowInProgrammingLanguage :=
- FreydCategory Types_premonoidal Types_premonoidal.
-
- FlatSubCategory
-
- InitialGArrowsAllowFlattening
-
- SystemFCa
-
- PCF
-
- SystemFCa_two_level
- SystemFCa_initial_GArrow
-
-
-*)
-
(*
Section EscBrak_Functor.
admit.
Defined.
*)
-End HaskProofCategory.
\ No newline at end of file
+*)
+End HaskProofCategory.