首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >证明f (f bool) = bool

证明f (f bool) = bool
EN

Stack Overflow用户
提问于 2009-11-04 14:18:00
回答 3查看 1.6K关注 0票数 13

如何在coq中证明接受bool f并返回bool true|false的函数(如下图所示),当对单个bool true|false应用两次时,总是会返回相同的值true|false

代码语言:javascript
复制
(f:bool -> bool)

例如,函数f只能做4件事,让我们调用函数b的输入

  • 总是返回true
  • 总是返回false
  • 返回b (即如果b为true,则返回true,反之亦然)
  • 返回not b (如果b为true,则返回false )

因此,如果函数总是返回true:

代码语言:javascript
复制
f (f bool) = f true = true

如果函数总是返回false,我们将得到:

代码语言:javascript
复制
f (f bool) = f false = false

对于其他情况,让我们将函数返回not b

代码语言:javascript
复制
f (f true) = f false = true
f (f false) = f true = false

在这两种可能的输入情况下,我们总是以原始输入结束。如果我们假设函数返回b,同样的情况也成立。

那你怎么用coq来证明这一点呢?

代码语言:javascript
复制
Goal forall (f:bool -> bool) (b:bool), f (f b) = f b.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-26 04:45:59

代码语言:javascript
复制
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.
票数 11
EN

Stack Overflow用户

发布于 2010-03-02 14:04:19

稍短一点的证据:

代码语言:javascript
复制
Require Import Sumbool.

Goal forall (f : bool -> bool) (b:bool), f (f (f b)) = f b.
Proof.
  destruct b;                             (* case analysis on [b] *)
    destruct (sumbool_of_bool (f true));  (* case analysis on [f true] *)
    destruct (sumbool_of_bool (f false)); (* case analysis on [f false] *)
    congruence.                           (* equational reasoning *)
Qed.
票数 4
EN

Stack Overflow用户

发布于 2010-03-13 10:43:54

SSReflect

代码语言:javascript
复制
Require Import ssreflect.

Goal forall (f:bool -> bool) (b:bool), f (f (f b)) = f b.
Proof.
move=> f.
by case et:(f true); case ef:(f false); case; rewrite ?et ?ef // !et ?ef.
Qed.
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1674018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档