module Countable (X : Set) where
open import Data.List
open import Data.List.Membership.Propositional
open import Data.List.Properties
open import Data.List.Relation.Unary.Any
open import Data.List.Relation.Unary.Any.Properties
open import Data.Nat hiding (_≤_)
open import Relation.Binary.PropositionalEquality
open import Data.Product
open import Data.Sum
open import Data.Maybe
open import Data.Fin hiding (_≥_; _>_)
-- Good P σ heißt: egal, wie sich die endliche Approximation σ an eine
-- Surjektion ℕ ↠ X zu einer besseren solchen Approximation entwickeln
-- wird, schlussendlich wird sie P erfüllen.
data Good (P : List X → Set) : List X → Set where
Here : {σ : List X} → (p : P σ) → Good P σ
Total : {σ : List X} → (f : (x : X) → Good P (x ∷ σ)) → Good P σ
Preimage : {a : X} {σ : List X} → (g : (τ : List X) → a ∈ τ ++ σ → Good P (τ ++ σ)) → Good P σ
-- Folgendes ist die Kripke-Joyal-Übersetzung von: "Jedes a wird getroffen."
-- Gibt es unten noch mal als ex₂, dort wird die KJ-Übersetzung anders
-- als hier nicht von Hand vorgenommen.
ex₀ : {a : X} → Good (λ σ → a ∈ σ) []
ex₀ = Preimage (λ τ → Here)
-- Folgendes ist die Kripke-Joyal-Übersetzung von: "f(0), f(1) und f(2) sind alle definiert"
ex₁ : Good (λ σ → length σ ≥ 2) []
ex₁ = Total λ _ → Total (λ _ → Here (s≤s (s≤s z≤n)))
module _ (x₀ : X) (Q : Set) where
lemma-conservative : {σ : List X} → Good (λ _ → Q) σ → Q
lemma-conservative (Here p) = p
lemma-conservative (Total f) = lemma-conservative (f x₀)
lemma-conservative {σ} (Preimage {a} g) = lemma-conservative (g (a ∷ σ) (Data.List.Relation.Unary.Any.Any.here refl))
Monotonic : (P : List X → Set) → Set
Monotonic P = (σ : List X) → P σ → ((x : X) → P (x ∷ σ))
++-and-∷ʳ : (τ : List X) (x : X) (σ : List X) → τ ∷ʳ x ++ σ ≡ τ ++ x ∷ σ
++-and-∷ʳ [] x σ = refl
++-and-∷ʳ (a ∷ τ) x σ = cong (_∷_ a) (++-and-∷ʳ τ x σ)
module _ (P : List X → Set) (m : Monotonic P) where
lemma-monotonic : Monotonic (Good P)
lemma-monotonic σ (Here p) x = Here (m σ p x)
lemma-monotonic σ (Total f) x = f x
lemma-monotonic σ (Preimage {a} g) x = Preimage {a = a} go
where
go : (τ : List X) → a ∈ τ ++ x ∷ σ → Good P (τ ++ x ∷ σ)
go τ p with g (τ ∷ʳ x)
go τ p | q rewrite ++-and-∷ʳ τ x σ = q p
module _ {P Q : List X → Set} (h : {σ : List X} → P σ → Q σ) where
lemma-map : {σ : List X} → Good P σ → Good Q σ
lemma-map (Here p) = Here (h p)
lemma-map (Total f) = Total (λ x → lemma-map (f x))
lemma-map (Preimage g) = Preimage (λ τ z → lemma-map (g τ z))
module _ {P Q : List X → Set} (h : {σ : List X} → P σ → Good Q σ) where
lemma-map' : {σ : List X} → Good P σ → Good Q σ
lemma-map' (Here p) = h p
lemma-map' (Total f) = Total (λ x → lemma-map' (f x))
lemma-map' (Preimage g) = Preimage (λ τ z → lemma-map' (g τ z))
-- KRIPKE-JOYAL-SEMANTIK
Ty : Set₁
Ty = Set
Cxt : Set₁
Cxt = List Ty
data Term (Δ : Cxt) : Ty → Set₁ where
var : {A : Ty} → A ∈ Δ → Term Δ A
con : {A : Ty} → A → Term Δ A
data Form (Δ : Cxt) : Set₁ where
_≣_ : {A : Ty} → Term Δ A → Term Δ A → Form Δ
RR : Term Δ ℕ → Term Δ X → Form Δ -- RR(n,x) meint: f(n) = x, wobei f die generische Surjektion ist
⊤ : Form Δ
⊥ : Form Δ
_∧_ : Form Δ → Form Δ → Form Δ
_∨_ : Form Δ → Form Δ → Form Δ
_⇒_ : Form Δ → Form Δ → Form Δ
⋀ : (A : Ty) → Form (A ∷ Δ) → Form Δ
⋁ : (A : Ty) → Form (A ∷ Δ) → Form Δ
data Env : Cxt → Set₁ where
[] : Env []
_∷_ : {A : Ty} {Δ : Cxt} → A → Env Δ → Env (A ∷ Δ)
record Unit : Set where
data Bottom : Set where
eval' : {Δ : Cxt} {A : Ty} → Env Δ → Term Δ A → A
eval' env (con x) = x
eval' [] (var ())
eval' (x ∷ env) (var (here refl)) = x
eval' (_ ∷ env) (var (there x)) = eval' env (var x)
_!!_ : List X → ℕ → Maybe X
[] !! n = nothing
(x ∷ xs) !! zero = just x
(x ∷ xs) !! suc n = xs !! n
R : ℕ → X → List X → Set
R n x σ = reverse σ !! n ≡ just x
eval : {Δ : Cxt} → Env Δ → Form Δ → List X → Set
eval {Δ} env (s ≣ t) = Good (λ _ → eval' env s ≡ eval' env t)
eval {Δ} env (RR n x) = Good (R (eval' env n) (eval' env x))
eval {Δ} env ⊤ = λ _ → Unit
eval {Δ} env ⊥ = Good (λ _ → Bottom)
eval {Δ} env (φ ∧ ψ) = λ σ → eval env φ σ × eval env ψ σ
eval {Δ} env (φ ∨ ψ) = Good (λ τ → eval env φ τ ⊎ eval env ψ τ)
eval {Δ} env (φ ⇒ ψ) = λ σ → (τ : List X) → eval env φ (τ ++ σ) → eval env ψ (τ ++ σ)
eval {Δ} env (⋀ A φ) = λ σ → (a : A) → eval (a ∷ env) φ σ
eval {Δ} env (⋁ A φ) = Good (λ τ → Σ[ a ∈ A ] eval (a ∷ env) φ τ)
univ-surj-is-surj : Form []
univ-surj-is-surj = ⋀ X (⋁ ℕ (RR (var (here refl)) (var (there (here refl)))))
ex₂ : eval [] univ-surj-is-surj []
ex₂ = λ a → Preimage {a = a} λ σ p → Here (Data.Product.map₂ Here (lemma₃ p))
where
lemma₁ : {σ : List X} {a : X} → (p : a ∈ σ) → σ !! toℕ (index p) ≡ just a
lemma₁ {.(a ∷ _)} {a} (here refl) = refl
lemma₁ {.(_ ∷ _)} {a} (there p) = lemma₁ p
lemma₂ : {σ : List X} {a : X} → a ∈ reverse σ → Σ[ n ∈ ℕ ] (R n a σ)
lemma₂ {σ} {a} p = toℕ (index p) , lemma₁ p
lemma₃ : {σ : List X} {a : X} → a ∈ σ → Σ[ n ∈ ℕ ] (R n a σ)
lemma₃ {σ} {a} p = lemma₂ {σ} {a} (reverse⁺ p)
univ-surj-is-total : Form []
univ-surj-is-total = ⋀ ℕ (⋁ X (RR (var (there (here refl))) (var (here refl))))
{-
ex₃ : eval [] univ-surj-is-total []
ex₃ n = Total^ n λ σ p → Here ((reverse σ !!' (subst (λ m → m > n) (sym (length-reverse σ)) p)) , Here (go n σ p))
where
Total^ : (n : ℕ) {P : List X → Set} → ((σ : List X) → length σ > n → Good P σ) → Good P []
Total^ zero f = Total (λ x → f (x ∷ []) (s≤s z≤n))
Total^ (suc n) f = Total^ n (λ σ z → Total (λ x → f (x ∷ σ) (s≤s z)))
_!!'_ : (σ : List X) {n : ℕ} → length σ > n → X
_!!'_ (x ∷ σ) {zero} p = x
_!!'_ (x ∷ σ) {suc n} (s≤s p) = σ !!' p
go : (n : ℕ) (σ : List X) (p : length σ > n) → R n (reverse σ !!' subst (λ m → m > n) (sym (length-reverse σ)) p) σ
go = {!!}
inv : {P Q : List X → Set} {x : X} {σ : List X} → ({τ : List X} → P (τ ++ σ) → Q (τ ++ σ)) → ({τ : List X} → P (τ ++ x ∷ σ) → Q (τ ++ x ∷ σ))
inv h p = subst {!!} (++-and-∷ʳ {!!} {!!} {!!}) {!!}
module _ {P Q : List X → Set} where
lemma-map'' : {σ : List X} → (h : {τ : List X} → P (τ ++ σ) → Good Q (τ ++ σ)) → Good P σ → Good Q σ
lemma-map'' h (Here p) = h p
lemma-map'' {σ} h (Total f) = Total λ x → lemma-map'' {x ∷ σ} (inv {P = P} {Q = Good Q} {x = x} {σ = σ} h) (f x) -- lemma-map'' (λ {τ} p → subst {!λ v → P v!} (sym (++-and-∷ʳ τ x σ)) {!!}) (f x)
lemma-map'' h (Preimage {a} g) = Preimage {a = a} λ τ q → lemma-map'' {!!} (g τ q)
univ-surj-is-single-valued : Form []
univ-surj-is-single-valued = ⋀ ℕ (⋀ X (⋀ X ((RR (var (there (there (here refl)))) (var (here refl)) ∧ RR (var (there (there (here refl)))) (var (there (here refl)))) ⇒ (var (here refl) ≣ var (there (here refl))))))
ex₄ : eval [] univ-surj-is-single-valued []
ex₄ = λ n x x' σ (p , p') → lemma-map'' (λ q → lemma-map'' {!!} {!!}) p
_↓_ : (ℕ → X) → ℕ → List X
α ↓ 0 = []
α ↓ (suc n) = α n ∷ (α ↓ n)
Surjective : {A B : Set} → (A → B) → Set
Surjective {A} {B} f = (y : B) → Σ[ x ∈ A ] f x ≡ y
module _ (P : List X → Set) where
lemma : {σ : List X} → Good P σ → (α : ℕ → X) → Surjective α → α ↓ length σ ≡ σ → Σ[ n ∈ ℕ ] (P (α ↓ n))
lemma {σ} (Here p) α surj q = length σ , subst P (sym q) p
lemma {σ} (Total f) α surj q = lemma (f (α (length σ))) α surj (cong (λ τ → α (length σ) ∷ τ) q)
lemma {σ} (Preimage g) α surj q = {!!}
{-
record Presheaf : Set₁ where
field
Γ : List X → Set
_//_ : {σ : List X} → Γ σ → (x : X) → Γ (x ∷ σ)
_//*_ : {σ : List X} → Γ σ → (τ : List X) → Γ (τ ++ σ)
s //* [] = s
s //* (x ∷ τ) = (s //* τ) // x
{-
record GluingData (E : Presheaf) {I : Set} (u : I → List X) : Set where
open Presheaf E
field
sections : (i : I) → Γ (u i)
compatible :
-}
record Sheaf : Set₁ where
field
presheaf : Presheaf
open Presheaf presheaf public
field
glue-total : {σ : List X} → (s : (x : X) → Γ (x ∷ σ)) → Γ σ
glue-total₀
: {σ : List X} (s : (x : X) → Γ (x ∷ σ))
→ (x : X) → glue-total s // x ≡ s x
glue-total₁
: {σ : List X} (s t : Γ σ)
→ ((x : X) → s // x ≡ t // x)
→ s ≡ t
glue-preimage
: {σ : List X} {a : X}
→ (s : (τ : List X) → a ∈ τ ++ σ → Γ (τ ++ σ))
→ ((x : X) (τ : List X) → (p : a ∈ τ ++ σ) → s τ p // x ≡ s (x ∷ τ) (there p))
→ Γ σ
glue-preimage₀
: {σ : List X} {a : X}
→ (s : (τ : List X) → a ∈ τ ++ σ → Γ (τ ++ σ))
→ (f : (x : X) (τ : List X) → (p : a ∈ τ ++ σ) → s τ p // x ≡ s (x ∷ τ) (there p))
→ (τ : List X) (p : a ∈ τ ++ σ) → glue-preimage s f //* τ ≡ s τ p
glue-preimage₁
: {σ : List X} {a : X}
→ (s t : Γ σ)
→ ((τ : List X) → a ∈ τ ++ σ → s //* τ ≡ t //* τ)
→ s ≡ t
{-
Constant : Set → Sheaf
Constant A = record
{ presheaf = record
{ Γ = λ σ → Good (λ _ → A) σ
; _//_ = λ p x → lemma-monotonic (λ _ → A) (λ σ z x → z) _ p x
}
; glue-total = Total
; glue-total₀ = λ s x → refl
; glue-total₁ = {!!}
; glue-preimage = λ s _ → Preimage s
; glue-preimage₀ = {!!}
; glue-preimage₁ = {!!}
}
-}
_///_ : Presheaf → List X → Presheaf
E /// σ = record
{ Γ = λ τ → Γ E (τ ++ σ)
; _//_ = λ s x → _//_ E s x
}
where
open Presheaf
record PresheafMorphism (E E' : Presheaf) : Set where
open Presheaf E
open Presheaf E' renaming (Γ to Γ'; _//_ to _//'_)
field
omap : {σ : List X} → Γ σ → Γ' σ
fmap : {σ : List X} {x : X} {s : Γ σ} → omap (s // x) ≡ omap s //' x
{-
_⇒_ : Presheaf → Presheaf → Presheaf
E ⇒ F = record
{ Γ = λ σ → PresheafMorphism (E /// σ) (F /// σ)
; _//_ = λ {σ} mor x → record { omap = λ {τ} s → {!!} ; fmap = {!!} }
}
where
open PresheafMorphism
-}
{-
[x,y,z] meint: das Offene, wo f(0) = x, f(1) = y, f(2) = z
zum Beispiel werden wir haben: Good (λ xs → in xs kommt irgendwo a vor) []
zum Beispiel werden wir haben: Good (λ xs → die Länge von xs ist ≥ 5) []
-}
{-
data _≤_ : List X → List X → Set where
base : {σ : List X} → σ ≤ []
step : {σ τ : List X} {x : X} → σ ≤ τ → (x ∷ σ) ≤ τ
tr : {α β γ : List X} → α ≤ β → β ≤ γ → α ≤ γ
tr base base = base
tr (step p) q = step (tr p q)
lemma : {τ σ σ' : List X} → τ ≤ σ → τ ≤ σ' → σ ≤ σ' ⊎ σ' ≤ σ
lemma base p' = inj₂ base
lemma (step p) base = inj₁ base
lemma (step p) (step p') = lemma p p'
-}
-}
-}