【发布时间】:2012-06-07 09:57:26
【问题描述】:
请注意,这是一个作业,所以最好不要发布完整的解决方案,相反,我只是卡住了,需要一些关于我接下来应该看什么的提示。
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)
现在这显然不起作用,因为新边界不必严格小于/大于最小值/最大值。给出了一个提示: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. 这就是我在这里所做的,显然我需要改变一些事情,但我认为基本的想法就在那里。
这就是我所在的地方,我只是真的不知道从哪里开始,我已经做了尽可能多的研究,但是没有很多阅读材料可供使用阿格达。我是否可能需要使用 ≤-refl 或 ≤-trans?
【问题讨论】:
-
作为
leaf部分的提示:辅助函数应具有∀ {a b c d} → a ≤ b → b < c → c ≤ d → a < d类型。这很容易从≤在ℕ 上传递这一事实得出。≤-trans的类型为∀ {a b c} → a ≤ b → b ≤ c → a ≤ c,<定义为m < n = suc m ≤ n。从这里开始应该很容易。 -
我注意到您包含了一大段“不起作用”的代码,这是我在 Agda 中很久没有看到的。它表明您可能没有使用 emacs Agda 模式,这是自切片面包以来最伟大的事情。我讨厌 emacs,只将它用于 Agda 模式,仅仅是因为它的特性(孔、自动模式匹配、类型信息)使得编写复杂的 Agda 成为可能。如果您已经在使用它,我深表歉意,但如果您还没有使用它,请尝试一下,我相信您的作业会更轻松。
-
对于
branch的情况,如果您使用交互模式和漏洞,您可能会发现对widen的递归调用实际上没有有意义的参数类型。你会在某个地方需要≤-refl:) -
@copumpkin:啊!我知道 agda-mode 非常有用,但是这个.. 我需要在 Win 7 上修复我的 emacs。:D
标签: agda