Neprogramátor/Kouzelné čtení

Z Wikiknih

Několik myšlenek o nekouzelném světě zapsaných ve větách kouzelného jazyka.

Zde se hodí zopakovat, že:

Kouzelný jazyk Racket má jen dva druhy slov: podstatná jména a slovesa. Podstatná jména ukrývají nějakou informaci. Třeba "kniha", "kouzelná", 0 a 3.14 jsou všechno podstatná jména kouzelného jazyka. Slovesa říkají, co se má s podstatnými jmény stát. Třeba + a string-append jsou slovesa kouzelného jazyka. Každá kouzelná věta začíná závorkou ( a hned po ní následuje sloveso. Potom jsou podstatná jména oddělená mezerami a úplně nakonec zase závorka ).




(define (Pythagorova-věta a b c) ; a, b jsou odvěsny, c je přepona
  (= (* c c) (+ (* a a) (* b b))))
(define (vypočítej-přeponu-pro-odvěsny a b)
  (sqrt (+ (* a a) (* b b))))
(define (vypočítej-odvěsnu-pro-přeponu-a-odvěsnu c a)
  (sqrt (- (* c c) (* a a))))

O jakou myšlenku se jedná? Jak ji ověřit?

Jde o myšlenu Pythagorovy věty.

(define (ověř-platnost-Pythagorovy-věty-pro a b c)
  (string-append "Pro trojúhelník "
                 (number->string a) " "
                 (number->string b) " "
                 (number->string c) " "
                 "Pythagorova věta "
                 (if (Pythagorova-věta a b c)
                     "platí"
                     "neplatí")
                 "."))
(ověř-platnost-Pythagorovy-věty-pro 3 4 5)
(ověř-platnost-Pythagorovy-věty-pro 1 2 3)
(define (přepona-pro-odvěsny a b)
  (string-append "Pro odvěsny "
                 (number->string a)
                 " a " (number->string b)
                 " je přepona "
                 (number->string (vypočítej-přeponu-pro-odvěsny a b))
                 "."))
(přepona-pro-odvěsny 3 4)
(define (odvěsna-pro-přeponu-a-odvěsnu c a)
  (string-append "Pro přeponu "
                 (number->string c)
                 " a odvěsnu "
                 (number->string a)
                 " je druhá odvěsna "
                 (number->string (vypočítej-odvěsnu-pro-přeponu-a-odvěsnu c a))
                 "."))
(odvěsna-pro-přeponu-a-odvěsnu 5 4)
(odvěsna-pro-přeponu-a-odvěsnu 5 3)
(let* ((první-odvěsna 3)
       (druhá-odvěsna 4)
       (přepona (vypočítej-přeponu-pro-odvěsny první-odvěsna druhá-odvěsna)))
  (ověř-platnost-Pythagorovy-věty-pro první-odvěsna druhá-odvěsna přepona))
(let* ((přepona 5)
       (první-odvěsna 3)
       (druhá-odvěsna (vypočítej-odvěsnu-pro-přeponu-a-odvěsnu přepona první-odvěsna)))
  (ověř-platnost-Pythagorovy-věty-pro první-odvěsna druhá-odvěsna přepona))
(let* ((přepona 5)
       (první-odvěsna 4)
       (druhá-odvěsna (vypočítej-odvěsnu-pro-přeponu-a-odvěsnu přepona první-odvěsna)))
  (ověř-platnost-Pythagorovy-věty-pro první-odvěsna druhá-odvěsna přepona))




(define (oxidační-číslo->koncovka oxidační-číslo)
  (cond ((= 1 oxidační-číslo) "-ný")
        ((= 2 oxidační-číslo) "-natý")
        ((= 3 oxidační-číslo) "-itý")
        ((= 4 oxidační-číslo) "-ičitý")
        ((= 5 oxidační-číslo) "-ičný, -ečný")
        ((= 6 oxidační-číslo) "-ový")
        ((= 7 oxidační-číslo) "-istý")
        ((= 8 oxidační-číslo) "-ičelý")
        ((= 9 oxidační-číslo) "-utý")))

O čem kouzelný text je? Jak to ověřit?

Kouzelný text pojednává o koncovkách oxidačních čísel.

(define (test-koncovky-pro oxidační-číslo koncovka)
  (string-append "Koncovka oxidačního čísla "
                 (number->string oxidační-číslo)
                 " má být '" koncovka "' a je '"
                 (oxidační-číslo->koncovka oxidační-číslo)
                 "'."))
