Neprogramátor/Vykonat či nevykonat: predikáty a podmínkové výrazy
Čaroděj se na spostu různých situací připravuje tak, že pro každou situaci vymyslí nějakou větu, která se vykoná, když daná situace nastane. Jako třeba, že když jsou obě krabice obalené, čaroděj si oddechne, jinak maká. Taková věta se v kouzelném jazyce zapíše pomocí slovesa if
.
(if obě-krabice-obalené? "oddechne" "maká")
Co vrátí kouzelná hůlka, když jsou obě krabice obalené?
Kouzelná hůlka vrátí "oddechne"
.
(if #t "oddechne" "maká")
Nebo lépe
(let ((obě-krabice-obalené? #t))
(if obě-krabice-obalené? "oddechne" "maká"))
Co vrátí, když nejsou?
Kouzelná hůlka vrátí "maká"
.
(if #f "oddechne" "maká")
Nebo lépe
(let ((obě-krabice-obalené? #f))
(if obě-krabice-obalené? "oddechne" "maká"))
Podstatnému jménu obě-krabice-obalené?
se říká predikát. Predikát je podstatné jméno nebo věta, která může být pravda nebo taky ne, a dohoda je, že predikáty končí otazníkem (?). Když je predikát kouzelná věta, končí otazníkem sloveso.
-
Obě krabice obalené?
-
První a druhá krabice obalená?
Kouzelná věta plnící stejnou funkci, která má ale místo podstatného jména-predikátu obě-krabice-obalené?
nějakou větu-predikát, by mohla vypadat třeba:
(if (and první-krabice-obalená? druhá-krabice-obalená?)
"oddechne"
"maká")
Co by kouzelná hůlka vrátila po vykonání takové věty, když jsou obě krabice obalené?
Kouzelná hůlka vrátí "oddechne"
.
(if (and #t #t) "oddechne" "maká")
Nebo lépe
(let ((první-krabice-obalená? #t)
(druhá-krabice-obalená? #t))
(if (and první-krabice-obalená? druhá-krabice-obalená?)
"oddechne"
"maká"))
Co by vrátila, kdyby druhá krabice obalená nebyla?
Kouzelná hůlka vrátí "maká"
.
(if (and #t #f) "oddechne" "maká")
Nebo lépe
(let ((první-krabice-obalená? #t)
(druhá-krabice-obalená? #f))
(if (and první-krabice-obalená? druhá-krabice-obalená?)
"oddechne"
"maká"))
Co když je možností více?
[editovat | editovat zdroj]Čaroděj si dá krátkou pauzu, když má obalenou alespoň jednu krabici. V kouzelném jazyce proto napíše:
(let ((první-krabice-obalená? #t)
(druhá-krabice-obalená? #f))
(if (or první-krabice-obalená? druhá-krabice-obalená?)
"pauzička"
"maká"))
Tím si ale dává krátkou pauzu i když už má obě krabice obalené!
(let ((první-krabice-obalená? #t)
(druhá-krabice-obalená? #t))
(if (or první-krabice-obalená? druhá-krabice-obalená?)
"pauzička"
"maká"))
A to čaroděj nechce. Potřebuje nějakou větu, která po vykonání kouzelnou hůlkou vrátí jeho zasloužený oddych, pokud jsou obě krabice obalené, a krátkou pauzu, když je obalená pouze jedna z nich. Ale když není obalená žádná krabice, musí čaroděj makat.
Anglicky se "když" řekne if
, což je shodou okolností sloveso kouzelného jazyka. Po chvilce zamyšlení a uvědomění si, že kouzelná věta vrátí nějaké slovo kouzelného jazyka poté, co kouzelná hůlka větu vykoná, může čaroděj přijít s něčím jako:
(let ((první-krabice-obalená? #t)
(druhá-krabice-obalená? #t))
(if (and první-krabice-obalená? druhá-krabice-obalená?)
"oddechne"
(if (or první-krabice-obalená? druhá-krabice-obalená?)
"pauzička"
"maká")))
Co vrátí kouzelná hůlka po vykonání této věty, pokud první-krabice-obalená?
a druhá-krabice-obalená?
budou postupně nabývat hodnot #t #t
, #t #f
, #f #t
a #f #f
?
Kouzelná hůlka vrátí "oddechne"
, "pauzička"
, "pauzička"
a "maká"
.
Jak by zněla kouzelná věta stejného významu, kde by ale byl nejdříve použitý predikát se slovesem or
a teprve potom predikát se slovesem and
?
(let ((první-krabice-obalená? #t)
(druhá-krabice-obalená? #t))
(if (or první-krabice-obalená? druhá-krabice-obalená?)
(if (and první-krabice-obalená? druhá-krabice-obalená?)
"oddechne"
"pauzička")
"maká")))
Jak by zněla kouzelná věta stejného významu, kde by vůbec nebyly použity věty-predikáty, ale jen podstatná jména-predikáty první-krabice-obalená?
a druhá-krabice-obalená?
?
Buď
(let ((první-krabice-obalená? #t)
(druhá-krabice-obalená? #t))
(if první-krabice-obalená?
(if druhá-krabice-obalená?
"oddechne"
"pauzička")
(if druhá-krabice-obalená?
"pauzička"
"maká")))
a nebo
(let ((první-krabice-obalená? #t)
(druhá-krabice-obalená? #t))
(if druhá-krabice-obalená?
(if první-krabice-obalená?
"oddechne"
"pauzička")
(if první-krabice-obalená?
"pauzička"
"maká")))
Jde to i bez vnořování?
[editovat | editovat zdroj]Pokud se chce čaroděj připravit na spoustu různých situací, brzy mu dojde trpělivost a místo kouzelného slovesa if
použije kouzelné sloveso cond
. cond
dovolí čaroději použít predikáty, jako by to byla slovesa, která provedou: "Jestli jsem (predikát) pravda, vykonej větu, co je hned za mnou, případně vrať slovo, co je hned za mnou!"
Čaroděj obalující dvě krabice má celkem čtyři situace, do kterých se může dostat. Nemá obalenou ani jednu krabici, nebo má obalenou první nebo druhou krabici, anebo má obalené obě.
(let ((první-krabice-obalená? #t)
(druhá-krabice-obalená? #t))
(cond
((and první-krabice-obalená? druhá-krabice-obalená?) "oddechne")
((or první-krabice-obalená? druhá-krabice-obalená?) "pauzička")
(else "maká")))
Protože cond
mění funkci predikátu z podstatného jména na sloveso – místo "jsem pravda, nebo ne" se z predikátu stane "jestli jsem pravda, vykonej větu, co je hned za mnou, případně vrať slovo, co je hned za mnou!" – záleží na pořadí, ve kterém jsou predikáty napsané. Když se třeba prohodí řádky s and
a or
, čaroděj si nikdy neoddechne.
Proč?
Protože or
je pravda vždy, když je pravda i and
, ale obráceně to neplatí: and
nemusí být pravda, když or
pravda je. Proč? and
je pravda, když jsou pravda oba predikáty, první-krabice-obalená?
i druhá-krabice-obalená?
. or
je pravda, když je pravda alespoň jeden z nich.
Kterému vývojovému diagramu (obrázky výše) se nejvíce podobá kouzelná věta s kouzelným slovesem cond
a proč?
Protože jako první se vykoná kouzelná věta-predikát se slovesem and
a jako druhá ta se slovesem or
. Kouzelné sloveso cond
se hodí pro implementaci vývojových diagramů, které rostou směrem NE, v případě diagramů nahoře tedy doprava.
Kouzelné slovo else
je vlastně #t
a v cond
tedy říká: "Vždy vykonej větu, co je hned za mnou, případně vrať slovo, co je hned za mnou!". Hodí se to, když čaroděj ví, co má kouzelná hůlka vykonat, když všechny ostatní hodnoty selžou.
Slovníček kouzelného jazyka
[editovat | editovat zdroj]Kouzelným slovesům if
a cond
se říká podmínkové výrazy, protože jejich vykonávání, a tedy i informace, kterou po vykonání kouzelné věty začínající slovesem if
nebo cond
kouzelná hůlka vrátí, záleží na podmínce.
Slovesa pro čísla, která se používají v predikátech, většinou nekončí otazníkem:
=
všechna čísla jsou si rovna?<
všechna čísla řazena vzestupně?>
všechna čísla řazena sestupně?<=
všechna čísla řazena neklesajíce?>=
všechna čísla řazena nestoupajíce?
I když některé ano:
number?
je číslo?integer?
je celé číslo?zero?
je nula?positive?
je kladné?negative?
je záporné?odd?
je liché?even?
je sudé?
Slovesa pro text, která se používají v predikátech, konvenci s otazníkem na konci dodržují:
string?
je text?string=?
jsou texty stejné?string-ci=?
jsou texty stejné bez ohledu na velikost písmen?string<?
,string>?
,string<=?
,string>=?
jsou texty lexikograficky řazené?string-ci<?
,string-ci>?
,string-ci<=?
,string-ci>=?
jsou texty lexikograficky řazené bez ohledu na velikost písmen?
Slovesa pro pravdivostní hodnoty jsou tři:
and
konjunkceor
disjunkcenot
negace
◄ Neprogramátor/Pojmenování informací: definice proměnných | Vykonat či nevykonat: predikáty a podmínkové výrazy | Neprogramátor/Nová slovesa: definice funkcí ► |