¿Por qué los lenguajes de programación no tienen 3 valores para booleanos: verdadero, falso y ‘no me importa’?

Estrictamente hablando, y sin tener en cuenta ningún lenguaje de programación específico, el tipo de datos booleanos en sí es binario por definición. En otras palabras, solo tiene dos estados posibles: verdadero y falso. Esto se deriva de sus raíces en el álgebra booleana [0], donde todas las expresiones finalmente evalúan sus valores de verdad. Los dos valores de verdad disponibles son una consecuencia de la ley del medio excluido; es decir, para cualquier proposición, la proposición misma es verdadera o su negación es verdadera [1].

Dicho esto, sin embargo, muchos lenguajes de programación proporcionan tipos anulables [2], que de hecho permiten un tercer pseudovalor en el caso de un booleano: verdadero, falso y sin valor. Los ejemplos incluyen C #, Java, SQL, etc. El significado del tercer estado sin valor depende en última instancia del contexto, en cuyo caso “no me importa” es sin duda una de las posibilidades.

[0] Álgebra booleana
[1] Ley del medio excluido
[2] Tipo anulable

Porque en la memoria de la computadora, un bit puede establecerse en 0 o en 1. No en 1/2.

Y cuando las personas necesitan usar “bit” con más estados, usualmente usan números enteros que tienen mucho estado.

Además, algunos idiomas le permiten sobrecargar a los operadores si desea hacer lógica con más estados. Pero eso puede ser engañoso.

Si asigna 1 a verdadero, 0 a no sé y -1 a falso, tiene las siguientes igualdades para implementar sus operadores lógicos:
a & b = max (a, b)
a | b = min (a, b)
! a = -a

Por qué no? Hay muchos lenguajes que tienen verdadero, falso y nulo / nulo / lo que sea, y algunos otros lenguajes que admiten lógica de tres valores (verdadero / falso / desconocido). La razón principal de su uso poco común es porque es menos útil que la lógica booleana en la mayoría de los casos, e implementarlo en computadoras binarias necesita más trabajo.

En electrónica también hay lógica de tres estados con 3 niveles: alto, bajo y alto-Z. También hay algunas computadoras ternarias donde hay 3 valores para cada “trit” aunque mucho menos comunes que las computadoras binarias debido a la complejidad. Algunos pueden usar el ternario equilibrado con bits valorados en -1, 0 y 1. Incluso hay lógica difusa para cualquier valor lógico de 0 a 1.

¿Por qué lo contarías si realmente no te importara?

Si realmente desea un “booleano” de 3 estados, probablemente prefiera una enumeración y luego use un modificador / cond / case en lugar de una instrucción if. Con eso puedes tener muchos más de 3 “estados”.

De todos modos, la idea de “no me importa” podría estructurarse en su “función” booleana (en lugar de ser un “valor”). O omitiendo el cheque, o mediante el uso de combinaciones de o / y / no / etc. En términos generales, si siente que necesita un “valor que no me importa”, debería mirar el diseño de su algoritmo.

Qubit – Bit cuántico.

Un qubit tiene algunas similitudes con un bit clásico, pero en general es muy diferente. Al igual que un bit, un qubit puede tener dos valores posibles: normalmente un 0 o un 1. La diferencia es que, si bien un bit debe ser 0 o 1, un qubit puede ser 0, 1 o una superposición de ambos.

Encuentre o cree un lenguaje de programación que implemente esto.

Suficientemente cerca ?

Porque solo hay dos valores booleanos, no tres. Bool está conectado a predicados en lógica matemática, que es bivalente. De lo que estás hablando es de trivalencia, como en la lógica trinaria.

En todo caso, un posible tercer habitante de tipo bivalente no representaría “no me importa” o “no sabe”, sino que representaría la ausencia de un valor / indisputabilidad. En matemáticas, esto se conoce como ⊥ y a menudo se pronuncia ‘fondo’. Realmente no es un valor.

Puede pensarlo como lo que una función devuelve a la persona que llama cuando lanza una excepción o cuando entra en un bucle infinito. Es el valor que se devuelve cuando no se devuelve ningún valor. Es un no valor. Sin embargo, puede considerarse un tercer habitante de Bool.

Si cuenta un lenguaje de descripción de hardware como lenguaje de programación, hay algunos que tienen 3 valores.

No tienen 3 valores después de la compilación, pero a veces, al escribir un programa, no le importa si un bit en particular termina como ‘1’ o ‘0’ y el compilador usa el valor de ‘1’ o El ‘0’ para los bits ‘no importa’ resulta ser el más conveniente para optimizar la velocidad o el área.

Aparte de esas situaciones en las que hay una operación poco inteligente en el hardware que tiene que suceder, realmente no tiene sentido crear un estado “no me importa” para un booleano. Si no le importa, omita evaluarlo. Realmente no puede evitar evaluar algo en hardware, pero sí puede hacerlo en software.

Puede haber un tipo como ese, pero ya no será booleano.

Es como decir por qué los valores enteros no pueden tener valores flotantes. Es para lo que están destinados.

Tenga cuidado con lo que desea, o puede encontrarlo en la próxima versión de Python.

Creo que casi puedes defender el soporte existente para booleanos de tres estados en JavaScript. Supongamos, por ejemplo, que se supone que un método devuelve verdadero si algún proceso asíncrono ha tenido éxito, y falso si ha fallado. El valor de retorno real es 1 en caso de éxito, 0 en caso de error y NaN (Ups) si el proceso aún se está ejecutando. Esto no es tanto un caso de “no me importa”. Es más como “aún no lo sé”.

¿Qué hacer? Bueno, puedes usar una comparación de tres estados:
var foo = bar ();
if (foo == verdadero) {
// manejar el proceso exitosamente
} else if (foo == false) {
// el proceso de manejo falló
} más {
// manejar aún no hecho
}

La fealdad y el potencial de error y la mala lectura del código son bastante evidentes. Supongo que esto se relaciona con por qué no vemos soporte explícito incorporado para booleanos de tres estados en lenguajes de programación.

Hay poco valor en hacer eso. En primer lugar, no importa no son valores booleanos. En la lógica booleana, solo tienes verdadero / 1 y falso / 0. No importa son combinaciones de valores de entrada que el diseñador del sistema sabe que nunca ocurren. Entonces, ¿por qué querría contabilizarlos en el código ?, e incluso si lo hace, puede probar las secuencias válidas y actuar en consecuencia si una secuencia no es válida.

Se podría programar una lógica de tres valores en una máquina binaria.

Si Boolean se basa únicamente en estados de máquina, entonces debe ser binario. Si se basa en un algoritmo, no necesita ser binario.

En Java, puede usar la clase booleana, en lugar de la booleana primitiva, por lo que puede usar nulo como valor para significar exactamente eso.

Simple: si no le importa el valor, no verifique el valor .

Quiero decir, suena trivial, pero es una especie de punto de programación que solo tratas con la información que te interesa. Cualquier valor que no importe no debe investigarse.

Los idiomas mal escritos pueden tener> 2 valores de verdad con resultados del tipo ‘último valor’.

De hecho, permiten un tercer valor de “no me importa”, si el booleano es anulable. El valor nulo significa esencialmente vacío o ningún valor.

C # tiene bool? que puede tener tres estados, nulo (no especificado o no me importa), verdadero y falso.

Eso es lo que nos hace humanos diferentes de las computadoras, para ellos todo es un “sí” o “no”, no tienen un camino intermedio.