以下是避免额外参数的一种方法(请参阅内联注释):
module Test
val length: list α â â
let rec length lst =
match lst with
| [] â 0
| _ ⸬ t â 1 + length t
//the refinement on n is not really necessary here, the proofs work even without it
//because as soon as we have [h], irrespective of the value of n, we return h
val nth_1 : lst: list â {length lst > 0} â n: â{n < length lst} â â
let rec nth_1 lst n =
match lst with
| [h] â h
| h ⸬ t â if n = 0 then h else nth_1 t (n - 1)
//refine the return type to say that it returns a list of length lng
val gen_1 : lng: pos â (l:list â{length l == lng})
let rec gen_1 lng =
match lng with
| 1 â [1]
| _ â 1 ⸬ gen_1 (lng - 1)
let rec lemma_1 (lng: pos) (n: â {n < lng}) : Lemma ((nth_1 (gen_1 lng) n) = 1) =
match n with
| 0 â ()
| _ â lemma_1 (lng - 1) (n - 1)