Просто заметьте, это для задания, поэтому, вероятно, лучше не публиковать полные решения, скорее, я просто застрял и нуждаюсь в некоторых подсказках относительно того, что я должен смотреть дальше.Агда и двоичные поисковые деревья
module BST where
open import Data.Nat
open import Relation.Binary.PropositionalEquality
open import Relation.Binary
open DecTotalOrder decTotalOrder using() renaming (refl to ≤-refl; trans to ≤-trans)
data Ord (n m : ℕ) : Set where
smaller : n < m -> Ord n m
equal : n ≡ m -> Ord n m
greater : n > m -> Ord n m
cmp : (n m : ℕ) -> Ord n m
cmp zero zero = equal refl
cmp zero (suc n) = smaller (s≤s z≤n)
cmp (suc n) zero = greater (s≤s z≤n)
cmp (suc n) (suc m) with cmp n m
... | smaller n<m-pf = smaller (s≤s n<m-pf)
... | equal n≡m-pf = equal (cong suc n≡m-pf)
... | greater n>m-pf = greater (s≤s n>m-pf)
-- To keep it simple and to exclude duplicates,
-- the BST can only store [1..]
--
data BST (min max : ℕ) : Set where
branch : (v : ℕ)
→ BST min v → BST v max
→ BST min max
leaf : min < max -> BST min max
Они уже импортирован:
≤-refl : ∀ {a} → a ≤ a
≤-trans : ∀ {a b c} → a ≤ b → b ≤ c → a ≤ c
Мы должны реализовать эту функцию, которая расширяет границы в BST:
widen : ∀{min max newMin newMax}
→ BST min max
→ newMin ≤ min
→ max ≤ newMax
→ BST newMin newMax
меня это до сих пор:
widen : ∀{min max newMin newMax}
→ BST min max
→ newMin ≤ min
→ max ≤ newMax
→ BST newMin newMax
widen (leaf min<max-pf) newMin<min-pf max<newMax-pf = BST newMin<min-pf max<newMax-pf
widen (branch v l r) newMin<min-pf max<newMax = branch v
(widen l newMin<min-pf max<newMax)
(widen r newMin<min-pf max<newMax)
Теперь это, очевидно, d потому что новые границы не должны быть строго меньше/больше min/max. Подсказка была дана: It is not strictly necessary, but you may find it helpful to implement an auxiliary function that widens the range of a strictly smaller than relation of the form min < max.
Какая из того, что я здесь сделал, очевидно, мне нужно будет изменить несколько вещей, но я думаю, что основная идея есть.
Здесь я нахожусь, и я просто зацикливаюсь, куда идти отсюда, я сделал столько исследований, сколько смогу, но там нет большого количества материалов для чтения используя Agda. Возможно, мне нужно использовать ≤-refl или ≤-trans?
Как подсказка для части 'leaf': вспомогательная функция должна иметь тип' ∀ {a b c d} → a ≤ b → b
Vitus
Я заметил, что вы включили кусок кода, который «не работает», чего я не видел в Agda в возрасте. Это предполагает, что вы не можете использовать emacs Agda-mode, что является самой большой вещью, поскольку нарезанный хлеб. Я ненавижу emacs и использую его только для своего Agda-режима, просто потому, что его функции (дыры, автоматическое сопоставление образцов, информация о типе) делают возможным создание сложного комплекса Agda. Я прошу прощения, если вы уже используете его, но если вы этого не сделаете, попробуйте, и я уверен, что вам будет намного легче выполнять задания. – copumpkin
Для случая «ветви», если вы использовали интерактивный режим и дыры, вы, вероятно, увидите, что ваши рекурсивные вызовы 'widen' действительно не имеют типов аргументов, которые имеют смысл. Вам понадобится «≤-refl» где-то :) – copumpkin