{-# OPTIONS --cubical --guardedness #-}
module HyperPositive where
open import Prelude
infixr 4 _↬_
{-# NO_POSITIVITY_CHECK #-}
record _↬_ (A : Type a) (B : Type b) : Type (a ℓ⊔ b) where
inductive; constructor hyp
field invoke : ((A ↬ B) → A) → B
open _↬_
open import Data.List using (List; _∷_; []; foldr)
module _ {a b} {A : Type a} {B : Type b} where
XT = List (A × B) ↬ (A → List (A × B)) → List (A × B)
YT = List (A × B) ↬ (A → List (A × B))
yfld : List B → YT
yfld = foldr f n
where
f : B → YT → YT
f y yk .invoke xk x = (x , y) ∷ xk yk
n : YT
n .invoke _ _ = []
xfld : List A → XT
xfld = foldr f n
where
f : A → XT → XT
f x xk yk = yk .invoke xk x
n : XT
n _ = []
zip : List A → List B → List (A × B)
zip xs ys = xfld xs (yfld ys)
open import Data.List using (_⋯_)
open import Data.List.Syntax
_ : zip (1 ⋯ 5) (11 ⋯ 15) ≡ [ 5 ][ (1 , 11) , (2 , 12) , (3 , 13) , (4 , 14) , (5 , 15) ]
_ = refl
open import Data.List
record Tree (A : Type a) : Type a where
inductive; pattern; constructor _&_
field
root : A
children : List (Tree A)
open Tree
{-# NON_TERMINATING #-}
loop : (A ↬ A) → A
loop k = k .invoke loop
{-# TERMINATING #-}
bfe : Tree A → List A
bfe t = f t d .invoke loop zero
where
f : Tree A → ((ℕ → List A) ↬ (ℕ → List A)) → ((ℕ → List A) ↬ (ℕ → List A))
f (x & xs) fw .invoke bw n = x ∷ fw .invoke (bw ∘ flip (foldr f) xs) (suc n)
d : ((ℕ → List A) ↬ (ℕ → List A))
d .invoke k zero = []
d .invoke k (suc n) = k d n