更容易生成真值表的方法

时间:2013-12-02 16:35:27

标签: functional-programming sml smlnj

我想在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 个答案:

答案 0 :(得分: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