import Syntax.Simple.Signature as S import Syntax.BiTyped.Signature as B import Theory.ModeCorrectness.Signature as MC module Theory.Trichotomy {SD : S.SigD} (D : B.SigD SD) (mc : MC.ModeCorrect SD D) where open import Prelude open import Syntax.Simple SD open import Syntax.Context SD open import Theory.Erasure open import Syntax.Typed.Raw.Term (erase D) open import Syntax.Typed.Term (erase D) open import Syntax.BiTyped.Pre.Term D open import Theory.ModeDecoration D open import Theory.ModeCorrectness.Synthesis D mc renaming (synthesise to synthesise⇔) open import Theory.Soundness D open import Theory.Completeness D synthesise : (Γ : Cxt 0) (r : Raw (length Γ)) → (Pre Syn r × Dec (∃[ A ] Γ ⊢ r ⦂ A)) ⊎ ¬ Pre Syn r synthesise Γ r with decorate Syn r ... | no ¬p = inr ¬p ... | yes p with synthesise⇔ Γ p ... | no ¬At = inl (p , no λ (_ , t) → ¬At (_ , completeness p t)) ... | yes (_ , t) = inl (p , yes (_ , soundness t)) data Tri (P : Set) (Q : Set) (R : Set) : Set where only-p : P → ¬ Q → ¬ R → Tri P Q R only-q : Q → ¬ P → ¬ R → Tri P Q R only-r : R → ¬ P → ¬ Q → Tri P Q R synthesise′ : (Γ : Cxt 0) (r : Raw (length Γ)) → Tri (Pre Syn r × ∃[ A ] Γ ⊢ r ⦂ A) (Pre Syn r × ¬ (∃[ A ] Γ ⊢ r ⦂ A)) (¬ Pre Syn r) synthesise′ Γ r with decorate Syn r ... | no ¬p = only-r ¬p (λ (p , _) → ¬p p) λ (p , _) → ¬p p ... | yes p with synthesise⇔ Γ p ... | no ¬At = only-q (p , λ (_ , t) → ¬At (_ , completeness p t)) (λ (_ , _ , At) → ¬At (_ , completeness p At)) (λ ¬p → ¬p p) ... | yes (_ , t) = only-p (p , _ , soundness t) (λ (_ , ¬At) → ¬At (_ , soundness t)) (λ ¬p → ¬p p)