Forma normal disyuntiva en Python

Usando python, ¿cuál es la mejor manera de convertir una cadena de AND y OR enforma normal disyuntiva (también conocido como "suma de productos")?

b AND (c OR (a AND d))

se convierte

(b AND c) OR (b AND a AND d)

Me gustaría ordenar también estos, lexicográficamente

(a AND b AND d) OR (b AND c)