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 twi
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).
Theorem bool_cases : forall a, a = true \/ a = false. proof. let a:bool. per cases on a. suppose it is false. thus thesis. suppose it is true. thus thesis. end cases. end proof. Qed. Goal forall (b:bool), f (f (f b)) = f b. proof. let b:bool. per cases on b. suppose it is false. per cases of (f false = false \/ f false = true) by bool_cases. suppose (f false = false). hence (f (f (f false)) = f false). suppose H:(f false = true). per cases of (f true = false \/ f true = true) by bool_cases. suppose (f true = false). hence (f (f (f false)) = f false) by H. suppose (f true = true). hence (f (f (f false)) = f false) by H. end cases. end cases. suppose it is true. per cases of (f true = false \/ f true = true) by bool_cases. suppose H:(f true = false). per cases of (f false = false \/ f false = true) by bool_cases. suppose (f false = false). hence (f (f (f true)) = f true) by H. suppose (f false = true). hence (f (f (f true)) = f true) by H. end cases. suppose (f true = true). hence (f (f (f true)) = f true). end cases. end cases. end proof. Qed.