在Agda中,编码集合的正确方法是什么?即是唯一元素列表?
我尝试过的事情:
可以使用我的last question上建议的方法之一来做到这一点,该方法是将谓词is-set
编码为List A -> Set
函数,然后使用Sigma进行列表的子集也被设置:
open import Data.List
open import Data.Empty
open import Data.Unit
open import Data.Nat
open import Data.Product
open import Data.Bool
open import Relation.Binary.PropositionalEquality
open import Relation.Nullary
DecEq : (A : Set) -> Set
DecEq A = (a : A) -> (b : A) -> Dec (a ≡ b)
is-in : {A : Set} -> (eq : DecEq A) -> (a : A) -> List A -> Bool
is-in eq v [] = false
is-in eq v (x ∷ xs) with eq v x
is-in eq v (x ∷ xs) | yes p = true
is-in eq v (x ∷ xs) | no ¬p = is-in eq v xs
is-set : {A : Set} -> (eq : DecEq A) -> List A -> Set
is-set eq [] = ⊤
is-set eq (x ∷ xs) with is-in eq x xs
... | false = is-set eq xs
... | true = ⊥
Uniques : (A : Set) -> DecEq A -> Set
Uniques A eq = Σ (List A) (is-set eq)
eq : (a : ℕ) -> (b : ℕ) -> Dec (a ≡ b)
eq zero zero = yes refl
eq zero (suc b) = no (λ ())
eq (suc a) zero = no (λ ())
eq (suc a) (suc b) with eq a b
eq (suc a) (suc b) | yes p = yes (cong suc p)
eq (suc a) (suc b) | no ¬p = no f where
f : suc a ≡ suc b -> ⊥
f refl = ¬p refl
set : Uniques ℕ eq
set = (1 ∷ 2 ∷ 3 ∷ []) , tt
类似地,我也可以使用is-in
来定义归纳类型。但是,这两种想法看起来都是很虚构的,因为它们仍然依赖于is-in
函数,而List A -> Bool
仍然是const tableWidth = 10;
const config = {
ROWS: tableWidth,
COLUMNS: tableWidth,
};
函数。因此,有没有更合适的方法呢?另外,标准(或其他)库中是否可以使用这种数据结构?