sobota 17. srpna 2019

Programovací a skriptovací jazyky

Počítačových jazyků dnes existuje nepřeberné množství, proto bývá užitečné je seskupovat do různých kategorií podle míry abstrakce, využití, způsobu běhu apod. Jedním z nich je i rozdělení jazyků na programovací a skriptovací (pojem "programovací jazyky" může být brán obecně jako všechny jazyky i konkrétně jako opak skriptovacích).

Jak už to tak bývá, i toto rozdělení je vcelku vágní. Už jsem viděl situace, kdy byl třeba jazyk C (drtivě programovací) použit pro psaní skriptů nebo kdy v JavaScriptu (převážně skriptovacím jazyce) byly napsány velké programy. Obecně se dá říct, že jazyky programovací jsou určené pro psaní programů, zatímco skriptovací jsou určené pro psaní skriptů, ale některé lze použít i pro druhý účel.

Jenomže jsme si tím moc nepomohli, neboť už ani samotné pojmy program a skript nejsou dobře definované. Program bývá tradičně izolovaný kus kódu, který může běžet samostatně, zatímco skript běží v rámci nějakého prostředí. Problém ale nastane, když si uvědomíme, že i programy vlastně běží pod operačním systémem, se kterým musejí komunikovat (pomocí API), takže i v jejich případě existuje nějaké prostředí. Můžeme z možných prostředí odstranit operační systém, ale co virtuální běhové prostředí .NET a JRE pro C# a Javu? Je kód v Lue, PHP či Haskellu, spuštěný v korespondujícím interpretru, stále program, či už skript? A co kus JavaScriptu spuštěný prohlížečem na webové stránce?

Napadlo mě, že bych tyto pojmy definoval přesněji, což by možná pomohlo při klasifikaci některých jazyků. Podle mé nové definice je program kód, jehož části mohou být vykonávány jen současně s jeho tělem. Tělo je pak hlavní procedura celého programu, s jejímž začátkem program vzniká a s jejímž koncem program zaniká. Když skončí tělo programu, už z něj nic nezbyde.

Oproti tomu skript po sobě často něco zanechává. Obsluha webové stránky v JavaScriptu či herní kód v Lue často reaguje na určité podněty generované prostředím, jejichž kód bývá vyvolán i poté, kdy skončí tělo skriptu.

Kupříkladu aplikace, která při spuštění vytvoří okno kalkulačky, reaguje na stisknutí tlačítek a počítá výsledky operací, je program, pokud součástí kódu je nějaká hlavní procedura, na jejímž začátku okno ještě neexistuje a na jejímž konci je už okno definitivně zavřené. Pokud hlavní procedura chybí (uživatelský kód jej neinicializuje), musí logicky existovat nějaké řídící prostředí, které se postará o jeho vytvoření. To zní trochu ezotericky, ale webová kalkulačka je perfektní příklad takového případu: webový prohlížeč (zde program) vytvoří reprezentaci stránky (pomocí deklarativního HTML) a poté spouští různé kusy kódu v JavaScriptu v závislosti na tom, co uživatel na stránce udělal. Pokud by existovalo nějaké newebové prostředí, které by fungovalo stejně (např. WPF neumožňující metodu Main), nebyl by v tom žádný rozdíl.

Pokud bych do své kalkulačky přidal podporu pluginů/zásuvných modulů, které bych informoval o všem, co se v kalkulačce děje (pomocí událostí), stává se moje aplikace prostředím pro skripty, ať jsou psané v C++ nebo Lue. Pokud by ale nějaký plugin převzal řízení nad aplikací (např. vytvořil modální okno), kde by kupříkladu kreslil grafy, stane se z něj program. Řízení klidně může předávat aplikaci zpět (koneckonců to samé dělá multitasking v OS), ale jeho průběh musí být jasně určen tělem.

Toto rozlišení nám umožní definovat jazyky ryze programovací (musí obsahovat tělo, které podmiňuje běh kódu programu) a ryze skriptovací (nemohou obsahovat tělo; vše je řízeno obsluhou událostí). Pokud bych vynutil v jazyce C funkci main, bude to jazyk ryze programovací, neboť vše v něm definované musí na jejím konci zaniknout. Naopak pokud bych v Lue zabránil vykonávat příkazy mimo funkci (např. tím, že globální prostředí poskytnu až po skončení těla skriptu) kromě inicializace se nebude moci takový skript nijak navenek projevovat, a tedy takový jazyk bude ryze skriptovací.

Jak je patrné z příkladů, reálné jazyky zapadají někam mezi tyto dvě kategorie. I programovací jazyk C++ mohu použít jako skriptovací v jiném programu tak, že spustím kompilátor, za běhu dynamicky načtu výsledek a zavolám v něm exportované funkce, a stejně tak interpretr JavaScriptu můžu spustit na kódu tak, že zanikne, jakmile skončí jeho tělo.

Skutečnost se má tak, že mnohdy to, zdali je nějaký jazyk programovací či skriptovací, závisí na konfiguraci prostředí. Operační systém či interpretr Luy jsou programy určené ke spouštění jiných programů a tak s nimi zacházejí, zatímco webový prohlížeč či hra je prostředí určené ke spouštění skriptů.

