假设我有一些自然数d ≥ 2和n > 0;在这种情况下,我可以从n中分离出d并得到n = m * d k,其中m不能被d整除。
我想使用这种重复删除d可分部分作为递归方案;所以我想我会为Steps
通往m的数据类型:
import Data.Nat.DivMod
data Steps: (d : Nat) -> {auto dValid: d `GTE` 2} -> (n : Nat) -> Type where
Base: (rem: Nat) -> (rem `GT` 0) -> (rem `LT` d) -> (quot : Nat) -> Steps d {dValid} (rem + quot * d)
Step: Steps d {dValid} n -> Steps d {dValid} (n * d)
并编写一个递归函数,计算Steps
给定对的d
和n
:
total lemma: x * y `GT` 0 -> x `GT` 0
lemma {x = Z} LTEZero impossible
lemma {x = Z} (LTESucc _) impossible
lemma {x = (S k)} prf = LTESucc LTEZero
steps : (d : Nat) -> {auto dValid: d `GTE` 2} -> (n : Nat) -> {auto nValid: n `GT` 0} -> Steps d {dValid} n
steps Z {dValid = LTEZero} _ impossible
steps Z {dValid = (LTESucc _)} _ impossible
steps (S d) {dValid} n {nValid} with (divMod n d)
steps (S d) (q * S d) {nValid} | MkDivMod q Z _ = Step (steps (S d) {dValid} q {nValid = lemma nValid})
steps (S d) (S rem + q * S d) | MkDivMod q (S rem) remSmall = Base (S rem) (LTESucc LTEZero) remSmall q
但是,steps
不被接受为全部,因为没有明显的理由说明递归调用是有充分根据的(q
和之间没有结构关系n
)。
但我也有一个功能
total wf : (S x) `LT` (S x) * S (S y)
用一个无聊的证明。
我可以用towf
的定义steps
来向Idris解释那steps
是total吗?