Combinations of Abstract Domains for Logic Programming: Open Product and Generic Pattern Construction