Sont || et ! les opérateurs suffisante pour faire de chaque expression logique?
L'expression logique ( a && b )
(les deux a
et b
ont des valeurs booléennes) peut être écrit comme !(!a || !b)
, par exemple. N'est-ce pas dire que &&
est "inutile"? Est-ce à dire que tous expressions logiques peuvent être effectuées uniquement à l'aide de ||
et !
?
- C'est plus une base de la logique symbolique question que Java problème, mais oui. OU et PAS en combinaison, peuvent être utilisés pour construire tout le reste. Le même avec ET et PAS. Par exemple, quand j'étais à l'école on nous a appris à construire tout en utilisant uniquement des portes NAND parce qu'ils ont pris moins de transistors.
- Ne confondez pas la capacité d'écrire une déclaration de cette façon, avec l'opportunité de le faire. Sucre syntaxique est un bon chose.
- Voir aussi "Comment faire de la logique OU de la avec la,ET la PAS?" stackoverflow.com/questions/8374895/...
- XOR est le même que ^
- De nombreux porte logique jetons seulement fournir NAND ou NOR portes comme il est possible de mettre en œuvre toutes les opérations avec eux et il les rend pas chers à produire -
A and B == !A nor !B == !(!A or !B)
. De mêmeA or B == !A nand !B == !(!A and !B)
. Évidemment passer la même valeur aux deux entrées d'un NAND ou NOR donnera le même résultat qu'un simple PAS. XOR et XNOR sont également possible, mais plus complexe. Voir le théorème De De Morgan - Oui, à l'aide ! et || opérateurs est encore plus d'options que NI le fait que NI portes sont suffisamment signifie que vous pouvez construire toute logique exclusivement avec des expressions de la forme !(A || B).
- vous pouvez construire un ordinateur de travail et de RAM juste à l'aide de la NAND. cela signifie également que vous pouvez construire stackoverflow site avec seulement NAND gate 🙂
- N'est-ce pas un ordinateur à la question scientifique? Je ne vois pas de code ici. En particulier, si cela est vrai dans la pratique varie par la mise en œuvre, par exemple en C++ avec l'exploitation d'une surcharge, il n'est pas en général.
- En fait, vous avez seulement besoin d'une expression logique pour exprimer tous les opérateurs logiques: La Sheffer accident vasculaire cérébral, ou "pas de deux": en.wikipedia.org/wiki/Sheffer_stroke
- Les gens de voir cette question comme ceci TED talk. C'est à propos de la construction d'un ordinateur en utilisant uniquement des portes NAND.
- S'il vous plaît ne pas aller à l'écriture de code en utilisant rien mais
||
et!
- il sera très illisible et futurs développeurs ne peuvent pas facilement saisir le code de l'intention. Pour ne pas mentionner le compilateur et/ou matériel en fin de compte faire ce qu'il croit est le meilleur, c'est à dire. les modules matériels déjà seulement ont des portes NAND et tout votre code sera jeté à travers elle, donc pas besoin d'essayer d'utiliser uniquement de la NAND (ou non) dans votre code. - Je ne pense pas que quiconque ici préconise de faire une telle chose. Je crois que cette question a été plus théorique de la logique de la question, que une programmation on, vraiment.
- Aussi pertinentes Un Jeu d'Instructions Ccomputer. Dans l'habitude de la mise en œuvre de l'instruction est "soustraire de la branche si negativel", mais il n'est pas abrégé
sbn
car il n'y a pas besoin de l'écrire. Le code d'assemblée se compose de l'ordre de triplets. - Vous pouvez créer toutes les expressions logiques à l'aide "ou" || et "non" ! les opérateurs, mais cela ne signifie pas que vous devriez. L'introduction de "pas" l'opérateur d'habitude rend le code plus compliqué à lire, qui peut être source d'erreurs et de malentendus. Vous devriez éviter de "pas" l'opérateur quand vous le pouvez. Vous pouvez même remplacer le || avec + (plus) et && avec * (multiplication), de sorte que vous pouvez sauter plus d'opérateurs logiques! L'Addition et la multiplication sont identiques avec "ou" et "et" pour des primitifs les types de données booléennes. Vous pouvez faire ce genre de choses, mais voulez-vous vraiment faire de votre code moins lisible et plus difficile à maintenir?
- Avez-vous des liens ou des références à des pratiques exemplaires en précisant que vous devriez éviter de l'opérateur not? Je pense que c'est tout à fait circonstancielle lorsque le pas de l'opérateur rend le code plus ou moins lisible. Alors que je suis d'accord que vous devriez généralement le minimum des opérateurs, tout en rendant le code lisible, je ne pense pas que vous devriez éviter en général un opérateur spécifique. Et, à ma connaissance, vous ne pouvez pas remplacer le || avec plus ou && avec la star.
- Vous avez raison. Je n'ai pas de référence à la pratique d'éviter de l'opérateur, mais à mon avis, si vous pouvez utiliser moins le montant des opérateurs, vous devez le faire, comme vous l'avez dit. En général, vous ne devriez pas remplacer le || avec l'addition et la && avec la star, mais quand vous avez deux valeurs booléennes, vous pouvez le faire dans l'instruction conditionnelle et il va fonctionner. Peut-être qu'il ne fonctionne pas dans toutes les langues, mais en C++, il fonctionne.
Vous devez vous connecter pour publier un commentaire.
Oui, comme les autres réponses souligné, l'ensemble des opérateurs composé de
||
et!
est fonctionnellement complets. Voici une preuve constructive de l', en montrant comment les utiliser pour exprimer tous les seize possible connecteurs logiques entre les variables booléennesA
etB
: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)
Noter que les deux NAND et NOR sont par eux-mêmes fonctionnellement (ce qui peut être prouvé en utilisant la même méthode ci-dessus), donc si vous voulez vérifier qu'un ensemble d'opérateurs est complet, c'est assez pour montrer que vous pouvez exprimer soit la NAND ou NOR avec elle.
Voici un graphique montrant la Des diagrammes de Venn pour chacune des conjonctions énumérés ci-dessus:
[source]
||
plutôt que|
) ou d'effets secondaires (pertinent parce que l'expansion de vrai, de faux, XOR et XNOR évaluer leurs arguments fois de plus que l'original constante ou l'exploitant n'a).!(!A || !B)
a le même court-circuit et d'évaluation comte deA && B
). Je ne pense pas que vous pouvez faire pour XOR et XNOR sans constructions supplémentaires (par exemple,a ? !b : b
), et vrai ou faux n'est pas un problème si vous pouvez enregistrer les valeurs, puisque vous pouvez commencer votre programme en définissanttrue
etfalse
à l'aide de certains dummy variable booléenne.Ce que vous décrivez est fonctionnelle de l'exhaustivité.
C'est ce qui décrit un ensemble d'opérateurs logiques qui est suffisant pour "exprimer toute vérité possible tableaux". Votre Java opérateur mis, {
||
,!
}, est suffisant; il correspond à l'ensemble {∨, }, qui est répertorié dans la section "Minimal fonctionnellement complète de l'opérateur fixe".L'ensemble de toutes les tables de vérité signifie que tous les ensembles possibles de 4 valeurs booléennes qui peut être le résultat d'une opération entre 2 valeurs booléennes. Car il y a 2 valeurs possibles pour un booléen, il y a 24, ou 16, tables de vérité possible.
Voici un tableau de la table de vérité des chiffres (de 0 à 15), la
||
et!
combinaisons de rendement, et une description.Il y a beaucoup d'autres fonctionnellement des ensembles complets, y compris l'un des ensembles d'éléments {NAND} et {NI}, qui n'ont pas de correspondant opérateurs en Java.
Oui.
Toutes les portes logiques peuvent être fabriqués à partir de NI portes.
Depuis une porte NOR peut être faite à partir d'un PAS et un OU, le résultat suit.
[citation-needed]
droit de marque il.Prendre le temps de lire sur DeMorgan les Lois de si vous le pouvez.
Vous trouverez la réponse dans la lecture, ainsi que les références à la logique de preuves.
Mais, pour l'essentiel, la réponse est oui.
MODIFIER: Pour précision, mon point est que l'on peut logiquement en déduire une OU de l'expression de l'un ET de l'expression, et vice-versa. Il y a plus de lois ainsi que pour la logique de l'équivalence et de l'inférence, mais je pense que celui de la plupart des apropos.
EDIT 2: Voici une preuve via la vérité-tableau montrant la logique de l'équivalence de l'expression suivante.
La Loi de DeMorgan:
!(!A || !B) -> A && B
NAND et NI sont universels, ils peuvent être utilisés pour construire la logique de l'opération que vous voulez n'importe où; d'autres opérateurs sont disponibles dans les langages de programmation pour le rendre facile à écrire et à faire des codes lisibles.
Également toutes les opérations logiques qui sont nécessaires pour être câblé dans le circuit sont également développés à l'aide soit de la NAND ou NOR seulement ICs.
Oui, en fonction de l'algèbre Booléenne, toute fonction Booléenne peut être exprimé comme une somme de minterms ou un produit de maxterms, qui est appelé canonique de la forme normale de. Il n'y a aucune raison pourquoi une telle logique ne pouvait pas être appliquée aux mêmes opérateurs utilisés en informatique.
https://en.wikipedia.org/wiki/Canonical_normal_form