coqでf
、boolを受け入れてbooltrue|false
を返す関数true|false
(以下に表示)を1つのboolに2回適用すると、true|false
常に同じ値が返されることを証明するにはどうすればよいですかtrue|false
。
(f:bool -> bool)
たとえば、関数f
は4つのことしか実行できません。関数の入力を呼び出しましょうb
:
- 常に戻る
true
- 常に戻る
false
- Return
b
(つまり、bがtrueの場合はtrueを返し、その逆の場合) - Return
not b
(つまり、bがtrueの場合はfalseを返し、その逆の場合はfalseを返します)
したがって、関数が常にtrueを返す場合:
f (f bool) = f true = true
関数が常にfalseを返す場合、次のようになります。
f (f bool) = f false = false
その他の場合は、関数がnot 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.