{-# OPTIONS --cubical --safe #-} module Data.List.Kleene.Relation.Unary where open import Data.List.Kleene open import Prelude open import Data.Fin open import Relation.Nullary private variable p : Level ◇⁺ : ∀ {A : Type a} (P : A → Type p) → A ⁺ → Type _ ◇⁺ P xs = ∃[ i ] P (xs !⁺ i) ◇⋆ : ∀ {A : Type a} (P : A → Type p) → A ⋆ → Type _ ◇⋆ P xs = ∃[ i ] P (xs !⋆ i) module Exists {a} {A : Type a} {p} (P : A → Type p) where push : ∀ {x xs} → ◇⋆ P xs → ◇⁺ P (x & xs) push (n , x∈xs) = (fs n , x∈xs) pull : ∀ {x xs} → ¬ P x → ◇⁺ P (x & xs) → ◇⋆ P xs pull ¬Px (f0 , p∈xs) = ⊥-elim (¬Px p∈xs) pull ¬Px (fs n , p∈xs) = (n , p∈xs) ◻⁺ : {A : Type a} (P : A → Type p) → A ⁺ → Type _ ◻⁺ P xs = ∀ i → P (xs !⁺ i) ◻⋆ : {A : Type a} (P : A → Type p) → A ⋆ → Type _ ◻⋆ P xs = ∀ i → P (xs !⋆ i) module Forall {a} {A : Type a} {p} (P : A → Type p) where push⁺ : ∀ {x xs} → P x → ◻⋆ P xs → ◻⁺ P (x & xs) push⁺ px pxs f0 = px push⁺ px pxs (fs n) = pxs n