【发布时间】:2014-01-12 23:18:16
【问题描述】:
我在为Data.AVL 树想出成员资格证明的概念时有些吃力。我希望能够传递一个 n ∈ m 类型的值,这意味着 n 在 AVL 树中显示为一个键,因此,如果有这样的证明,get n m 总是可以成功地产生一个与 n 关联的值.你可以假设我的 AVL 树总是包含从集合半格 (A, ∨, ⊥) 上的集合 (A, ≈) 中提取的值,尽管在幂等性之下是隐含的。
module Temp where
open import Algebra.FunctionProperties
open import Algebra.Structures renaming (IsCommutativeMonoid to IsCM)
open import Data.AVL
open import Data.List
open import Data.Nat hiding (_⊔_)
import Data.Nat.Properties as ℕ-Prop
open import Data.Product hiding (_-×-_)
open import Function
open import Level
open import Relation.Binary renaming (IsEquivalence to IsEq)
open import Relation.Binary.PropositionalEquality
module ℕ-AVL {v} (V : Set v)
= Data.AVL (const V) (StrictTotalOrder.isStrictTotalOrder ℕ-Prop.strictTotalOrder)
data ≈-List {a ℓ : Level} {A : Set a} (_≈_ : Rel A ℓ) : Rel (List A) (a ⊔ ℓ) where
[] : ≈-List _≈_ [] []
_∷_ : {x y : A} {xs ys : List A} → (x≈y : x ≈ y) → (xs≈ys : ≈-List _≈_ xs ys) → ≈-List _≈_ (x ∷ xs) (y ∷ ys)
_-×-_ : {a b c d ℓ₁ ℓ₂ : Level} {A : Set a} {B : Set b} {C : Set c} {D : Set d} →
REL A C ℓ₁ → REL B D ℓ₂ → A × B → C × D → Set (ℓ₁ ⊔ ℓ₂)
(R -×- S) (a , b) (c , d) = R a c × S b d
-- Two AVL trees are equal iff they have equal toList images.
≈-AVL : {a ℓ : Level} {A : Set a} → Rel A ℓ → Rel (ℕ-AVL.Tree A) (a ⊔ ℓ)
≈-AVL _≈_ = ≈-List ( _≡_ -×- _≈_ ) on (ℕ-AVL.toList _)
_∈_ : {a ℓ : Level} {A : Set a} {_≈_ : Rel A ℓ} {_∨_ : Op₂ A} {⊥ : A}
{{_ : IsCM _≈_ _∨_ ⊥}} → ℕ → ℕ-AVL.Tree A → Set (a ⊔ ℓ)
n ∈ m = {!!}
get : {a ℓ : Level} {A : Set a} {_≈_ : Rel A ℓ} {_∨_ : Op₂ A} {⊥ : A} →
{{_ : IsCM _≈_ _∨_ ⊥}} → (n : ℕ) → (m : ℕ-AVL.Tree A) → n ∈ m → A
get n m n∈m = {!!}
我觉得这应该很容易,但我发现很难。一种选择是使用我对 AVL-trees 的等价概念,它表示如果两棵树具有相同的toList 图像,则它们是相等的,并利用 A 上的可交换幺半群,定义
n ∈ m = ≈-AVL ≈ m (ℕ-AVL.unionWith _ ∨ m (ℕ-AVL.singleton _ n ⊥))
这实质上是说 m 包含 n 当且仅当单例映射 (n, ⊥) 在由可交换幺半群诱导的偏序中“低于” m 时(从技术上讲,我们需要幂等性才能使这种解释有意义)。但是,鉴于这样的定义,我完全不确定如何实现get。
我还尝试定义自己的归纳 ∈ 关系,但发现这很难,因为我似乎最终不得不了解 Data.AVL 使用的复杂内部索引。
最后我还尝试使用n ∈? m ≡ true 类型的值,其中∈? 定义在Data.AVL 中,但在那里也没有取得多大成功。如有任何建议,我将不胜感激。
【问题讨论】:
标签: membership avl-tree proof agda