Sémantika výrazov

Ciele

  1. Definovanie syntaxe aritmetických a boolovských výrazov.
  2. Definovanie sémantiky jednoduchých aritmetických výrazov.
  3. Definovanie sémantiky jednoduchých boolovksých výrazov.
  4. Rozšírenie syntaxe a definície sémantiky výrazov.

Úvod

V tejto časti definujeme abstraktnú syntax a sémantiku základných aritmetických a boolovských výrazov. Sémantiku výrazov, aritmetických aj boolovských, obvykle definujeme dvoma spôsobmi: denotačným a operačným prístupom. Zameriame sa na denotačnú sémantiku výrazov. Pre lepšiu názornosť pri formulovaní princípov sémantických metód predpokladáme, že pracujeme len s celočíselnými hodnotami, ktoré môžu nadobúdať premenné jazyka a s pravdivostnými hodnotami, ktoré sa používajú v boolovských výrazoch. Jazyk má preddefinované dva typy (celočíselný typ a typ boolovských hodnôt) a typovanie v abstraktnom jazyku Jane je implicitné.

Postup

Krok 1

V tomto predmete pracujeme s abstraktným jazykom Jane. Tento jazyk obsahuje základné syntaktické konštrukcie typické pre imperatívne jazyky – priradenie hodnoty premennej (zmena obsahu pamäte), vetvenie (dvojcestné, na základe logickej podmienky), cyklus (prefixný s logickou podmienkou). Jazyk obshauje tiež aritmetické výrazy s celočíselnými hodnotami a boolovské výrazy s logickými hodnotami.

Aritmetické výrazy konštruujeme z prvkov syntaktickej oblasti aritmetických výrazov $\mathbf{Expr}$. Ich syntax je nasledovná: $$ e ::= ~n~|~x~|~e~+ ~e~|~e~-~e~|~e~*~e~|~(e),$$ pričom $e \in \mathbf{Expr}$.

Úloha 1.1

Pomenujte a vysvetlite jednotlivé prvky v uvedenom produkčnom pravidle pre aritmetické výrazy.

Podobne konštruujeme aj boolovské výrazy z prvkov syntaktickej oblasti boolovských výrazov $\mathbf{Bexpr}$. Ich syntax je nasledovná: $$ b ::= ~\mathtt{true}~|~\mathtt{false}~|~e~=~e~|~e~\leq~e~|~\neg~b~|~b~\wedge ~b~|~(b), $$ pričom $b \in \mathbf{Bexpr}$.

Úloha 1.2

Pomenujte a vysvetlite jednotlivé prvky v uvedenom produkčnom pravidle pre boolovské výrazy.

Syntax a sémantiku aritmetických aj boolovských výrazov je možné rozšíriť pridaním nových prvkov. Pri definovaní sémantiky obvykle vychádzame zo známych matematických pravidiel. S rozšírením syntaxe a sémantiky sa oboznámime v kroku 4.

Krok 2

Aby sme mohli vyjadriť sémantiku (význam) aritmetických výrazov, musíme zaviesť pojem stavu pamäte. Stav je prvkom sémantickej oblasti stavov $\mathbf{State}$ a definujeme ho ako funkciu, ktorá premennej priradí jej hodnotu: $$s : \mathbf{Var} \rightarrow \mathbf{Z}.$$

Poznámka

Prvky sémantickej oblasti $\mathbf{State}$ sú funkcie, preto sa táto množina označuje tiež funkčný priestor: $$\mathbf{State} = \mathbf{Var} \rightarrow \mathbf{Z}.$$

Pri vyhodnocovaní výrazov má stav len pasívnu rolu (nemení sa). Ak napr. premenná $x$ má v stave $s_{1}$ hodnotu $\mathbf{14}$, potom túto skutočnosť zapisujeme $$ s_{1}~x = \mathbf{14}$$ alebo $$ s_{1} = \left[x \mapsto \mathbf{14}\right].$$

Sémantiku výrazov môžeme definovať len pre syntakticky správne výrazy. To dosiahneme definovaním príslušnej sémantickej funkcie. Sémantická funkcia pre aritmetické výrazy je funkciou dvoch argumentov – výrazu a stavu:

