Decidability procedures to check that a given QC, TC or Chain is in a list of messages.
instance
Dec-connects : _-connects-to-_ ⁇²
Dec-connects .dec with dec | dec | dec
... | yes p | yes q | yes r = yes (connects∶ p q r)
... | no ¬p | _ | _ = no λ where (connects∶ p _ _) → ¬p p
... | _ | no ¬q | _ = no λ where (connects∶ _ q _) → ¬q q
... | _ | _ | no ¬r = no λ where (connects∶ _ _ r) → ¬r r
Dec-qc∈-Message : _qc∈-Message_ ⁇²
Dec-qc∈-Message {x = qc} {y = Propose sb} .dec
with dec
... | yes eq = yes (qc∈-Propose eq)
... | no ¬eq
with sb ∙tc? in eq
... | nothing = no λ where
(qc∈-Propose eq) → ¬eq eq
(qc∈-ProposeTC eq′ _) → contradict $ trans (sym eq) eq′
... | just tc
with dec
... | yes qc∈ = yes (qc∈-ProposeTC eq qc∈)
... | no qc∉ = no λ where
(qc∈-Propose eq) → ¬eq eq
(qc∈-ProposeTC eq′ qc∈) →
qc∉ (subst (λ ◆ → qc ∈₁ qcs⁺ ◆)
(M.just-injective (sym $ trans (sym eq) eq′))
qc∈)
Dec-qc∈-Message {y = Vote _} .dec = no λ ()
Dec-qc∈-Message {y = TCFormed _} .dec with dec
... | yes qc∈ = yes (qc∈-TCFormed qc∈)
... | no ¬qc∈ = no λ where (qc∈-TCFormed qc∈) → ¬qc∈ qc∈
Dec-qc∈-Message {y = Timeout (te , mtc)} .dec with dec
... | yes eq = yes (qc∈-Timeout eq)
... | no ¬eq
with mtc in eq
... | nothing = no λ where
(qc∈-Timeout eq) → ¬eq eq
(qc∈-TimeoutTC eq′ _ ) → contradict eq′
... | just tc
with dec
... | yes qc∈ = yes (qc∈-TimeoutTC refl qc∈)
... | no qc∉ = no λ where
(qc∈-Timeout eq) → ¬eq eq
(qc∈-TimeoutTC refl qc∈) → qc∉ qc∈
Dec-tc∈-Message : _tc∈-Message_ ⁇²
Dec-tc∈-Message {y = Propose _} .dec with dec
... | yes eq = yes (tc∈-Propose eq)
... | no ¬eq = no λ where (tc∈-Propose eq) → ¬eq eq
Dec-tc∈-Message {y = Vote _} .dec = no λ ()
Dec-tc∈-Message {tc}{TCFormed tc′} .dec with tc′ ≟ tc
... | yes refl = yes tc∈-TCFormed
... | no ¬eq = no λ where tc∈-TCFormed → ¬eq refl
Dec-tc∈-Message {y = Timeout x} .dec with dec
... | yes eq = yes (tc∈-Timeout eq)
... | no ¬eq = no λ where (tc∈-Timeout eq) → ¬eq eq
Dec-qc-∈ : _-qc-∈-_ ⁇²
Dec-qc-∈ .dec with dec
... | yes eq = yes (initialQC eq)
... | no ¬eq with dec
... | yes qc∈ = yes (receivedQC qc∈)
... | no qc∉ with dec
... | yes all∈ = yes (formedQC all∈)
... | no ¬all∈ = no λ where
(initialQC eq) → ¬eq eq
(formedQC all∈) → ¬all∈ all∈
(receivedQC x) → qc∉ x
Dec-te∈ : _-te-∈-_ ⁇²
Dec-te∈ {y = []} .dec = no λ where (_ , ())
Dec-te∈ {y = Propose _ ∷ _} .dec with dec
... | no ¬mtc×m∈ = no (λ where (mtc , there m∈) → ¬mtc×m∈ (mtc , m∈))
... | yes m∈ = yes (proj₁ m∈ , there (proj₂ m∈))
Dec-te∈ {y = Vote _ ∷ _} .dec with dec
... | no ¬mtc×m∈ = no (λ where (mtc , there m∈) → ¬mtc×m∈ (mtc , m∈))
... | yes m∈ = yes (proj₁ m∈ , there (proj₂ m∈))
Dec-te∈ {y = TCFormed _ ∷ _} .dec with dec
... | no ¬mtc×m∈ = no (λ where (mtc , there m∈) → ¬mtc×m∈ (mtc , m∈))
... | yes m∈ = yes (proj₁ m∈ , there (proj₂ m∈))
Dec-te∈ {te} {Timeout (te′ , _) ∷ _} .dec with te ≟ te′
... | yes refl = yes (-, here refl)
... | no ¬eq with dec
... | no ¬mtc×m∈ = no λ where
(mtc , here refl) → ¬eq refl
(mtc , there m∈) → ¬mtc×m∈ (-, m∈)
... | yes m∈ = yes (m∈ .proj₁ , there (m∈ .proj₂))
Dec-tc∈ : _-tc-∈-_ ⁇²
Dec-tc∈ .dec with dec
... | yes ftc = yes (formedTC ftc)
... | no ¬ftc with dec
... | yes tc∈ = yes (receivedTC tc∈)
... | no ¬tc = no λ where
(formedTC x) → ¬ftc x
(receivedTC x) → ¬tc x
Dec-chain-∈ : _-chain-∈-_ ⁇²
Dec-chain-∈ {[]} {ms} .dec = yes []
Dec-chain-∈ {b ∷ ch} {ms} .dec
with b ∙∈? ms
... | no ¬p = no λ where (p ∷ _ ⊣ _) → ¬p p
... | yes p with ¿ ch -chain-∈- ms ¿
... | no ¬q = no (λ where (_ ∷ q ⊣ _) → ¬q q)
... | yes q with ¿ b -connects-to- ch ¿
... | no ¬w = no λ where (_ ∷ _ ⊣ w) → ¬w w
... | yes w = yes (p ∷ q ⊣ w)
_ = Decidable² _-qc-∈-_
∋ dec²
_ = Decidable² _-tc-∈-_
∋ dec²
_ = Decidable² _-chain-∈-_
∋ dec²
UniqueMajority⊆ˢ : List A → Type
UniqueMajority⊆ˢ xs = ∃ λ ys →
ys ⊆ˢ xs
× Unique ys
× IsMajority ys
UniqueByMajority⊆ˢ : (f : B → A) → List B → Type
UniqueByMajority⊆ˢ f xs = ∃ λ ys →
ys ⊆ˢ xs
× UniqueBy f ys
× IsMajority ys
module _ ⦃ _ : DecEq A ⦄ where instance
Dec-UniqueMajority⊆ˢ : UniqueMajority⊆ˢ {A = A} ⁇¹
Dec-UniqueMajority⊆ˢ {x = xs} .dec
with ¿ IsMajority (nub xs) ¿
... | yes maj = yes (nub xs , nub-⊆⁻ , Unique-nub {xs = xs} , maj)
... | no ¬maj = no λ (ys , ys⊆ˢ , u , m) →
¬maj $ majority-mono u (L.SubS.⊆-trans ys⊆ˢ nub-⊆⁺) m
Dec-UniqueByMajority⊆ˢ : {f : B → A} → UniqueByMajority⊆ˢ {A = A} f ⁇¹
Dec-UniqueByMajority⊆ˢ {f = f} {xs} .dec
with ¿ IsMajority (nubBy f xs) ¿
... | yes maj = yes (nubBy f xs , nubBy-⊆⁻ f , UniqueBy-nubBy f xs , maj)
... | no ¬maj = no λ (ys , ys⊆ˢ , u , m) →
¬maj ( majority-map⁻ (nubBy f xs) f
$ majority-mono u
(L.SubS.⊆-trans (L.SubS.map⁺ f ys⊆ˢ) $ nubBy-⊆⁺ f {xs = xs})
(majority-map⁺ ys f m)
)
instance
Dec-AllBlock : ∀ {P : Block → Type} → ⦃ P ⁇¹ ⦄ → AllBlock P ⁇¹
Dec-AllBlock {P}{ms} .dec with ¿ All P (allBlocks ms) ¿
... | yes allp = yes $ mk (L.All.lookup allp)
... | no ¬allp = no λ where (mk f) → ¬allp $ L.All.tabulate f