module WISC where
open import AlgebraicSignature public
open import Axioms public
open import Prelude public
Fam : (l : Level) → Set (lsuc l)
Fam l = ∑ C ∶ Set l , (C → Set l)
sig : Fam ℓ₀ → Sig
Op (sig (C , E)) = C
Ar (sig (C , E)) = E
Ker : {l : Level} → Fam l → Set l → Fam l
π₁ (Ker (A , B) X) = ∑ a ∶ A , (B a → X)
π₂ (Ker (A , B) X) (a , f) = ker f
wisc : {l : Level} → Set l → Fam l → ∀ m → Prop (l ⊔ lsuc m)
wisc A (C , D) m =
(X : Set m)
(e : X → A)
(_ : surjection e)
→
∃ c ∶ C , ∃ f ∶ (D c → X) , surjection (e ∘ f)
wAC :
{l : Level}
{A : Set l}
((C , D) : Fam l)
(_ : wisc A (C , D) l)
(B : A → Set l)
(P : (x : A) → B x → Prop l)
(_ : ∀ x → ∃ (B x) (P x))
→
∃ c ∶ C ,
∃ p ∶ (D c → A),
∃ q ∶ ((z : D c) → B (p z)),
(surjection p ∧ ∀ z → P (p z) (q z))
wAC {l} {A} (C , D) w B P e = wac
where
E : Set l
E = set (x , y) ∶ (∑ A B), P x y
p' : E → A
p' ((x , _) ∣ _) = x
surjectionp' : surjection p'
surjectionp' x with e x
... | ∃i y u = ∃i ((x , y) ∣ u) refl
q' : (z : E) → B (p' z)
q' ((_ , y) ∣ _) = y
r : ∀ z → P (p' z) (q' z)
r ((_ , _) ∣ p) = p
wac : ∃ c ∶ C , ∃ p ∶ (D c → A), ∃ q ∶ ((z : D c) → B (p z)),
(surjection p ∧ ∀ z → P (p z) (q z))
wac with w E p' surjectionp'
... | ∃i c (∃i k u) =
∃i c (
∃i (p' ∘ k) (
∃i (q' ∘ k) (
∧i u λ z → r (k z))))
postulate
WISC : ∀{l}(A : Set l) → ∀ m → ∃ F ∶ Fam l , wisc A F m
IWISC :
{l : Level}
((A , B) : Fam l)
(m : Level)
→
∃ F ∶ Fam l , ∀ a → wisc (B a) F m
IWISC {l} (A , B) m with WISC A (lsuc l ⊔ lsuc m)
... | ∃i (C , D) w = match (w E p sp) (\ where
(∃i c (∃i e q)) →
let
C' : Set l
C' = ∑ z ∶ D c , π₁ (el (π₂ (e z)))
D' : C' → Set l
D' u = π₂ (el (π₂ (e (π₁ u)))) (π₂ u)
w' : (a : A) → wisc (B a) (C' , D') m
w' a X g gs = match (q a) (\ where
(∃i z refl) → match (pf (π₂ (e z)) X g gs) (\ where
(∃i y (∃i h hs)) →
∃i (z , y) ((∃i {P = λ f → surjection (g ∘ f)} h hs))))
in
∃i (C' , D') w')
where
E : Set (lsuc l ⊔ lsuc m)
E = ∑ x ∶ A , set F ∶ Fam l , wisc (B x) F m
p : E → A
p = π₁
sp : surjection p
sp a with WISC (B a) m
... | ∃i F w = ∃i (a , (F ∣ w)) refl