Boolean

Boolean je v informatice datový typ určený pro reprezentaci pravdivostních hodnot pravda (true) a nepravda (false). Zatímco jazyky ALGOL a Pascal zavádějí zvláštní typ pro logické hodnoty, umožňují deklarovat proměnné tohoto typu a používat je na místě podmínek, část nejstarších programovacích jazyků na syntaktické úrovni oddělovala výrazy a logické podmínky, které byly výsledkem uplatnění relačních operátorů (=, ≠, >, <, ≥, ≤), bylo na ně možné aplikovat logické operátory nebo spojky (not, and, or, případně další) a mohly se vyskytnout pouze na specifických místech (podmínka v podmíněném příkazu nebo v příkazech cyklu), takže u těchto jazyků nic jako typ boolean neexistovalo. Jazyk C a mnoho dalších jazyků sice dovolují použití logických hodnot ve výrazech, ale zvláštní typ pro logické hodnoty nemají; logické hodnoty se ukládají do celočíselných proměnných, a celočíselné hodnoty lze interpretovat jako logické hodnoty (např. 0 je nepravda, jakákoli nenulová hodnota je pravda).

Boolean je pojmenován po Georgeovi Booleovi, který v polovině 19. století vytvořil algebraický systém pro logické výrazy.

Logická tabulka

[editovat | editovat zdroj]
X Y X and Y X or Y not X
false false false false true
false true false true true
true false false true false
true true true true false
  • and – logický součin (konjunkce)
  • or – logický součet (disjunkce)
  • not – negace

Calc (Excel)

[editovat | editovat zdroj]

V tabulkovém editoru Calc, popř. Excel počítáme s booleovskými proměnnými jako s běžnými čísly, jen nakonec výsledek absorbujeme dvojitou negací. K tomu slouží funkce NOT():

=NOT(5) .......... NEPRAVDA
=NOT(5)*1 ........ 0
=NOT(NOT(5)) ..... PRAVDA
=NOT(NOT(5))*1 ... 1

Ukažme to na příkladu zákona distribuce u součinu, který neplatí v běžné algebře: Jestliže A=B=C=1, pak v normální algebře

A+(B.C) ≠ (A+B).(A+C)
2≠4

V Booleovské logice se ale rovnají, protože výsledky obou stran musíme absorbovat. V Calcu tuto absorpci děláme dvojitou negací:

=NOT(NOT(A1+(B1*C1))) ........ PRAVDA
=NOT(NOT((A1+B1)*(A1+C1))) ... PRAVDA

Jeden z prvních programovacích jazyků ALGOL 60, definoval datový typ Boolean a jeho související operace. Algol 68 zkrátil název na bool.

Operace s Boolean operandy:

  1. op ∨ = (bool a, b) bool: ( a | true | b );
  2. op ∧ = (bool a, b) bool: ( a | b | false );
  3. op ¬ = (bool a) bool: ( a | false | true );
  4. op = = (bool a, b) bool: ( a∧b ) ∨ ( ¬b∧¬a );
  5. op ≠ = (bool a, b) bool: ¬(a=b);
  6. op abs = (bool a) int: ( a | 1 | 0 );

V jazyce Pascal je typ boolean ordinální typ, pro který jsou definovány všechny relační operace (=, ≠, >, <, ≥, ≤). Z toho, že v tomto typu platí uspořádání false < true vyplývá, že i nad tímto typem jsou definovány standardní funkce succ(x), pred(x) a ord(x). Hodnota ord(false) = 0, hodnota ord(true) = 1. A dále jsou zde definovány binární operace konjunkce, disjunkce a unární operace negace.

{ typ boolean se chová jako výčtový typ hodnotami false a true }
Type
   boolean = (false, true);

{ využití }

var
  Hodnota: boolean;
 
{ ... }
 
Hodnota := true;
Hodnota := false;
 
if Hodnota then
begin
  { ... }
end;

Některé překladače jako Delphi mají rozšířený typ boolean (bytebool, wordbool, longbool).

V jazyce C až do verze C99 neexistuje zvláštní typ pro logické hodnoty. Operátory porovnávání čísel <, >, <=, >=, == (je rovno), != (není rovno), stejně jako logické operátory && (konjunkce), || (disjunkce) a ! (negace) vracejí hodnoty typu int, konkrétně hodnotu 1 s významem pravda a hodnotu 0 s významem nepravda; při vyhodnocování v příkazech if a while, v logických operátorech &&, || a ! a v podmíněném výrazu ? : se 0 bere jako nepravda a jakákoli nenulová hodnota jako pravda. Tento přístup převzala celá řada dalších jazyků, jako AWK nebo Perl; některé jazyky pouze doplnily další hodnoty, které se považují za nepravdu (například prázdný řetězec). Konstanty pro logické hodnoty bylo možné ve starších verzích jazyka C definovat pomocí direktiv preprocesoru #define TRUE 1, #define FALSE 0.

Ukládání jednobitové hodnoty do mnohabitové celočíselné proměnné je plýtvání pamětí, proto někteří programátoři používají pro logické hodnoty typ char. Jazyk C poskytuje struktury s bitovými poli, která umožňují využívat jednu celočíselnou proměnnou pro uložení několika logických hodnot, ale mnoho programátorů je považuje za nebezpečné a nepřenositelné (díky rozdílům v ukládání dat do paměti). Proto se v mnoha programech používají pro zhuštěné ukládání logických hodnot operace s bitovými maskami (operátor |= pro nastavení, operátor &= pro vynulování a operátor bitové konjunkce & pro testování). Výčtové typy enum zavedené v ANSI C umožňují nadeklarovat logické hodnoty jejich pomocí, ale protože se výčtové typy stále považují za pojmenované konstanty typu int, výsledná vnitřní implementace zůstává nezměněna.

Až od verze C99 obsahuje standard jazyka C logický typ nazvaný _Bool. Po vložení hlavičkového souboru stdbool.h lze používat intuitivnější jméno bool a konstanty true a false. Jazyk zaručuje, že při porovnání budou libovolné dvě hodnoty true považovány za stejné (což nebylo splněno před zavedením zvláštního logického typu). Logické hodnoty se stále chovají jako celočíselné, mohou být ukládány v celočíselných proměnných a použity kdekoli, kde lze použít celá čísla, včetně indexování polí, aritmetických operací, načítání a výpisu. Tento přístup (hodnoty Boolean jsou pouze celá čísla) zůstává zachován ve všech pozdějších verzích jazyka C. Neznamená to však, že lze v proměnné typu boolean uložit libovolné celé číslo.

V C# jsou booleovské proměnné identifikovány pomocí vyhrazeného slova bool, což je alias pro předdefinovný typ System.Boolean. Tento typ zabírá jeden byte. Nestandardní konverze existují mezi bool a dalšími typy.

Kód na výstupu by mohl vypadat takto:

bool myBool = (i == 5);
System.Console.WriteLine(myBool ? "I = 5" : "I != 5");

V programovacím jazyce Fortran bylo v 50. letech zavedeno klíčové slovo LOGICAL a související slova .NOT., .AND., .OR..

Objective-C

[editovat | editovat zdroj]

Objective-C nabízí typ BOOL a hodnoty YES a NO. Vzhledem k tomu, že Objective-C je nadstavbou C, také zde platí jazyková sémantika pro typ boolean.

OCaml má typ bool, který má hodnoty true a false.

# 1 = 1 ;;
- : bool = true

PHP nemá striktně typové proměnné, zato definuje hodnoty true a false. Některé funkce, které typicky vracejí celá čísla nebo řetězce, vracejí false v případě neúspěchu. Spolu s typovým porovnáváním může být odlišeno od hodnoty 0, která v některých případech může být výslednou hodnotou v případě úspěchu (jako například u funkce strpos()).

$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);

// Všimněte si použití ===. Obyčejné == by nefungovalo podle předpokladu,
// protože 'a' je na nultém (prvním) místě.
if ($pos === false) {
    echo "Řetězec '$findme' nebyl nalezen v řetězci '$mystring'.\n";
} else {
    echo "Řetězec '$findme' byl nalezen v řetězci '$mystring'";
    echo " a to na pozici $pos.\n";
}

V Pythonu je datový typ bool.

pravda = True
nepravda = False
if pravda or nepravda:
    print("pravda")
if pravda and not nepravda:
    print("pravda")

V programovacím jazyce Java je zaveden primitivní typ boolean.

boolean i = true;
if (i)
  System.out.println("i je pravda.");
else
  System.out.println("i neni pravda.");

V jazyce Java mohou být boolean hodnoty (stejně jako ostatní primitivní typy) konvertovány na řetězce (výsledkem je řetězec true nebo false).

Protože GML pracuje pouze s datovými typy String (řetězec) a Real (reálné číslo), v GML neexistuje datový typ boolean. GML typ boolean simuluje tak, že definuje konstantu true, resp. false, která obsahuje reálné číslo 1, resp. reálné číslo 0.

promenna0 = choose(true,false) // definuje, že promenna0 je boolean a nese náhodně pravdu či nepravdu
promenna0 = !promenna0 // promenna0 se invertuje (z true je false a z false je true)

if(promenna0) // pokud promenna0 nese pravdu
{
	show_message("true") // zobrazí zprávu "true"
}
else // jinak (pokud nenese pravdu)
{
	show_message("false") // zobrazí zprávu "false"
}

Související články

[editovat | editovat zdroj]

Externí odkazy

[editovat | editovat zdroj]