Příklad jazyka, který by se dal označit za hybridní, je Pawn. Ačkoliv je staticky typovaný, kompilovaný a má funkci main (tedy obsahuje rysy programovacích jazyků), je primárně určen pro psaní vnořeného kódu pro existující systémy, tedy pro psaní skriptů. Vstupní body v Pawnu jsou všechny veřejné (exportované) funkce a funkce main, přičemž má-li kód pouze veřejné funkce (a nikoliv main), jeho běh je zcela řízen prostředím a tudíž se jedná o skript, zatímco pokud kód má pouze funkci main, má jen jediný možný průběh a jedinou možnost, jak se projevit, a tudíž se jedná o program.

Tato definice není nikterak absolutní a jako podobné definice těchto termínů nemusí být ani tak užitečná, ale podle mého názoru je rozhodně zajímavé přemýšlet o návrzích jazyků z různých úhlů pohledu, zvláště když to určuje, na co se jazyky dají použít a na co nikoliv.

Na závěr je ještě nutno dodat, kam patří jazyky jako HTML či XML. Nikam, protože to nejsou aktivní jazyky, tedy jazyky umožňující zápis kódu, který něco vykonává. Pokud by programy byly na jedné straně škály a skripty na druhé, kód v HTML by přečníval dál za skripty, protože v takovém případě má prostředí absolutní moc nad tím, jak jej interpretovat.
 
Dodatek: Mluvit o webových stránkách v rámci tohoto srovnání je možná trochu nešikovné, protože každá stránka se skládá z mnoha komponent, kde ty aktivní nemají zdaleka tak velkou váhu, jako tomu bývá u klasických programů. Kód v HTML, CSS i JS existuje v rámci jednoho celkového programu, který vzniká otevřením stránky a zaniká jejím zavřením, ale ačkoliv zde prohlížeč figuruje podobně jako OS spuštěním tohoto programu, zároveň ho i (narozdíl od OS) také vytváří z poskytnutých součástí.

Druhý dodatek: Mimo toto rozdělení stojí i některé kódy, které se též tradičně nazývají programy, například lineární programy. Ty stojí na stejném místě jako XML, protože pouze popisují proměnné a jejich vztahy a slouží jen k vybudování nějakého objektu.

úterý 14. května 2019

Tolerance

Na úvod obligatorní informace, že se neztotožňuji s názory, které vedou k nadřazování skupin obyvatelstva nad jiné ani které legitimizují trestné činy. Pokud by to nebylo zřejmé.

Říkám si, kdy to začalo. Kdy se ve společnosti něco změnilo, co způsobilo, že tolerance, respekt a úcta mezi lidmi se už přestala nosit. Či jsem možná jen naivní a bylo to takhle vždycky... nevím.

Začal jsem o tom přemýšlet už v době, kdy začala kampaň MeToo, jejímž cílem bylo poukázat na sexuální obtěžování. S uplynulým časem ale mám stále větší a větší pocit, že ačkoliv důvody pro její vznik mohly být ctnostné, bylo by lepší ji spíš přirovnat k atomové pumě, kterou může každý její člen shodit na kohokoliv, s kým má nějaký problém, bez nějakých důkazů nebo soudu, bez čehokoliv. To není spravedlnost ani morálka, to je pouze msta.

Nedávno zase došlo k jakémusi „odhalení“ zpěváka Michaela Jacksona ze sexuálního obtěžování dětí. Ponechme stranou, zdali k tomu opravdu došlo; to by měl rozhodnout soud a ne já. Reakce některých lidí na tuto událost mi ale přišly naprosto odporné. Jako lavina se začaly odstraňovat Jacksonovy písničky, různé zmíňky o něm, dokonce i díl Simpsonových, kde byla jeho postava. Jako by lidi zapomněli, čím přispěl ke kultuře a k rozvoji hudby. Když už neměl přežít on, jeho dílo mělo.

Asi je jasné, proč tyto odstavce píši. Nesouhlasím s premisou, že každý člověk musí být svatý, aby měl nárok na respekt. Pokud ve společnosti stačí pouze někoho obvinit, aby se z něj stal veřejný nepřítel číslo jedna, aby mu bylo znemožněno vystupovat a být pro společnost prospěšný, pak taková společnost není soudná ani spravedlivá. Je dobře, že státy východní Evropy si už takovou dobou prošly, takže si snad jejich občané zachovají rozum, ale o budoucnost západu se upřímně bojím.

Kdyby jenom zůstalo u skutků, které mohou být trestné činy, tak budiž. Skutečnost nám však bohužel ukazuje, že i odlišnost názorů mnohdy k odstranění osoby bohatě postačí. Nedávno byl tvůrce populární hry Minecraft, známý jako Notch, odstraněn z různých textů ve hře jen kvůli tomu, že má názory, které by se daly označit jako kontroverzní. Ať jsou jeho názory jakékoliv, má na ně přeci svaté právo a to, že je ve hře zmíněno jeho jméno, jim přeci nedává žádnou větší váhu. Vždyť o tom Minecraft vůbec není.

