% -*- coding: iso-8859-2 -*-
\documentclass[a4paper]{article}
\usepackage{progm}
\analpacks
\analoldal{3. feladatsor, 22. feladat. függvényabsztrakcióval}
\newcommand{\ChE}{\text{ChE}}
\newcommand{\extr}{\text{extr}}
\begin{document}
\noindent
\emph{Feladat:} Adott egy karakterekből álló szekvenciális file
(megengedett művelet az $sx,dx,x:read$).  Számoljuk meg, hogy a
szövegben hány $k$ betűnél hosszabb szó van!  (A szavakat tetszőleges
számú szóköz választhatja el.)

\emph{Specifikáció:}\\
$\F = \file(Ch)$\\
$A = \alatt{\F}{x} \times \alatt{\N_0}{k} \times \alatt{\N_0}{d}$

A feladat állapotterét először áttranszformáljuk egy olyanra, ahol a
file végén van extremális elem, még mielőtt az olvasás során abnorm
értéket kapnánk, mert így könnyebb lesz felírni a kiértékelendő
rekurzív függvényt.

$\ChE=Ch \cup \{\extr\}, \F'=file(\ChE), Ch'=Ch\setminus\{\_\}$\\
$A' = \alatt{\F'}{y} \times \alatt{\N_0}{k} \times \alatt{\N_0}{d}$\\
$y=\con(x,<\extr>)$

$B = \alatt{\F'}{y'} \times \alatt{\N_0}{k'}$\\
$Q = ( y=y' )$\\
$R = ( d = f(dom(y'))_1)$, ahol $f:[0,dom(y')]\nyil \N_0\times\N_0, f(0):=(0,0), \forall i\in[1,dom(y')]:f(i):=F(i,f(i-1))$
\[
F(i,z):= \left\{
\begin{array}{ll}
(z_1,z_2+1) & \text{, ha } y_i\in Ch' \\
(z_1+1,0) & \text{, ha } y_i\not\in Ch' \es z_2 > k \\
(z_1,0) & \text{, ha } y_i\not\in Ch' \es 0 < z_2 \le k
\end{array}
\right.
\]

Ez a specifikáció már visszavezethető a rekurzív formulával adott
függvény kiszámításának tételére, amit file-ra írunk fel:

\begin{stuki}[16cm]
  \stm{\open(y)}
  \stm{sy,dy,y:\Read}
  \stm{d,h:=0,0}
  \begin{WHILE}{3}{\stm{sy=\norm}}
    \begin{CASE}{1}{3}
      \WHEN{\stm{dy\in Ch'}}
      \stm{h:=h+1}
      \WHEN{\stm{dy\not\in Ch'\es h>k}}
      \stm{d,h:=d+1,0}
      \WHEN{\stm{dy\not\in Ch'\es h\le k}}
      \stm{h:=0}
    \end{CASE}
    \stm{sy,dy,y:\Read}
  \end{WHILE}
\end{stuki}

\begin{stuki*}[4cm]{open($y$)}
  \stm{sx,dx,x:\Read}
  \stm{dy:=\_}
\end{stuki*}

\begin{stuki*}[8cm]{$sy,dy,y:\Read$}
\begin{IF}{4}{\stm{dy\ne\extr}}
  \stm{sy:=\norm}
  \begin{IF}{2}{\stm{sx=\norm}}
    \stm{dy:=dx}
    \stm{sx,dx,x:\Read}
    \ELSE
    \stm{dy:=\extr}
  \end{IF}
  \ELSE
  \stm{sy:=\abnorm}
\end{IF}
\end{stuki*}

\end{document}
