Более простой способ создания таблицы истинности

Я хочу создать список списков в SML, который представляет таблицу истинности в следующей форме:

Example:

[
    [("r",true),("p",true),("q",true)],
    [("r",false),("p",false),("q",true)],
    [("r",false),("p",true),("q",true)], 
    ...
]

Я думаю, что я мог бы достичь этого двумя способами: (1) с помощью декартового произведения (2) преобразование записи индекса таблицы истинности в двоичную, которая представляла бы закодированную строку в списке (например, 8(десятичная) равна 1000(двоичная) => [("r",true),("p",false),("q",false)]), но я думаю, что это сложно и, возможно, есть более простой способ.

Какой самый простой способ это сделать?

1 ответ

Решение
fun tt []        = [[]]   
  | tt (x :: xs) =    
    let
      val txs = tt xs    
    in
      map (fn l => (x, true) :: l) txs @
      map (fn l => (x, false) :: l) txs    
    end


- tt ["a", "b", "c"];
val it =
  [[("a",true),("b",true),("c",true)],[("a",true),("b",true),("c",false)],
   [("a",true),("b",false),("c",true)],[("a",true),("b",false),("c",false)],
   [("a",false),("b",true),("c",true)],[("a",false),("b",true),("c",false)],
   [("a",false),("b",false),("c",true)],[("a",false),("b",false),("c",false)]]
  : (string * bool) list list
Другие вопросы по тегам