d ≥ 2でn > 0の自然数があるとします。この場合、 nからdを分割して、n = m * d kを取得できます。ここで、mはdで割り切れません。
このd分割可能な部分の繰り返しの削除を再帰スキームとして使用したいと思います。だから私はmSteps
につながるデータ型を作ると思った:
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)
退屈な証拠で。
合計であるとイドリスに説明するためwf
に の定義で使用できますか?steps
steps