\section{Chapitre 4: Algorithmes de filtrage pour les contraintes arithmétiques}
\label{sec:ch4}

\subsection{Contrainte d'égalité}
\label{sec:ch4egal}

\begin{itemize}
\item $X=Y, \texttt{dom}(X) = [a,b], \mathtt{dom}(Y) = [c,d]$
\item Cohérence de domaine: $\texttt{dom}(X) \cap \mathtt{dom}(Y)$ 
\item Cohérence de bornes: $[\max(a,c),\min(b,d)]$
\end{itemize}

\subsection{Arithmétique des intervalles}
\label{sec:ch4arith}

\paragraph{Addition}

\begin{itemize}
\item $X+Y=Z, \texttt{dom}(X) = [a,b], \mathtt{dom}(Y) = [c,d], \mathtt{dom}(Z) = [e,f]$
\item $\mathtt{dom}(X+Y) = [a,b]+[c,d]=[a+c,b+d]$
\item $\mathtt{dom}(Z)=[a+c,b+d] \cap [e,f] = [\max(e,a+c),\min(f,b+d)]$
\item Addition d'une constante: $[a,b]+k = [a+k,b+k]$
\end{itemize}

\paragraph{Multiplication par une constante}

\begin{align}
  k[a,b] &= \begin{cases}
    [ka,kb], k \geq 0\\
    [kb,ka], k < 0
  \end{cases}
\end{align}

\paragraph{Soustraction}

\begin{align}
  [a,b]-[c,d] = [a-d,b-c] 
\end{align}

\paragraph{Multiplication et division}

La multiplication par l'inverse équivaut à une division.

\begin{align}
  [a,b] \times [c,d] &= [\min(ac, ad, bc, bd), \max(ac, ad, bc, bd)]\\
  \frac{1}{[a,b]} &= \begin{cases}
    [\frac{1}{b},\frac{1}{a} ], & 0 \notin [a,b]\\
    [\frac{1}{b},\infty ), & a=0<b\\
    (-\infty, \frac{1}{a}, & a<0=b\\
    (-\infty,\infty) \setminus (\frac{1}{a},\frac{1}{b}), & a<0<b\\
  \end{cases}
\end{align}

\subsection{Fonctions}
\label{sec:ch4fonctions}

Deux techniques possibles:

\begin{itemize}
\item Application telle quelle: on utilise l'inclusion: $\subset$
\item Factorisation: on utilise l'égalité $=$
\end{itemize}

Conditions pour obtenir un intervalle exact:

\begin{itemize}
\item Les variables n'apparaîssent qu'une seule fois
\item La fonction est monotone sur le domaine de toutes ses variables
\end{itemize}

Étude de la monotonicité

\begin{itemize}
\item \begin{itemize}
  \item Fonction croissante: $f([a,b]) = [f(a),f(b)]$
  \item Fonction décroissante: $f([a,b]) = [f(b),f(a)]$
  \end{itemize}
\item Pour $f(X_1,\ldots,X_n), \mathtt{dom}(X_i)=[a_i,b_i]$:
  \begin{itemize}
  \item Borne supérieure:
    \begin{itemize}
    \item $X_i \leftarrow b_i, \frac{df}{dX_i} > 0$
    \item $X_i \leftarrow a_i, \frac{df}{dX_i} < 0$
    \end{itemize}
  \item Borne inférieure:
    \begin{itemize}
    \item $X_i \leftarrow a_i, \frac{df}{dX_i} > 0$
    \item $X_i \leftarrow b_i, \frac{df}{dX_i} < 0$
    \end{itemize}
  \end{itemize}
\item On peut utiliser des résultats où la fonction est monotone seulement par rapport à quelques variables. On fixe les bornes inférieures et supérieures et on applique l'arithmétique des intervalles ensuite. On obtient un surensemble davantage restreint.
\end{itemize}

\paragraph{Filtrer une contrainte arithmétique}

Exprimer une variable en fonction des autres variables, puis utiliser l'arithmétique des intervalles. $X_i = f(X_1,\ldots,X_{i-1},X_{i+1},\ldots,X_n)$. 

Si une variable ne peut être isolée: on crée des contraintes plus petites en utilisant des variables additionnelles.

Variables entières: \begin{itemize}
\item Calcul des intervalles continus
\item Borne supérieure: fonction plancher
\item Borne inférieure: fonction plafond
\item \textbf{Attention}: Pas de cohérence de bornes. NP-Difficile
\end{itemize}

\paragraph{Réduction}

$S=\lbrace a_1,\ldots,a_n \rbrace$ un ensemble d'entiers. On pose $\sum_{a_i\in A}a_i = \sum_{a_i\in S \setminus A}a_i$ Est-ce que $A$ existe ?

On peut réduire le problème à $a_1X_1+a_2X_2+\ldots+a_nX_n = \frac{1}{2} \sum_{i=1}^{n}a_i, X_i \in \lbrace 0,1 \rbrace$.

\subsection{Cohérence de domaine}
\label{sec:ch4cohdom}

La cohérence de domaine est aussi NP-Difficile.
Algorithme pseudo-polynomial (dépend de la taille des coefficients et des cartinalité des domaines): Algorithme de Trick

\paragraph{Algorithme de Trick}

\begin{itemize}
\item Filtre $< \leq X_1 + \ldots + X_n \leq u$. Égalité si $l=u$.
\item Graphe de n+1 niveaux. Niveau 0: Un noeud étiqueté 0.
\item On crée un noeud $v+u$ au niveau $i$ pour chaque valeur $u$ au niveau $i-1$ et chaque valeur $u$ du domaine de $X_i$.
\item L'arête prend la valeur $u$.
\item Illustration: \ref{fig:algotrick}
\end{itemize}

\begin{figure}[H]
  \centering
  \includegraphics[width=10cm]{algo_trick}
  \caption{Algorithme de Trick}
  \label{fig:algotrick}
\end{figure}


%%% Local Variables:
%%% mode: latex
%%% TeX-master: "notes_de_cours"
%%% End:
