use cartesian product when no shared terms
maybe with non-nil filler