{-# OPTIONS --safe --with-K #-} module Examples.WithoutMacros.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.WithoutMacros.Nat open import Examples.WithoutMacros.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 c0 c1 c2 = defineByDataD ⌊ TypingOD ⌋ᵈ Typing (c0 ∷ c1 ∷ c2 ∷ []) 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