编码集(唯一元素列表)的正确方法是什么?

时间:2018-09-06 17:40:22

标签: agda

在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, }; 函数。因此,有没有更合适的方法呢?另外,标准(或其他)库中是否可以使用这种数据结构?

0 个答案:

没有答案