我刚刚开始学习 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