我怎么能在coq中证明一个函数f接受bool true|false并返回一个bool true|false(如下所示),当对一个bool应用两次时true|false总会返回相同的值true|false:
(f:bool -> bool)
Run Code Online (Sandbox Code Playgroud)
例如函数f只能做4件事,让我们调用函数的输入b:
truefalseb(即如果b为真则返回true,反之亦然)not b(即如果b为真,则返回false,副)因此,如果函数始终返回true:
f (f bool) = f true = true
Run Code Online (Sandbox Code Playgroud)
如果函数总是返回false,我们会得到:
f (f bool) = f false = false
Run Code Online (Sandbox Code Playgroud)
对于其他情况,让我们假设函数返回 not b
f (f true) = f false = true
f (f false) = f true = false
Run Code Online (Sandbox Code Playgroud)
在两种可能的输入情况下,我们总是最终得到原始输入.如果我们假设函数返回,则同样成立b.
那么你如何在coq中证明这一点?
Goal forall (f:bool -> bool) (b:bool), f (f b) = f b.
Run Code Online (Sandbox Code Playgroud)
mat*_*ast 10
Goal forall (f:bool -> bool) (b:bool), f (f (f b)) = f b.
Proof.
intros.
remember (f true) as ft.
remember (f false) as ff.
destruct ff ; destruct ft ; destruct b ;
try rewrite <- Heqft ; try rewrite <- Heqff ;
try rewrite <- Heqft ; try rewrite <- Heqff ; auto.
Qed.
Run Code Online (Sandbox Code Playgroud)