import Graded.Modality
module Graded.Modality.Properties.Subtraction
{a} {M : Set a}
(open Graded.Modality M)
(𝕄 : Semiring-with-meet)
where
open Semiring-with-meet 𝕄
open import Graded.Modality.Properties.Addition 𝕄
open import Graded.Modality.Properties.Meet 𝕄
open import Graded.Modality.Properties.PartialOrder 𝕄
open import Tools.Empty
open import Tools.Function
open import Tools.Product
open import Tools.PropositionalEquality
private variable
p p′ q q′ r r′ ∞ : M
infix 4 _-_≤_
_-_≤_ : (p q r : M) → Set a
p - q ≤ r = p ≤ r + q
infix 4 _-_≡_
_-_≡_ : (p q r : M) → Set a
p - q ≡ r = Least-such-that (p - q ≤_) r
opaque
-≡-functional : p - q ≡ r → p - q ≡ r′ → r ≡ r′
-≡-functional (p-q≤r , least) (p-q≤r′ , least′) =
≤-antisym (least _ p-q≤r′) (least′ _ p-q≤r)
opaque
-≡≤-monotoneˡ : p ≤ p′ → p - q ≡ r → p′ - q ≤ r′ → r ≤ r′
-≡≤-monotoneˡ p≤p′ (p≤q+r , P) p′≤q+r′ =
P _ (≤-trans p≤p′ p′≤q+r′)
opaque
-≡-monotoneˡ : p ≤ p′ → p - q ≡ r → p′ - q ≡ r′ → r ≤ r′
-≡-monotoneˡ p≤p′ p-q≡r (p′≤q+r′ , P′) =
-≡≤-monotoneˡ p≤p′ p-q≡r p′≤q+r′
opaque
-≡-antitoneʳ : q ≤ q′ → p - q ≡ r → p - q′ ≡ r′ → r′ ≤ r
-≡-antitoneʳ q≤q′ (p≤q+r , P) (p≤q′+r′ , P′) =
P′ _ (≤-trans p≤q+r (+-monotoneʳ q≤q′))
opaque
p-𝟘≤p : p - 𝟘 ≤ p
p-𝟘≤p = ≤-reflexive (sym (+-identityʳ _))
opaque
p-𝟘≡p : p - 𝟘 ≡ p
p-𝟘≡p = p-𝟘≤p , (λ q p≤q+𝟘 → ≤-trans p≤q+𝟘 (≤-reflexive (+-identityʳ q)))
opaque
p-𝟘≤ : p - 𝟘 ≤ q → p ≤ q
p-𝟘≤ p≤q+𝟘 = ≤-trans p≤q+𝟘 (≤-reflexive (+-identityʳ _))
opaque
p-𝟘≡ : p - 𝟘 ≡ q → p ≡ q
p-𝟘≡ p-𝟘≡q = -≡-functional p-𝟘≡p p-𝟘≡q
opaque
p-p≤𝟘 : p - p ≤ 𝟘
p-p≤𝟘 = ≤-reflexive (sym (+-identityˡ _))
opaque
∞-p≤∞ : (∀ {q} → ∞ ≤ q) → ∞ - p ≤ ∞
∞-p≤∞ ∞≤ = ∞≤
opaque
∞-p≡∞ : (∀ {q} → ∞ ≤ q) → (p : M) → ∞ - p ≡ ∞
∞-p≡∞ ∞≤ _ = ∞-p≤∞ ∞≤ , λ _ _ → ∞≤
opaque
-≤∧ : p - q ≤ r → p - q ≤ r′ → p - q ≤ (r ∧ r′)
-≤∧ {p} {q} {r} {r′} ≤r ≤r′ = begin
p ≡⟨ ≤r′ ⟩
p ∧ (r′ + q) ≡⟨ ∧-congʳ ≤r ⟩
(p ∧ (r + q)) ∧ (r′ + q) ≡⟨ ∧-assoc p (r + q) (r′ + q) ⟩
p ∧ ((r + q) ∧ (r′ + q)) ≡˘⟨ ∧-congˡ (+-distribʳ-∧ q r r′) ⟩
p ∧ (r ∧ r′ + q) ∎
where
open import Tools.Reasoning.PropositionalEquality
opaque
p+q-r≤p-r+q : p - q ≤ r → (p′ : M)
→ (p + p′ - q ≤ p′ + r)
p+q-r≤p-r+q {p} {q} {r} p≤r+q p′ = begin
p + p′ ≤⟨ +-monotoneˡ p≤r+q ⟩
(r + q) + p′ ≈⟨ +-comm _ _ ⟩
p′ + (r + q) ≈˘⟨ +-assoc p′ r q ⟩
(p′ + r) + q ∎
where
open import Tools.Reasoning.PartialOrder ≤-poset
Supports-subtraction : Set a
Supports-subtraction =
∀ {p q r} → p - q ≤ r → ∃ λ r′ → p - q ≡ r′
module Addition≡Meet (+≡∧ : ∀ p q → p + q ≡ p ∧ q) where
opaque
p-q≤p : p ≤ q → p - q ≤ p
p-q≤p {p} {q} p≤q = begin
p ≡˘⟨ ∧-idem p ⟩
p ∧ p ≡˘⟨ +≡∧ p p ⟩
p + p ≤⟨ +-monotoneʳ p≤q ⟩
p + q ∎
where
open import Tools.Reasoning.PartialOrder ≤-poset
opaque
p-q≡p : p ≤ q → p - q ≡ p
p-q≡p {p} {q} p≤q = p-q≤p p≤q , (λ r p≤r+q → begin
p ≤⟨ p≤r+q ⟩
r + q ≡⟨ +≡∧ r q ⟩
r ∧ q ≤⟨ ∧-decreasingˡ r q ⟩
r ∎)
where
open import Tools.Reasoning.PartialOrder ≤-poset
opaque
p-q≤r→p≤q : p - q ≤ r → p ≤ q
p-q≤r→p≤q {p} {q} {r} p≤r+q = begin
p ≤⟨ p≤r+q ⟩
r + q ≡⟨ +≡∧ r q ⟩
r ∧ q ≤⟨ ∧-decreasingʳ r q ⟩
q ∎
where
open import Tools.Reasoning.PartialOrder ≤-poset
opaque
p-q≡r→p≤q∧r≡p : p - q ≡ r → p ≤ q × r ≡ p
p-q≡r→p≤q∧r≡p p-q≡r =
case p-q≤r→p≤q (proj₁ p-q≡r) of λ
p≤q →
case -≡-functional p-q≡r (p-q≡p p≤q) of λ
p≡r →
p≤q , p≡r
opaque
supports-subtraction : Supports-subtraction
supports-subtraction {p} p-q≤r = p , p-q≡p (p-q≤r→p≤q p-q≤r)
module _ ⦃ _ : Has-well-behaved-zero 𝕄 ⦄ where
open import Graded.Modality.Properties.Has-well-behaved-zero 𝕄
opaque
𝟘-p≤q : 𝟘 - p ≤ q → q ≡ 𝟘 × p ≡ 𝟘
𝟘-p≤q 𝟘≤p+q = +-positive (𝟘≮ 𝟘≤p+q)
opaque
𝟘-p≡q : 𝟘 - p ≡ q → q ≡ 𝟘 × p ≡ 𝟘
𝟘-p≡q (x , _) = 𝟘-p≤q x
opaque
𝟘-q≰p : q ≢ 𝟘 → 𝟘 - q ≤ p → ⊥
𝟘-q≰p q≢𝟘 𝟘≤p+q =
case 𝟘≮ 𝟘≤p+q of λ
p+q≡𝟘 →
case +-positiveʳ p+q≡𝟘 of λ
q≡𝟘 →
q≢𝟘 q≡𝟘
opaque
𝟘-q≢p : q ≢ 𝟘 → 𝟘 - q ≡ p → ⊥
𝟘-q≢p q≢𝟘 𝟘-q≡p = 𝟘-q≰p q≢𝟘 (proj₁ 𝟘-q≡p)