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.

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

Č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á"))
 
Vývojový diagram dvou navazujících podmínek.

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á")))
 
Vývojový diagram dvou navazujících podmínek.

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ď

 
Vývojový diagram dvou navazujících podmínek.
(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

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č?

 
Vývojový diagram dvou navazujících podmínek.

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

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 konjunkce
  • or disjunkce
  • not 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í ►