$$\mathscr{E}: \mathbf{Expr} \rightarrow \mathbf{State}\rightarrow \mathbf{Z}.$$

Ak predpokladáme existenciu funkcie $\mathscr{N}$ (Cvičenie 1), ktorá definuje význam numerálov, potom môžeme definovať funkciu $\mathscr{E}$ pre jednotlivé tvary aritmetických výrazov pomocou sémantických rovností v nasledujúcej tabuľke:

$$ \begin{array}{l} \mathscr{E} [\![ n ]\!]~s = \mathscr{N} [\![ n ]\!] \\ \mathscr{E} [\![ x ]\!]~s = s~x \\ \mathscr{E} [\![ e_{1} + e_{2} ]\!]~s = \mathscr{E} [\![ e_{1} ]\!]~s \oplus \mathscr{E} [\![ e_{2} ]\!]~s\\ \mathscr{E} [\![ e_{1} - e_{2} ]\!]~s = \mathscr{E} [\![ e_{1} ]\!]~s \ominus \mathscr{E} [\![ e_{2} ]\!]~s\\ \mathscr{E} [\![ e_{1} * e_{2} ]\!]~s = \mathscr{E} [\![ e_{1} ]\!]~s \otimes \mathscr{E} [\![ e_{2} ]\!]~s\\ \mathscr{E} [\![ (e) ]\!]~s = (\mathscr{E} [\![ e ]\!]~s) \\ \end{array} $$

Sémantickú funkciu aplikujeme postupne.

Príklad

Pre výraz $x-1$ a stav $s~x = \mathbf{14}$ nájdeme význam daného výrazu nasledovne:

  • dosadíme prvý argument, výraz, do funkcie $\mathscr{E}$ a dostaneme funkciu jedného argumentu: $$ \mathscr{E} [\![ x-1 ]\!] : \mathbf{State} \rightarrow \mathbf{Z}, $$
  • uvedenú funkciu aplikujeme na argument – stav $s$ a dostaneme výsledok – hodnotu výrazu: $$ \mathscr{E} [\![ x-1 ]\!]~s = s~x \ominus \mathbf{1} = \mathbf{13}.$$

Úloha 2.1

Daný je matematický výraz $x^2 - y^2$. Transformujte tento výraz a tvar pomocou operátorov v pravidle pre aritmetické výrazy. Nájdite jeho význam pre hodnoty premenných v stave $s=\left[x \mapsto \mathbf{5001}, y \mapsto \mathbf{4999} \right]$. Pre daný výraz zostavte strom abstraktnej syntaxe.

Úloha 2.2

Daný je výraz $x-y*z$. Vyhodnoťte daný výraz v stave $s = \left[ x\mapsto\mathbf{12}, y\mapsto\mathbf{4}, z\mapsto\mathbf{3}\right]$. Pre daný výraz zostavte strom abstraktnej syntaxe.

Úloha 2.3

Daný je výraz $(x-y) * z$. Vyhodnoťte daný výraz v stave $s = \left[ x\mapsto\mathbf{12}, y\mapsto\mathbf{4}, z\mapsto\mathbf{3}\right]$. Pre daný výraz zostavte strom abstraktnej syntaxe.

Úloha 2.4

Dokážte štrukturálnou indukciou, že rovnosti v tabuľke v tomto kroku definujú úplnú funkciu $\mathscr{E}$.

Návod: Najprv ukážte, že postačuje dokázať, že pre každý výraz $e \in \mathbf{Expr}$ a každý stav $s \in \mathbf{State}$ existuje práve jedna hodnota $v \in \mathbf{Z}$ taká, že $\mathscr{E}[\![ e ]\!]~s = v$. Potom použite štrukturálnu indukciu na jednotlivých aritmetických výrazoch.

Krok 3

Boolovské (logické) výrazy v jazyku Jane (a vo väčšine skutočných programovacích jazykov) slúžia na zistenie pravdivostnej hodnoty podmienky v podmieňovacom príkaze alebo v príkaze cyklu. Významom boolovských výrazov je pravdivostná hodnota. Pre tieto hodnoty definujeme sémantickú oblasť $$\mathbf{B} = \{ \mathbf{tt}, \mathbf{ff} \},$$ pričom

  • $\mathbf{tt}$ bude označovať pravdivosť,
  • $\mathbf{ff}$ bude označovať nepravdivosť.

