这是一个简单的模式生成器,它返回一个1:nat
. lemma_1
证明生成的任意长度列表的每个位置都有一个 1。必须引入for的lng
参数,因为否则会被限制为与in其类型为 的 in发生类型冲突。如果没有额外的参数,如何解决这个问题?nth_1
n
n:nat{n < length lst}
n
lemma_1
n:nat{n < lng}
val length: list 'a -> nat
let rec length lst =
match lst with
| [] -> 0
| _ :: t -> 1 + length t
val nth_1 : lst: list nat {length lst > 0} -> (lng: nat) -> n: nat {n < lng} -> nat
let rec nth_1 lst lng n =
match lst with
| [h] -> h
| h :: t -> if n = 0 then h else nth_1 t (lng - 1) (n - 1)
val gen_1 : lng: nat {lng > 0} -> list nat
let rec gen_1 lng =
match lng with
| 1 -> [1]
| _ -> 1 :: gen_1 (lng - 1)
let rec lemma_1 (lng: nat {lng > 0}) (n: nat {n < lng}) : Lemma ((nth_1 (gen_1 lng) lng n) = 1) =
match n with
| 0 -> ()
| _ -> lemma_1 (lng - 1) (n - 1)
似乎问题与gen_1
模式不得为零长度的约束有关。有没有更好的方法来表达这个标准?