En informática , el tipo de datos booleano es un tipo de datos que tiene uno de dos valores posibles (generalmente denotados como verdadero y falso ) que pretende representar los dos valores de verdad de la lógica y el álgebra booleana . 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 al cambiar el flujo de control dependiendo de si una condición booleana especificada por el programadorse evalúa como verdadero o falso. Es un caso especial de un tipo de datos lógicos más general (ver lógica probabilística ) - la lógica no siempre necesita ser booleana.
Generalidades
En los 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 tipos de datos booleanos explícitos, 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 número entero tipo, donde las expresiones relacionales como i > j
y expresiones lógicas conectadas por &&
y ||
se define para que tenga valor 1 si es verdadero y 0 si es falso, mientras que las partes de la prueba de if
, while
, for
, etc., tratar cualquier valor distinto de cero como cierto. [1] [2] De hecho, una variable booleana puede considerarse (e implementarse) como una variable numérica con un dígito binario ( bit ), que puede almacenar solo dos valores. Lo más probable es que la implementación de booleanos en computadoras se represente como una palabra completa , en lugar de un bit; esto generalmente se debe a las formas en que las computadoras transfieren bloques de información.
La mayoría de los lenguajes de programación, incluso aquellos con ningún tipo de Boole explícita, tienen el apoyo para las operaciones algebraicas booleanas como conjunto ( AND
, &
, *
), disyunción ( OR
, |
, +
), la equivalencia ( EQV
, =
, ==
), exclusiva o / no equivalencia ( XOR
, NEQV
, ^
, !=
), y la negación ( NOT
, ~
, !
).
En algunos lenguajes, como Ruby , Smalltalk y Alice, los valores verdadero y falso pertenecen a clases separadas , es decir, True
y False
, respectivamente, por lo que no hay un solo tipo booleano .
En SQL , que utiliza una lógica de tres valores para comparaciones explícitas debido a su tratamiento especial de los nulos , 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 los booleanos de SQL puedan almacenar todos valores lógicos resultantes de la evaluación de predicados en SQL. Una columna de tipo booleano se puede restringir a solo TRUE
y FALSE
aunque.
ALGOL y el tipo booleano incorporado
Uno de los primeros lenguajes de programación en proporcionar un tipo de datos booleano explícito es ALGOL 60 (1960) con valores verdadero y falso y operadores lógicos denotados por símbolos '' (y), '' (o), ''(implica),''(equivalencia), y'' (no). Sin embargo, debido a los límites de dispositivos de entrada y juego de caracteres en muchas computadoras de la época, la mayoría de los compiladores usaban representaciones alternativas para muchos de los operadores, como AND
o 'AND'
.
Este enfoque con boolean como incorporado (ya sea primitiva o de otra manera predefinida), tipo de datos fue adoptada por muchos lenguajes de programación más tarde, como Simula 67 (1967), ALGOL 68 (1970), [3] 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 u operaciones lógicas; incluso el IF
enunciado condicional toma una expresión aritmética y se ramifica a una de las tres ubicaciones según su signo; ver aritmética SI . FORTRAN IV (1962), sin embargo, sigue el ejemplo ALGOL 60 proporcionando un tipo booleano de datos ( LOGICAL
), los literales verdad ( .TRUE.
y .FALSE.
), Boolean de valor operadores numéricos de comparación ( .EQ.
, .GT.
, etc.), y operadores lógicos ( .NOT.
, .AND.
, .OR.
). En las FORMAT
declaraciones, se proporciona un descriptor de formato específico (' L
') para analizar o formatear valores lógicos. [4]
Lisp y Scheme
El lenguaje Lisp (1958) nunca tuvo un tipo de datos booleano incorporado. En cambio, las construcciones condicionales como cond
asumen que el valor lógico falso está representado por la lista vacía ()
, que se define como el mismo 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 valor t
, por lo que t
se puede usar como una notación mnemotécnica para verdadero .
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 scripting adoptaron modelos similares , incluso aquellos que tenían un tipo booleano distinto o valores booleanos; aunque los valores que se interpretan como falsos y los 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 este último se interpreta como verdadero . Common Lisp, por otro lado, también proporciona el boolean
tipo dedicado , derivado como una especialización del símbolo. [5]
Pascal, Ada y Haskell
El lenguaje Pascal (1970) introdujo el concepto de tipos enumerados definidos por el programador . A Boolean
continuación, se proporcionó un tipo de datos 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 producidas Boolean
valores. De lo contrario, el Boolean
tipo tenía todas las facilidades disponibles para los tipos enumerados en general, como ordenar y usar como índices. Por el contrario, la conversión entre Boolean
sy enteros (o cualquier otro tipo) todavía requería pruebas explícitas o llamadas a funciones, como en ALGOL 60. Este enfoque ( booleano 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 ++, Objective-C, AWK
Las implementaciones iniciales del lenguaje C (1972) no proporcionaron ningún tipo booleano y, hasta el día de hoy, los valores booleanos se representan comúnmente mediante números enteros int
en los programas C. Los operadores de comparación ( >
, ==
, etc.) se definen para devolver un entero con signo ( int
) resultado, ya sea 0 (por falsa) o 1 (por cierto). Los operadores lógicos ( &&
, ||
, !
, etc.) y las instrucciones de condición para pruebas ( if
, while
) asumen que el cero es falso y todos los demás valores son verdaderos.
Después de que enum
se agregaron los tipos enumerados a la versión de C del Instituto Nacional Estadounidense de Estándares , ANSI C (1989), muchos programadores de C se acostumbraron a definir sus propios tipos booleanos como tales, por razones de legibilidad. Sin embargo, los tipos enumerados son equivalentes a números enteros según los estándares del idioma; 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 aún se comportan como números enteros, se pueden almacenar en variables de números enteros y se pueden usar 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 solo números enteros ) se ha mantenido en todas las versiones posteriores de C. Tenga en cuenta que esto no significa que cualquier valor entero pueda almacenarse 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 también fue adoptado por muchos lenguajes posteriores, especialmente por algunos lenguajes de scripting como AWK .
Objective-C también tiene un tipo de datos booleano separado BOOL
, con valores posibles que son YES
o NO
, equivalentes de verdadero y falso respectivamente. [6] Además, en los compiladores de Objective-C que admiten C99, _Bool
se puede usar el tipo de C , ya que Objective-C es un superconjunto de C.
Java
En Java , el valor del tipo de datos booleano solo puede ser true
o false
. [7]
Perl y Lua
Perl no tiene un tipo de datos booleano. En cambio, cualquier valor puede comportarse como booleano en un contexto booleano (condición de if
o while
declaración, argumento de &&
o ||
, etc.). El número 0
, las cadenas "0"
y ""
, la lista vacía ()
y el valor especial se undef
evalúan como falso. [8] 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 no se nil
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 a menudo se consideran true
en otros idiomas.
Tcl
Tcl no tiene un tipo booleano separado. Como en C, se utilizan los enteros 0 (falso) y 1 (verdadero; de hecho, cualquier entero distinto de cero). [9]
Ejemplos de codificación:
establecer v 1 si {$ v} {pone "V es 1 o verdadero"}
Lo anterior mostrará "V es 1 o verdadero" ya que la expresión se evalúa como 1.
establecer 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 bool
tipo que es una subclase del int
tipo entero estándar. [10] 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 ( None
), 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 por defecto. [11] Las clases pueden definir cómo se tratan sus instancias en un contexto booleano a través del método especial __nonzero__
(Python 2) o __bool__
(Python 3). Para los contenedores, __len__
(el método especial para determinar la longitud de los contenedores) se usa si el método de conversión booleano explícito no está definido.
En Ruby , por el contrario, solo nil
(el valor nulo de Ruby) y un false
objeto especial son falsos ; todo lo demás (incluido el entero 0 y las matrices vacías) es verdadero .
En JavaScript , la cadena vacía ( ""
), null
, undefined
, NaN
, 0, -0 y false
[12] a veces se llaman Falsy (de los cuales el complemento es Truthy ) para distinguir entre las obligaciones de tipo controladas y bajo coacción booleanos. [13] A diferencia de Python, los contenedores vacíos (matrices, mapas, conjuntos) se consideran verdaderos. Los lenguajes como PHP también utilizan este enfoque.
Shell de próxima generación
Next Generation Shell tiene un Bool
tipo. Tiene dos valores posibles: true
y false
. Bool
no es intercambiable con Int
y debe convertirse explícitamente si es necesario. Cuando se necesita un valor booleano de una expresión (por ejemplo, en una if
declaración), Bool
se llama al método. Bool
El método para tipos incorporados se define de manera que devuelve false
para un valor numérico de cero, el null
valor, la cadena vacía, los contenedores vacíos (listas, conjuntos, etc.), procesos externos que salieron con un código de salida distinto de cero ; para otros valores Bool
devuelve verdadero. Los tipos para los que Bool
se define el método se pueden utilizar en contexto booleano. Al evaluar una expresión en contexto booleano, si no Bool
se define un método apropiado , se lanza una excepción.
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, IS (NOT) NULL, etc. Sin embargo, además de TRUE y FALSE, estos operadores también puede producir un tercer estado, llamado DESCONOCIDO, cuando se realiza la comparación con 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, por ejemplo SELECT a FROM t WHERE a
, mientras que una declaración como SELECT column IS NOT NULL FROM t
produce un error de sintaxis. El tipo de datos BIT, que solo puede almacenar enteros 0 y 1 aparte de NULL, se usa comúnmente como una solución para almacenar valores booleanos, pero se deben usar soluciones alternativas, como UPDATE t SET flag = IIF(col IS NOT NULL, 1, 0) WHERE flag = 0
convertir entre la expresión entera y booleana.
PostgreSQL tiene un tipo BOOLEAN distinto como en el estándar, [14] 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); [15] VERDADERO es lo mismo que el entero 1 y FALSO es lo mismo que el entero 0. [16] Cualquier entero distinto de cero es verdadero en las condiciones.
El estándar SQL92 introdujo los operadores IS (NOT) TRUE, IS (NOT) FALSE y IS (NOT) UNKNOWN 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 NOT NULL
restricción, un BOOLEANO de SQL se comporta como booleanos en otros lenguajes, que pueden almacenar solo valores VERDADEROS y FALSOS. Sin embargo, si admite nulos, que es el valor predeterminado como todos los demás tipos de datos SQL, también puede tener el valor nulo 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 lo mismo". [17] [18] Esto ha causado cierta controversia porque la identificación sujeta a DESCONOCIDO a las reglas de comparación de igualdad para NULL. Más precisamente DESCONOCIDO = DESCONOCIDO no es VERDADERO sino DESCONOCIDO / NULO. [19] A partir de 2012, pocos sistemas SQL importantes implementan la función T031. [20] Firebird y PostgreSQL son excepciones notables, aunque PostgreSQL no implementa un literal DESCONOCIDO; En su lugar, se puede utilizar NULL. [21]
Microsoft Access , que utiliza el motor de base de datos Microsoft Jet , [22] tampoco tiene un tipo de datos booleano. Similar a MS SQL Server, utiliza un tipo de datos BIT. [23] En Access se conoce como un tipo de datos Sí / No [24] que 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. [25] Esto difiere de MS SQL Server en dos formas, aunque ambos son productos de Microsoft:
- El acceso representa VERDADERO como -1, mientras que es 1 en SQL Server
- Access no admite el tri-estado nulo, compatible con SQL Server
Cuadro
Tableau Software tiene un tipo de datos BOOLEAN. [26] El literal de un valor booleano es True
o False
. [27]
La INT()
función de Tableau convierte un valor booleano en un número y devuelve 1 para verdadero y 0 para falso. [28]
Ver también
- verdadero y falso (comandos) , para secuencias de comandos de shell
- Expansión de Shannon
- Cálculo diferencial booleano
Referencias
- ^ Kernighan, Brian W ; Ritchie, Dennis M (1978). El lenguaje de programación C (1ª ed.). Englewood Cliffs, Nueva Jersey : Prentice Hall . pag. 41 . ISBN 0-13-110163-3.
- ^ Plauger, PJ ; Brodie, Jim (1992) [1989]. Referencia del programador de la norma C de ANSI e ISO . Microsoft Press . págs. 86–93 . ISBN 1-55615-359-7.
- ^ "Informe sobre el lenguaje algorítmico ALGOL 68, sección 10.2.2" (PDF) . Agosto de 1968. Archivado (PDF) desde el original el 6 de abril de 2008 . Consultado el 30 de abril de 2007 .
- ^ Digital Equipment Corporation, DECSystem10 FORTRAN IV Programmers Reference Manual . Reimpreso en el manual de lenguajes matemáticos . Versión en línea Archivado el 14 de agosto de2011 en Wayback Machine, consultado el 16 de noviembre de 2011.
- ^ [1]
- ^ "Guías y código de muestra" . developer.apple.com . Archivado desde el original el 7 de septiembre de 2011 . Consultado el 1 de mayo de 2018 .
- ^ "Java Booleanos" . Tutoriales web en línea de W3Schools . Consultado el 17 de febrero de 2021 .
- ^ "perlsyn - Sintaxis de Perl / Verdad y falsedad" . Archivado desde el original el 26 de agosto de 2013 . Consultado el 10 de septiembre de 2013 .
- ^ "PEP 285 - Añadiendo un tipo bool" . 4 de mayo de 2011. Archivado desde el original el 28 de marzo de 2018 . Consultado el 28 de marzo de 2018 .
- ^ van Rossum, Guido (3 de abril de 2002). "PEP 285 - Añadiendo un tipo bool" . Archivado desde el original el 1 de mayo de 2013 . Consultado el 15 de mayo de 2013 .
- ^ "Expresiones" . Documentación de Python v3.3.2 . Archivado desde el original el 22 de mayo de 2013 . Consultado el 15 de mayo de 2013 .
- ^ "Especificación del lenguaje ECMAScript" (PDF) . pag. 43. Archivado desde el original (PDF) el 12 de abril de 2015 . Consultado el 12 de marzo de 2011 .
- ^ "Los elementos del estilo JavaScript" . Douglas Crockford. Archivado desde el original el 17 de marzo de 2011 . Consultado el 5 de marzo de 2011 .
- ^ [2]
- ^ [3]
- ^ [4]
- ^ C. Fecha (2011). SQL y teoría relacional: cómo escribir código SQL preciso . O'Reilly Media, Inc. pág. 83. ISBN 978-1-4493-1640-2.
- ^ ISO / IEC 9075-2: 2011 §4.5
- ^ Martyn Prigmore (2007). Introducción a las bases de datos con aplicaciones web . Pearson Education Canadá. pag. 197. ISBN 978-0-321-26359-9.
- ^ Troels Arvin, Encuesta sobre la implementación del tipo de datos BOOLEAN Archivado el 9 de marzo de 2005 en la Wayback Machine.
- ^ "PostgreSQL: Documentación: 10: 8.6. Tipo booleano" . www.postgresql.org . Archivado desde el original el 9 de marzo de 2018 . Consultado el 1 de mayo de 2018 .
- ^ "Migrar una base de datos de Access a SQL Server" . support.microsoft.com . Consultado el 19 de octubre de 2020 .
- ^ o365devx. "Tipos de datos SQL (referencia de la base de datos de escritorio de Access)" . docs.microsoft.com . Consultado el 19 de octubre de 2020 .
- ^ "Introducción a los tipos de datos y propiedades de los campos" . support.microsoft.com . Consultado el 19 de octubre de 2020 .
- ^ "Datos booleanos - Tutorial de MS-Access" . sourcedaddy.com . Consultado el 19 de octubre de 2020 .
- ^ "Tipos de datos" . help.tableau.com . Consultado el 19 de octubre de 2020 .
- ^ "Formateo de cálculos en Tableau" . help.tableau.com . Consultado el 19 de octubre de 2020 .
- ^ "El booleano hace que Tableau sea más rápido: ¿verdadero o falso?" . Soluciones TAR . 2020-09-11 . Consultado el 19 de octubre de 2020 .