{-# OPTIONS --postfix-projections --safe --without-K #-} open import Level using (suc; _⊔_) open import Data.Bool.Base using (Bool; true; false; T; not) open import Relation.Nullary using (Dec; yes; no) open import Relation.Binary open import Relation.Binary.PropositionalEquality.Core using (_≡_; _≢_; refl) open import Relation.Nullary.Negation.Core using (¬_; contradiction) module MAUV.Structure {a} (Atom : Set a) where infix 20 `+_ infix 20 `-_ infix 15 `¬_ infix 10 _`◁_ infix 10 _`⅋_ infix 10 _`⊗_ infix 10 _`&_ infix 10 _`⊕_ data Structure : Set a where `I : Structure `𝟘 : Structure `⊤ : Structure `+_ : Atom → Structure `-_ : Atom → Structure _`◁_ : Structure → Structure → Structure _`⅋_ : Structure → Structure → Structure _`⊗_ : Structure → Structure → Structure _`&_ : Structure → Structure → Structure _`⊕_ : Structure → Structure → Structure private variable P P′ : Structure Q Q′ : Structure R R′ : Structure S S′ : Structure `¬_ : Structure → Structure `¬ `I = `I `¬ `𝟘 = `⊤ `¬ `⊤ = `𝟘 `¬ (`+ A) = `- A `¬ (`- A) = `+ A `¬ (P `◁ Q) = `¬ P `◁ `¬ Q `¬ (P `⅋ Q) = `¬ P `⊗ `¬ Q `¬ (P `⊗ Q) = `¬ P `⅋ `¬ Q `¬ (P `& Q) = `¬ P `⊕ `¬ Q `¬ (P `⊕ Q) = `¬ P `& `¬ Q module _ {ℓ} (_∼_ : Rel Structure ℓ) where mutual private _≃_ : Rel Structure (suc a ⊔ ℓ) _≃_ = CongClosure data CongClosure : Rel Structure (suc a ⊔ ℓ) where emb : P ∼ P′ → P ≃ P′ _`⟨◁ : P ≃ P′ → (P `◁ Q) ≃ (P′ `◁ Q) `◁⟩_ : Q ≃ Q′ → (P `◁ Q) ≃ (P `◁ Q′) _`⟨⊗ : P ≃ P′ → (P `⊗ Q) ≃ (P′ `⊗ Q) `⊗⟩_ : Q ≃ Q′ → (P `⊗ Q) ≃ (P `⊗ Q′) _`⟨⅋ : P ≃ P′ → (P `⅋ Q) ≃ (P′ `⅋ Q) `⅋⟩_ : Q ≃ Q′ → (P `⅋ Q) ≃ (P `⅋ Q′) _`⟨& : P ≃ P′ → (P `& Q) ≃ (P′ `& Q) `&⟩_ : Q ≃ Q′ → (P `& Q) ≃ (P `& Q′) _`⟨⊕ : P ≃ P′ → (P `⊕ Q) ≃ (P′ `⊕ Q) `⊕⟩_ : Q ≃ Q′ → (P `⊕ Q) ≃ (P `⊕ Q′) _≡ᵇ`I : (P : Structure) → Bool `I ≡ᵇ`I = true `𝟘 ≡ᵇ`I = false `⊤ ≡ᵇ`I = false (`+ A) ≡ᵇ`I = false (`- A) ≡ᵇ`I = false (P `◁ Q) ≡ᵇ`I = false (P `⅋ Q) ≡ᵇ`I = false (P `⊗ Q) ≡ᵇ`I = false (P `& Q) ≡ᵇ`I = false (P `⊕ Q) ≡ᵇ`I = false record NonUnit (P : Structure) : Set where field nonUnit : T (not (P ≡ᵇ`I)) instance `+-nonUnit : ∀ {A} → NonUnit (`+ A) `+-nonUnit = _ `--nonUnit : ∀ {A} → NonUnit (`- A) `--nonUnit = _ `◁-nonUnit : ∀ {P Q} → NonUnit (P `◁ Q) `◁-nonUnit = _ `⅋-nonUnit : ∀ {P Q} → NonUnit (P `⅋ Q) `⅋-nonUnit = _ `⊗-nonUnit : ∀ {P Q} → NonUnit (P `⊗ Q) `⊗-nonUnit = _ `&-nonUnit : ∀ {P Q} → NonUnit (P `& Q) `&-nonUnit = _ `⊕-nonUnit : ∀ {P Q} → NonUnit (P `⊕ Q) `⊕-nonUnit = _ _≟`I : (P : Structure) → Dec (P ≡ `I) `I ≟`I = yes refl `𝟘 ≟`I = no λ () `⊤ ≟`I = no λ () (`+ A) ≟`I = no (λ ()) (`- A) ≟`I = no (λ ()) (P `◁ Q) ≟`I = no (λ ()) (P `⅋ Q) ≟`I = no (λ ()) (P `⊗ Q) ≟`I = no (λ ()) (P `& Q) ≟`I = no (λ ()) (P `⊕ Q) ≟`I = no (λ ()) ≢-nonUnit : ∀ {P} → P ≢ `I → NonUnit P ≢-nonUnit {`I} P≢`I = contradiction refl P≢`I ≢-nonUnit {`𝟘} P≢`I = _ ≢-nonUnit {`⊤} P≢`I = _ ≢-nonUnit {`+ A} P≢`I = _ ≢-nonUnit {`- A} P≢`I = _ ≢-nonUnit {P `◁ Q} P≢`I = _ ≢-nonUnit {P `⅋ Q} P≢`I = _ ≢-nonUnit {P `⊗ Q} P≢`I = _ ≢-nonUnit {P `& Q} P≢`I = _ ≢-nonUnit {P `⊕ Q} P≢`I = _