(test-koncovky-pro 1 "-ný")
(test-koncovky-pro 2 "-natý")
(test-koncovky-pro 3 "-itý")
(test-koncovky-pro 4 "-ičitý")
(test-koncovky-pro 5 "-ičný, -ečný")
(test-koncovky-pro 6 "-ový")
(test-koncovky-pro 7 "-istý")
(test-koncovky-pro 8 "-ičelý")
(test-koncovky-pro 9 "-utý")




; základní definice a opak (negace) jedné věty
(define pravda #t)
(define (je-pravda? věta)
  (equal? pravda věta))
(define lež #f)
(define (je-lež? věta)
  (equal? lež věta))
(define (neplatí-že věta)
  (cond ((je-pravda? věta) lež)
        ((je-lež? věta) pravda)))

; možné kombinace dvou vět
(define (platí-obě? první-věta druhá-věta)
  (if (je-pravda? první-věta)
      (if (je-pravda? druhá-věta)
          pravda
          lež)
      lež))
(define (platí-první-a-druhá-ne? první-věta druhá-věta)
  (if (je-pravda? první-věta)
      (if (je-lež? druhá-věta)
          pravda
          lež)
      lež))
(define (platí-druhá-a-první-ne? první-věta druhá-věta)
  (if (je-pravda? druhá-věta)
      (if (je-lež? první-věta)
          pravda
          lež)
      lež))
(define (neplatí-ani-jedna? první-věta druhá-věta)
  (if (je-lež? první-věta)
      (if (je-lež? druhá-věta)
          pravda
          lež)
      lež))
(define (řekni-jestli-platí-že má-být věta)
  (cond ((platí-obě? má-být věta) "platí")
        ((neplatí-ani-jedna? má-být věta) "platí")
        (else "neplatí")))

; souvětí dvou vět
(define (souvětí-s-a první-věta druhá-věta)
  (cond ((platí-obě? první-věta druhá-věta) pravda)
        ((platí-první-a-druhá-ne? první-věta druhá-věta) lež)
        ((platí-druhá-a-první-ne? první-věta druhá-věta) lež)
        ((neplatí-ani-jedna? první-věta druhá-věta) lež)))
(define (souvětí-s-nebo první-věta druhá-věta)
  (cond ((platí-obě? první-věta druhá-věta) pravda)
        ((platí-první-a-druhá-ne? první-věta druhá-věta) pravda)
        ((platí-druhá-a-první-ne? první-věta druhá-věta) pravda)
        ((neplatí-ani-jedna? první-věta druhá-věta) lež)))
(define (souvětí-s-vylučovacím-nebo první-věta druhá-věta)
  (cond ((platí-obě? první-věta druhá-věta) lež)
        ((platí-první-a-druhá-ne? první-věta druhá-věta) pravda)
        ((platí-druhá-a-první-ne? první-věta druhá-věta) pravda)
        ((neplatí-ani-jedna? první-věta druhá-věta) lež)))
(define (když první-věta druhá-věta)
  (cond ((platí-obě? první-věta druhá-věta) pravda)
        ((platí-první-a-druhá-ne? první-věta druhá-věta) lež)
        ((platí-druhá-a-první-ne? první-věta druhá-věta) pravda)
        ((neplatí-ani-jedna? první-věta druhá-věta) pravda)))
(define (právě-tehdy-když první-věta druhá-věta)
  (cond ((platí-obě? první-věta druhá-věta) pravda)
        ((platí-první-a-druhá-ne? první-věta druhá-věta) lež)
        ((platí-druhá-a-první-ne? první-věta druhá-věta) lež)
        ((neplatí-ani-jedna? první-věta druhá-věta) pravda)))

; odborné názvy
(define konjunkce souvětí-s-a)
(define disjunkce souvětí-s-nebo)
(define negace neplatí-že)
(define implikace když)
(define ekvivalence právě-tehdy-když)

; Jaká je negace věty 'Když prší je mokro'?
(define prší pravda)
(define je-mokro pravda)
(řekni-jestli-platí-že
 (neplatí-že (když prší je-mokro))
 (když (neplatí-že prší) je-mokro)) ; Když neprší je mokro.
(řekni-jestli-platí-že
 (neplatí-že (když prší je-mokro))
 (když prší (neplatí-že je-mokro))) ; Když prší není mokro.
(řekni-jestli-platí-že
 (neplatí-že (když prší je-mokro))
 (když (neplatí-že prší) (neplatí-že je-mokro))) ; Když neprší není mokro.

Toto je trochu delší myšlenka, proto je rozdělena na několik částí, kde každou část uvozuje komentář. O čem myšlenka je? O čem je každá z jejích částí?

Text pojednává o Logice. První část, základní definice a opak (negace) jedné věty, definuje podstatná jména (pravda a lež) a slovesa (je-pravda?, je-lež?, neplatí-že), která tvoří základ pro další text. Logická věta je kouzelná věta, která představuje jednu z pravdivostních hodnot pravda či lež. Logické věty odpovídají predikátům v kouzelném jazyce Racket a podstatná jména pravda a lež pravdivostním (boolean) hodnotám #t a #f.

Druhá část, možné kombinace dvou vět, představuje, jakých (pravdivostních) hodnot mohou nabývat kombinace dvou logických vět (predikátů); tato část vlastně definuje pravdivostní tabulku pro dvě pravdivostní hodnoty.

Část souvětí dvou vět se od předchozí části liší v tom, že všem možným kombinacím hodnot dvou logických vět přiřadí nějakou další pravdivostní hodnotu a toto přiřazení pojmenuje. Například souvětí-s-a přiřadí pravdivostní hodnotu pravda kombinaci dvou logických vět, když jsou obě pravdivé a lež pro všechny ostatní případy kombinací těchto dvou vět. Nebo souvětí-s-nebo přiřadí pravdivostní hodnotu lež kombinaci dvou logických vět, když ani jedna z nich není pravdivá a pravda pro všechny ostatní případy kombinací těchto dvou vět (když alespoň jedna z nich je pravdivá nebo když jsou pravdivé obě).

Část odborné názvy říká, jak se přiřazením pravdivostních hodnot dvou větám z předchozí části říká odborně.

Poslední část, Jaká je negace věty 'Když prší je mokro'?, řeší implikaci -- logickou větu, která začíná slovem "Když", respektive její negaci, tedy negaci implikace. Poslední tři kouzelné věty této myšlenky o logice (každá z těchto kouzelných vět je na třech řádcích) zkoumají, zda Negace věty "Když prší je mokro" je buď Když neprší je mokro, nebo Když prší není mokro, nebo Když neprší není mokro.

Jaká je negace věty 'Když prší je mokro' vyplývající z vyhodnocení kouzelných vět?

Když prší není mokro.

Na této myšlence o logice je vidět jeden z přístupů k řešení složitějších problémů. Složitější problém této myšlenky je poslední část, tedy Jaká je negace věty 'Když prší je mokro'? pro jehož řešení se využijí předchozí části. Jinými slovy, pro řešení složitějšího problému čaroděj vytváří nová kouzelná slovesa a podstatná jména, která postupně využívá v dalších částech textu, aby nakonec řešení problému popsal několika málo kouzelnými větami.

Jak lze ověřit základní definice?

"Ověření základních definic:"
(řekni-jestli-platí-že pravda (je-pravda? pravda))
(řekni-jestli-platí-že lež (je-pravda? lež))
(řekni-jestli-platí-že lež (je-lež? pravda))
(řekni-jestli-platí-že pravda (je-lež? lež))
(řekni-jestli-platí-že pravda (neplatí-že (neplatí-že pravda)))
(řekni-jestli-platí-že lež (neplatí-že (neplatí-že lež)))

Kouzelné sloveso řekni-jestli-platí-že lze definovat o trochu lépe za pomoci kouzelných sloves definovaných kouzelnými větami v části souvětí dvou vět. Jak třeba?

(define (řekni-jestli-platí-že má-být věta)
  (if (právě-tehdy-když má-být věta)
      "platí"
      "neplatí"))

Kouzelná slovesa souvětí-s-a, souvětí-s-nebo a neplatí-že lze definovat jednodušeji a pouze s kouzelným jazykem Racket, tedy bez nových kouzelných sloves a podstatných jmen definovaných v jednotlivých částech této myšlenky. Jak třeba?

(define (souvětí-s-a první-věta druhá-věta)
  (and první-věta druhá-věta))
(define (souvětí-s-nebo první-věta druhá-věta)
  (or první-věta druhá-věta))
(define (neplatí-že věta)
  (not věta))

Myšlenka obsahuje množství nových kouzelných sloves a podstatných jmen pro usnadnění zápisu poslední části -- Jaká je negace věty 'Když prší je mokro'? -- této myšlenky. Zkušenější čaroděj by se s největší pravděpodobností soustředil právě na poslední část myšlenky a snažil by se použít co nejvíce slov kouzelného jazyka Racket. Jak by mohl poslední část myšlenky zapsat bez nových kouzelných slov z předchozích částí? (Takže když nějaké chce použít, musí je napsat znovu?)

; Jaká je negace věty 'Když prší je mokro'?
(define prší #t)
(define je-mokro #t)
(define (když příčina důsledek) ; implikace
  (if (and příčina (not důsledek))
      #f
      #t))
(equal? (not (když prší je-mokro))
        (když (not prší) je-mokro)) ; Když neprší je mokro.
(equal? (not (když prší je-mokro))
        (když prší (not je-mokro))) ; Když prší není mokro.
(equal? (not (když prší je-mokro))
        (když (not prší) (not je-mokro))) ; Když neprší není morko.

Nejzajímavější je definice když, která vychází z definice když v textu myšlenky. Je vidět, že když je lež (tedy #f) pouze v případě, že platí-první-a-druhá-ne?, což lze v jazyce Racket zapsat jako (and příčina (not důsledek)). Definice když lze navíc ještě zkrátit, takže výsledek může být:

; Jaká je negace věty 'Když prší je mokro'?
(define prší #t)
(define je-mokro #t)
(define (když příčina důsledek) ; implikace
  (not (and příčina (not důsledek))))
(equal? (not (když prší je-mokro))
        (když (not prší) je-mokro)) ; Když neprší je mokro.
(equal? (not (když prší je-mokro))
        (když prší (not je-mokro))) ; Když prší není mokro.
(equal? (not (když prší je-mokro))
        (když (not prší) (not je-mokro))) ; Když neprší není morko.

Když čaroděj použije nová kouzelná slova z myšlenky výše -- jaká je negace věty 'Právě tehdy když prší je mokro'?

; Jaká je negace věty 'Právě tehdy když prší je mokro'?
(define prší pravda)
(define je-mokro pravda)
(řekni-jestli-platí-že
 (neplatí-že (právě-tehdy-když prší je-mokro))
 (právě-tehdy-když (neplatí-že prší) je-mokro))
(řekni-jestli-platí-že
 (neplatí-že (právě-tehdy-když prší je-mokro))
 (právě-tehdy-když prší (neplatí-že je-mokro)))
(řekni-jestli-platí-že
 (neplatí-že (právě-tehdy-když prší je-mokro))
 (právě-tehdy-když (neplatí-že prší) (neplatí-že je-mokro)))

Výsledek vyhodnocení znamená, že jsou dva způsoby, jak říci či napsat negaci věty 'Právě tehdy když prší je mokro': První je 'Právě tehdy když neprší je mokro' a druhý je 'Právě tehdy když prší není mokro'.

A jaká je negace věty 'Právě tehdy když prší je mokro', kdyby čaroděj nová kouzelná slova z myšlenky výše nepoužil?

; Jaká je negace věty 'Právě tehdy když prší je mokro'?
(define prší #t)
(define je-mokro #t)
(define (právě-tehdy-když platí-první? platí-druhá?) ; ekvivalence
  (not (or (and platí-první? (not platí-druhá?))
           (and (not platí-první?) platí-druhá?))))
(equal? (not (právě-tehdy-když prší je-mokro))
        (právě-tehdy-když (not prší) je-mokro))
(equal? (not (právě-tehdy-když prší je-mokro))
        (právě-tehdy-když prší (not je-mokro)))
(equal? (not (právě-tehdy-když prší je-mokro))
        (právě-tehdy-když (not prší) (not je-mokro)))

Negace právě tehdy když je to samé jako souvětí s vylučovacím nebo. Jak to lze otestovat?

(let ((platí-první pravda)
      (platí-druhá pravda))
  (řekni-jestli-platí-že
   (neplatí-že (právě-tehdy-když platí-první platí-druhá))
   (souvětí-s-vylučovacím-nebo platí-první platí-druhá)))
(let ((platí-první pravda)
      (platí-druhá lež))
  (řekni-jestli-platí-že
   (neplatí-že (právě-tehdy-když platí-první platí-druhá))
   (souvětí-s-vylučovacím-nebo platí-první platí-druhá)))
(let ((platí-první lež)
      (platí-druhá pravda))
  (řekni-jestli-platí-že
   (neplatí-že (právě-tehdy-když platí-první platí-druhá))
   (souvětí-s-vylučovacím-nebo platí-první platí-druhá)))
(let ((platí-první lež)
      (platí-druhá lež))
  (řekni-jestli-platí-že
   (neplatí-že (právě-tehdy-když platí-první platí-druhá))
   (souvětí-s-vylučovacím-nebo platí-první platí-druhá)))