\documentclass[a4paper]{article}
\usepackage{progm}
\analpacks
\analoldal{3. feladatsor, 7. feladat}
\begin{document}
\noindent
\emph{Feladat:} Adott egy egész számokat tartalmazó file.  Ha a file tartalmaz
pozitív elemet, akkor keressük meg a legnagyobbat, különben a legkisebbet!

Tekintsük az alábbi függvényt: $R = \{0,1\} \times \N_0 \times \Z, f: \Z \nyil R$ \\
\[
f(x)=\left\{
\begin{array}{ll}
  (1, x, x) & \text{, ha } x>0 \\
  (0, -x, x) & \text{, ha } x\le 0
\end{array}
\right.
\]

\emph{Specifikáció:}\\
$\F = \file(\Z)$\\
$A = \alatt{\F}{x} \times \alatt{R}{max}$\\
$B = \alatt{\F}{x'}$\\
$Q = ( x=x' \es x'.dom\ge 1 )$\\
$R = ( \exists i\in[1..x'.dom]:f(x'_i)=max \es \forall j\in[1..x'.dom]:f(x'_j)\Tilde\le max)$

Ahol az $R$ típuson értelmezett rendezés a $\Tilde\le$, oly módon,
hogy az első komponenst veszi figyelembe legerősebben, a másodikat ``kevésbé''.
A keresett számot $max$ 3. komponense tartalmazza.
Látva ezt az utófeltételt, megpróbálhatjuk a feladatot
maximumkeresésre visszavezetni, ehhez először írjuk fel a
maximumkeresést sorozatokra:
\begin{stuki}
  \stm{max:=f(x.lov)}
  \begin{WHILE}{3}{\stm{x.dom \ne 0}}
    \begin{IF}{1}{\stm{f(x.lov)\Tilde\ge max}}
      \stm{max:=f(x.lov)}
      \ELSE
      \SKIP
    \end{IF}
    \stm{x:lorem}
  \end{WHILE}
\end{stuki}

Majd innen már egyszerűbb az átírás filera.  Tudjuk, hogy az $x$ nem
üres, ezért két előolvasást is végezhetünk.  Valamint alkalmazzuk
$\Tilde\le$ kiszámításának módját, majd helyettesítsük $f(dx)$-et
változóval (ekkor $z$-t már rekordnak is tekinthetjük):
\begin{stuki}
  \stm{sx,dx,x:read}
  \stm{max:=f(dx)}
  \stm{sx,dx,x:read}
  \begin{WHILE}{3}{\stm{sx=norm}}
    \begin{IF}{1}{\stm{f(dx).1 > max.1 \vagy f(dx).1 = max.1 \es f(dx).2>max.2}}
      \stm{max:=f(dx)}
      \ELSE
      \SKIP
    \end{IF}
    \stm{sx,dx,x:read}
  \end{WHILE}
\end{stuki}

\begin{stuki}
  \stm{sx,dx,x:read}
  \begin{IF}{1}{\stm{dx>0}}
    \stm{z:=(1,dx,dx)}
    \ELSE
    \stm{z:=(0,-dx,dx)}
  \end{IF}
  \stm{max:=z}
  \stm{sx,dx,x:read}
  \begin{WHILE}{5}{\stm{sx=norm}}
    \begin{IF}{1}{\stm{dx>0}}
      \stm{z:=(1,dx,dx)}
      \ELSE
      \stm{z:=(0,-dx,dx)}
    \end{IF}
    \begin{IF}{1}{\stm{z.1 > max.1 \vagy z.1 = max.1 \es z.2>max.2}}
      \stm{max:=z}
      \ELSE
      \SKIP
    \end{IF}
    \stm{sx,dx,x:read}
  \end{WHILE}
\end{stuki}

\end{document}