Kdyby jenom zůstalo u názorů... Internetový tvůrce PewDiePie nemá nijak „závadné“ názory, ale přesto se už poněkolikáté média snažila vést různé kampaně na jeho zničení, přisuzujíce mu různé názory a přesvědčení podložené chabými a vymyšlenými důkazy. Opět se ukazuje, jak lehké je šířit svoji vlastní moc, když ji skryjete morálkou a dobrými úmysly. Kdo nesouhlasí, je nepřítel, rasista, xenofob; kdo se přidá, ocitne se na výsluní, je mu dána popularita, protože on je přeci ten dobrý. Přitom důležitější jsou činy než slova. Jediný dobrý důsledek toho všeho je, že ukáže lidi, kteří nemají čest ani svědomí (že, Wile Wheatone?).

Kdy už si konečně lidi uvědomí, že jde někoho uznávat a zároveň s ním nesouhlasit? Že nic není černobílé a každý člověk má mnoho stránek, které nemůžeme přehlížet všechny jen kvůli jediné z nich?

čtvrtek 7. února 2019

Zajímavost: Paradox prajazyka

Okruh lidského poznání se neustále zvětšuje. Stále nacházíme nové a nové skutečnosti, které je potřeba pojmenovat a popsat, a tak se zdá být logické předpokládat, že tak se rozšiřuje a roste i náš jazyk. Ale ouha!

Čeština se možná rozšiřuje co do nových slov a pojmů, neboť je nutno popsat nové skutečnosti, ale jazyk jako takový neroste, ba naopak. Vždyť ve srovnání se staročeštinou jsme přišli o:
  • Tři minulé časy (aorist, imperfektum a antepréteritum).
  • Dvojné číslo (duál).
  • Předbudoucí čas (futurum exactum).
  • Přechodníky (tedy ještě ne, ale brzo o ně přijdeme).
Jiné slovanské jazyky jsou na tom ještě hůř, třeba vokativ (5. pád) se z mnoha vytrácí. Už jsem si jednou posteskl nad okleštěností angličtiny, která se z původního syntetického jazyka stala jazykem analytickým, ustrnulým a neohybatelným. A všude po Evropě dochází ke zjednodušování, mizí rody (vzniká jednotný mužský a ženský), mizí pády (vokativ, dativ), mizí a sjednocují se koncovky tvarů...

Když si srovnáme vývoj indoevropských jazyků, můžeme se pokusit rekonstruovat jejich společného předka – protoindoevropštinu. Podle stávajících teorií měl tento jazyk 9 pádů, 3 vidy, 4 způsoby a svojí komplexností byl na úrovni latiny či staré řečtiny.

Co od té doby indoevropské jazyky získaly? Napadá mě akorát budoucí čas a členy jako příklady prvků, které se v mnoha jazycích vyvinuly až po rozdělení onoho prajazyka.

Paradox spočívá v tom, že není zcela jasné, co nastartovalo proces zjednodušování jazyků a proč k tomu došlo. Očekávali bychom, že na začátku vznikala z různých pazvuků podstatná jména pro popis konkrétních věcí, pak přídavná jména pro abstrakce a slovesa pro změny stavu a mohli bychom jít dál a dál ve vývoji jazyka, ale je zvláštní, že kdysi dávno si patrně indoevropské národy řekly, že už mají moc složitý jazyk, a tak se jaly jej zjednodušovat.

Tuto změnu nelze ani spojovat s rozvojem písma či s kodifikací jazyků, neboť k ní došlo nejspíš už před 4000 lety. Jedno možné vysvětlení by bylo, že jazyk byl vynálezem úzké skupiny rozumově pokročilých lidí, kteří jej rozšířili do celého svého národa, protože v jakékoliv větší skupině lidí by už žádné pokročilosti samy od sebe neprošly.

Další vysvětlení je možnost, že inteligence lidstva se v průměru spíš snižuje než zvyšuje, ale tomu moc neodpovídá očekávaná primitivita lidí v době, kdy tento jazyk vznikl.

Třetí vysvětlení je, že nám jazyk dal Stvořitel.

středa 30. ledna 2019

Nejoptimálnější článek

Tento spor se táhne historií české lingvistiky už po desetiletí. Není-li to patrno z nadpisu tohoto článku, myslím tím spor o to, zdali slovo "nejoptimálnější" (a slova jemu podobná) vůbec dávají smysl.

Po rychlém hledání lze najít mnoho argumentů pro i proti. Napřed bych se rád podíval na některé z nich:

Nedává to smysl, protože slovo "optimální" je vlastně samo o sobě ve 3. stupni.
V latině je opravdu optimus ve třetím stupni (slova bonus – dobrý), ale ani tento fakt není dobrým argumentem. Jednak jsme v češtině, kde to slovo žije vlastním životem, ale ani tak to nemůže zcela dobře být navrhovaný gramatický pleonasmus, protože to slovo samotné se vztahuje k jinému slovu, a sice k podstatnému jménu optimum (to nejlepší). Původní třetí stupeň už není relevantní.

Dává to smysl, protože nic optimálního vlastně ve skutečnosti neexistuje; můžeme se tomu pouze blížit a tedy určovat, jak moc se daná věc blíží optimu.
Nic nám nebrání mluvit o věcech, které nejsou reálné, pak můžeme docela dobře mluvit i o absolutním optimu. Krom toho vybíráme-li si ze dvou věcí, z nichž jedna je pro nás špatná a druhá dobrá, je vcelku evidentní, že v tomto souboru existuje optimální věc. Navíc tento argument skrývá i logický spor – můžeme-li se optimu pouze blížit, věc nejoptimálnější nemůže existovat, protože by vždy existovala věc optimálnější a tedy by ona původní nebyla ve skutečnosti ta nej.