Definujeme sémantickú funkciu $\mathscr{B}$ pre boolovské výrazy: $$\mathscr{B}: \mathbf{Bexp} \rightarrow \mathbf{State} \rightarrow \mathbf{B}.$$ Funkciu $\mathscr{B}$ pre jednotlivé tvary boolovských výrazov definujeme pomocou sémantických rovností v nasledujúcej tabuľke:

$$ \begin{array}{ll} \mathscr{B} [\![ \mathtt{true} ]\!]~s = & \mathbf{tt}, \\ & \\ \mathscr{B} [\![ \mathtt{false} ]\!]~s = & \mathbf{ff}, \\ & \\ \mathscr{B} [\![ e_{1} = e_{2} ]\!]~s = & \mathbf{tt}, \text{ ak } \mathscr{E} [\![ e_{1} ]\!]~s = \mathscr{E} [\![ e_{2} ]\!]~s, \\ & \mathbf{ff}, \text{ ak } \mathscr{E} [\![ e_{1} ]\!]~s \neq \mathscr{E} [\![ e_{2} ]\!]~s, \\ &\\ \mathscr{B} [\![ e_{1} \leq e_{2} ]\!]~s = & \mathbf{tt}, \text{ ak } \mathscr{E} [\![ e_{1} ]\!]~s \leq \mathscr{E} [\![ e_{2} ]\!]~s, \\ & \mathbf{ff}, \text{ ak } \mathscr{E} [\![ e_{1} ]\!]~s \mathscr{E} [\![ e_{2} ]\!]~s, \\ &\\ \mathscr{B} [\![ \neg b ]\!]~s = & \mathbf{tt}, \text{ ak } \mathscr{B} [\![ \neg b ]\!]~s = \mathbf{ff}, \\ & \mathbf{ff}, \text{ ak } \mathscr{B} [\![ \neg b ]\!]~s = \mathbf{tt}, \\ & \\ \mathscr{B} [\![ b_{1} \wedge b_{2} ]\!]~s = & \mathbf{tt}, \text{ ak } \mathscr{B} [\![ b_{1} ]\!]~s = \mathbf{tt} \text{ a } \mathscr{B} [\![ b_{2} ]\!]~s = \mathbf{tt}, \\ & \mathbf{ff}, \text{ ak } \mathscr{B} [\![ b_{1} ]\!]~s = \mathbf{ff} \text{ alebo } \mathscr{B} [\![ b_{2} ]\!]~s = \mathbf{ff}, \\ &\\ \mathscr{B} [\![ (b) ]\!]~s = & (\mathscr{B} [\![ b ]\!]~s). \\ & \\ \end{array} $$

Pretože boolovské výrazy môžu obsahovať aritmetické výrazy, ktorých hodnota môže závisieť od aktuálnych hodnôt premenných, opäť musíme uvažovať stavy. Sémantické rovnosti pre jednotlivé alternatívy produkčného pravidla definujú význam boolovského výrazu v stave $s$.

Príklad

Pre výraz $x \leq y \wedge z \leq y - 1$ a stav $$s = \left[ x\mapsto\mathbf{16}, y\mapsto\mathbf{46}, z\mapsto\mathbf{12}\right]$$ nájdeme význam daného výrazu nasledovne: $$ \begin{array}{ll} \mathscr{B} [\![ x \leq y ]\!]~s & = \mathscr{E} [\![ x ]\!]~s \leq \mathscr{E} [\![ y ]\!]~s \\ & = s~x \leq s~y \\ & = \mathbf{16} \leq \mathbf{46} \\ & = \mathbf{tt}, \\ \end{array} $$

$$ \begin{array}{ll} \mathscr{B} [\![ z \leq y - 1]\!]~s & = \mathscr{E} [\![ z ]\!]~s \leq \mathscr{E} [\![ y - 1]\!]~s \\ & = \mathscr{E} [\![ z ]\!]~s \leq \mathscr{E} [\![ y ]\!]~s \ominus \mathscr{E} [\![ 1 ]\!]~s \\ & = s~z \leq s~y \ominus \mathscr{N} [\![ 1 ]\!] \\ & = \mathbf{12} \leq \mathbf{46} \ominus \mathbf{1} \\ & = \mathbf{12} \leq \mathbf{45} \\ & = \mathbf{tt}, \\ \end{array} $$

