Если вы рассматриваете список логических значений как список битов фиксированной длины, есть очень простое решение: Count!
Если вы хотите иметь все комбинации из 4 логических значений, считайте от 0 до 15 (2 ^ 4 - 1) - затем интерпретируйте каждый бит как один из логических значений. Для простоты я буду использовать цикл for, но вы также можете сделать это с помощью рекурсии:
let size = 4 in
(* '1 lsl size' computes 2^size *)
for i = 0 to (1 lsl size) - 1 do
(* from: is the least significant bit '1'? *)
let b0 = 1 = ((i / 1) mod 2) in
let b1 = 1 = ((i / 2) mod 2) in
let b2 = 1 = ((i / 4) mod 2) in
(* to: is the most significant bit '1'? *)
let b3 = 1 = ((i / 8) mod 2) in
(* do your thing *)
compute b0 b1 b2 b3
done
Конечно, вы можете сделать тело цикла более общим, например: создает список / массив логических значений в зависимости от размера, указанного выше и т. д .;
Дело в том, что вы можете решить эту проблему, перечислив все значения, которые вы ищете. Если это так, вычислите все целые числа до размера вашей проблемы. Напишите функцию, которая генерирует значение вашей исходной задачи из целого числа. Соберите все это вместе.
Этот метод имеет то преимущество, что вам не необходимо сначала создавать все комбинации, прежде чем начинать вычисления. При больших проблемах это может вас спасти. Для довольно маленького размера = 16 вам уже понадобится 65535 * sizeof (type) memory - и это растет экспоненциально с размером! Приведенное выше решение потребует только постоянного объема памяти sizeof (тип) .
И ради науки: ваша проблема NP-полная , поэтому, если вам нужно точное решение, это займет экспоненциальное время.