{-# OPTIONS --without-K --safe #-}
module Mints.Semantics.Properties.NoFunExt.Domain where
open import Data.Nat.Properties as Nₚ
open import Lib
open import Mints.Statics.Syntax
open import Mints.Semantics.Domain
O-add-ρ : ∀ n m (ρ : Envs) → O ρ (n + m) ≡ O ρ n + O (ρ ∥ n) m
O-add-ρ zero m ρ = refl
O-add-ρ (suc n) m ρ = trans (cong (proj₁ (ρ 0) +_) (O-add-ρ n m (ρ ∥ 1)))
(sym (+-assoc (proj₁ (ρ 0)) (O (ρ ∥ 1) n) (O (ρ ∥ suc n) m)))
O-vone : ∀ n → O vone n ≡ n
O-vone zero = refl
O-vone (suc n) = cong suc (O-vone n)
O-+ : ∀ (κ : UMoT) n m → O κ (n + m) ≡ O κ n + O (κ ∥ n) m
O-+ κ zero m = refl
O-+ κ (suc n) m
rewrite O-+ (κ ∥ 1) n m = sym (+-assoc (κ 0) (O (κ ∥ 1) n) (O (κ ∥ suc n) m))
O-ø : ∀ κ κ′ n → O (κ ø κ′) n ≡ O κ′ (O κ n)
O-ø κ κ′ zero = refl
O-ø κ κ′ (suc n)
rewrite O-ø (κ ∥ 1) (κ′ ∥ κ 0) n
| O-+ κ′ (κ 0) (O (κ ∥ 1) n) = refl
O-drop : ∀ n ρ → O (drop ρ) n ≡ O ρ n
O-drop zero ρ = refl
O-drop (suc n) ρ = refl
O-↦ : ∀ n ρ a → O (ρ ↦ a) n ≡ O ρ n
O-↦ zero ρ a = refl
O-↦ (suc n) ρ a = refl
O-ρ-+ : ∀ (ρ : Envs) n m → O ρ (n + m) ≡ O ρ n + O (ρ ∥ n) m
O-ρ-+ ρ zero m = refl
O-ρ-+ ρ (suc n) m = trans (cong (proj₁ (ρ 0) +_) (O-ρ-+ (ρ ∥ 1) n m))
(sym (+-assoc (proj₁ (ρ 0)) (O (ρ ∥ 1) n) (O (ρ ∥ suc n) m)))