Existem 16 funções booleanas distintas para duas variáveis binárias, A e B:
A B | F0 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | F13 | F14 | F15
-----------------------------------------------------------------------------------------
0 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
0 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1
1 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1
1 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1
O operador less than <
, que normalmente não é considerado um operador lógico como NOT, AND ou OR, é de fato uma dessas funções (F4) quando aplicada a valores booleanos:
A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
Curiosamente, podemos simular qualquer uma das 15 outras funções usando expressões que contêm apenas os símbolos ()<AB10
. Essas expressões são lidas e avaliadas exatamente como seriam em muitas linguagens de programação padrão, por exemplo, parênteses devem corresponder e <
devem ter argumentos em ambos os lados.
Especificamente, essas expressões devem obedecer à seguinte gramática (fornecida na forma Backus-Naur ):
element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)
Isso significa que parênteses e expressões inúteis do formulário A<B<1
não são permitidos.
Portanto, a expressão A<B
corresponde à função F4 e A<B<1
deve ser alterada para (A<B)<1
ou A<(B<1)
.
Para provar que todas as outras 15 funções podem ser transformadas em expressões, basta formar um conjunto de expressões funcionalmente completas , pois, por definição, elas podem ser compostas em expressões para qualquer função.
Um desses conjuntos de expressões é x<1
(onde x
é A
ou B
), qual é ¬x
e (((B<A)<1)<A)<1
qual é A → B
. Negação ( ¬
) e implicação ( →
) são conhecidas por serem funcionalmente completas.
Desafio
Usando os caracteres ()<AB10
, escreva 16 expressões no formulário descrito acima que são equivalentes a cada uma das 16 funções booleanas distintas.
O objetivo é tornar cada uma das expressões o mais curta possível. Sua pontuação é a soma do número de caracteres em cada uma de suas 16 expressões. A pontuação mais baixa vence. O desempatador vai para a resposta mais antiga (desde que não tenha editado sua resposta posteriormente com expressões mais curtas tiradas de outra pessoa).
Tecnicamente, você não precisa escrever nenhum código real para este concurso, mas se você criou algum programa para ajudá-lo a gerar as expressões, é altamente recomendável publicá-las.
Você pode usar este snippet de pilha para verificar se suas expressões fazem o que é esperado:
(0, 0, 0, 1, 0, 1, 1, 0)
e (0, 1, 1, 0, 1, 0, 0, 0)
.