Agdaと特にAgda標準ライブラリがまだ非常に新しい私に。私は、バイナリ検索ツリーの概念を実装しようとしています。Agda:_≦_(または、バイナリ検索ツリーを実装する方法)を推測する方法
Iは、二分木二分木から最大値と最小値を抽出
data BTree (A : Set) : ℕ → Set where
Leaf : A → BTree A 1
Node : ∀ {n m} → A → BTree A n → BTree A m → BTree A (1 + n + m)
ならびに二つの機能bt-⊔ : ∀ {n : ℕ} → BTree ℕ n → ℕ
とbt-⊓ : ∀ {n : ℕ} → BTree ℕ n → ℕ
の簡単な定義を有します。
私は今、特定のツリーがバイナリ検索ツリーであることを証明するデータ型を定義しようとしています。ここに私がこれまで持っているものがあります。
data BST : {n : ℕ} → BTree ℕ n → Set where
sortL : {x : ℕ} → BST (Leaf x)
sortN : ∀ {n m} → {a : ℕ} → {l : BTree ℕ n} → {r : BTree ℕ m}
→ (sl : BST l) → (sr : BST r)
→ {cl : a ≥ (bt-⊔ l)} → {cr : a < (bt-⊓ r)}
→ BST (Node a l r)
ノードBSTコンストラクタのための私の直感は、ノード(a
)に格納された値、2つのサブツリー(l
とr
)、2つのサブツリーが分探索木(sl
とsr
)と証明されている証明を取ることです現在の値a
は、左側のサブツリーのすべてよりも大きく、右側のすべての値よりも小さい(cl
およびcr
)ことを確認してください。
これは多かれ少なかれ動作しているようで、次の単純なツリーとBSTプルーフを構築できます。
T₂ : BTree ℕ 3
T₂ = Node 5 (Leaf 3) (Leaf 7)
bst₂ : BST T₂
bst₂ = sortN sortL sortL {s≤s (s≤s (s≤s z≤n))} {s≤s (s≤s (s≤s (s≤s (s≤s (s≤s z≤n)))))}
はしかし、私は彼らが非常に面倒であるため、Agdaはcl
とcr
のための証拠を推測したいです。もし私がbst₂
の定義でそれらを指定しなければ、Agdaはコードに穴があると思って、cl
とcr
に関連するアンダースコア変数を与えます。
これについてはどうすればいいのか分かりませんし、標準ライブラリのこの部分も正しく使用しているわけではありません。私はこれをもっと簡単にするための提案や解決策にはオープンです。
一般的なアドバイスとそのペーパーへのリンクをありがとう。少なくとも、私にはもっと多くのことを試してください。 – Karl