\documentclass[a4paper]{article}
\usepackage{progm}
\analpacks
\analoldal{2. feladatsor, 37. feladat}
\begin{document}
\noindent
\emph{Feladat:} Adott a kezdőpontja szerint növekvő sorrendben a számegyenes
$N$ darab intervalluma.  Állapítsuk meg, hogy a $k$ szám hány intervallumba
esik bele.

\emph{Specifikáció:}\\
$Iv = (ah:\Z, fh:\Z)$ \\
$I_{Iv}(i)=(i.ah\le i.fh+1)$ \\
$\V = \vect([1..N], Iv)$ \\
$A = \alatt{\V}{v} \times \alatt{\Z}{k} \times \alatt{\N_0}{d}$\\
$B = \alatt{\V}{v'} \times \alatt{\Z}{k'}$\\
$Q = ( v=v' \es k=k' \es \forall i\in[1..N-1]: v[i].ah\le v[i+1].ah)$\\
$R = ( Q \es d=\sum\limits_{i=1}^N\chi(v[i].ah\le k\le v[i].fh))$

A specifikáció nagyon hasonló a számlálás programozási tételéhez.  Az
eltéréseket az alábbi táblázattal foglalhatjuk össze:

\begin{tabular}{ccc}
  feladat &  & számlálás \\
  \hline
  $1$ & \knyil & $m$ \\
  $N$ & \knyil & $n$ \\
  $v[x].ah\le k\le v[x].fh$ & \knyil & $\beta(x)$ \\
  $i$ & \knyil & $k$ 
\end{tabular}

A visszavezetés paraméteres a $k$ szerint, továbbá a számlálás
programozási tétele nem követeli meg a vektor
rendezettségét, tehát az előfeltétele a feladatnak erősebb, mint a
tételé, így a visszavezetés egyben általánosított.

\begin{stuki}
  \stm{i,d:=0,0}
  \begin{WHILE}{3}{\stm{i \ne N}}
    \begin{IF}{1}{\stm{v[i+1].ah\le k\le v[i+1].fh}}
      \stm{d:=d+1}
      \ELSE
      \SKIP
    \end{IF}
    \stm{i:=i+1}
  \end{WHILE}
\end{stuki}

\end{document}
