0votos

Tabla de verdad en Binario en Haskell

por josejuan hace 4 años

Una tabla de verdad no es enumerar en binario sino que, dada una función de variables booleanas que devuelve un valor booleano, se trata de indicar para qué variables devuelve cierto y para cuales devuelve falso. (Ej. buscar en la wiki "Tabla de verdad"). Mi solución presenta la tabla de verdad de cualquier función booleana con cualquier aridad (cualquier nº de variables booleanas de entrada).

crear una lista de todas las combinaciones de n variables y genera una Tabla de verdad.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
-- Evalúa la tabla de verdad para toda función booleana (de cualquier aridad) 
class TruthTable x where 
  eval :: x -> [([Bool], Bool)] 
 
instance TruthTable Bool where 
  eval f = [([], f)] 
 
instance TruthTable xs => TruthTable (Bool -> xs) where 
  eval f = [(b:bs, r) | b <- [False, True], (bs, r) <- eval (f b)] 
 
-- Y ya está. 
 
 
 
 
 
 
{-# LANGUAGE FlexibleInstances #-} 
import Data.Bits 
import Text.Printf 
 
class ... 
 
-- Imprimir la tabla trata únicamente de ir aplicando el formato deseado 
printTruthTable :: String -> [([Bool], Bool)] -> [String] 
printTruthTable title rs@((r,_):_) = 
  printTruthRow (take (length r) $ map (:[]) ['A'..], title) : 
  printTruthSep (take (length r) $ repeat "-----", "-----") : 
  map (\(a,b)-> printTruthRow (map show a, show b)) rs 
  where printTruthRow (bs, r) = concatMap (printf " %- 5s |") bs ++ printf "| %s" r 
        printTruthSep (bs, r) = concatMap (printf "-%s-+") bs ++ printf "+-%s-" r 
 
 
ioPrintTruthTable title = mapM_ putStrLn . printTruthTable title . eval 
 
 
-- Así, de cualquier función booleana que tengamos, podemos generar su tabla de verdad 
main = do 
 
    ioPrintTruthTable "AND" (&&) 
 
    ioPrintTruthTable "Salgo y llueve o hace sol" (\salgo llueve hace_sol -> salgo && (llueve || hace_sol)) 
 
{- 
 
 
            *Main> main 
 
 
             A     | B     || AND 
            -------+-------++------- 
             False | False || False 
             False | True  || False 
             True  | False || False 
             True  | True  || True 
 
 
             A     | B     | C     || Salgo y llueve o hace sol 
            -------+-------+-------++------- 
             False | False | False || False 
             False | False | True  || False 
             False | True  | False || False 
             False | True  | True  || False 
             True  | False | False || False 
             True  | False | True  || True 
             True  | True  | False || True 
             True  | True  | True  || True 
 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.