Я немного борюсь с представлением о доказательстве принадлежности для Data.AVL
деревьев. Я хотел бы иметь возможность передавать значение типа n ∈ m
, чтобы означать, что n появляется в качестве ключа в дереве AVL, так что при таком доказательстве get n m
всегда может успешно присвоить значение, связанное с n. Вы можете предположить, что мои деревья AVL всегда содержат значения, полученные из полурешетки соединения (A, ∨, ⊥) над сетоидом (A, ≈), хотя под идемпотенцией остается неявным.Свидетельства о членстве для деревьев AVL
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-деревьев, в котором говорится, что два дерева равны, если они имеют одинаковое изображение toList
и используют коммутативный моноид над A, определяющий
n ∈ m = ≈-AVL ≈ м (ℕ-AVL.unionWith _ ∨ м (ℕ-AVL.singleton _ п ⊥))
Это по существу говорит, что т содержит п тогда и только тогда одноплодной карте (п, ⊥) является "ниже" m в частичном порядке, индуцированном коммутативным моноидом (технически нам нужно, чтобы идемпотентность для этой интерпретации имела смысл). Однако, учитывая такое определение, я совсем не уверен, как реализовать get
.
Я также экспериментировал с определением собственного индуктивного отношения, но обнаружил, что трудно, поскольку мне казалось, что я должен знать о сложных внутренних показателях, используемых Data.AVL
.
Наконец, я также попытался использовать значение типа n ∈? m ≡ true
, где ∈? определяется в Data.AVL
, но также не имел большого успеха. Буду признателен за любые предложения.
Возможно, я пропустил некоторые части кода, так что вот полная версия: https: //gist.github.com/vituscze/8394501 – Vitus
Yup, взял меня на то, чтобы определить, что вы определяете ≮ и ≢ себя. Отличное объяснение; Я решил внимательно прочитать ваш ответ , затем прочитайте код для 'Data.AVL' и, наконец, самостоятельно реконструируйте свое решение, чтобы я правильно его понял. Я почти закончил с этим. Вы правы, внутренности 'Data.AVL' не так страшны, как они сначала смотрят! – Roly
Хорошо, это было отличное упражнение. Мне, казалось, понадобилось пару '{bal = bal}' по сравнению с вашим кодом, но в остальном у меня не было никаких проблем. пришлось обмануть для 'rewrite (P.sym b)' step - я пытался «переписать P.refl', и сообщение об ошибке было неразборчиво. Правильно ли я думаю, что не могу поместить правильные шаблоны (т. Е. С конструкторами), а только шаблонные переменные в шаблонах 'с'? (Может быть, что-то связано с тем, как «с десегарами?») – Roly