$$ \begin{array}{ll} \mathscr{B} [\![ x \leq y \wedge z \leq y - 1]\!]~s & = \mathscr{B} [\![ x \leq y ]\!]~s \wedge \mathscr{B} [\![ z \leq y - 1]\!]~s \\ & = \mathbf{tt} \wedge \mathbf{tt} \\ & = \mathbf{tt} \\ \end{array} $$

Daný výraz je v stave $s$ pravdivý.

Úloha 3.1

Daný je kvadratický trojčlen $x^2 - x - 6$. Potvrdťe alebo vyvráťte tvrdenie, že pre nasledujúce hodnoty je výraz kladný: $s~x= \mathbf{4}$, $s'~x=\mathbf{3}$.

Úloha 3.2

Dokážte štrukturálnou indukciou, že rovnosti v tabuľke v tomto kroku definujú úplnú funkciu $\mathscr{B}$.

Krok 4

Syntax aritmetických výrazov a boolovských výrazov možno podľa potreby kedykoľvek rozšíriť pridaním nových prvkov do produkčného pravidla. K takto pridaným prvkom je potrebné definovať ich význam. Pri definícii využívame obvyklé postupy a štandardné matematické vlastnosti.

Príklad

Rozšírte syntax a sémantiku aritmetických výrazov o tvar opačného výrazu k výrazu $e$, t.j. $-e$.

Syntax rozšírime pridaním príslušného zápisu do produkčného pravidla: $$ e ::= \ldots ~| ~ -e. $$

Sémantiku daného výrazu najjednoduchšie definujeme nasledujúcim spôsobom: $$ \mathscr{E} [\![ -e ]\!]~s = \mathbf{0} \ominus \mathscr{E} [\![ e ]\!]~s.$$

Podobne postupujeme aj pri boolovských výrazoch.

Príklad

Rozšírte syntax a sémantiku boolovksých výrazov o nerovnosť dvoch aritmetických výrazov, t.j. $e \neq e$.

Syntax rozšírime pridaním príslušného zápisu do produkčného pravidla: $$ b ::= \ldots ~| ~ e \neq e. $$

Sémantiku daného výrazu najjednoduchšie definujeme nasledujúcim spôsobom: $$ \begin{array}{ll} \mathscr{B} [\![ e_{1} \neq e_{2} ]\!]~s = & \mathbf{ff}, \text{ ak } \mathscr{E} [\![ e_{1} ]\!]~s = \mathscr{E} [\![ e_{2} ]\!]~s, \\ & \mathbf{tt}, \text{ inak.} \\ \end{array} $$

Úloha 4.1

Rozšírte syntax a sémantiku aritmetických výrazov o nasledujúce tvary:
a) predchodca prirodzeného čísla $\mathrm{pred}~n$
b) druhá mocnica výrazu $\mathrm{sqr}~e$
c) absolútna hodnota výrazu $\mathrm{abs}~e$

Úloha 4.2

Rozšírte syntax a sémantiku boolovksých výrazov o nasledujúce tvary:
a) nerovnosť $e < e$
b) nonekvivalencia $b~\mathrm{xor}~b$
c) implikácia $b \Rightarrow b$

Doplňujúce úlohy

Úloha A.1

Definujte sémantiku pre nasledujúce operácie:

a) celočíselný podiel $e~\mathrm{div}~e$
b) zvyšok po delení $e~\mathrm{mod}~e$ \

Prediskutujte všetky prípady, ktoré môžu nastať. Uvažujte len nezáporné hodnoty výrazov.

Záver

Uvedený spôsob definície sémantiky výrazov predstavuje denotačný prístup. Existuje aj spôsob vyhodnocovania výrazov podľa pravidiel operačnej sémantiky. S týmto spôsobom sa ozobnámime neskôr. Denotačný prístup sa bežne používa vo všetkých sémantických metódach, v ktorých sa sústreďujeme na hľadanie významov programov.