Nedává to smysl, protože pokud je něco už optimální, nemůže být nic lepšího.
Zde se porovnávají špatná slova. "Optimální" a "lepší" nejsou synonyma. Tak jako "lepší" neznamená "dobré", tak ani "optimálnější" neznamená "optimální". Přeci není ani záruka, že věc nejlepší je vůbec dobrá.


Abychom se dobrali nějakého závěru, napřed je potřeba podívat se, co vlastně věc optimální je. Věc optimální je optimum, stejně tak jako věc ideální je ideál či věc maximální je maximum, v dané skupině věcí. Optimum jest něco, co nám vyhovuje nejvíce (pro daný účel), tedy vyhovuje více než všechny alternativy (jako maximum je větší než všechny ostatní prvky).

Teď přejdeme k druhému stupni. Zatímco první stupeň (pozitiv) prostě stanovuje určitou vlastnost, druhý stupeň (komparativ) porovnává míru dané vlastnosti mezi dvěma objekty. Věc optimálnější je tedy doslova to, co je více optimální než něco jiného. Třetí stupeň (superlativ) je pak už lehký, věc nejoptimálnější je optimálnější než všechny ostatní (nebo, mám-li zabrousit do matematiky, k ní neexistuje optimálnější věc, což ale není úplně ekvivalentní).

Vše nyní stojí na tom, zdali může něco být "více optimální". Vrátíme-li se zpět k našemu spojitému adjektivu "dobré", jeho míry můžeme lehce najít. Věci mohou být dobré, hodně dobré, málo dobré, trochu dobré, ne zcela dobré, vůbec dobré atd., tedy alespoň vágně lze určitou míru stanovit. Oproti tomu může být něco "málo optimální"? Podle mě taková věc není optimální vůbec, stejně tak i věc "ne zcela optimální". "Hodně optimální" už je teprve nesmysl, přeci když jsme něco už označili za optimální, máme hotovo, už není co dodat.

Míra slova "optimální" je triviální. Jsou jen dvě možnosti, buď něco optimální je, nebo není, 0/1. Stejné chování je na první pohled vidět i u slova "maximální".

A verdikt? Míra je triviální, ale existuje. Tím pádem optimálnější věc je pouze optimum (pokud existuje, vzhledem k neoptimu) nebo nic (vzhledem k optimu či pokud optimum neexistuje). Nejoptimálnější věc pak může být jedině nějaké neoptimum (neexistuje-li optimum) či nějaké optimum (všechna jsou si samozřejmě rovnocenná). Jak prosté.

Dá se tedy říct, že o věci nejoptimálnější se mluvit dá, ale zpravidla nám to nic neřekne. Když se budeme pohybovat jen v reálném světě a přijeme fakt, že optimum neexistuje, pak je nejoptimálnější všechno.

Dodatek: Při psaní tohoto článku jsem si vzpomněl na jeden dialog bůhvíodkud: "Ty jsi těhotná?!" "No trochu..."

Druhý dodatek: Matematika rozlišuje mezi největším prvkem a maximálním prvkem. Největší prvek je takový, který je větší než všechny ostatní prvky, zatímco maximální prvek je takový, ke kterému neexistuje prvek větší. U čísel obě definice splývají, ale pokud třeba porovnáváme množiny co do obsahu, může být více maximálních množin (a žádná největší).

středa 26. září 2018

Zajímavost: Telnet

Někteří z vás možná znají příkaz telnet, dostupný na většině operačních systémů, který se občas používá na textovou komunikaci pomocí protokolu TCP. Jeho původní účel byla nicméně podpora protokolu telnet (standardně na portu 23), který byl vytvořen za účelem vzdáleného přístupu k terminálům (jako jeden z nejstarších).

Telnet umožňuje přenášet proud jakýchkoliv dat, ale obsahuje také příznaky pro řízení komunikace, které mohou být obsaženy mezi datovými bajty. Pro jejich nastavení se používají čtyři typy zpráv: WILL, DO, WON'T, DON'T. Zajímavé je, že tyto zprávy mohou být použity jak v požadavku, tak i v odpovědi na něj a občas ani nemusí být jasné, o jakou pozici se jedná.

Telnet je diplomatický protokol – obě strany komunikace jsou si rovnocenné a musejí se vzájemně dohodnout na parametrech přenosu pomocí výše zmíněných zpráv. Příklad takové úvodní komunikace mezi zařízeními A a B může být třeba:

A: DO ECHO
B: WILL ECHO

V této komunikaci A požaduje po B, aby vracel zpět přijaté znaky (příznak ECHO), protože A je zobrazovat nebude. Všimněte si ale, jak se změní komunikace po malé úpravě:

B: WILL ECHO
A: DO ECHO

V tomto případě B informuje A, že bude opakovat přijaté znaky zpět. A s tímto návrhem souhlasí a svou zprávou to potvrzuje.

Tento systém komunikace je sice zajímavý, ale není z něj úplně patrné, jak se má zařízení chovat, pokud druhá strana odmítne spolupracovat. Komunikace by mohla probíhat například i takto (z pohledu A):

A: DO ECHO
B: WON'T ECHO
A: DON'T ECHO

