m1-internship/ZOLCompleteness.lagda

199 lines
7.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\begin{code}
{-# OPTIONS --prop --rewriting #-}
open import PropUtil
module ZOLCompleteness where
open import Agda.Primitive
open import ZOL2
open import ListUtil
record Kripke : Set (lsuc (ℓ¹)) where
field
World : Set ℓ¹
_-w->_ : World → World → Prop ℓ¹ -- arrows
-w->id : {w : World} → w -w-> w -- id arrow
_∘-w->_ : {w w' w'' : World} → w -w-> w' → w' -w-> w'' → w -w-> w'' -- arrow composition
Ι : World → Prop ℓ¹
Ι≤ : {w w' : World} → w -w-> w' → Ι w' → Ι w
infixr 10 _∘_
Con : Set (lsuc ℓ¹)
Con = World → Prop ℓ¹
Sub : Con → Con → Prop ℓ¹
Sub Δ Γ = (w : World) → Δ w → Γ w
_∘_ : {Γ Δ Ξ : Con} → Sub Δ Ξ → Sub Γ Δ → Sub Γ Ξ
α ∘ β = λ w γα w (β w γ)
id : {Γ : Con} → Sub Γ Γ
id = λ w γγ
◇ : Con -- The initial object of the category
◇ = λ w →
ε : {Γ : Con} → Sub Γ ◇ -- The morphism from the initial to any object
ε w Γ = tt
-- Functor Con → Set called For
For : Con → Set (lsuc ℓ¹)
For Γ = (w : World) → (Γ w) → Prop ℓ¹
_[_]f : {Γ Δ : Con} → For Γ → Sub Δ Γ → For Δ -- The functor's action on morphisms
F [ σ ]f = λ w → λ x → F w (σ w x)
-- Proofs
Pf : (Γ : Con) → For Γ → Prop ℓ¹
Pf Γ F = ∀ w (γ : Γ w) → F w γ
_[_]p : {Γ Δ : Con} → {F : For Γ} → Pf Γ F → (σ : Sub Δ Γ) → Pf Δ (F [ σ ]f) -- The functor's action on morphisms
prf [ σ ]p = λ w → λ γ → prf w (σ w γ)
-- Equalities below are useless because Γ ⊢ F is in prop
-- []p-id : {Γ : Con} → {F : For Γ} → {prf : Γ ⊢ F} → prf [ id {Γ} ]p ≡ prf
-- []p-∘ : {Γ Δ Ξ : Con} → {α : Sub Ξ Δ} → {β : Sub Δ Γ} → {F : For Γ} → {prf : Γ ⊢ F} → prf [ α ∘ β ]p ≡ (prf [ β ]p) [ α ]p
-- → Prop⁺
_▹ₚ_ : (Γ : Con) → For Γ → Con
Γ ▹ₚ F = λ w → Γ w ×p F w
πₚ¹ : {Γ Δ : Con} → {F : For Γ} → Sub Δ (Γ ▹ₚ F) → Sub Δ Γ
πₚ¹ σ w δ = proj×p₁ (σ w δ)
πₚ² : {Γ Δ : Con} → {F : For Γ} → (σ : Sub Δ (Γ ▹ₚ F)) → Pf Δ (F [ πₚ¹ σ ]f)
πₚ² σ w δ = proj×p₂ (σ w δ)
_,ₚ_ : {Γ Δ : Con} → {F : For Γ} → (σ : Sub Δ Γ) → Pf Δ (F [ σ ]f) → Sub Δ (Γ ▹ₚ F)
(σ ,ₚ pf) w δ = (σ w δ) ,×p pf w δ
-- Base formula
ι : {Γ : Con} → For Γ
ι = λ w → λ γΙ w
-- Implication
_⇒_ : {Γ : Con} → For Γ → For Γ → For Γ
(F ⇒ G) w γ = {w' : World} → (s : w -w-> w') → (F w' {!s γ!}) → (G w' {!!})
-- Lam & App
lam : {Γ : Con} → {F : For Γ} → {G : For Γ} → Pf (Γ ▹ₚ F) (G [ πₚ¹ id ]f) → Pf Γ (F ⇒ G)
--lam prf = λ w γ w' s h → prf w (γ ,×p h)
app : {Γ : Con} → {F G : For Γ} → Pf Γ (F ⇒ G) → Pf Γ F → Pf Γ G
--app prf prf' = λ w γ → prf w γ w -w->id (prf' w γ)
-- Again, we don't write the _[_]p equalities as everything is in Prop
zol : ZOL
zol = record
{ Con = Con
; Sub = Sub
; _∘_ = _∘_
; id = id
; ◇ = ◇
; ε = ε
; For = For
; _[_]f = _[_]f
; []f-id = refl
; []f-∘ = refl
; Pf = Pf
; _[_]p = _[_]p
; _▹ₚ_ = _▹ₚ_
; πₚ¹ = πₚ¹
; πₚ² = πₚ²
; _,ₚ_ = _,ₚ_
; ι = ι
; []f-ι = refl
; _⇒_ = _⇒_
; []f-⇒ = refl
; lam = lam
; app = app
}
\end{code}
module U where
import ZOLInitial as I
U : Kripke
U = record
{ World = I.Con
; _-w->_ = I.Sub
; -w->id = I.id
; _∘-w->_ = λ σ σ' → σ' I.∘ σ
; Ι = λ Γ → I.Pf Γ I.ι
; Ι≤ = λ s pf → pf I.[ s ]p
}
open Kripke U
y : Mapping I.zol zol
y = record
{ mCon = λ Γ Δ → I.Sub Δ Γ
; mSub = λ σ Ξ δ → σ I.∘ δ
; mFor = λ A Ξ σ → I.Pf Ξ A
; mPf = λ pf Ξ σ → pf I.[ σ ]p
}
m : Morphism I.zol zol
m = I.InitialMorphism.mor zol
u : (Γ : I.Con) → Sub (Morphism.mCon m Γ) (Mapping.mCon y Γ)
q : (Γ : I.Con) → Sub (Mapping.mCon y Γ) (Morphism.mCon m Γ)
⟦_⟧c = Morphism.mCon m
⟦_,_⟧f = λ A Γ → Morphism.mFor m {Γ} A
⟦⟧f-mon : {Γ : I.Con}{A : I.For}{w w' : World}{γ : ⟦ Γ ⟧c w}{γ' : ⟦ Γ ⟧c w'} → w -w-> w' → ⟦ A , Γ ⟧f w' γ' → ⟦ A , Γ ⟧f w γ
⟦⟧f-mon {A = I.ι} s h = Ι≤ s h
⟦⟧f-mon {A = A I.⇒ B} s h w'' s' h' = {!h!}
⟦⟧c-mon : {Γ : I.Con}{w w' : I.Con} → w -w-> w' → ⟦ Γ ⟧c w → ⟦ Γ ⟧c w'
⟦⟧c-mon s h = {!!}
q⁰ : {F : I.For} → {Γ : I.Con} → Pf ⟦ Γ ⟧c ⟦ F , Γ ⟧f → I.Pf Γ F
u⁰ : {F : I.For} → {Γ : I.Con} → I.Pf Γ F → Pf ⟦ Γ ⟧c ⟦ F , Γ ⟧f
u⁰ {I.ι} h w γ = {!!}
u⁰ {A I.⇒ B} h Γ' γ Γ'' iq hF = u⁰ {B} (I.app {A = A} h (q⁰ (λ Ξ γ' → {!hF!}))) {!!} γ --{Γ'} iq hF = u {F₁} (app {Γ'} {F} {F₁} (⊢tran iq h) (q hF))
q⁰ {I.ι} {Γ} h = h Γ {!!}
q⁰ {A I.⇒ B} {Γ} h = I.lam (q⁰ (λ w γ → {!h ? ? ? (I.πₚ¹ I.id)!})) --lam (q (h (retro (Preorder.refl≤ o)) (u {F} {F ∷ Γ} zero)))
u I.◇ Δ x = I.ε
u (Γ I.▹ₚ I.ι) Δ (Γu ,×p Au) = u Γ Δ Γu I.,ₚ Au
--u (Γ I.▹ₚ (A I.⇒ B)) Δ (Γu ,×p ABu) = (u Γ Δ Γu) I.,ₚ I.lam (I.πₚ² (u (Γ I.▹ₚ B) (Δ I.▹ₚ A) ({!!} ,×p {!!})))
u (Γ I.▹ₚ (A I.⇒ B)) Δ (Γu ,×p ABu) = (u Γ Δ Γu) I.,ₚ {!!}
q .I.◇ Δ I.ε = tt
q (Γ I.▹ₚ I.ι) Δ σ = (q Γ Δ (I.πₚ¹ σ)) ,×p I.πₚ² σ
q (Γ I.▹ₚ (A I.⇒ B)) Δ σ = (q Γ Δ (I.πₚ¹ σ)) ,×p {!!}
{-
u {Var x} h = h
u {F ⇒ F₁} h {Γ'} iq hF = u {F₁} (app {Γ'} {F} {F₁} (⊢tran iq h) (q hF))
u {F ∧∧ G} h = ⟨ (u {F} (ande₁ h)) , (u {G} (ande₂ h)) ⟩
u {} h = tt
q {Var x} h = neu⁰ h
q {F ⇒ F₁} {Γ} h = lam (q (h (retro (Preorder.refl≤ o)) (u {F} {F ∷ Γ} zero)))
q {F ∧∧ G} ⟨ hF , hG ⟩ = andi (q {F} hF) (q {G} hG)
q {} h = true
-}
ηu : TrNat (Morphism.m m) y
ηu = record { f = u }
ηq : TrNat y (Morphism.m m)
ηq = record { f = q }
eq : ηu ∘TrNat ηq ≡ idTrNat
eq = {!!}
-- Transformation naturelle
\end{code}
-- Completeness proof
-- We first build our universal Kripke model
module ComplenessProof where
-- We have a model, we construct the Universal Presheaf model of this model
import ZOLInitial as I
\end{code}