Я хочу, чтобы следующее было сделано в 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 к остальным
<- отсортировать весь список возможностей
Но я бы хотел избежать сортировки экспоненциального списка. И, надеюсь, я смогу сделать это с помощью ленивого списка, чтобы избежать повторения всех возможных вариантов.