A se nejspíš bude muset smířit, že B nedokáže jeho požadavku vyhovět a tak si zadané znaky bude opakovat sám, což poraženecky potvrdí. Jenomže vzápětí přijde od B zpráva WILL ECHO. Člověku může připadat, že B to asi nemá úplně jasno v obvodech, ale podívejme se, jak komunikaci pozoruje B:

B: WON'T ECHO
A: DO ECHO
B: WILL ECHO
A: DON'T ECHO

B napřed naznačí, že nechce opakovat znaky, ale A to nepotvrdí, a tak B nakonec souhlasí. V důsledku duplexní komunikace jsou totiž dvojice zpráv prohozeny, a tak B vnímá jako odpověď to, co A chtělo jako požadavek. Záměna těchto zpráv způsobí, že oběma zařízením asi musí připadat, že se to druhé zbláznilo, protože nesouhlasí ani s jednou ze dvou jediných možných variant. Komunikace takhle může probíhat donekonečna, pokud to síťové podmínky dovolí a ani jedna strana není natolik pokročilá, aby tomu zabránila.

Telnetový vtip

Už jsem slyšel vtip o TCP i o UDP, takže se pokusím o vtipnou konverzaci v telnetu. Příkazy jsou obdařené popisky:

A: DO ECHO (opakuj po mně)
B: WON'T ECHO (nechci)
A: DO ECHO (musíš po mně opakovat)
B: WON'T ECHO (nebudu)
A: DO ECHO (opakuj, nebo uvidíš)
 B: WON'T ECHO (nehodlám opakovat)
A: WILL SUBLIMINAL-MESSAGE (tak budu zobrazovat podprahové zprávy)
 B: DON'T SUBLIMINAL-MESSAGE (prosím, nedělej to)
 A: DO ECHO
 B: WILL ECHO

Docela rád bych viděl zařízení, se kterým by se takhle muselo komunikovat.

pátek 7. září 2018

Nekonečna

Nekonečno bylo něco, co mě fascinovalo už od dětství. Již okolo třetí třídy jsem se ptal učitelek na základní škole, jestli nekonečno je číslo, a pokud je, zdali existuje kupříkladu ∞ + 1. Žel bohu, jejich kvalifikace nedostačovala na to, aby mohly uspokojit moji touhu po poznání, a tak mi trvalo skoro 10 let, než jsem si byl schopen na tuto otázku odpovědět sám.

Vzhledem k tomu, za jak fascinující toto téma v matematice považuji, jsem se rozhodl lehce přiblížit různé způsoby, jak lze na nekonečno nahlížet, v tomto článku (a taky je čas, abych konečně napsal něco matematického).

Začneme překvapivým zjištěním... 

Nekonečno neexistuje

Jak můžu vyprávět o něčem, co neexistuje? Zatím nemohu, ale v matematice si stačí nějakou věc vymyslet, definovat, a už existuje. Tak to opravdu je; není potřeba mít nějakou analogii v reálném světě, stačí definovat nějaký objekt a už o něm můžeme hovořit. Dokud nedefinuji, co vlastně nekonečno je, otázky jako "Kolik je ∞ – ∞?" apod. nemají smysl (jednak nikam nevedou, druhak se na ně nedá odpovědět).

Zatím máme pouze intuitivní představu o tom, co je číslo, tedy posloupnost číslic (stačí nám celá čísla). Taktéž mohu předpokládat chápaní pojmů konečnost/nekonečnost, protože už pracujeme s nekonečnými množinami (všech čísel). Pokud bychom chtěli vytvořit nekonečno jako číslo, mohli bychom například říci, že se jedná o nekonečnou posloupnost číslic (směrem doleva). Tím nám vzniká hromada nekonečen (podle naší nové definice), ale taky hromada problémů. Pokud použijeme standardní porovnávání čísel, největší možné číslo by bylo ...999,999..., což je ...999 + 1 (patrně sudé číslo), ale to podle našeho nového systému stále nejsme schopni vyjádřit (a mluvit o něm jako o 1000...0 by bylo jako mluvit o poslední číslici pí). Navíc tento systém je příliš pevně vázán na zvolený základ číselné soustavy (10), neboť třeba ve trojkové soustavě by největší číslo bylo ...222 + 1, což je ale zase liché číslo.

Tento navržený systém má mnoho chyb a nakonec se ani nedá dobře využít (nicméně existují takzvaná p-adická čísla, která jsou vyjádřena nekonečnou posloupností před desetinnou čárkou, ale o těch se zase nedá mluvit jako o nekonečnech). Čistě numericky se na nekonečno dobře jít nedá; ve většině systémů nemůžeme mluvit o jeho číslicích, ani s ním provádět standardní aritmetické operace, ale přesto je zavedeno jako prvek rozšiřující běžné číselné množiny. Nyní se podíváme na první z nich.

Rozšířená osa reálných čísel

Budiž nekonečno, respektive dvě nekonečna (+∞ a –∞). K reálným číslům stačí přidat dvě nová, "nevlastní" čísla, ke kterým se dostaneme, půjdeme-li nekonečně dlouho jedním ze dvou možných směrů. To se hodí v matematické analýze pro popis funkcí, počítání limit, derivací apod. Operace s nekonečny jsou odvozeny od limit. Roste-li například nějaká funkce nade všechny meze, říkáme, že v nekonečnu (tedy pro zvětšující se x) dosáhne nekonečna (tedy má nekonečnou limitu, neustále zvětšující se y).

