2

与えられた量の 3 値の論理値のすべての可能な組み合わせを導くアルゴリズムはありますか?

たとえば、F(2)次のリストを返す必要があります。

t t
t u
t f
u t
u u
u f
f t
f u
f f

関数は次のようになります (Haskell の場合):

data Tril = FALSE | NULL | TRUE

all :: Int -> [[Tril]]
all amount = ???

all1 :: [Tril]
all1 = join (all 1)

all2 :: [(Tril, Tril)]
all2 = map (\[f, s] -> (f, s)) (all 2)

all3 :: [(Tril, Tril, Tril)]
all3 = map (\[f, s, t] -> (f, s, t)) (all 3)
4

2 に答える 2

7

これは、リスト内包表記として非常に簡単に実行できます。

all2 = [ (v1, v2) | v1 <- [FALSE, TRUE, NULL], v2 <- [FALSE, TRUE, NULL] ]

モナドのdoブロックとして同等に書くことができます:

all2 = do
  v1 <- [FALSE, TRUE, NULL]
  v2 <- [FALSE, TRUE, NULL]
  return (v1, v2)

そして、可変サイズのものをどのように書くことができるかについてのアイデアを与えてくれます:

all 0 = [[]] -- Note: Empty list with one empty item.
all n = do
  v  <- [FALSE, TRUE, NULL]
  vs <- all (n-1)
  return (v:vs)

結局のところ、これは少し頭を悩ませていますが、これがreplicateM関数の正味の効果です。モナドアクションを取り、それを N 回実行し、結果をまとめます。

all n = replicateM n [FALSE, TRUE, NULL]
于 2015-03-03T10:16:42.173 に答える