fix bug in GeneralizedArrowFromReification
[coq-hetmet.git] / src / ProgrammingLanguageReification.v
1 (*********************************************************************************************************************************)
2 (* ProgrammingLanguageReification                                                                                                *)
3 (*                                                                                                                               *)
4 (*   Reifications in ProgrammingLanguages.                                                                                       *)
5 (*                                                                                                                               *)
6 (*********************************************************************************************************************************)
7
8 Generalizable All Variables.
9 Require Import Preamble.
10 Require Import General.
11 Require Import Categories_ch1_3.
12 Require Import InitialTerminal_ch2_2.
13 Require Import Functors_ch1_4.
14 Require Import Isomorphisms_ch1_5.
15 Require Import ProductCategories_ch1_6_1.
16 Require Import OppositeCategories_ch1_6_2.
17 Require Import Enrichment_ch2_8.
18 Require Import Subcategories_ch7_1.
19 Require Import NaturalTransformations_ch7_4.
20 Require Import NaturalIsomorphisms_ch7_5.
21 Require Import MonoidalCategories_ch7_8.
22 Require Import Coherence_ch7_8.
23 Require Import Enrichment_ch2_8.
24 Require Import RepresentableStructure_ch7_2.
25 Require Import FunctorCategories_ch7_7.
26
27 Require Import Reification.
28 Require Import NaturalDeduction.
29 Require Import NaturalDeductionCategory.
30 Require Import ProgrammingLanguage.
31
32 (*
33   Structure ProgrammingLanguageSMME :=
34   { plsmme_t       : Type
35   ; plsmme_judg    : Type
36   ; plsmme_sequent : Tree ??plsmme_t -> Tree ??plsmme_t -> plsmme_judg
37   ; plsmme_rule    : Tree ??plsmme_judg -> Tree ??plsmme_judg -> Type
38   ; plsmme_pl      : @ProgrammingLanguage plsmme_t plsmme_judg plsmme_sequent plsmme_rule
39   ; plsmme_smme    : SurjectiveEnrichment (TypesEnrichedInJudgments _ _ plsmme_pl)
40   }.
41   Coercion plsmme_pl   : ProgrammingLanguageSMME >-> ProgrammingLanguage.
42   Coercion plsmme_smme : ProgrammingLanguageSMME >-> SurjectiveMonicMonoidalEnrichment.
43 *)
44
45   Context
46   `(Guest        : ProgrammingLanguage)
47   `(Host         : ProgrammingLanguage)
48    (HostMonoidal : MonoidalEnrichment (TypesEnrichedInJudgments Host))
49    (HostMonic    : MonicEnrichment    (TypesEnrichedInJudgments Host)).
50
51 Definition TwoLevelLanguage (Guest Host:ProgrammingLanguageSMME)
52   := Reification Guest Host (me_i Host).
53
54 Inductive NLevelLanguage : nat -> ProgrammingLanguageSMME -> Type :=
55 | NLevelLanguage_zero : forall lang,    NLevelLanguage O lang
56 | NLevelLanguage_succ : forall (L1 L2:ProgrammingLanguageSMME) n,
57                           TwoLevelLanguage L1 L2 -> NLevelLanguage n L1 -> NLevelLanguage (S n) L2.
58
59 Definition OmegaLevelLanguage : Type :=
60   { f : nat -> ProgrammingLanguageSMME
61   & forall n, TwoLevelLanguage (f n) (f (S n)) }.
62