Tím jsme schopni popsat výrazy jako ∞ + ∞, ∞ × ∞ (součet a součin dvou neomezeně rostoucích funkcí je neomezeně rostoucí funkce), ∞ + 1 apod., což je všechno rovno nekonečnu. Také výraz 1 / ∞ má jasnou hodnotu, 0. Samotné nekonečno dostaneme třeba z výrazu 1 / 0 (což ale může být i záporné nekonečno, pokud ta nula je "záporná"). Problém nastává v momentě, kdy nekonečno není dostačující informace k tomu, abychom mohli určit chování rozdílu či podílu dvou funkcí. Výrazy ∞ × 0, ∞ / ∞ či ∞ – ∞ jsou neurčité, můžou být to či ono v závislosti na tom, odkud vzešly, a k dalšímu počítání se nám už nijak nehodí. Možná to vypadá jako nedostatek, že některé výrazy nemají jasnou hodnotu, ale bez nekonečna by ji neměl ani výraz 1 / 0 a koneckonců 0 / 0 ji nemá ani s nekonečnem.

Z této aritmetiky vychází taky způsob digitálního ukládání desetinných čísel (standard IEEE 754). V něm se zvlášť ukládá řád čísla a pevný počet číslic na nejvyšším místě, ale dvě speciální hodnoty jsou označeny jako nekonečno a velký rozsah speciálních hodnot jsou nečísla, která vzniknou používáním neurčitých výrazů. Tento standard zná navíc i zápornou nulu.

Projektivní roviny

Pokud si z geometrie vezmeme přímky a body, ale odstraníme jakékoliv ponětí o vzdálenostech a tvarech, dostáváme se zavedením několika axiomů (mezi každými body je jedna přímka, každé přímky se protnou v jednom bodě apod.) projektivní rovinu. V takové rovině tedy neexistují rovnoběžky.

Pokud chceme stejnou konstrukci aplikovat na standardní reálnou rovinu, dostáváme reálnou projektivní rovinu. Problém s rovnoběžností stále zůstává; musíme tedy říct, že (nekonečné) rovnoběžky se protnou v nekonečnu, které je pouze jediné a je dosažitelné nekonečnou cestou v jakémkoliv směru (a půjdeme-li dál, vyjdeme z opačného směru). V určitém ohledu se tedy jedná o geometrický protiklad nuly, který může vzniknout například transformací povrchu koule na rovinu (jeden pól se transformuje na nulu, druhý na nekonečno).

Homogenní souřadnice

Při promítání prostoru pomocí perspektivy je často výhodné reprezentovat souřadnice pomocí homogenního systému souřadnic, kde navíc ke standardním třem prostorovým souřadnicím přibude jedna nová, označovaná jako váha. Takové souřadnice mají některé hezké matematické vlastnosti, které umožňují snazší výpočty (posun pomocí matice). Chceme-li homogenní souřadnice převést na standardní, stačí všechny prostorové souřadnice vydělit vahou (kanonická váha je 1).

Tak kupříkladu homogenní bod [4; 6; 8; 2] je kartézský bod [2; 3; 4], jehož kanonická homogenní reprezentace je [2; 3; 4; 1]. Z tohoto příkladu je také patrné, že homogenní souřadnice lze vynásobit či vydělit libovolnou hodnotou, aniž by se tím změnila pozice bodu samotného. Jakému bodu by ale odpovídaly souřadnice [4; 6; 8; 0]? Dělení nulou v tomto systému není definováno, ale přesto může být užitečné používat body s nulovou vahou pro reprezentaci směrů. Zatímco úsečka mezi body s nenulovými vahami vypadá geometricky tak, jak bychom očekávali od úsečky, úsečka směřující do bodu [a; b; c; 0] je vlastně polopřímka se směrem daným vektorem (a; b; c). A tím se zase vracíme k projektivním rovinám, neboť nám tu vlastně pro každý směr vzniká jeden bod v nekonečné vzdálenosti od počátku.

Toto geometrické pojetí nekonečna je i víceméně intuitivní vzhledem k polopřímkám z příkladu. Snižujeme-li váhu bodu, geometricky ho tím posouváme dále od počátku, a tedy úsečka spojující tento bod s jiným bodem se stále více blíží rovnoběžce.

Součet řady

Dá se ukázat, že řada 1 + 1/2 + 1/4 + 1/8 + 1/16 + ... se hodnotou blíží číslu 2. V takovém případě řada konverguje, tedy se blíží k nějakému konečnému číslu. Řada 1 + 1 + 1 + ... naopak diverguje, a pokud si vypůjčíme hodnoty z rozšířené reálné osy, můžeme říct, že částečné součty se blíží k (nám již známému) nekonečnu. Jako třetí exemplář vezměme řadu 1 – 1 + 1 – 1 + 1 – 1 + ..., která taktéž diverguje, ale neblíží se ani k nekonečnu (částečné součty nemají limitu).

