簡體   English   中英

Agda中使用標准庫的對/列表的字典排序

[英]Lexicographic ordering of pairs/lists in Agda using the standard library

Agda標准庫包含一些模塊Relation.Binary.*.(Non)StrictLex (目前僅用於ProductList )。 我們可以使用這些模塊輕松構造一個實例,例如IsStrictTotalOrder用於成對的自然數(即ℕ × ℕ )。

open import Data.Nat as ℕ using (ℕ; _<_)
open import Data.Nat.Properties as ℕ
open import Relation.Binary using (module StrictTotalOrder; IsStrictTotalOrder)
open import Relation.Binary.PropositionalEquality using (_≡_)
open import Relation.Binary.Product.StrictLex using (×-Lex; _×-isStrictTotalOrder_)
open import Relation.Binary.Product.Pointwise using (_×-Rel_)

ℕ-isSTO : IsStrictTotalOrder _≡_ _<_
ℕ-isSTO = StrictTotalOrder.isStrictTotalOrder ℕ.strictTotalOrder

ℕ×ℕ-isSTO : IsStrictTotalOrder (_≡_ ×-Rel _≡_) (×-Lex _≡_ _<_ _<_)
ℕ×ℕ-isSTO = ℕ-isSTO ×-isStrictTotalOrder ℕ-isSTO

這將使用逐點相等_≡_ ×-Rel _≡_創建一個實例。 在命題相等的情況下,這應該是等同於使用命題平等。

是否有一種簡單的方法可以使用正常的命題相等將上面的實例轉換為IsStrictTotalOrder _≡_ (×-Lex _≡_ _<_ _<_)類型的實例?

所需的套件不太難組裝:

open import Data.Product
open import Function using (_∘_; case_of_)
open import Relation.Binary

_⇔₂_ : ∀ {a ℓ₁ ℓ₂} {A : Set a} → Rel A ℓ₁ → Rel A ℓ₂ → Set _
_≈_ ⇔₂ _≈′_ = (∀ {x y} → x ≈ y → x ≈′ y) × (∀ {x y} → x ≈′ y → x ≈ y)

-- I was unable to write this nicely using Data.Product.map... 
-- hence it is moved here to a toplevel where it can pattern-match
-- on the product of proofs
transform-resp : ∀ {a ℓ₁ ℓ₂ ℓ} {A : Set a} {≈ : Rel A ℓ₁} {≈′ : Rel A ℓ₂} {< : Rel A ℓ} →
                 ≈ ⇔₂ ≈′ →
                 < Respects₂ ≈ → < Respects₂ ≈′
transform-resp (to ,  from) = λ { (resp₁ , resp₂) → (resp₁ ∘ from , resp₂ ∘ from) }

transform-isSTO : ∀ {a ℓ₁ ℓ₂ ℓ} {A : Set a} {≈ : Rel A ℓ₁} {≈′ : Rel A ℓ₂} {< : Rel A ℓ} →
                  ≈ ⇔₂ ≈′ →
                  IsStrictTotalOrder ≈ < → IsStrictTotalOrder ≈′ <
transform-isSTO {≈′ = ≈′} {< = <} (to , from) isSTO = record
  { isEquivalence = let open IsEquivalence (IsStrictTotalOrder.isEquivalence isSTO)
                    in record { refl = to refl
                              ; sym = to ∘ sym ∘ from
                              ; trans = λ x y → to (trans (from x) (from y))
                              }
  ; trans = IsStrictTotalOrder.trans isSTO
  ; compare = compare
  ; <-resp-≈ = transform-resp (to , from) (IsStrictTotalOrder.<-resp-≈ isSTO)
  }
  where
    compare : Trichotomous ≈′ <
    compare x y with IsStrictTotalOrder.compare isSTO x y
    compare x y | tri< a ¬b ¬c = tri< a (¬b ∘ from) ¬c
    compare x y | tri≈ ¬a b ¬c = tri≈ ¬a (to b) ¬c
    compare x y | tri> ¬a ¬b c = tri> ¬a (¬b ∘ from) c

然后我們可以用它來解決你原來的問題:

ℕ×ℕ-isSTO′ : IsStrictTotalOrder _≡_ (×-Lex _≡_ _<_ _<_)
ℕ×ℕ-isSTO′ = transform-isSTO (to , from) ℕ×ℕ-isSTO
  where
    open import Function using (_⟨_⟩_)
    open import Relation.Binary.PropositionalEquality

    to : ∀ {a b} {A : Set a} {B : Set b}
         {x x′ : A} {y y′ : B} → (x , y) ⟨ _≡_ ×-Rel _≡_ ⟩ (x′ , y′) → (x , y) ≡ (x′ , y′)
    to (refl , refl) = refl

    from : ∀ {a b} {A : Set a} {B : Set b}
           {x x′ : A} {y y′ : B} → (x , y) ≡ (x′ , y′) → (x , y) ⟨ _≡_ ×-Rel _≡_ ⟩ (x′ , y′)
    from refl = refl , refl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM