Is there any efficient way to create all combination of cross coverage

I would like to know that how to generate cross coverage of all the combination of the coverpoints in efficient way.

For example

covergroup combination;
    a1: coverpoint a;
    b1: coverpoint b;
    c1: coverpoint c;

    // cross coverage
    a1xb1: cross a1, b1;
    a1xc1: cross a1, c1;
    b1xc1: cross b1, c1;
    a1xb1xc1: cross a1, b1, c1;
endgroup

For the real case I meet, there are 5 coverpoints in the group, which means 5!-1-5 = 114 combinations. Is there any method to generate the cross coverage part automatically without directly write them out explicitly?

The crosses a1xb1, a1xc1, and b1xc1 are redundant if you also have the cross a1xb1xc1. But if you have more complex bins than you have shown, that might not be the case.