Как я могу в coq доказать, что функция f, которая принимает bool true|false и возвращает bool true|false (показано ниже), когда применяется дважды к одному bool true|false, всегда будет возвращать тот же значение true|false:
(f:bool -> bool)
Например, функция f может выполнять только 4 вещи, позволяет вызвать входной сигнал функции b:
- Всегда возвращать
true - Всегда возвращайте
false - Возвращает
b(т.е. возвращает true, если b истинно наоборот) - Возвращает
not b(т.е. возвращает false, если b - true и vice vera)
Итак, если функция всегда возвращает 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.