V některých případech nám nemusí stačit nekonečno jako "hodnota" divergující řady. Existují určité metody, které udávají vlastnost některých řad, která je v případě konvergentních řad shodná s normálním součtem, ale u divergentních řad mohou mít konečnou hodnotu. Nejznámější metoda je od indického matematika Ramanujana, pomocí které vychází 1 + 2 + 3 + 4 + 5 + ... "=" –1/12, ale dokonce i 1 – 1 + 1 – 1 + ... "=" 1/2. Nejedná se samozřejmě o skutečný součet, ale získaná čísla se v některých případech mohou uplatnit tam, kde je potřeba součet řady (například v kvantové fyzice).

V případě řad blížících se k nekonečnu se tedy ono "nekonečno" dá blíže popsat užitečnou hodnotou. Je věc pohledu, zdali je tato hodnota vlastnost daného nekonečna či vlastnost dané řady, ale nám bude stačit, že (alespoň zápisem) je s nekonečnem spojená.

Fraktály

Fascinující kategorii geometrických objektů představují fraktály. Jedná se o nekonečně detailní tvary, které sice (třeba v rovině) zabírají konečnou plochu, ale jejich obvod může být nekonečný. Přiblížením částí fraktálů se vždy začnou objevovat další tvary, které jsou sice menší, ale stále stejně detailní.

Studium fraktálů se dá využít i k popsání horizontální a vertikální členitosti zemského povrchu, neboť ten také vykazuje fraktálovou povahu.


Mohutnost množin

Už na začátku jsem zmínil nekonečné množiny, ale ani jeden z ukázaných konceptů se nedá použít pro popis velikosti těchto množin. Setkali jsme se s množinami přirozených čísel, celých čísel, racionálních čísel a reálných čísel, o nichž můžeme tvrdit, že jsou nekonečné, ale pokud bychom označili nekonečno za jejich velikost (mohutnost, kardinalitu), nemáme způsob, jak ho popsat.

Napřed zkusíme určit, co znamená, pokud jsou dvě množiny stejně velké. Máme-li dvě konečné množiny, prostě spočítáme počet prvků v obou z nich a porovnáme. To může mít u velkých množin tu nevýhodu, že si musíme pamatovat velké číslo (a dvakrát). Proto můžeme zkusit jinou metodu, kterou používaly v minulosti mnohé národy, kde známá čísla byla jen 1, 2, 3 a "více". Opakovaně vybíráme jeden prvek z jedné množiny a jeden prvek z druhé množiny a jakmile nám prvky v jedné množině dojdou, jedná se o menší množinu. Hledáme tedy párování (bijekci) mezi oběma množinami.

Tento postup se dá uplatnit i u nekonečných množin. Ačkoliv člověku může přijít, že celých čísel je více než přirozených ("dvakrát" víc), obě množiny jsou v tomto pohledu stejně velké. Párování (0, 0), (1, 1), (2, –1), (3, 2), (4, –2), (5, 3), (6, –3) atd. nám nakonec vyčerpá obě množiny (každý prvek množiny je na konečné pozici). Dá se ukázat, že stejně velká je i množina racionálních čísel a v podstatě každá množina, jejíž prvky můžu umístit do řady (neboli do párů s přirozenými čísly).

Mohutnost těchto množin můžu definovat jako nekonečno a operace známé z rozšířených reálných čísel mají stejnou logiku (akorát nemáme záporné nekonečno, protože záporná mohutnost nemá smysl, respektive není definovaná). ∞ + 1 bude stále ∞, neboť přidáním jednoho prvku do nekonečné množiny se její velikost nezmění. ∞ – ∞ bohužel zůstává stále neurčitým výrazem, neboť záleží na tom, které prvky odebíráme.

U jednoho nekonečna ale nezůstane. Ještě jsem nezmínil množinu reálných čísel, která je prostě mnohem větší (za což můžou konkrétně transcendentní čísla). Dá se ukázat, že jakákoliv nekonečná posloupnost reálných čísel nemůže vyjmenovat všechna reálná čísla. Reálných čísel je tedy také nekonečně mnoho, ale je jich více (říkáme nespočetně nekonečně mnoho).

V tento moment opustíme symbol ∞, neboť se nám objevují nekonečna různých velikostí. Mohutnost množiny přirozených čísel označíme jako ℵ₀ (alef nula) a mohutnost reálných čísel jako 𝔠 (mohutnost kontinua). Kromě reálných čísel má mohutnost 𝔠 taky množina komplexních čísel, tedy i bodů v rovině, bodů v prostoru i ve vyšších rozměrech a všechny oblasti v nich.

Mezi těmito nekonečny je navíc jistý vztah. Protože interval od 0 do 1 má stejnou mohutnost jako všechna reálná čísla (oblast na reálné ose), může je všechna reprezentovat jako nekonečné posloupnosti číslic (za desetinnou čárkou). Takovou posloupnost mohu vyjádřit jako zobrazení z přirozených čísel na číslice. Pokud se omezím jen na dvojkovou soustavu, každé podmnožině přirozených čísel odpovídá zobrazení, kde se tato přirozená čísla mapují na 0 a ostatní na 1. Počet všech podmnožin přirozených čísel má tedy stejnou velikost jako počet všech reálných čísel.

