我刚刚开始学习F *,完成了教程。其中一个练习是证明列表上的reverse
函数是单射的。
由于这是因为入侵是单射的,所以我想将这个事实表达为F *中的引理。为此,我定义了
let is_involutive f = forall x. (f (f x) == x)
let is_injective f = forall x y. (f x == f y) ==> x == y
这是在F *中定义f
是对偶还是内射的概念的正确方法?
然后我说明了引理
val inv_is_inj: #a:eqtype -> a -> f:(a->a) ->
Lemma (requires (is_involutive f)) (ensures(is_injective f))
非正式地,证据可以写成
{ fix (x:a) (y:a)
assume (f x == f y)
then have (f (f x) == f (f y))
with (is_involutive f) have (x == y)
} hence (forall (x:a) (y:a). f x == f y ==> x == y)
then have (is_injective f)
我如何用F *表达这样的证据?
通常,可以使用哪些F *语言构造来证明forall (x:a). phi x
形式的语句,其中phi
是类型a
的谓词?