在研究有根据的时候,我想看看不同的设计是如何表现的。例如,对于一个类型:
data _<_ (x : Nat) : Nat -> Set where
<-b : x < (suc x)
<-s : (y : Nat) -> x < y -> x < (suc y)
有根据很容易证明。但是如果类似的类型定义不同:
data _<_ : Nat -> Nat -> Set where
z-< : (m : Nat) -> zero < (suc m)
s<s : (m n : Nat) -> m < n -> (suc m) < (suc n)
很明显,在这两种情况下,下降链都不是无限的,但在第二种情况下,有根据并不容易证明:(y -> y < x -> Acc y)
对于给定的 证明存在并不容易x
。
是否有一些原则可以帮助选择第一个设计而不是第二个设计?
证明第二个定义的有根据并不难,它只需要额外的定理。在这里,依靠_==_
for的可判定性,我们可以为 caseNat
构造新的,并且可以重写目标类型以使用已知尺寸减小问题的解决方案作为 for 的解决方案。_<_
(suc y) != x
suc y
-- trying to express well-foundedness is tricky, because of how x < y is defined:
-- since both x and y decrease in the inductive step case, need special effort to
-- prove when the induction stops - when no more constructors are available
<-Well-founded : Well-founded Nat _<_
<-Well-founded x = acc (aux x) where
aux : (x y : Nat) -> y < x -> Acc _<_ y
aux zero y ()
aux x zero z-< = acc \_ ()
aux (suc x) (suc y) (s<s y<x) with is-eq? (suc y) x
... | no sy!=x = aux x (suc y) (neq y<x sy!=x)
... | yes sy==x rewrite sy==x = <-Well-founded x