Tipo de datos booleanos
En informática, el booleano (a veces abreviado como Bool) es un tipo de datos que tiene uno de dos valores posibles (normalmente denominado verdadero y falso) que pretende representar los dos valores de verdad de la lógica y el álgebra de Boole. Lleva el nombre de George Boole, quien definió por primera vez un sistema algebraico de lógica a mediados del siglo XIX. El tipo de datos booleano se asocia principalmente con declaraciones condicionales, que permiten diferentes acciones cambiando el flujo de control dependiendo de si una condición booleana especificada por el programador se evalúa como verdadera o falsa. Es un caso especial de un tipo de datos lógicos más general: la lógica no siempre necesita ser booleana (ver lógica probabilística).
Generalidades
En lenguajes de programación con un tipo de datos booleano incorporado, como Pascal y Java, los operadores de comparación como > y ≠ generalmente se definen para devolver un Valor booleano. Se pueden definir comandos condicionales e iterativos para probar expresiones con valores booleanos.
Los lenguajes sin un tipo de datos booleano explícito, como C90 y Lisp, aún pueden representar valores de verdad mediante algún otro tipo de datos. Common Lisp usa una lista vacía para falso y cualquier otro valor para verdadero. El lenguaje de programación C utiliza un tipo entero, donde expresiones relacionales como && y || se definen para tener el valor 1 si es verdadero y 0 si es falso, mientras que las partes de prueba de < code>if, while, for, etc., trata cualquier valor distinto de cero como verdadero. De hecho, una variable booleana puede considerarse (e implementarse) como una variable numérica con un dígito binario (bit), o como una cadena de bits de longitud uno, que puede almacenar sólo dos valores. La implementación de booleanos en las computadoras probablemente se represente como una palabra completa, en lugar de un bit; Esto suele deberse a la forma en que las computadoras transfieren bloques de información.
La mayoría de los lenguajes de programación, incluso aquellos que no tienen un tipo booleano explícito, admiten operaciones algebraicas booleanas como la conjunción (AND, &, * code>), disyunción (), y negación (OR, |, +), equivalencia (EQV, =< /code>, , ==), exclusivo o/no equivalente (XOR, NEQV, ^, < código>!=
En algunos lenguajes, como Ruby, Smalltalk y Alice, los valores true y false pertenecen a clases separadas, por ejemplo, True y < code>False, respectivamente, por lo que no hay ningún tipo booleano.
En SQL, que utiliza una lógica de tres valores para comparaciones explícitas debido a su tratamiento especial de Nulls, el tipo de datos booleano (introducido en SQL:1999) también se define para incluir más de dos valores de verdad, de modo que SQL < Los i>booleanos pueden almacenar todos los valores lógicos resultantes de la evaluación de predicados en SQL. Sin embargo, una columna de tipo booleano se puede restringir solo a TRUE y FALSE.
Implementaciones específicas del idioma
ALGOL y el tipo BOOLEAN incorporado
Uno de los primeros idiomas de programación para proporcionar un texto explícito BOOLEAN tipo de datos es ALGOL 60 (1960) con valores verdadero y falso y operadores lógicos denotados por símbolos 'Y...'(o), '' (implies), '' (equivalencia) y '" (no). Debido al dispositivo de entrada y los límites de caracteres fijados en muchas computadoras de la época, sin embargo, la mayoría de los compiladores utilizaron representaciones alternativas para muchos de los operadores, tales como AND o 'AND'.
Este enfoque con BOOLEAN como tipo de datos incorporado (ya sea primitivo o predefinido) fue adoptado por muchos lenguajes de programación posteriores, como Simula 67 (1967), ALGOL 68 (1970), Pascal (1970), Ada (1980), Java (1995) y C# (2000), entre otros.
Fortran
La primera versión de FORTRAN (1957) y su sucesor FORTRAN II (1958) no tienen valores ni operaciones lógicas; incluso la sentencia IF condicional toma una expresión aritmética y se ramifica a una de tres ubicaciones según su signo; ver aritmética SI. FORTRAN IV (1962), sin embargo, sigue el ejemplo de ALGOL 60 al proporcionar un tipo de datos booleano (LOGICAL), literales de verdad (.TRUE. y .FALSE. ), operadores de comparación numéricos con valores booleanos (.EQ., .GT., etc.) y operadores lógicos (.NOT.< /código>, , FORMAT, se proporciona un descriptor de formato específico ('L') para el análisis o formato de valores lógicos.
Cceceo y esquema
El lenguaje Lisp (1958) nunca tuvo un tipo de datos booleano incorporado. En cambio, las construcciones condicionales como cond suponen que el valor lógico false está representado por la lista vacía (), que se define como la misma que el átomo especial nil o NIL; mientras que cualquier otra expresión s se interpreta como verdadera. Por conveniencia, la mayoría de los dialectos modernos de Lisp predefinen el átomo t para que tenga el valor t, de modo que t pueda usarse como notación mnemotécnica para < i>verdad.
Este enfoque (cualquier valor puede usarse como valor booleano) se mantuvo en la mayoría de los dialectos Lisp (Common Lisp, Scheme, Emacs Lisp), y muchos lenguajes de programación adoptaron modelos similares, incluso los que tienen un tipo booleano distinto o valores booleanos; aunque qué valores se interpretan como falso y cuáles son verdaderos varían de un idioma a otro. En Scheme, por ejemplo, el valor falso es un átomo distinto de la lista vacía, por lo que esta última se interpreta como verdadero. Common Lisp, por otro lado, también proporciona el tipo boolean dedicado, derivado como una especialización del símbolo.
Pascal, Ada y Haskell
El lenguaje Pascal (1970) popularizó el concepto de tipos enumerados definidos por el programador, anteriormente disponibles con diferente nomenclatura en COBOL, FACT y JOVIAL. Luego se proporcionó un tipo de datos Boolean integrado como un tipo enumerado predefinido con valores FALSE y TRUE. Por definición, todas las comparaciones, operaciones lógicas y declaraciones condicionales aplicadas y/o produjeron valores booleanos. De lo contrario, el tipo Boolean tenía todas las funciones disponibles para los tipos enumerados en general, como ordenar y usar como índices. Por el contrario, la conversión entre Boolean y enteros (o cualquier otro tipo) aún requería pruebas explícitas o llamadas a funciones, como en ALGOL 60. Este enfoque (Boolean es un tipo enumerado) fue adoptado por la mayoría de los lenguajes posteriores que tenían tipos enumerados, como Modula, Ada y Haskell.
C, C++, D, Objective-C, AWK
Las implementaciones iniciales del lenguaje C (1972) no proporcionaban ningún tipo booleano y, hasta el día de hoy, los valores booleanos se representan comúnmente mediante números enteros (ints) en los programas C. Los operadores de comparación (>, ==, etc.) están definidos para devolver un resultado entero con signo (int), ya sea 0 (para falso) o 1 (para verdadero). Operadores lógicos (&&, ||, !, etc.) y declaraciones de prueba de condiciones (if, while) asumen que cero es falso y todos los demás valores son verdaderos.
Después de que se agregaron los tipos enumerados (enums) a la versión de C del American National Standards Institute, ANSI C (1989), muchos programadores de C se acostumbraron a definir sus propios tipos booleanos como tales, por ejemplo. razones de legibilidad. Sin embargo, los tipos enumerados son equivalentes a números enteros según los estándares del lenguaje; por lo que la identidad efectiva entre booleanos y enteros sigue siendo válida para programas en C.
El estándar C (desde C99) proporciona un tipo booleano, llamado _Bool. Al incluir el encabezado stdbool.h, se puede usar el nombre más intuitivo bool y las constantes true y false. El lenguaje garantiza que dos valores verdaderos cualesquiera se compararán iguales (lo que era imposible de lograr antes de la introducción del tipo). Los valores booleanos todavía se comportan como números enteros, se pueden almacenar en variables enteras y usarse en cualquier lugar donde los números enteros sean válidos, incluso en indexación, aritmética, análisis y formato. Este enfoque (los valores booleanos son sólo números enteros) se ha mantenido en todas las versiones posteriores de C. Tenga en cuenta que esto no significa que se pueda almacenar cualquier valor entero en una variable booleana.
C++ tiene un tipo de datos booleano separado bool, pero con conversiones automáticas de valores escalares y de puntero que son muy similares a los de C. Este enfoque fue adoptado también por muchos lenguajes posteriores, especialmente por algunos lenguajes de scripting como AWK.
El lenguaje de programación D tiene un tipo de datos booleano adecuado bool. El tipo bool es un tipo de tamaño de byte que solo puede contener el valor verdadero o falso.
Los únicos operadores que pueden aceptar operandos de tipo bool son: &, |, ^, &=, |=, ^=, !, &&, || y ?:.
Un valor bool se puede convertir implícitamente a cualquier tipo integral, donde false se convierte en 0 y true se convierte en 1.
Los literales numéricos 0 y 1 se pueden convertir implícitamente a los valores booleanos falso y verdadero, respectivamente. Convertir una expresión a bool significa probar 0 o !=0 para tipos aritméticos y null o !=null para punteros o referencias.
Objective-C también tiene un tipo de datos booleano independiente BOOL, con valores posibles YES o NO, equivalentes a verdadero y falso respectivamente.. Además, en los compiladores de Objective-C que admiten C99, se puede utilizar el tipo _Bool de C, ya que Objective-C es un superconjunto de C.
Java
En Java, el valor del tipo de datos boolean solo puede ser true o false.
Perl y Lua
Perl no tiene ningún tipo de datos booleanos. En cambio, cualquier valor puede comportarse como booleano en un contexto booleano (condición de la declaración if o while, argumento de && o ||, etc.). El número 0, las cadenas "0" y "", la lista vacía (), y el valor especial undef se evalúa como falso. Todo lo demás se evalúa como verdadero.
Lua tiene un tipo de datos booleano, pero los valores no booleanos también pueden comportarse como booleanos. El valor sin valor nil se evalúa como falso, mientras que cualquier otro valor de tipo de datos se evalúa como verdadero. Esto incluye la cadena vacía "" y el número 0, que muy a menudo se consideran false en otros idiomas.
PL/I
PL/I no tiene ningún tipo de datos booleanos. En cambio, los operadores de comparación generan valores BIT(1); '0'B representa falso y '1'B representa verdadero. Los operandos de, por ejemplo, &, |, ¬, se convierten en cadenas de bits y las operaciones se realizan en cada bit. La expresión-elemento de una declaración IF es verdadera si algún bit es 1.
Rexx
Rexx no tiene ningún tipo de datos booleanos. En cambio, los operadores de comparación generan 0 o 1; 0 representa falso y 1 representa verdadero. Los operandos de, por ejemplo, &, |, ¬, deben ser 0 o 1.
Tcl
Tcl no tiene un tipo booleano separado. Al igual que en C, se utilizan los números enteros 0 (falso) y 1 (verdadero; de hecho, cualquier número entero distinto de cero).
Ejemplos de codificación:
set v 1 si {} $v } {} puts "V es 1 o verdadero" }Lo anterior mostrará V es 1 o verdadero ya que la expresión se evalúa como 1.
set v " si {} $v } ...
Lo anterior generará un error, ya que la variable v no se puede evaluar como 0 o 1.
Python, Ruby y JavaScript
Python, desde la versión 2.3 en adelante, tiene un tipo bool que es una subclase de int, el tipo entero estándar. Tiene dos valores posibles: True y False, que son versiones especiales de 1 y 0 respectivamente y se comportan como tales en contextos aritméticos. Además, un valor numérico de cero (entero o fraccionario), el valor nulo (Ninguno), la cadena vacía y los contenedores vacíos (listas, conjuntos, etc.) se consideran booleanos falsos; todos los demás valores se consideran booleanos verdaderos de forma predeterminada. Las clases pueden definir cómo se tratan sus instancias en un contexto booleano mediante el método especial __nonzero__ (Python 2) o __bool__ (Python 3). Para contenedores, se utiliza __len__ (el método especial para determinar la longitud de los contenedores) si no se define el método de conversión booleano explícito.
En Ruby, por el contrario, sólo nil (el valor nulo de Ruby) y un objeto especial false son false; todo lo demás (incluido el número entero 0 y las matrices vacías) es verdadero.
En JavaScript, la cadena vacía (""), null, undefinido, NaN, +0, −0 y
SQL
Los booleanos aparecen en SQL cuando se necesita una condición, como la cláusula WHERE, en forma de predicado que se produce mediante el uso de operadores como operadores de comparación, operador IN, ES (NO) NULL etc. Sin embargo, aparte de TRUE y FALSE, estos Los operadores también pueden generar un tercer estado, llamado UNKNOWN, cuando se realiza una comparación con NULL.
El estándar SQL92 introdujo los operadores ES (NO) VERDADERO, ES (NO) FALSO y ES (NO) DESCONOCIDO que evalúan un predicado, que es anterior a la introducción del tipo booleano en SQL:1999.
El estándar SQL:1999 introdujo un tipo de datos BOOLEAN como característica opcional (T031). Cuando está restringido por una restricción NOT NULL, un BOOLEAN de SQL se comporta como booleanos en otros lenguajes, que solo pueden almacenar TRUE y FALSE. Sin embargo, si admite valores NULL, que es el valor predeterminado como todos los demás tipos de datos SQL, también puede tener el valor NULL especial. Aunque el estándar SQL define tres literales para el tipo BOOLEAN: TRUE, FALSE, y UNKNOWN : también dice que NULL BOOLEAN y UNKNOWN "pueden usarse indistintamente para significar exactamente el lo mismo". Esto ha causado cierta controversia porque la identificación sujeta a UNKNOWN a las reglas de comparación de igualdad para NULL. Más precisamente, UNKNOWN = UNKNOWN no es TRUE pero DESCONOCIDO/NULL. A partir de 2012, pocos sistemas SQL importantes implementan la función T031. Firebird y PostgreSQL son excepciones notables, aunque PostgreSQL no implementa ningún literal UNKNOWN; En su lugar, se puede utilizar NULL.
El tratamiento de los valores booleanos difiere entre los sistemas SQL.
Por ejemplo, en Microsoft SQL Server, el valor booleano no se admite en absoluto, ni como un tipo de datos independiente ni representable como un número entero. Muestra el mensaje de error "Una expresión de tipo no booleano especificada en un contexto donde se espera una condición" si una columna se usa directamente en la cláusula WHERE, p. SELECCIONAR a DESDE t DÓNDE a, mientras que una declaración como SELECCIONAR columna ES NO NULL FROM t genera un error de sintaxis. El tipo de datos BIT, que sólo puede almacenar números enteros 0 y 1 aparte de NULL, se utiliza comúnmente como solución alternativa para almacenar valores booleanos. valores, pero es necesario utilizar soluciones alternativas, como ACTUALIZAR t SET bandera = IIF(col ES NOT NULL, 1, 0) DÓNDE bandera = 0 para convertir entre la expresión entera y booleana.
Microsoft Access, que utiliza Access Database Engine (ACE/JET), tampoco tiene un tipo de datos booleano. Similar a MS SQL Server, utiliza un tipo de datos BIT. En Access se le conoce como tipo de datos Sí/No y puede tener dos valores; Sí (Verdadero) o No (Falso). El tipo de datos BIT en Access también se puede representar numéricamente; Verdadero es −1 y Falso es 0. Esto difiere de MS SQL Server en dos formas, aunque ambos son productos de Microsoft:
- El acceso representa TRUE como −1, mientras que es 1 en SQL Server
- El acceso no admite el triestado Null, apoyado por SQL Server
PostgreSQL tiene un tipo BOOLEAN distinto como en el estándar, lo que permite que los predicados se almacenen directamente en una columna BOOLEAN. y permite usar una columna BOOLEAN directamente como predicado en una cláusula WHERE.
En MySQL, BOOLEAN se trata como un alias de TINYINT(1< abarcan clase="p">); TRUE es lo mismo que el entero 1 y FALSE es lo mismo que el entero 0. Cualquier entero distinto de cero es verdadero en las condiciones.
Cuadro
Tableau Software tiene un tipo de datos BOOLEANO. El literal de un valor booleano es True o False.
La función INT() de Tableau convierte un valor booleano en un número y devuelve 1 para Verdadero y 0 para Falso.
Adelante
Forth (lenguaje de programación) no tiene tipo booleano, utiliza números enteros regulares: el valor 0 (todos los bits bajos) representa falso y -1 (todos los bits altos) representa verdadero. Esto permite que el lenguaje defina solo un conjunto de operadores lógicos, en lugar de uno para cálculos matemáticos y otro para condiciones.