证明 f (f bool) = bool
我如何在 coq 中证明函数 f
接受 bool true|false
并返回 bool true|false
(如下所示) ,当对单个 bool true|false
应用两次时,将始终返回相同的值 true|false
:
(f:bool -> bool)
例如,函数 f
只能执行以下操作: 4件事,让我们调用函数b
的输入:
- 总是返回
true
- 总是返回
false
- 返回
b
(即如果 b 为 true,则返回 true,反之亦然) - 返回
not b
(即,如果 b 为 true,则返回 false,反之亦然)
因此,如果函数始终返回 true:
f (f bool) = f true = true
如果函数始终返回 false,我们将得到:
f (f bool) = f false = false
对于其他情况,假设函数返回不是 b
f (f true) = f false = true
f (f false) = f true = false
在两种可能的输入情况下,我们总是以原始输入结束。如果我们假设函数返回 b,情况也是如此。
那么如何在 coq 中证明这一点呢?
Goal forall (f:bool -> bool) (b:bool), f (f b) = f b.
How can I in coq, prove that a function f
that accepts a bool true|false
and returns a bool true|false
(shown below), when applied twice to a single bool true|false
would always return that same value true|false
:
(f:bool -> bool)
For example the function f
can only do 4 things, lets call the input of the function b
:
- Always return
true
- Always return
false
- Return
b
(i.e. returns true if b is true vice versa) - Return
not b
(i.e. returns false if b is true and vice vera)
So if the function always returns true:
f (f bool) = f true = true
and if the function always return false we would get:
f (f bool) = f false = false
For the other cases lets assum the function returns not b
f (f true) = f false = true
f (f false) = f true = false
In both possible input cases, we we always end up with with the original input. The same holds if we assume the function returns b
.
So how would you prove this in coq?
Goal forall (f:bool -> bool) (b:bool), f (f b) = f b.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
稍微短一点的证明:
A tad shorter proof:
在 SSReflect 中:
In SSReflect:
感谢精彩的任务!多么可爱的定理啊!
这是使用 Coq 的 C-zar 声明式证明风格的证明。它比命令式的要长得多(尽管可能是因为我的技能太低)。
Thanks for wonderful assignment! Such a lovely theorem!
This is the proof using C-zar declarative proof style for Coq. It is a much longer than imperative ones (altrough it might be such because of my too low skill).