Considereu aquesta definició de tipus per a expressions lògiques amb variables o valors booleans a les fulles:
data LogicExpression
= Or LogicExpression LogicExpression
| And LogicExpression LogicExpression
| Not LogicExpression
| Var String
| Val Bool
Feu que LogicExpression sigui instància de
Show de forma que les expressions compostes apareguin
totalment parentitzades en forma infixa, tot seguint el format dels
exemples.
Feu una funció
pushNegations :: LogicExpression -> LogicExpression que,
donada una expressió lògica, retorni una expressió lògica equivalent en
la que les negacions només apareguin aplicades a variables i que elimini
les dobles negacions consecutives.
Escriviu un llista infinita bits :: [[[Int]]] que
contingui totes les llistes
d’
bits per a tota
.
No podeu fer servir recursivitat ni importar cap llibreria. Penseu en
l’operador <*> de les llistes considerades com a
aplicatius. S’espera una solució extremadament concisa. (Aquest apartat
és independent dels anteriors.)
El Jutge dóna puntacions parcials per cada apartat: un punt per cada joc de proves públic i un punt per cada joc de proves privat. La puntuació del problema per part del professor és independent d’aquesta puntuació.
Input
Val False Val True Var "a" And (Val True) (Var "b") And (Val False) (Val False) Or (And (Val True) (Var "x")) (Not (Or (Var "y") (Var "x"))) Not (Or (And (Val True) (Var "x")) (Not (Or (Var "y") (Var "x"))))
Output
0 1 a (1 and b) (0 and 0) ((1 and x) or (not (y or x))) (not ((1 and x) or (not (y or x))))
Input
pushNegations $ Val True pushNegations $ Var "x" pushNegations $ Not (Val True) pushNegations $ And (Val True) (Var "x") pushNegations $ Or (And (Val True) (Var "x")) (Not (Or (Var "y") (Var "x"))) pushNegations $ Not (Or (And (Val True) (Var "x")) (Not (Or (Var "y") (Var "x")))) pushNegations $ Not $ Not $ Not $ Var "a"
Output
1 x 0 (1 and x) ((1 and x) or ((not y) and (not x))) ((0 or (not x)) and (y or x)) (not a)
Input
take 3 bits bits !! 0 bits !! 1 bits !! 2 bits !! 3 bits !! 4 take 16 $ map length bits
Output
[[[]],[[0],[1]],[[0,0],[0,1],[1,0],[1,1]]] [[]] [[0],[1]] [[0,0],[0,1],[1,0],[1,1]] [[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]] [[0,0,0,0],[0,0,0,1],[0,0,1,0],[0,0,1,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1],[1,0,0,0],[1,0,0,1],[1,0,1,0],[1,0,1,1],[1,1,0,0],[1,1,0,1],[1,1,1,0],[1,1,1,1]] [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]