Как я могу в 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.