{-# OPTIONS --cumulativity #-}
module ROmega.IndexCalculus.Rows where
open import Agda.Primitive
open import Relation.Binary.PropositionalEquality
using (_≡_; refl; sym; trans)
open import Data.Nat using (ℕ; zero; suc)
open import Data.List
open import Data.Sum
renaming (_⊎_ to _or_; inj₁ to left; inj₂ to right)
hiding (map)
open import Data.Product
using (_×_; ∃; ∃-syntax; Σ-syntax; _,_)
renaming (proj₁ to fst; proj₂ to snd)
open import Data.Fin renaming (zero to fzero; suc to fsuc)
hiding (fold)
infixl 5 _≲_
infix 5 _·_~_
Row : ∀ {ℓ : Level} (A : Set ℓ) → Set ℓ
Row A = Σ[ n ∈ ℕ ] (Fin n → A)
Ix : ∀ {ℓ} {A : Set ℓ} → Row {ℓ} A → Set ℓ
Ix (n , _) = Fin n
ixs : (n : ℕ) → List (Fin n)
ixs zero = []
ixs (suc n) = fromℕ n ∷ Data.List.map inject₁ (ixs n)
sing : ∀ {ℓ} {A : Set ℓ} →
A → Row {ℓ} A
sing a = 1 , λ { fzero → a }
one = lsuc lzero
two = lsuc one
three = lsuc two
Row₀ = Row {one} Set
Row₁ = Row {two} Set₁
Row₂ = Row {three} Set₂
infix 2 Σi-syntax
Σi-syntax : {ℓ : Level} (n : ℕ) → (Fin n → Set ℓ) → Set ℓ
Σi-syntax {ℓ} n P = ∃ {lzero} {ℓ} (λ (j : Fin n) → P j)
syntax Σi-syntax {ℓ} n (λ i → B) = Σi[ i ≤ n ] B at ℓ
Σ : ∀ {ℓ} → Row (Set ℓ) → Set ℓ
Σ (n , P) = Σ[ i ∈ Fin n ] (P i)
_≲_ : ∀ {ℓ}{A : Set ℓ} → Row {ℓ} A → Row {ℓ} A → Set ℓ
_≲_ {ℓ} (n , P) (m , Q) = ∀ (i : Fin n) → Σi[ j ≤ m ] (P i ≡ Q j) at ℓ
_·_~_ : ∀ {ℓ} {A : Set ℓ} →
Row {ℓ} A →
Row {ℓ} A →
Row {ℓ} A →
Set ℓ
_·_~_ {ℓ} (l , P) (m , Q) (n , R) =
(∀ (i : Fin n) → _or_ {ℓ} {ℓ} (Σi[ j ≤ l ] (P j ≡ R i) at ℓ) (Σi[ j ≤ m ] (Q j ≡ R i) at ℓ)) ×
(((l , P) ≲ (n , R)) ×
((m , Q) ≲ (n , R)))
·-to-≲L : ∀ {ℓ} {A : Set ℓ} → {ρ₁ ρ₂ ρ₃ : Row {ℓ} A} →
ρ₁ · ρ₂ ~ ρ₃ →
ρ₁ ≲ ρ₃
·-to-≲L (_ , l , _) = l
·-to-≲R : ∀ {ℓ} {A : Set ℓ} → {ρ₁ ρ₂ ρ₃ : Row {ℓ} A} →
ρ₁ · ρ₂ ~ ρ₃ →
ρ₂ ≲ ρ₃
·-to-≲R (_ , _ , r) = r
_pick_ : ∀ {ℓ} {A : Set ℓ} → (ρ : Row {ℓ} A) → Ix {ℓ} ρ → Row {ℓ} A
_pick_ {ℓ} {A} ρ i = sing (snd ρ i)
_delete_ : ∀ {ℓ} {A : Set ℓ} → (ρ : Row {ℓ} A) → Ix {ℓ} ρ → Row {ℓ} A
_delete_ {ℓ} {A} (suc n , f) i = n , (λ j → f (punchIn i j))
lift₁ : ∀ {ℓ} {A B : Set ℓ} → Row {ℓ} (A → B) → A → Row {ℓ} B
lift₁ {A = A} {B = B} (n , P) a = (n , (λ m → P m a))
lift₂ : ∀ {ℓ} {A B : Set ℓ} → (A → B) → Row {ℓ} A → Row {ℓ} B
lift₂ {A = A} {B = B} f (n , P) = (n , (λ m → f (P m)))