{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Physics.CausalSet where
open import Data.Nat using (ℕ; zero; suc) renaming (_+_ to _+ℕ_; _≡ᵇ_ to _≡ℕᵇ_)
open import Data.Fin using (Fin; toℕ)
open import Data.Bool using (Bool; true; false; T; _∧_; _∨_)
open import Data.Vec using (allFin; toList)
open import Data.List using (List; _∷_; [])
open import Data.Integer using (ℤ; _+_; _*_; +_)
open import Relation.Nullary using (¬_)
open import Relation.Binary.PropositionalEquality using (_≡_; refl)
boolFilter : ∀ {a} {A : Set a} → (A → Bool) → List A → List A
boolFilter p [] = []
boolFilter p (x ∷ xs) with p x
... | true = x ∷ boolFilter p xs
... | false = boolFilter p xs
sumOver : ∀ {a} {A : Set a} → List A → (A → ℕ) → ℕ
sumOver [] f = 0
sumOver (x ∷ xs) f = f x +ℕ sumOver xs f
module Core (n : ℕ) (_≺_ : Fin n → Fin n → Bool) where
events : List (Fin n)
events = toList (allFin n)
succs : Fin n → List (Fin n)
succs x = boolFilter (λ y → x ≺ y) events
chainsFrom : ℕ → Fin n → ℕ
chainsFrom 0 x = 0
chainsFrom (suc m) x = g m x
where
g : ℕ → Fin n → ℕ
g 0 x = 1
g (suc j) x = sumOver (succs x) (g j)
chains : ℕ → ℕ
chains k = sumOver events (chainsFrom k)
between : ℕ → Fin n → Fin n → ℕ
between 0 x y = 0
between (suc m) x y = h m x
where
h : ℕ → Fin n → ℕ
h 0 z with toℕ z ≡ℕᵇ toℕ y
... | true = 1
... | false = 0
h (suc j) z = sumOver (succs z) (h j)
interior : Fin n → Fin n → List (Fin n)
interior x y =
boolFilter (λ z → (x ≺ z) ∧ (z ≺ y)) events
interval-volume : Fin n → Fin n → ℕ
interval-volume x y = 2 +ℕ sumOver (interior x y) (λ _ → 1)
weighted : List ℤ → ℕ → (ℕ → ℕ) → ℤ
weighted [] k f = + 0
weighted (c ∷ cs) k f = c * + (f k) + weighted cs (suc k) f
curvatureAt : List ℤ → Fin n → Fin n → ℤ
curvatureAt coeffs x y = weighted coeffs 1 (λ k → between k x y)
record IsCausalSet (n : ℕ) (_≺_ : Fin n → Fin n → Bool) : Set where
field
irrefl : ∀ x → ¬ T (_≺_ x x)
trans : ∀ x y z → T (_≺_ x y) → T (_≺_ y z) → T (_≺_ x z)
diamondℕ : ℕ → ℕ → Bool
diamondℕ a b =
((a ≡ℕᵇ 0) ∧ ((b ≡ℕᵇ 1) ∨ (b ≡ℕᵇ 2) ∨ (b ≡ℕᵇ 3)))
∨ (((a ≡ℕᵇ 1) ∨ (a ≡ℕᵇ 2)) ∧ (b ≡ℕᵇ 3))
diamond : Fin 4 → Fin 4 → Bool
diamond x y = diamondℕ (toℕ x) (toℕ y)
open Core 4 diamond
d0 : Fin 4
d0 = Data.Fin.zero
d3 : Fin 4
d3 = Data.Fin.fromℕ 3
diamond-C1 : chains 1 ≡ 4
diamond-C1 = refl
diamond-C2 : chains 2 ≡ 5
diamond-C2 = refl
diamond-C3 : chains 3 ≡ 2
diamond-C3 = refl
diamond-between3 : between 3 d0 d3 ≡ 2
diamond-between3 = refl
diamond-between4 : between 4 d0 d3 ≡ 0
diamond-between4 = refl
diamond-volume : interval-volume d0 d3 ≡ 4
diamond-volume = refl
diamondℕ-irrefl : ∀ a → ¬ T (diamondℕ a a)
diamondℕ-irrefl zero = λ ()
diamondℕ-irrefl (suc zero) = λ ()
diamondℕ-irrefl (suc (suc zero)) = λ ()
diamondℕ-irrefl (suc (suc (suc zero))) = λ ()
diamondℕ-irrefl (suc (suc (suc (suc _)))) = λ ()
diamond-irrefl : ∀ x → ¬ T (diamond x x)
diamond-irrefl x = diamondℕ-irrefl (toℕ x)
diamond-trans : ∀ x y z → T (diamond x y) → T (diamond y z) → T (diamond x z)
diamond-trans x y z p q = trans-helper (toℕ x) (toℕ y) (toℕ z) p q
where
trans-helper : ∀ a b c
→ T (diamondℕ a b) → T (diamondℕ b c) → T (diamondℕ a c)
trans-helper zero (suc zero) (suc (suc (suc zero))) _ _ = _
trans-helper zero (suc (suc zero)) (suc (suc (suc zero))) _ _ = _
trans-helper zero zero _ () _
trans-helper zero (suc zero) zero _ ()
trans-helper zero (suc zero) (suc zero) _ ()
trans-helper zero (suc zero) (suc (suc zero)) _ ()
trans-helper zero (suc zero) (suc (suc (suc (suc _)))) _ ()
trans-helper zero (suc (suc zero)) zero _ ()
trans-helper zero (suc (suc zero)) (suc zero) _ ()
trans-helper zero (suc (suc zero)) (suc (suc zero)) _ ()
trans-helper zero (suc (suc zero)) (suc (suc (suc (suc _)))) _ ()
trans-helper zero (suc (suc (suc zero))) _ _ ()
trans-helper zero (suc (suc (suc (suc _)))) _ () _
trans-helper (suc zero) zero _ () _
trans-helper (suc zero) (suc zero) _ () _
trans-helper (suc zero) (suc (suc zero)) _ () _
trans-helper (suc zero) (suc (suc (suc zero))) _ _ ()
trans-helper (suc zero) (suc (suc (suc (suc _)))) _ () _
trans-helper (suc (suc zero)) zero _ () _
trans-helper (suc (suc zero)) (suc zero) _ () _
trans-helper (suc (suc zero)) (suc (suc zero)) _ () _
trans-helper (suc (suc zero)) (suc (suc (suc zero))) _ _ ()
trans-helper (suc (suc zero)) (suc (suc (suc (suc _)))) _ () _
trans-helper (suc (suc (suc zero))) _ _ () _
trans-helper (suc (suc (suc (suc _)))) _ _ () _
diamond-causal : IsCausalSet 4 diamond
diamond-causal = record
{ irrefl = diamond-irrefl
; trans = diamond-trans
}