module Metaprog2016 where
open import Data.List using (List) renaming ([] to ⌀)
open import Data.Maybe using (Maybe)
open import Data.Product using (_×_)
open import Data.Unit using () renaming (⊤ to 𝟙)
-- TOWARDS INTENSIONAL ANALYSIS OF SYNTAX
--
-- Miëtek Bak
-- mietek@bak.io
--
-- http://github.com/mietek/metaprog2016
--
-- International Summer School on Metaprogramming
-- Robinson College, Cambridge, 8th to 12th August 2016
-- Consider a basic fragment of intuitionistic modal logic S4 (IS4).
data Type : Set where
_▻_ : Type → Type → Type
_∧_ : Type → Type → Type
⊤ : Type
□_ : Type → Type
postulate
_⊢_ : List Type → Type → Set
-- IS4 provides the logical foundations for MetaML.
-- Sheard (2001) reminds us that MetaML only allows syntax to be constructed
-- and executed at runtime. Observation and decomposition is not supported.
--
-- “Accomplishments and research challenges in meta-programming”
-- http://dx.doi.org/10.1007/3-540-44806-3_2
postulate
• : Type
yes : ∀ {Γ} → Γ ⊢ •
no : ∀ {Γ} → Γ ⊢ •
isApp : ∀ {Γ A} → Γ ⊢ ((□ A) ▻ •)
-- Has anyone built a typed system supporting intensional analysis of syntax?
-- I don’t know, but Gabbay and Nanevski (2012) come close. They give a
-- Tarski-style semantics for IS4, reading “□ A” as “closed syntax of type A”.
--
-- “Denotation of contextual modal type theory: Syntax and meta-programming”
-- http://dx.doi.org/10.1016/j.jal.2012.07.002
module GabbayNanevski2012 where
⊨_ : Type → Set
⊨ (A ▻ B) = ⊨ A → ⊨ B
⊨ (A ∧ B) = (⊨ A) × (⊨ B)
⊨ ⊤ = 𝟙
⊨ (□ A) = (⌀ ⊢ A) × (⊨ A)
-- Can we construct a proof of completeness with respect to this semantics
-- and obtain normalisation by evaluation (NbE) for IS4?
-- Yes, we can! As long as we also take from Coquand and Dybjer (1997).
--
-- “Intuitionistic model constructions and normalization proofs”
-- http://dx.doi.org/10.1017/S0960129596002150
module CoquandDybjer1997GabbayNanevski2012 where
⊨_ : Type → Set
⊨ (A ▻ B) = (⌀ ⊢ (A ▻ B)) × (⊨ A → ⊨ B)
⊨ (A ∧ B) = (⊨ A) × (⊨ B)
⊨ ⊤ = 𝟙
⊨ (□ A) = (⌀ ⊢ A) × (⊨ A)
-- Could we perhaps read “□ A” as “open syntax of type A”?
-- I don’t know, but I’ve had an idea about that...
postulate
_⊆_ : List Type → List Type → Set
module ??? where
_⊨_ : List Type → Type → Set
Δ ⊨ (A ▻ B) = ∀ {Δ′} → Δ ⊆ Δ′ → Δ′ ⊨ A → Δ′ ⊨ B
Δ ⊨ (A ∧ B) = (Δ ⊨ A) × (Δ ⊨ B)
Δ ⊨ ⊤ = 𝟙
Δ ⊨ (□ A) = ∀ {Δ′} → Δ ⊆ Δ′ → (Δ′ ⊢ A) × (Δ′ ⊨ A)
-- Does this look suspiciously like a Kripke-style possible worlds semantics?
-- Yes, it does! We can find one of these in Alechina et al. (2001).
--
-- “Categorical and Kripke semantics for constructive S4 modal logic”
-- http://dx.doi.org/10.1007/3-540-44802-0_21
postulate
World : Set
_≤_ : World → World → Set
_R_ : World → World → Set
module AlechinaMendlerDePaivaRitter2001 where
_⊩_ : World → Type → Set
w ⊩ (A ▻ B) = ∀ {w′} → w ≤ w′ → w′ ⊩ A → w′ ⊩ B
w ⊩ (A ∧ B) = (w ⊩ A) × (w ⊩ B)
w ⊩ ⊤ = 𝟙
w ⊩ (□ A) = ∀ {w′} → w ≤ w′ → ∀ {v′} → w′ R v′ → v′ ⊩ A
-- Has anyone constructed a proof of completeness with respect to a
-- Kripke-style semantics for IS4?
-- I haven’t found one, and I’ve tried five.
-- v′ w″ → v″ w″
-- ◌───R───● → ◌───────R───────●
-- │ → │
-- ≤ ξ′,ζ′ → │
-- v │ → │
-- ◌───R───● → ≤
-- │ w′ → │
-- ≤ ξ,ζ → │
-- │ → │
-- ● → ●
-- w → w
-- How do we go from being able to talk about open syntax to being able
-- to intensionally analyse syntax at runtime?
-- I don’t know, but I’ve noticed a funny coincidence...
--
-- Work in progress:
-- http://github.com/mietek/hilbert-gentzen
-- FIN