- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
#include <stdbool.h>
bool impl(bool a, bool b) // ->
{
return (!a || b);
}
bool always_true(bool a, bool b)
{
return (impl(a,b) == impl(b,a)) == (a == b); // ( (a -> b) = (b -> a) ) = (a = b) tautology
}
/*
GCC не хочет мне тавтологию оптимизировать!
https://godbolt.org/z/kgFMpR
always_true:
movl %esi, %eax
xorl %edi, %eax
cmpb %dil, %sil
sete %dl
xorl %edx, %eax
ret
Но Clang может
https://godbolt.org/z/YcOat-
always_true: # @always_true
movb $1, %al
retq
*/
https://en.wikipedia.org/wiki/Frege%27s_theorem
(P → (Q→R)) → ((P→Q) → (P→R))
GCC опять хрени нагенерил.
а clang норм сделал:
GCC сообразил нормально:
Видимо, GCC считает, что bool может иметь значения отличные от false и true.
https://godbolt.org/z/veF6xe
А вот эту хуйню ни один компилятор не оптимизирует
Metamath is a tiny language that can express theorems in abstract mathematics, accompanied by proofs that can be verified by a computer program. This site has a collection of web pages generated from those proofs and lets you see mathematics developed in complete detail from first principles, with absolute rigor. Hopefully it will amuse you, amaze you, and possibly enlighten you in its own special way.
Нет, это не APL. Это прувчекер
Если же сделать каст к байту, то выхлоп уже без ветвлений: Выхлоп кодогенератора: Он зачем-то чистит булеву переменную, чтобы на выходе точно не было ничего, кроме нуля и единицы. В функции always_true и always_true2 он подставляет именно этот фрагмент кода, не оптимизируя.
Какой позор (((
А чего добился ты?
Куикк.
> не набухиваться до усрачки