A expressão lógica ( a && b )
(ambos a
e b
com valores booleanos) pode ser escrita como !(!a || !b)
, por exemplo. Isso não significa que &&
é "desnecessário"? Isso significa que todas as expressões lógicas podem ser feitas apenas usando ||
e !
?
logic
logical-operators
JakeTheSnake
fonte
fonte
A and B == !A nor !B == !(!A or !B)
. Da mesma formaA or B == !A nand !B == !(!A and !B)
. Obviamente, passar o mesmo valor para as duas entradas de um NAND ou NOR dará o mesmo resultado que um simples NOT. XOR e XNOR também são possíveis, mas mais complexos. Veja o teorema de De MorganRespostas:
Sim, como as outras respostas apontaram, o conjunto de operadores que compreende
||
e!
é funcionalmente completo . Aqui está uma prova construtiva disso, mostrando como usá-los para expressar todos os dezesseis possíveis conectores lógicos possíveis entre as variáveis booleanasA
eB
:A || !A
!A || !B
!B || A
!A || B
A || B
!B
!A
!(!A || B) || !(A || !B)
!(!A || !B) || !(A || B)
A
B
!(A || B)
!(!A || B)
!(!B || A)
!(!A || !B)
!(A || !A)
Observe que NAND e NOR são eles próprios funcionalmente completos (o que pode ser comprovado usando o mesmo método acima); portanto, se você deseja verificar se um conjunto de operadores está funcionalmente completo, basta mostrar que você pode expressar NAND ou NOR com isso.
Aqui está um gráfico mostrando os diagramas de Venn para cada um dos conectivos listados acima:
[ fonte ]
fonte
||
do que|
) ou efeitos colaterais (relevante porque a expansão de true, false, XOR e XNOR avaliam seus argumentos mais vezes do que a constante ou o operador original).!(!A || !B)
tem a mesma contagem de curto-circuito e avaliação queA && B
). Eu não acho que você possa fazer isso para XOR e XNOR sem construções adicionais (por exemploa ? !b : b
), e verdadeiro ou falso não é um problema se você pode salvar valores, pois você pode iniciar seu programa definindotrue
efalse
usando alguma variável booleana fictícia.O que você está descrevendo é integridade funcional .
Isso descreve um conjunto de operadores lógicos que é suficiente para "expressar todas as tabelas verdadeiras possíveis". O seu Java do operador, {
||
,!
}, é suficiente; corresponde ao conjunto {∨, ¬}, listado na seção "Conjuntos mínimos de operadores funcionalmente completos".O conjunto de todas as tabelas verdadeiras significa todos os conjuntos possíveis de 4 valores booleanos que podem ser o resultado de uma operação entre 2 valores booleanos. Como existem 2 valores possíveis para um booleano, existem 2 4 ou 16 tabelas de verdade possíveis.
Aqui está uma tabela dos números da tabela verdade (0-15), as combinações
||
e!
que a produzem e uma descrição.Existem muitos outros conjuntos funcionalmente completos, incluindo os conjuntos de um elemento {NAND} e {NOR}, que não possuem operadores únicos correspondentes em Java.
fonte
Sim.
Todas as portas lógicas podem ser feitas a partir de portas NOR.
Como uma porta NOR pode ser feita a partir de um NOT e um OR, o resultado segue.
fonte
[citation-needed]
marca ali.Reserve um tempo para ler as leis de DeMorgan, se puder.
Você encontrará a resposta na leitura, assim como referências às provas lógicas.
Mas essencialmente, a resposta é sim.
EDIT : Para explicitação, o que quero dizer é que é possível inferir logicamente uma expressão OR a partir de uma expressão AND e vice-versa. Também existem mais leis para equivalência lógica e inferência, mas acho que essa é mais apropriada.
EDIT 2 : Aqui está uma prova via tabela de verdade mostrando a equivalência lógica da expressão a seguir.
Lei de DeMorgan:
!(!A || !B) -> A && B
fonte
NAND e NOR são universais, podem ser usados para criar qualquer operação lógica que você deseja em qualquer lugar; outro operador está disponível nas linguagens de programação para facilitar a gravação e a criação de códigos legíveis.
Além disso, todas as operações lógicas que precisam ser conectadas no circuito também são desenvolvidas usando ICs NAND ou NOR apenas.
fonte
Sim, de acordo com a álgebra booleana, qualquer função booleana pode ser expressa como uma soma de mintermos ou um produto de maxtermos, chamado forma normal canônica . Não há razão para que essa lógica não possa ser aplicada aos mesmos operadores usados na ciência da computação.
https://en.wikipedia.org/wiki/Canonical_normal_form
fonte