Advertisement
Guest User

Untitled

a guest
May 27th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.38 KB | None | 0 0
  1. module Prelude where
  2.  
  3. open import Agda.Primitive public
  4. using (_⊔_ ; lsuc)
  5.  
  6.  
  7. -- Truth.
  8.  
  9. open import Agda.Builtin.Unit public
  10. using (⊤)
  11. renaming (tt to ∅)
  12.  
  13.  
  14. -- Strong existence.
  15.  
  16. record Σ {ℓ ℓ′} (X : Set ℓ) (Y : X → Set ℓ′) : Set (ℓ ⊔ ℓ′) where
  17. instance constructor _,_
  18. field
  19. π₁ : X
  20. π₂ : Y π₁
  21. open Σ public
  22.  
  23. ∃ : ∀ {ℓ ℓ′} {X : Set ℓ} → (X → Set ℓ′) → Set (ℓ ⊔ ℓ′)
  24. ∃ = Σ _
  25.  
  26. mapΣ : ∀ {ℓ ℓ′} {X : Set ℓ} {Y : X → Set ℓ′}
  27. {ℓₘ ℓₘ′} {Xₘ : Set ℓₘ} {Yₘ : Xₘ → Set ℓₘ′}
  28. (f : X → Xₘ) (g : ∀ {x} → Y x → Yₘ (f x)) →
  29. Σ X Y → Σ Xₘ Yₘ
  30. mapΣ f g (x , y) = f x , g y
  31.  
  32. mapΣ₂ : ∀ {ℓ ℓ′} {X : Set ℓ} {Y : X → Set ℓ′}
  33. {ℓ₂ ℓ₂′} {X₂ : Set ℓ₂} {Y₂ : X₂ → Set ℓ₂′}
  34. {ℓₘ ℓₘ′} {Xₘ : Set ℓₘ} {Yₘ : Xₘ → Set ℓₘ′}
  35. (f : X → X₂ → Xₘ) (g : ∀ {x x₂} → Y x → Y₂ x₂ → Yₘ (f x x₂)) →
  36. Σ X Y → Σ X₂ Y₂ → Σ Xₘ Yₘ
  37. mapΣ₂ f g (x , y) (x₂ , y₂) = f x x₂ , g y y₂
  38.  
  39.  
  40. -- Conjunction.
  41.  
  42. infixr 2 _∧_
  43. _∧_ : ∀ {ℓ ℓ′} → Set ℓ → Set ℓ′ → Set (ℓ ⊔ ℓ′)
  44. X ∧ Y = Σ X (λ x → Y)
  45.  
  46.  
  47. -- Built-in implication.
  48.  
  49. id : ∀ {ℓ} {X : Set ℓ} → X → X
  50. id x = x
  51.  
  52. const : ∀ {ℓ ℓ′} {X : Set ℓ} {Y : Set ℓ′} → X → Y → X
  53. const x y = x
  54.  
  55. flip : ∀ {ℓ ℓ′ ℓ″} {X : Set ℓ} {Y : Set ℓ′} {Z : Set ℓ″} →
  56. (X → Y → Z) → Y → X → Z
  57. flip P y x = P x y
  58.  
  59. ap : ∀ {ℓ ℓ′ ℓ″} {X : Set ℓ} {Y : Set ℓ′} {Z : Set ℓ″} →
  60. (X → Y → Z) → (X → Y) → X → Z
  61. ap f g x = f x (g x)
  62.  
  63. infixr 9 _∘_
  64. _∘_ : ∀ {ℓ ℓ′ ℓ″} {X : Set ℓ} {Y : Set ℓ′} {Z : Set ℓ″} →
  65. (Y → Z) → (X → Y) → X → Z
  66. f ∘ g = λ x → f (g x)
  67.  
  68. refl→ : ∀ {ℓ} {X : Set ℓ} → X → X
  69. refl→ = id
  70.  
  71. trans→ : ∀ {ℓ ℓ′ ℓ″} {X : Set ℓ} {Y : Set ℓ′} {Z : Set ℓ″} →
  72. (X → Y) → (Y → Z) → X → Z
  73. trans→ = flip _∘_
  74.  
  75.  
  76. -- Disjunction.
  77.  
  78. infixr 1 _∨_
  79. data _∨_ {ℓ ℓ′} (X : Set ℓ) (Y : Set ℓ′) : Set (ℓ ⊔ ℓ′) where
  80. ι₁ : X → X ∨ Y
  81. ι₂ : Y → X ∨ Y
  82.  
  83. elim∨ : ∀ {ℓ ℓ′ ℓ″} {X : Set ℓ} {Y : Set ℓ′} {Z : Set ℓ″} →
  84. X ∨ Y → (X → Z) → (Y → Z) → Z
  85. elim∨ (ι₁ x) f g = f x
  86. elim∨ (ι₂ y) f g = g y
  87.  
  88.  
  89. -- Falsehood.
  90.  
  91. data ⊥ : Set where
  92.  
  93. elim⊥ : ∀ {ℓ} {X : Set ℓ} → ⊥ → X
  94. elim⊥ ()
  95.  
  96.  
  97. -- Negation.
  98.  
  99. infix 3 ¬_
  100. ¬_ : ∀ {ℓ} → Set ℓ → Set ℓ
  101. ¬ X = X → ⊥
  102.  
  103. _↯_ : ∀ {ℓ ℓ′} {X : Set ℓ} {Y : Set ℓ′} → X → ¬ X → Y
  104. p ↯ ¬p = elim⊥ (¬p p)
  105.  
  106.  
  107. -- Built-in equality.
  108.  
  109. open import Agda.Builtin.Equality public
  110. using (_≡_ ; refl)
  111.  
  112. infix 4 _≢_
  113. _≢_ : ∀ {ℓ} {X : Set ℓ} → X → X → Set ℓ
  114. x ≢ x′ = ¬ (x ≡ x′)
  115.  
  116. trans : ∀ {ℓ} {X : Set ℓ} {x x′ x″ : X} → x ≡ x′ → x′ ≡ x″ → x ≡ x″
  117. trans refl refl = refl
  118.  
  119. sym : ∀ {ℓ} {X : Set ℓ} {x x′ : X} → x ≡ x′ → x′ ≡ x
  120. sym refl = refl
  121.  
  122. subst : ∀ {ℓ ℓ′} {X : Set ℓ} → (P : X → Set ℓ′) →
  123. ∀ {x x′} → x ≡ x′ → P x → P x′
  124. subst P refl p = p
  125.  
  126. cong : ∀ {ℓ ℓ′} {X : Set ℓ} {Y : Set ℓ′} → (f : X → Y) →
  127. ∀ {x x′} → x ≡ x′ → f x ≡ f x′
  128. cong f refl = refl
  129.  
  130. cong₂ : ∀ {ℓ ℓ′ ℓ″} {X : Set ℓ} {Y : Set ℓ′} {Z : Set ℓ″} → (f : X → Y → Z) →
  131. ∀ {x x′ y y′} → x ≡ x′ → y ≡ y′ → f x y ≡ f x′ y′
  132. cong₂ f refl refl = refl
  133.  
  134. cong₃ : ∀ {ℓ ℓ′ ℓ″ ℓ‴} {X : Set ℓ} {Y : Set ℓ′} {Z : Set ℓ″} {A : Set ℓ‴} →
  135. (f : X → Y → Z → A) →
  136. ∀ {x x′ y y′ z z′} → x ≡ x′ → y ≡ y′ → z ≡ z′ → f x y z ≡ f x′ y′ z′
  137. cong₃ f refl refl refl = refl
  138.  
  139.  
  140. -- Equational reasoning with built-in equality.
  141.  
  142. module ≡-Reasoning {ℓ} {X : Set ℓ} where
  143. infix 1 begin_
  144. begin_ : ∀ {x x′ : X} → x ≡ x′ → x ≡ x′
  145. begin p = p
  146.  
  147. infixr 2 _≡⟨⟩_
  148. _≡⟨⟩_ : ∀ (x {x′} : X) → x ≡ x′ → x ≡ x′
  149. x ≡⟨⟩ p = p
  150.  
  151. infixr 2 _≡⟨_⟩_
  152. _≡⟨_⟩_ : ∀ (x {x′ x″} : X) → x ≡ x′ → x′ ≡ x″ → x ≡ x″
  153. x ≡⟨ p ⟩ q = trans p q
  154.  
  155. infix 3 _∎
  156. _∎ : ∀ (x : X) → x ≡ x
  157. x ∎ = refl
  158.  
  159. open ≡-Reasoning public
  160.  
  161.  
  162. -- Booleans.
  163.  
  164. open import Agda.Builtin.Bool public
  165. using (Bool ; false ; true)
  166.  
  167. elimBool : ∀ {ℓ} {X : Set ℓ} → Bool → X → X → X
  168. elimBool false z s = z
  169. elimBool true z s = s
  170.  
  171.  
  172. -- Conditionals.
  173.  
  174. data Maybe {ℓ} (X : Set ℓ) : Set ℓ where
  175. nothing : Maybe X
  176. just : X → Maybe X
  177.  
  178. {-# HASKELL type AgdaMaybe _ x = Maybe x #-}
  179. {-# COMPILED_DATA Maybe MAlonzo.Code.Data.Maybe.Base.AgdaMaybe Just Nothing #-}
  180.  
  181. elimMaybe : ∀ {ℓ ℓ′} {X : Set ℓ} {Y : Set ℓ′} → Maybe X → Y → (X → Y) → Y
  182. elimMaybe nothing z f = z
  183. elimMaybe (just x) z f = f x
  184.  
  185.  
  186. -- Naturals.
  187.  
  188. open import Agda.Builtin.Nat public
  189. using (Nat ; zero ; suc)
  190.  
  191. elimNat : ∀ {ℓ} {X : Set ℓ} → Nat → X → (Nat → X → X) → X
  192. elimNat zero z f = z
  193. elimNat (suc n) z f = f n (elimNat n z f)
  194.  
  195.  
  196. -- Finite sets.
  197.  
  198. data Fin : Nat → Set where
  199. zero : ∀ {n} → Fin (suc n)
  200. suc : ∀ {n} → Fin n → Fin (suc n)
  201.  
  202.  
  203. -- Overloaded literals.
  204.  
  205. record Number {ℓ} (X : Set ℓ) : Set (lsuc ℓ) where
  206. field
  207. Constraint : Nat → Set ℓ
  208. fromNat : (n : Nat) {{_ : Constraint n}} → X
  209. open Number {{...}} public
  210. using (fromNat)
  211. {-# BUILTIN FROMNAT fromNat #-}
  212.  
  213. data IsTrue : Bool → Set where
  214. isTrue : IsTrue true
  215.  
  216. instance
  217. trueIsTrue : IsTrue true
  218. trueIsTrue = isTrue
  219.  
  220. infix 5 _<?_
  221. _<?_ : Nat → Nat → Bool
  222. zero <? zero = false
  223. zero <? suc m = true
  224. suc n <? zero = false
  225. suc n <? suc m = n <? m
  226.  
  227. infixl 3 _&&_
  228. _&&_ : Bool → Bool → Bool
  229. true && true = true
  230. _ && _ = false
  231.  
  232. natToFin : ∀ {n} (m : Nat) {{_ : IsTrue (m <? n)}} → Fin n
  233. natToFin {zero} zero {{()}}
  234. natToFin {zero} (suc m) {{()}}
  235. natToFin {suc n} zero {{isTrue}} = zero
  236. natToFin {suc n} (suc m) {{p}} = suc (natToFin m)
  237.  
  238. instance
  239. NatIsNumber : Number Nat
  240. Number.Constraint NatIsNumber n = ⊤
  241. Number.fromNat NatIsNumber n = n
  242.  
  243. instance
  244. FinIsNumber : ∀ {n} → Number (Fin n)
  245. Number.Constraint (FinIsNumber {n}) m = IsTrue (m <? n)
  246. Number.fromNat FinIsNumber m = natToFin m
  247.  
  248.  
  249. -- Stacks.
  250.  
  251. data Stack (X : Set) : Set where
  252. ∅ : Stack X
  253. _,_ : Stack X → X → Stack X
  254.  
  255. module StackThings {X : Set} where
  256. size : Stack X → Nat
  257. size ∅ = zero
  258. size (Γ , A) = suc (size Γ)
  259.  
  260. get : (Γ : Stack X) (n : Nat) {{_ : IsTrue (n <? size Γ)}} → X
  261. get ∅ zero {{()}}
  262. get ∅ (suc n) {{()}}
  263. get (Γ , A) zero {{isTrue}} = A
  264. get (Γ , B) (suc n) {{p}} = get Γ n
  265.  
  266. infix 3 _∈_
  267. data _∈_ (A : X) : Stack X → Set where
  268. zero : ∀ {Γ} → A ∈ Γ , A
  269. suc : ∀ {B Γ} → A ∈ Γ → A ∈ Γ , B
  270.  
  271. natTo∈ : ∀ {Γ : Stack X} (n : Nat) {{_ : IsTrue (n <? size Γ)}} → get Γ n ∈ Γ
  272. natTo∈ {∅} zero {{()}}
  273. natTo∈ {∅} (suc n) {{()}}
  274. natTo∈ {Γ , A} zero {{isTrue}} = zero
  275. natTo∈ {Γ , B} (suc n) {{p}} = suc (natTo∈ n)
  276.  
  277. instance
  278. ∈IsNumber : ∀ {A : X} {Γ} → Number (A ∈ Γ)
  279. Number.Constraint (∈IsNumber {A} {Γ}) n = Σ (IsTrue (n <? size Γ)) (λ p → A ≡ get Γ n {{p}})
  280. Number.fromNat ∈IsNumber n {{p , refl}} = natTo∈ n {{p}}
  281.  
  282. infix 3 _∈⟨_⟩_
  283. data _∈⟨_⟩_ (A : X) : Nat → Stack X → Set where
  284. zero : ∀ {Γ} → A ∈⟨ zero ⟩ Γ , A
  285. suc : ∀ {B n Γ} → A ∈⟨ n ⟩ Γ → A ∈⟨ suc n ⟩ Γ , B
  286.  
  287. natTo∈′ : ∀ {Γ : Stack X} (n : Nat) {{_ : IsTrue (n <? size Γ)}} → get Γ n ∈⟨ n ⟩ Γ
  288. natTo∈′ {∅} zero {{()}}
  289. natTo∈′ {∅} (suc n) {{()}}
  290. natTo∈′ {Γ , A} zero {{isTrue}} = zero
  291. natTo∈′ {Γ , B} (suc n) {{p}} = suc (natTo∈′ n)
  292.  
  293. instance
  294. ∈′IsNumber : ∀ {A : X} {n Γ} → Number (A ∈⟨ n ⟩ Γ)
  295. Number.Constraint (∈′IsNumber {A} {n} {Γ}) m = Σ (IsTrue (n <? size Γ)) (λ p → A ≡ get Γ n {{p}} ∧ m ≡ n)
  296. Number.fromNat ∈′IsNumber m {{p , (refl , refl)}} = natTo∈′ m {{p}}
  297.  
  298. infix 3 _⊆_
  299. data _⊆_ : Stack X → Stack X → Set where
  300. done : ∅ ⊆ ∅
  301. skip : ∀ {A Γ Γ′} → Γ ⊆ Γ′ → Γ ⊆ Γ′ , A
  302. keep : ∀ {A Γ Γ′} → Γ ⊆ Γ′ → Γ , A ⊆ Γ′ , A
  303.  
  304. refl⊆ : ∀ {Γ} → Γ ⊆ Γ
  305. refl⊆ {∅} = done
  306. refl⊆ {Γ , A} = keep refl⊆
  307.  
  308. trans⊆ : ∀ {Γ Γ′ Γ″} → Γ ⊆ Γ′ → Γ′ ⊆ Γ″ → Γ ⊆ Γ″
  309. trans⊆ done η′ = η′
  310. trans⊆ η (skip η′) = skip (trans⊆ η η′)
  311. trans⊆ (skip η) (keep η′) = skip (trans⊆ η η′)
  312. trans⊆ (keep η) (keep η′) = keep (trans⊆ η η′)
  313.  
  314. inf⊆ : ∀ {Γ} → ∅ ⊆ Γ
  315. inf⊆ {∅} = done
  316. inf⊆ {Γ , A} = skip inf⊆
  317.  
  318. weak⊆ : ∀ {A Γ} → Γ ⊆ Γ , A
  319. weak⊆ = skip refl⊆
  320.  
  321. move∈ : ∀ {A : X} {Γ Γ′} → Γ ⊆ Γ′ → A ∈ Γ → A ∈ Γ′
  322. move∈ done ()
  323. move∈ (skip η) i = suc (move∈ η i)
  324. move∈ (keep η) zero = zero
  325. move∈ (keep η) (suc i) = suc (move∈ η i)
  326.  
  327. move∈′ : ∀ {A : X} {n Γ Γ′} → Γ ⊆ Γ′ → A ∈⟨ n ⟩ Γ → Σ Nat (λ n′ → A ∈⟨ n′ ⟩ Γ′)
  328. move∈′ done ()
  329. move∈′ (skip η) i = mapΣ suc suc (move∈′ η i)
  330. move∈′ (keep η) zero = zero , zero
  331. move∈′ (keep η) (suc i) = mapΣ suc suc (move∈′ η i)
  332.  
  333. record StackPair (X Y : Set) : Set where
  334. constructor _⁏_
  335. field
  336. π₁ : Stack X
  337. π₂ : Stack Y
  338. open StackPair public
  339.  
  340. module StackPairThings {X Y : Set} where
  341. open StackThings
  342.  
  343. infix 3 _⊆²_
  344. _⊆²_ : StackPair X Y → StackPair X Y → Set
  345. Γ ⁏ Δ ⊆² Γ′ ⁏ Δ′ = Γ ⊆ Γ′ ∧ Δ ⊆ Δ′
  346.  
  347. refl⊆² : ∀ {Γ Δ} → Γ ⁏ Δ ⊆² Γ ⁏ Δ
  348. refl⊆² = refl⊆ , refl⊆
  349.  
  350. trans⊆² : ∀ {Γ Γ′ Γ″ Δ Δ′ Δ″} → Γ ⁏ Δ ⊆² Γ′ ⁏ Δ′ → Γ′ ⁏ Δ′ ⊆² Γ″ ⁏ Δ″ → Γ ⁏ Δ ⊆² Γ″ ⁏ Δ″
  351. trans⊆² (η , μ) (η′ , μ′) = trans⊆ η η′ , trans⊆ μ μ′
  352.  
  353.  
  354. -- Sized stacks.
  355.  
  356. data SStack (X : Set) : Nat → Set where
  357. ∅ : SStack X zero
  358. _,_ : ∀ {n} → SStack X n → X → SStack X (suc n)
  359.  
  360. module SStackThings {X : Set} where
  361. get : ∀ {n} → (Γ : SStack X n) (m : Nat) {{_ : IsTrue (m <? n)}} → X
  362. get ∅ zero {{()}}
  363. get ∅ (suc n) {{()}}
  364. get (Γ , A) zero {{isTrue}} = A
  365. get (Γ , B) (suc n) {{p}} = get Γ n
  366.  
  367. get′ : ∀ {n} → (Γ : SStack X n) (k : Fin n) → X
  368. get′ ∅ ()
  369. get′ (Γ , A) zero = A
  370. get′ (Γ , B) (suc k) = get′ Γ k
  371.  
  372. infix 3 _∈_
  373. data _∈_ (A : X) : ∀ {n} → SStack X n → Set where
  374. zero : ∀ {n} {Γ : SStack X n} → A ∈ Γ , A
  375. suc : ∀ {B n} {Γ : SStack X n} → A ∈ Γ → A ∈ Γ , B
  376.  
  377. natTo∈ : ∀ {n} {Γ : SStack X n} (m : Nat) {{_ : IsTrue (m <? n)}} → get Γ m ∈ Γ
  378. natTo∈ {Γ = ∅} zero {{()}}
  379. natTo∈ {Γ = ∅} (suc m) {{()}}
  380. natTo∈ {Γ = Γ , A} zero {{isTrue}} = zero
  381. natTo∈ {Γ = Γ , B} (suc m) {{p}} = suc (natTo∈ m)
  382.  
  383. instance
  384. ∈IsNumber : ∀ {n} {Γ : SStack X n} {A} → Number (A ∈ Γ)
  385. Number.Constraint (∈IsNumber {n} {Γ} {A}) m = Σ (IsTrue (m <? n)) (λ p → A ≡ get Γ m {{p}})
  386. Number.fromNat ∈IsNumber n {{p , refl}} = natTo∈ n {{p}}
  387.  
  388. infix 3 _∈⟨_⟩_
  389. data _∈⟨_⟩_ (A : X) : ∀ {n} → Fin n → SStack X n → Set where
  390. zero : ∀ {n} {Γ : SStack X n} → A ∈⟨ zero ⟩ Γ , A
  391. suc : ∀ {B n k} {Γ : SStack X n} → A ∈⟨ k ⟩ Γ → A ∈⟨ suc k ⟩ Γ , B
  392.  
  393. natTo∈′ : ∀ {n} {Γ : SStack X n} (k : Fin n) → get′ Γ k ∈⟨ k ⟩ Γ
  394. natTo∈′ {Γ = ∅} ()
  395. natTo∈′ {Γ = Γ , A} zero = zero
  396. natTo∈′ {Γ = Γ , B} (suc m) = suc (natTo∈′ m)
  397.  
  398. instance
  399. ∈′IsNumber : ∀ {n} {Γ : SStack X n} {A k} → Number (A ∈⟨ k ⟩ Γ)
  400. Number.Constraint (∈′IsNumber {n} {Γ} {A} {k}) m = Σ (IsTrue (m <? n)) (λ p → A ≡ get′ Γ k ∧ natToFin m {{p}} ≡ k)
  401. Number.fromNat ∈′IsNumber m {{p , (refl , refl)}} = natTo∈′ (natToFin m {{p}})
  402.  
  403. infix 3 _⊆_
  404. data _⊆_ : ∀ {n n′} → SStack X n → SStack X n′ → Set where
  405. done : ∅ ⊆ ∅
  406. skip : ∀ {A n n′} {Γ : SStack X n} {Γ′ : SStack X n′} → Γ ⊆ Γ′ → Γ ⊆ Γ′ , A
  407. keep : ∀ {A n n′} {Γ : SStack X n} {Γ′ : SStack X n′} → Γ ⊆ Γ′ → Γ , A ⊆ Γ′ , A
  408.  
  409. refl⊆ : ∀ {n} {Γ : SStack X n} → Γ ⊆ Γ
  410. refl⊆ {Γ = ∅} = done
  411. refl⊆ {Γ = Γ , A} = keep refl⊆
  412.  
  413. trans⊆ : ∀ {n n′ n″} {Γ : SStack X n} {Γ′ : SStack X n′} {Γ″ : SStack X n″} →
  414. Γ ⊆ Γ′ → Γ′ ⊆ Γ″ → Γ ⊆ Γ″
  415. trans⊆ done η′ = η′
  416. trans⊆ η (skip η′) = skip (trans⊆ η η′)
  417. trans⊆ (skip η) (keep η′) = skip (trans⊆ η η′)
  418. trans⊆ (keep η) (keep η′) = keep (trans⊆ η η′)
  419.  
  420. inf⊆ : ∀ {n} {Γ : SStack X n} → ∅ ⊆ Γ
  421. inf⊆ {Γ = ∅} = done
  422. inf⊆ {Γ = Γ , A} = skip inf⊆
  423.  
  424. weak⊆ : ∀ {n} {Γ : SStack X n} {A} → Γ ⊆ Γ , A
  425. weak⊆ = skip refl⊆
  426.  
  427. move∈ : ∀ {n n′} {Γ : SStack X n} {Γ′ : SStack X n′} {A} →
  428. Γ ⊆ Γ′ → A ∈ Γ → A ∈ Γ′
  429. move∈ done ()
  430. move∈ (skip η) i = suc (move∈ η i)
  431. move∈ (keep η) zero = zero
  432. move∈ (keep η) (suc i) = suc (move∈ η i)
  433.  
  434. move∈′ : ∀ {n n′} {Γ : SStack X n} {Γ′ : SStack X n′} {A k} →
  435. Γ ⊆ Γ′ → A ∈⟨ k ⟩ Γ → Σ (Fin n′) (λ k′ → A ∈⟨ k′ ⟩ Γ′)
  436. move∈′ done ()
  437. move∈′ (skip η) i = mapΣ suc suc (move∈′ η i)
  438. move∈′ (keep η) zero = zero , zero
  439. move∈′ (keep η) (suc i) = mapΣ suc suc (move∈′ η i)
  440.  
  441. infixl 4 _⁏_
  442. record SStackPair (X Y : Set) (n m : Nat) : Set where
  443. constructor _⁏_
  444. field
  445. π₁ : SStack X n
  446. π₂ : SStack Y m
  447. open SStackPair public
  448.  
  449. module SStackPairThings {X Y : Set} where
  450. open SStackThings
  451.  
  452. infix 3 _⊆²_
  453. _⊆²_ : ∀ {n n′ m m′} → SStackPair X Y n m → SStackPair X Y n′ m′ → Set
  454. Γ ⁏ Δ ⊆² Γ′ ⁏ Δ′ = Γ ⊆ Γ′ ∧ Δ ⊆ Δ′
  455.  
  456. refl⊆² : ∀ {n m} {Γ : SStack X n} {Δ : SStack Y m} →
  457. Γ ⁏ Δ ⊆² Γ ⁏ Δ
  458. refl⊆² = refl⊆ , refl⊆
  459.  
  460. trans⊆² : ∀ {n n′ n″} {Γ : SStack X n} {Γ′ : SStack X n′} {Γ″ : SStack X n″}
  461. {m m′ m″} {Δ : SStack Y m} {Δ′ : SStack Y m′} {Δ″ : SStack Y m″} →
  462. Γ ⁏ Δ ⊆² Γ′ ⁏ Δ′ → Γ′ ⁏ Δ′ ⊆² Γ″ ⁏ Δ″ → Γ ⁏ Δ ⊆² Γ″ ⁏ Δ″
  463. trans⊆² (η , μ) (η′ , μ′) = trans⊆ η η′ , trans⊆ μ μ′
  464.  
  465.  
  466. -- Predicates.
  467.  
  468. Pred : ∀ {ℓ} → Set ℓ → Set (lsuc ℓ)
  469. Pred {ℓ} X = X → Set ℓ
  470.  
  471. module _ {X : Set} where
  472. open StackThings
  473.  
  474. data All (P : Pred X) : Pred (Stack X) where
  475. ∅ : All P ∅
  476. _,_ : ∀ {A Γ} → All P Γ → P A → All P (Γ , A)
  477.  
  478. mapAll : ∀ {P Q Γ} → (∀ {A} → P A → Q A) → All P Γ → All Q Γ
  479. mapAll η ∅ = ∅
  480. mapAll η (γ , a) = mapAll η γ , η a
  481.  
  482. lookupAll : ∀ {A : X} {Γ P} → A ∈ Γ → All P Γ → P A
  483. lookupAll zero (γ , a) = a
  484. lookupAll (suc i) (γ , b) = lookupAll i γ
  485.  
  486. lookupAll′ : ∀ {A : X} {n Γ P} → A ∈⟨ n ⟩ Γ → All P Γ → P A
  487. lookupAll′ zero (γ , a) = a
  488. lookupAll′ (suc i) (γ , b) = lookupAll′ i γ
  489.  
  490. module _ {X : Set} where
  491. open SStackThings
  492.  
  493. data SAll (P : Pred X) : ∀ {n} → Pred (SStack X n) where
  494. ∅ : SAll P ∅
  495. _,_ : ∀ {A n} {Γ : SStack X n} → SAll P Γ → P A → SAll P (Γ , A)
  496.  
  497. mapSAll : ∀ {n} {Γ : SStack X n} {P Q} → (∀ {A} → P A → Q A) → SAll P Γ → SAll Q Γ
  498. mapSAll η ∅ = ∅
  499. mapSAll η (γ , a) = mapSAll η γ , η a
  500.  
  501. lookupSAll : ∀ {n} {Γ : SStack X n} {P A} → A ∈ Γ → SAll P Γ → P A
  502. lookupSAll zero (γ , a) = a
  503. lookupSAll (suc i) (γ , b) = lookupSAll i γ
  504.  
  505. lookupSAll′ : ∀ {n} {Γ : SStack X n} {P A k} → A ∈⟨ k ⟩ Γ → SAll P Γ → P A
  506. lookupSAll′ zero (γ , a) = a
  507. lookupSAll′ (suc i) (γ , b) = lookupSAll′ i γ
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement