I would set this in an array with manual numbering:

\documentclass{article}
\usepackage{amsmath,array}% http://ctan.org/pkg/{amsmath,array}
\newcommand{\NOT}{\sim}\newcommand{\AND}{\wedge}\newcommand{\OR}{\vee}
\newcommand{\twolinebrace}{\rlap{$\smash{\raisebox{.5\height}{\bigg\}}}$}}
\newlength{\LHS}\newlength{\RHS}
\settowidth{\LHS}{$P \OR (Q \OR R)$}\settowidth{\RHS}{$(P \AND Q) \OR (P \AND R)$}
\newcolumntype{M}{>{$}p{\LHS}<{$}}
\newcolumntype{N}{>{$}p{\RHS}<{$}}
\begin{document}
\[
\renewcommand{\arraystretch}{1.1}
\begin{array}{@{}l@{\quad}l@{}}
\begin{array}{>{\bfseries}p{2em}@{\quad}M@{\quad\text{and}\quad}N}
(a) & P & \NOT (\NOT P)
\end{array} & \text{Double Negation Law} \\
\left.\kern-\nulldelimiterspace\begin{array}{>{\bfseries}p{2em}@{\quad}M@{\quad\text{and}\quad}N}
(b) & P \OR Q & Q \OR P \\
(c) & P \AND Q & Q \AND P
\end{array}\right\} & {\text{Commutative Laws}} \\
\left.\kern-\nulldelimiterspace\begin{array}{>{\bfseries}p{2em}@{\quad}M@{\quad\text{and}\quad}N}
(d) & P \OR (Q \OR R) & (P \OR Q) \OR R \\
(e) & P \AND (Q \AND R) & (P \AND Q) \AND R
\end{array}\right\} & {\text{Associative Laws}} \\
\left.\kern-\nulldelimiterspace\begin{array}{>{\bfseries}p{2em}@{\quad}M@{\quad\text{and}\quad}N}
(f) & P \AND (Q \OR R) & (P \AND Q) \OR (P \AND R) \\
(g) & P \OR (Q \AND R) & (P \OR Q) \AND (P \OR R)
\end{array}\right\} & {\text{Distributive Laws}} \\
\left.\kern-\nulldelimiterspace\begin{array}{>{\bfseries}p{2em}@{\quad}M@{\quad\text{and}\quad}N}
(h) & \NOT (P \AND Q) & {\NOT P} \OR {\NOT Q} \\
(i) & \NOT (P \OR Q) & {\NOT P} \AND {\NOT Q}
\end{array}\right\} & {\text{DeMorgan's\textsuperscript{*} Laws}}
\end{array}
\]
\end{document}
Column type M is defined to fit the left-hand side of every law, while N is for the right-hand side. Their lengths are determined before the to fit exactly the contents of the column.
I assume the first column numbering could be automated, but it doesn't warrant that here in my opinion. One caveat with this approach is that the block is not breakable across the page boundary. It could be made that way by using amsmath's breakable alignment, keeping pairs together in an array still.