{-# OPTIONS --without-K --safe #-}

-- Properties of domain-level operations that do not rely on functional extensionality
module Mint.Semantics.Properties.NoFunExt.Domain where

open import Data.Nat.Properties as Nₚ

open import Lib
open import Mint.Statics.Syntax
open import Mint.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)))