Наборы «Заказанный набор мощности» / «Раскраска графика»

Я хочу, чтобы следующее было сделано в Ocaml, но ответ в ex F # мог бы дать мне достаточно информации, чтобы выполнить преобразование самостоятельно.

Упорядоченный набор мощности (от наибольшего набора к наименьшему) позволил бы мне сделать еще один шаг вперед к описанной ниже проблеме, которую я в идеале хочу решить.

Для неэффективной раскраски графа мне нужна функция, которая дает мне следующее:

f({a,b,c,d}):

{{a,b,c,d}}
{{a,b,c},{d}}
{{a,b,d},{c}}
{{a,c,d},{b}}
{{b,c,d},{a}}
{{a,b},{c,d}}
{{a,c},{b,d}}
{{a,d},{b,c}}
{{a},{b,c},{d}}
{{a},{b},{c,d}}
{{a},{b,d},{c}}
...
{{a},{b},{c},{d}}

как список наборов (или лучше, как ленивый список / перечисление наборов)

Итак, я хочу, чтобы все переменные были представлены в некотором наборе. Но я хочу, чтобы он был упорядочен, поэтому сначала я получаю тот, у которого меньше всего наборов, а тот, где все переменные находятся в наборе последними.

У меня есть одно решение, которое выглядит примерно так: f: Take powerset -> iterate -> применить f к остальным <- отсортировать весь список возможностей

Но я бы хотел избежать сортировки экспоненциального списка. И, надеюсь, я смогу сделать это с помощью ленивого списка, чтобы избежать повторения всех возможных вариантов.

5
задан Lasse Espeholt 5 November 2011 в 08:48
поделиться