{-# OPTIONS --safe --with-K #-} module Examples.WithMacros.STLC where open import Prelude open import Generics.Description open import Generics.Recursion open import Generics.Reflection open import Generics.Ornament open import Generics.Ornament.Description open import Generics.Ornament.Algebraic open import Generics.Ornament.Algebraic.Isomorphism open import Examples.WithMacros.Nat open import Examples.WithMacros.List -------- -- Untyped λ-calculus data Λ : Set where var : ℕ → Λ app : Λ → Λ → Λ lam : Λ → Λ instance UntypedTermC : Named (quote Λ) _ unNamed UntypedTermC = genDataC UntypedTermD (genDataT UntypedTermD Λ) where UntypedTermD = genDataD Λ -------- -- Simply typed λ-calculus infixr 5 _⇒_ data Ty : Set where base : Ty _⇒_ : Ty → Ty → Ty variable τ τ' : Ty Γ : List Ty infix 3 _⊢_ data _⊢_ : List Ty → Ty → Set where var : Γ ∋ τ → ----- Γ ⊢ τ app : Γ ⊢ τ ⇒ τ' → Γ ⊢ τ ---------- → Γ ⊢ τ' lam : τ ∷ Γ ⊢ τ' → ---------- Γ ⊢ τ ⇒ τ' instance TypedTermC : Named (quote _⊢_) _ unNamed TypedTermC = genDataC TypedTermD (genDataT TypedTermD _⊢_) where TypedTermD = genDataD _⊢_ TypedTermO : DataO (findDataD (quote _⊢_)) (findDataD (quote Λ)) TypedTermO = record { level = λ _ → tt ; applyL = λ _ → record { param = λ _ → tt ; index = λ _ _ → tt ; applyP = λ _ → (Δ[ Γ ] Δ[ τ ] Δ[ i ] ∇ (toℕ i) ι) ∷ ∺ (Δ[ Γ ] Δ[ τ ] Δ[ τ' ] ρ ι (ρ ι ι)) ∷ ∺ (Δ[ τ ] Δ[ Γ ] Δ[ τ' ] ρ ι ι) ∷ ∺ [] } } TypedTermFin : Finitary (findDataD (quote _⊢_)) TypedTermFin = (tt ∷ tt ∷ tt ∷ []) ∷ (tt ∷ tt ∷ tt ∷ refl ∷ refl ∷ []) ∷ (tt ∷ tt ∷ tt ∷ refl ∷ []) ∷ [] private toΛP : FoldP toΛP = forget (quote _⊢_) (quote Λ) unquoteDecl toΛ = defineFold toΛP toΛ -- toΛ : Γ ⊢ τ → Λ -- toΛ (var i ) = var (toℕ i) -- toΛ (app t u) = app (toΛ t) (toΛ u) -- toΛ (lam t ) = lam (toΛ t) instance toΛC = genFoldC toΛP toΛ -------- -- Typing relation as an algebraic ornamentation private TypingOD : DataOD (findDataD (quote _⊢_)) TypingOD = AlgOD toΛP instance TypingO = ⌈ TypingOD ⌉ᵈ infix 3 _⊢_∶_ unquoteDecl data Typing constructor var app lam = defineByDataD ⌊ TypingOD ⌋ᵈ Typing (Typing.var ∷ Typing.app ∷ Typing.lam ∷ []) _⊢_∶_ : List Ty → Λ → Ty → Set _⊢_∶_ a b c = Typing a c b --data _⊢_∶_ : List Ty → Λ → Ty → Set₀ where -- -- var : (i : Γ ∋ τ) -- → ------------------- -- Γ ⊢ var (toℕ i) ∶ τ -- -- app : ∀ {t} → Γ ⊢ t ∶ τ ⇒ τ' -- → ∀ {u} → Γ ⊢ u ∶ τ -- → ---------------------- -- Γ ⊢ app t u ∶ τ' -- -- lam : ∀ {t} → τ ∷ Γ ⊢ t ∶ τ' -- → ---------------------- -- Γ ⊢ lam t ∶ τ ⇒ τ' instance TypingC : Named (quote _⊢_∶_) _ unNamed TypingC = genDataC ⌊ TypingOD ⌋ᵈ TypingT where TypingT : DataT ⌊ TypingOD ⌋ᵈ TypingT tt tt ((Γ , τ , tt) , t , tt) = Γ ⊢ t ∶ τ -------- -- Conversion between intrinsically and extrinsically typed terms private fromTypingP : FoldP fromTypingP = forget (quote _⊢_∶_) (quote _⊢_) unquoteDecl fromTyping = defineFold fromTypingP fromTyping -- fromTyping : ∀ {t} → Γ ⊢ t ∶ τ → Γ ⊢ τ -- fromTyping (var i ) = var i -- fromTyping (app d e) = app (fromTyping d) (fromTyping e) -- fromTyping (lam d ) = lam (fromTyping d) instance fromTypingC = genFoldC fromTypingP fromTyping private toTypingP : IndP toTypingP = remember (quote _⊢_∶_) unquoteDecl toTyping = defineInd toTypingP toTyping -- toTyping : (t : Γ ⊢ τ) → Γ ⊢ toΛ t ∶ τ -- toTyping (var i ) = var i -- toTyping (app t u) = app (toTyping t) (toTyping u) -- toTyping (lam t ) = lam (toTyping t) instance toTypingC = genIndC toTypingP toTyping --private -- from-toTypingP : IndP -- from-toTypingP = forget-remember-inv (quote _⊢_∶_) (quote _⊢_) (inl it) --unquoteDecl from-toTyping = defineInd from-toTypingP from-toTyping -- from-toTyping : (t : Γ ⊢ τ) → fromTyping (toTyping t) ≡ t -- from-toTyping (var i ) = refl -- from-toTyping (app t u) = trans' (cong (app (fromTyping (toTyping t))) (from-toTyping u)) -- (cong (λ n' → app n' u) (from-toTyping t)) -- from-toTyping (lam t ) = cong lam (from-toTyping t) --instance from-toTypingC = genIndC from-toTypingP from-toTyping --private -- to-fromTypingP : IndP -- to-fromTypingP = remember-forget-inv (quote _⊢_∶_) (quote _⊢_) (inl it) --unquoteDecl to-fromTyping = defineInd to-fromTypingP to-fromTyping -- to-fromTyping : ∀ {t} (d : Γ ⊢ t ∶ τ) -- → (toΛ (fromTyping d) , toTyping (fromTyping d)) -- ≡ ((t , d) ⦂ Σ[ t' ∈ Λ ] Γ ⊢ t' ∶ τ) -- [FAIL] manual type annotation -- to-fromTyping (var i) = refl -- to-fromTyping (app {Γ} {τ} {τ'} {t} d e) = -- trans -- (cong -- (bimap (λ x → x) (DataC.toN (findDataC (quote _⊢_∶_)))) -- (cong (bimap (λ x → x) inr) -- (cong (bimap (λ x → x) inl) -- (cong (bimap (λ x → x) (λ section → Γ , section)) -- (cong (bimap (λ x → x) (λ section → τ , section)) -- (cong (bimap (λ x → x) (λ section → τ' , section)) -- (trans -- (cong -- (λ p → -- app (fst p) (toΛ (fromTyping e)) , -- fst p , -- snd p , toΛ (fromTyping e) , toTyping (fromTyping e) , refl) -- (to-fromTyping d)) -- (cong (bimap (λ x → x) (λ x → t , d , x)) -- (trans -- (cong (λ p → app t (fst p) , fst p , snd p , refl) -- (to-fromTyping e)) -- refl))))))))) -- refl -- to-fromTyping (lam {τ} {Γ} {τ'} d) = -- trans -- (cong -- (bimap (λ x → x) (DataC.toN (findDataC (quote _⊢_∶_)))) -- (cong (bimap (λ x → x) inr) -- (cong (bimap (λ x → x) inr) -- (cong (bimap (λ x → x) inl) -- (cong (bimap (λ x → x) (λ section → τ , section)) -- (cong (bimap (λ x → x) (λ section → Γ , section)) -- (cong (bimap (λ x → x) (λ section → τ' , section)) -- (trans -- (cong (λ p → lam (fst p) , fst p , snd p , refl) (to-fromTyping d)) -- refl)))))))) -- refl --instance to-fromTypingC = genIndC to-fromTypingP to-fromTyping