U konečných množin platí, že pokud má množina velikost k, má právě 2k podmnožin. To lze rozšířit i do nekonečných množin a tím dostáváme vztah 2ℵ₀ = 𝔠. Navíc, jelikož mohutnost množiny všech podmnožin (takzvané potenční množiny) je vždy větší než velikost původní množiny, existuje i množina mohutnosti 2𝔠 (všech podmnožin množiny reálných čísel) a větší a větší množiny a tedy i větší a větší nekonečna. Těchto nekonečen je tím pádem nekonečně mnoho (zatím jsem jich ukázal jen spočetně mnoho, ale existují i jiná, která nemusí být druhou mocninou jiného).

Všem těmto číslům se říká kardinální čísla (označují kardinalitu). Existují také kardinální čísla ℵ₁, ℵ₂, ℵ₃ atd., ale pro jejich popis jsou potřeba další axiomy (vztah ℵ₁ = 2ℵ₀ může a nemusí platit, záleží na teorii).

Pořadí

Kardinální čísla dokáží popsat velikost množin, ale co kdybych chtěl popsat pořadí prvku v nějaké posloupnosti? Mohu použít přirozená čísla, ale pokud mluvím o nekonečné posloupnosti, kardinální čísla nestačí. Z tohoto důvodu existují ordinální čísla, která mohou vyjádřit pořadí prvku i v nekonečných (uspořádaných) množinách.

Nejmenší nekonečné ordinální číslo se značí ω (omega) a označuje prvek, který se nachází hned za nekonečnou (spočetnou) posloupností prvků. Za ním je prvek na pozici ω + 1, za ním prvek na pozici ω + 2 apod. Sčítání vychází ze spojování posloupností, takže výraz 1 + ω je vlastně totéž co ω (před spočetně nekonečnou posloupnost prvků mohu dát jeden jiný prvek a její délka se nezmění).

Za dvěma nekonečnými posloupnostmi se nachází prvek na pozici ω + ω, tedy ω × 2 (moje intuice by říkala 2 × ω, ale to je definováno jako ωkrát 2, tedy spočetně někonečněkrát opakované dvojice, za nimiž je opět prvek pouze na pozici ω). Půjdeme-li dále, dostaneme ω × ω a nakonec i ωω. Hezky to ilustruje následující obrázek:





Ale zastavit se nemusíme, existuje i ωωω, ωωωω, ωωωωω a další. Tahle posloupnost ordinálních čísel se blíží k dalšímu ordinálnímu číslu, které se nazývá ε₀. Všechna tato ordinální čísla se dají použít k popisu spočetných množin, ale za nimi se nachází ω₁, první nespočetné ordinální číslo.


Ukazuje se, že stále můžeme mluvit o větších a větších množinách (dokonce i ℵω) a větších a větších pozicích, ačkoliv všechny jsou stále nekonečné. I pro jakékoliv nekonečné kardinální i ordinální číslo můžeme pomocí jiných konstrukcí najít větší číslo. To možná neuspokojuje naše hledání skutečného nekonečna, které je zároveň i konečno, protože za ním není už nic. Potřebujeme něco tak obrovského, že nic většího už být nemůže. Taková věc v matematice svým způsobem taky existuje.

Vlastní třída

Pojem množina byl v matematice dlouhou dobu vágně definovaný termín. Používal se jako prvek přirozeného jazyka, aniž by bylo jasné, co přesně znamená. Než nastal rozvoj teorie množin, množina se dala popsat pomocí výroku, který určoval, co v ní je. Výrok "x je reálné číslo" vytvořil množinu reálných čísel; výrok "x je množina" vytvořil množinu všech množin. Tato definice ale vede k paradoxům, hlavně co se týče množiny všech množin. Množina všech podmnožin musí být vždy větší než původní množina, ale množina všech množin přece tyto množiny už musela obsahovat. Pokud to je množina, její velikost přesahuje všechny konečné i nekonečné meze natolik, že to už není množina.

Pro objekty definované výrokem se začal používat výraz třída. Někdy pojmy třída a množina splývají, například třída reálných čísel je množina, ale některé třídy nejsou množiny, těm se pak říká vlastní třídy.

Vlastní třída (mezi příklady patří třeba třída všech množin, ale i třída všech ordinálních i kardinálních čísel) nemá mohutnost definovatelnou stejně jako množina, ale podle mého názoru fakt, že je "větší" než jakákoliv jiná množina a v podstatě pro její nekonečnou velikost platí 2∞ = ∞, stačí k tomu, abychom velikost vlastní třídy mohli považovat za to pravé, největší, poslední nekonečno.

středa 4. července 2018

Zajímavost: O emocích

Netrpí-li člověk nějakou formou psychopatie, bývá obdařen širokou škálou emocí, jež se v různých situacích začnou projevovat. Některé jsou nám možná občas na překážku, ale všechny mají svůj účel.

Člověk je ve své podstatě tvor egoistický. Primárně mu jde o jeho vlastní přežití, na což jsou nastavené instinkty i rozum. Pokud ale vidíme jiného člověka trpět, soucítíme s ním; pokud způsobíme někomu radost, pociťujeme ji taky. I rozumná a logická rozhodnutí si vyčítáme a to nás nutí o nich přemýšlet.

Můžete si říct, že to je příroda, která nás takto stvořila. Poté je hezké, že i přes rozum, kterým jsme obdařeni, nás stále cosi uvnitř nutí pomáhat ostatním, a tak to má být. Nebo si můžete říct, že jsme k tomu dospěli evolucí. Poté je vidět, že to funguje.