2013-12-02 6 views
2

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

Что было бы самым простым способом?

ответ

2
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 
Смежные вопросы