Let $L_1 \subseteq \Sigma_1^*$ and $L_2 \subseteq \Sigma_2^*$ be decision problems (languages).
    Then $L_1$ is \emph{polynomial-time reducible} to $L_2$ if there exists
    a \emph{polynomial-time computable} function $f: \Sigma_1^* \to \Sigma_2^*$ such that:
      x\in L_1 ~\iff~ f(x)\in L_2
    To decide if $x \in L_1$, we can compute $f(x)$ and check $f(x) \in L_2$.
  So the problem $L_1$ is reduced to the problem $L_2$.
    Let $f : \Sigma_1^* \to \Sigma_2^*$ and
    $g : \Sigma_2^* \to \Sigma_3^*$ 
    be polynomial-time reductions.\\
    The composition $g \circ f : \Sigma_1^* \to \Sigma_3^*$ 
    is a polynomial-time reduction.

    A language $L \in \text{NP}$ is \emph{NP-complete} if \alert{every language in NP}
    is polynomial time reducible to $L$.