Jak można w coq udowodnić, że funkcja f
przyjmująca bool true|false
i zwraca bool true|false
(pokazane poniżej), w którym stosuje się dwa do jednego bool true|false
zawsze powrócić tego samego wartość true|false
:Udowodnienie F (f BOOL) = bool
(f:bool -> bool)
na przykład funkcja f
może zrobić tylko 4 rzeczy, pozwala wywołać wejście funkcji b
:
- Zawsze powrócić
true
- Zawsze wracam
false
- Powrót
b
(tj. zwraca true jeśli b jest prawdziwe odwrotnie) - Powrót
not b
(tj zwraca false, jeśli b jest prawdziwe i vice vera)
Więc jeśli funkcja zawsze zwraca true:
f (f bool) = f true = true
i jeżeli funkcja zawsze return false chcielibyśmy dostać:
f (f bool) = f false = false
Dla pozostałych przypadkach pozwala assum funkcja zwraca not b
f (f true) = f false = true
f (f false) = f true = false
W obu możliwych przypadkach wejściowych zawsze otrzymujemy oryginalne wejście. To samo dotyczy, jeśli założymy, że funkcja zwraca b
.
Jak to udowodnić w coq?
Goal forall (f:bool -> bool) (b:bool), f (f b) = f b.
zdałem sobie sprawę, że f (f b: bool)! = B nie może być udowodnione, jakby zawsze zwrócony prawdziwej f f (f false) == f prawdziwego == true = false. –
Jednak f (f (f b)) = f (b). Być może jest to bliższe Twojemu pożądanemu pytaniu? Nie wiem jak to udowodnić w Coq! –
Nawiasem mówiąc, właściwość, którą próbujesz udowodnić, ma nazwę: Idempotence. https://en.wikipedia.org/wiki/Idempotence – krokodil