Arquitectura de Sistemas. 3 Algebra de Boole. Formas canónicas y método de Karnaugh.












LINK AL CUADERNO CON TODA LA INFORMACIÓN DEL CAPITULO:

https://notebooklm.google.com/notebook/ea81783d-eeee-41e3-9269-0dd576b7e5fb


Formas canónicas.


Dada una función del AB, tenemos dos formas de describirla, de referirnos a ella, de definirla…

Por extensión y por comprensión.

Las funciones son un tipo especial de relaciones. Las relaciones son un subconjunto del producto cartesiano. Entonces las funciones son conjuntos.

Los conjuntos se pueden dar por extensión o por comprensión y por lo tanto las funciones también.

Por extensión es cuando damos su tabla de verdad.

Por ejemplo damos f, arbitrariamente, f(a,b) tal que

f(0,0)=1

f(0,1)=0

f(1,0)=0

f(1,1)=1

Por comprensión es cuando la indicamos a partir de la composición de los operadores básicos del álgebra.

Por ejemplo g(a,b,c)= a + /b + c

Notar que estamos introduciendo una notación funcional, con lo cual estamos trabajando con funciones dentro del AB. Funciones que toman tuplas de valores Booleanos y devuelven algún Booleano.

Lo hacemos con total naturalidad…

Si nos dan una función, por comprensión, podemos llevarla a su notación por extensión.

¿Cómo lo hacemos?

Por medio de la tabla de verdad.

Sea g una función que damos arbitrariamente:

g(a,b,c)= a + /b +c

Para darla por extensión, hacemos su tabla de verdad:

a b c   g  =  a  + /b  + c

000    1

001    1

010    0

011    1

100    1

101    1

110    1

111    1

Aquí, con la tabla de verdad, g queda dada por extensión

Ahora vamos por el problema inverso.

Dada una función por extensión, cómo hacemos para escribirla por comprensión.

O sea, dada la tabla como armamos la fórmula…

Este método es el de las FORMAS CANONICAS. Veremos otro también, el MÉTODO DE KARNAUGH, que nos lleva a la expresión más simple de una función del AB.

Las formas canónicas son un método rápido y sencillo, pero que NO NECESARIAMENTE (y habitualmente NO lo hacen) llevan a la forma más simple.

“Más simple” es la expresión que no tiene nada por simplificar.

Por ejemplo si aparece ab+/ab sabemos que eso es b… sin embargo la primera es canónica y la segunda no…

Formas Canónicas

Observemos la siguiente tabla de verdad:

Notamos que estos términos que tienen todas las variables, comunes o negadas, tienen una particularidad, y es que son 0 en todas las líneas menos una.

Estos términos se llaman CANONICOS. Su característica es tener todas las variables, ya sea sin negar o negada. Y generan un solo UNO en la tabla, siendo CERO el resto.

Entonces, dada una tabla de verdad cualquiera, nosotros podemos razonar AL REVES, y expresarla como suma de términos canónicos…

Entonces dada f por su tabla de verdad, la descompongo como suma de términos canónicos, y por lo tanto f(a,b,c,)=abc+/a/b/c+a/bc+/abc

Y decimos que en este caso f está en su PRIMERA FORMA CANONICA.

Esta forma, tal como vemos, dista mucho de ser la más simple. Y habría que simplificarla, o bien por KARNAUGH o bien usando propiedades.

Cómo exactamente miramos la construcción de cada término canónico ?

Si la variable está en 1, va como está, y si está en 0, va negada.

Por ejemplo, 0 0 0 produce un 1, entonces es: /a./b./c

Ejercicio

Dada f(a,b,c) / f(0,0,1)=1 , f(1,1,0)=1 y f(1,1,1)=1 y en todo otro caso da 0… hallar la tabla de verdad de f, y su primera forma canónica.

Entonces f(a,b,c)= /a/bc+ab/c+abc es la primera forma canónica.

Segunda forma canónica:

f(a,b,c)=(a+b+c).(a+/b+c).(a+/b+/c).(/a+b+c).(/a+b+/c)

Principio de dualidad

Todo en el AB guarda simetría entre el 0 y el 1. Por qué? Porque las funciones base de la definición del álgebra la tienen.

Vale el siguiente principio de dualidad:

Sea E un enunciado del álgebra.

Construimos E’, el cual diremos es su dual, sustituyendo 0 por 1, 1 por 0, + por .  y . por +

Entonces se cumple que: E’ es válido sii E es válido.

Por ejemplo, sabemos que: a.1=a

Entonces, por dualidad, a+0=a

Otro ejemplo, sabemos que /(a+b)=/a./b 

Entonces, por dualidad, /(a.b)=/a + /b

Entonces, vamos a ver que la primera forma canónica tiene un dual, que es la SEGUNDA FORMA CANONICA o PRODUCTO DE SUMAS.

Segunda forma canónica: producto de sumas canónicas

Tomamos todos los CEROS y por cada uno de ellos armamos un término canónico, basado en sumas, donde cada variable que aparezca en 0, aparece sin negar, y cada variable que aparezca en 1, aparece negada. Luego multiplicamos esos términos.

Ejemplo

Entonces tenemos

f(a,b,c)=(a+b+c).(a+/b+c).(a+/b+/c).(/a+b+c).(/a+b+/c)

ATENCION CON ESTO

REVISEMOS ESTE RAZONAMIENTO

a+b.c+/a.c = por dualidad = a.(b+c).(/a+c)

¿ VÁLIDO O NO ?

a+b=por dualidad=a.b

NOOOOOO NO ES VALIDO Y EL PRINCIPIO DE DUALIDAD NO DICE ESO!

Ejemplo de aplicación correcta del principio:

Como a+b=b+a entonces a.b=b.a

Pero no dice a+b=a.b….

El principio de dualidad plantea una igualdad entre enunciados.

Otro ejemplo, de una forma SI correcta:

a+b+/c= doble negación

=/ ( / (a+b+/c)) = de Morgan

=/ (/a . /b . //c)=doble negación

=/(/a./b.c)

Notación sigma y pi

Esta es una forma abreviada de dar la tabla de verdad, es decir, de dar la función por extensión.

Para decir donde la función vale 1 (y por lo tanto, se deduce que donde no vale 1, vale 0) usamos la notación sigma.

En forma dual usamos la notación pi. Es decir, nos indica dónde la función vale 0.

Los lugares se numeran desde el cero.

Ejemplo:

Observación: Cantidad mínima de variables

Cuando no se especifica, tomamos la cantidad mínima de variables, que cumpla lo pedido.

Así, por ejemplo g=pi(0,4,6,7) tendrá 3 variables y será g(a,b,c)=pi(0,4,6,7).

Así, por ejemplo h=sigma(2,3,8) tendrá 4 variables y será g(a,b,c,d)=sigma(2,3,8).

Entonces, atención:

f=pi(0,4,6,7)=f(a,b,c)

PERO

f’(a,b,c,d)=pi(0,4,6,7) también es válida y es una función ABSOLUTAMENTE DIFERENTE

ASÍ COMO

f’’(a,b)=pi(0,4,6,7) NO TIENE SENTIDO

Cómo sabemos cuál es la cantidad mínima de variables…?

Si refieren hasta el 1, es una.

Si refieren hasta el 3, es dos.

Si refieren hasta el 7, es tres.

SI refieren hasta el 15, es cuatro variables.

Y así sucesivamente.

Ejemplo

f=pi(0,4,6,7)=f(a,b,c)=sigma(1,2,3,5)

Y

f’(a,b,c,d)=pi(0,4,6,7)=sigma(1,2,3,5,8,9,10,11,12,13,14,15)

Ejemplo

g=pi(0,4,6,7)=g(a,b,c)=sigma(1,2,3,5)

Cuando no me dicen la cantidad de variables, TOMAMOS LA MINIMA CANTIDAD QUE CUMPLA.

Para ordenarnos… tenemos:

Las funciones, dadas por extensión, se dan por su tabla de verdad. La misma se puede escribir en forma total, como tabla, o con notación sigma o pi.

Las funciones, dadas por comprensión, se dan con una fórmula. La misma puede ser simplificada por aplicación de propiedades, o por Karnaugh, lo cual veremos la clase próxima.

Si me dan la función por comprensión, hago la tabla y la obtengo por extensión.

Si me dan la función por extensión, aplico formas canónicas (o Karnaugh) y la obtengo por comprensión.

Ejercicio

Dada f=sigma(1,3,7) calcular su notación pi, su tabla de verdad, y sus formas canónicas.

f=f(a,b,c)=sigma(1,3,7)=pi(0,2,4,5,6)

f=/a./b.c+/a.b.c+a.b.c=(a+b+c).(a+/b+c).(/a+b+c).(/a+b+/c).(/a+/b+c)

Práctico

1)

a)

(a+/b+ab)(a+/b)(/ab)= asociativa= (a+/b+ab)((a+/b)(/ab))=distributiva=(a+/b+ab)(a/ab+/b/ab)=

=asoc producto, x/x=0, conmutat producto=(a+/b+ab)(0b+0a)=

Aplico 0.x=0 y 0+0=0

=(a+/b+ab)(0)=

Aplico x.0=0

=0

QED

b)

(a+/b+a/b)(ab+/ac+bc)= absorción y conmutativa=

=(a+/b)(ab+/ac+bc)=distributiva=

=aab+a/ac+abc+/bab+/b/ac+ /bbc=   X.X=X   X/X=0 X+0=X asoc conmu

=ab +abc +/a/bc=   absorción = ab+/a/bc

QED

c)

(ab+c+d)(/c+d)(/c+d+e)= absorción dual X+XY=X….. X(X+Y)=X

=(ab+c+d)(/c+d)=distributiva=

=ab/c+c/c+d/c+abd+cd+dd=    X./X=0    X+0=X    X.X=X

=ab/c+d/c+abd+cd+d  = absorción 3 veces=

=ab/c+d

QEDb

d)

/a(/b/c+/((b+/c)(/b+/c))) = de Morgan=

=/a(/b/c+  /(b+/c)+/(/b+/c)) )= de Morgan y //X=X  =

=/a(/b/c+ /bc+bc )= factor común =

=/a(/b/c+c(b+/b))=        X+/X=1

= /a(/b/c+c) =      X+/XY=X+Y=

=/a(/b+c)

QED

Otra forma de hallar las formas canónicas.

Dada f(a,b,c)=a+bc

Puedo calcular la primera forma canónica, haciendo el razonamiento “enriqueciendo” los términos.

Usando que X=X1=X(Y+/Y)=XY+X/Y

f=a+bc= ab+a/b + bc=abc+ab/c+a/bc+a/b/c+abc+/abc= tacho repetidos=

= abc+ab/c+a/bc+a/b/c+/abc primera forma canónica.

Yo puedo sacar la tabla, mirando los productos canónicos:

Sabemos que la función es 1 en

111 110 101 100 011

Entonces la función es 0 en:

000 001 010

Con lo cual la segunda forma canónica es

f=(a+b+c)(a+b+/c)(0+/b+c)

Calcular las formas canónicas de g(ab)=a

g(a,b)=a=ab+a/b

Se hace 1 en 11 y 10

Entonces se hace 0 en 00 y 01

g(a,b)=(a+b).(a+/b)

Para ordenarnos… tenemos:

Las funciones, dadas por extensión, se dan por su tabla de verdad. La misma se puede escribir en forma total, como tabla, o con notación sigma o pi.

Las funciones, dadas por comprensión, se dan con una fórmula. La misma puede ser simplificada por aplicación de propiedades, o por Karnaugh, lo cual veremos ahora.

Si me dan la función por comprensión, hago la tabla y la obtengo por extensión.

Si me dan la función por extensión, aplico formas canónicas (o Karnaugh) y la obtengo por comprensión.

Ejercicio

Dada f=sigma(1,3,7) calcular su notación pi, su tabla de verdad, y sus formas canónicas.

f=f(a,b,c)=sigma(1,3,7)=pi(0,2,4,5,6)

f=/a./b.c+/a.b.c+a.b.c=(a+b+c).(a+/b+c).(/a+b+c).(/a+b+/c).(/a+/b+c)

EL METODO DE KARNAUGH

Lo vamos a ver para dimensión 2, 3 y 4, es decir para esos números de variables. PERO es extensible a más variables.

Lo primero que hacemos es identificar el mapa según la cantidad de variables. 2, 3 o 4

Lo segundo que necesitamos es numerar la tabla de verdad.

Permite simplificar funciones de forma “automática”, sin aplicar propiedades.

El método consiste en:

  • Obtener la tabla de verdad
  • Ponerla dentro de un esquema llamado mapa
  • Construir los rectángulos
  • Decodificar los rectángulos

Lo explicaremos a través de ejemplos.

Si bien, es posible razonarlo para más variables, lo trabajaremos en 2,3 y 4 variables.

Para 2 variables.

Ejemplo

Cubrimos los 1s o los 0s (a elección) de modo de lograr rectángulos de largos y anchos que sean potencias de 2.

Los rectángulos deben ser lo más grandes posible.

Desarmamos el rectángulo, se incluyen las variables del rectángulo que NO varían:

Como en este caso, la constante que se cumple en el rectángulo es b=0, entonces ponemos /b

f(a,b)=/b

Si levanto los 1s, obtengo suma de productos, si levanto los 0s, obtengo producto de sumas.

Ejemplo

g(a,b)=pi(0,3)

En el primer rectángulo a y b fijos, a=1 y b=0 entonces es a./b

g(a,b)=a./b + /a.b

En forma dual, levantemos los 0’s:

En 3 variables

Ahora los rectángulos podrán tener largo y ancho 1,2 o 4.

Ejemplo

f=sigma(1,2,5,7)

Ejemplo

g(a,b,c)=sigma(0,1,2,3,4,6)


En 4 variables

Ejemplo

f(a,b,c,d)=pi(0,2,4,6,8,10,12,14)

g(a,b,c,d)=sigma(1,3,5,6,7,8,9,14)

Simplificar por medio del método de Karnaugh la función f=a+ab+abc+abcd

Forma 1

Hacemos la tabla de verdad

abcd   f

0000 0

0001 0

0010 0

0011 0

0100 0

0101 0

0110 0

0111 0

1000 1

1001 1

1010 1

1011 1

1100 1

1101 1

1110 1

1111 1

La ponemos en el mapa

f(a,b,c,d)=a

Además sabíamos que aplicando absorción, eso daba a.

Forma 2

Sin pasar por la tabla de verdad

Tenemos f(a,b,c,d)=a+ab+abc+abcd

Ejemplo

Simplificar

f(a,b,c)= ab+a/b+abc+a/bc+ac+a/c

Ejemplo de Karnaugh

g=sigma(0,2,8,10)

Este es un caso particular.

Práctico de Karnaugh

Ejercicio 1

a)

f=Σ(0,1,2,4)

b)

f=π(1,2,4,7)

c) f=

2)

F=bd+/b/d

b)

3)

4)

Al darme esta expresión, me están dando la forma canónica y de ella saco la tabla.

ii)

/x+/y significa que x=1 e y=1

/w+/x+y significa w=1 x=1 y=0

/w+x+z significa w=1 x=0 z=0

5)

Las X son don’t cares, y pueden valer cualquier cosa, según me convenga.

Los haremos valer 0 o 1 para maximizar el tamaño de los rectángulos.

Esta función cumple lo pedido.

Método de Karnaugh

Permite simplificar funciones de forma “automática”, sin aplicar propiedades.

El método consiste en:

  • Obtener la tabla de verdad
  • Ponerla dentro de un esquema llamado mapa
  • Construir los rectángulos
  • Decodificar los rectángulos

Lo explicaremos a través de ejemplos.

Si bien, es posible razonarlo para más variables, lo trabajaremos en 2,3 y 4 variables.

Para 2 variables.

Ejemplo

Cubrimos los 1s o los 0s (a elección) de modo de lograr rectángulos de largos y anchos que sean potencias de 2.

Desarmamos el rectángulo, se incluyen las variables del rectángulo que NO varían:

Como en este caso, la constante que se cumple en el rectángulo es b=0, entonces ponemos /b

f(a,b)=/b

Si levanto los 1s, obtengo suma de productos, si levanto los 0s, obtengo producto de sumas.

Ejemplo

g(a,b)=pi(0,3)

En el primer rectángulo a y b fijos, a=1 y b=0 entonces es a./b

g(a,b)=a./b + /a.b

En forma dual, levantemos los 0’s:

En 3 variables

Ahora los rectángulos podrán tener largo y ancho 1,2 o 4.

Ejemplo

f=sigma(1,2,5,7)

Ejemplo

g(a,b,c)=sigma(0,1,2,3,4,6)

En 4 variables

Ejemplo

f(a,b,c,d)=pi(0,2,4,6,8,10,12,14)

g(a,b,c,d)=sigma(1,3,5,6,7,8,9,14)

Simplificar por medio del método de Karnaugh la función f=a+ab+abc+abcd

Forma 1

Hacemos la tabla de verdad

abcd   f

0000 0

0001 0

0010 0

0011 0

0100 0

0101 0

0110 0

0111 0

1000 1

1001 1

1010 1

1011 1

1100 1

1101 1

1110 1

1111 1

La ponemos en el mapa

f(a,b,c,d)=a

Además sabíamos que aplicando absorción, eso daba a.

Forma 2

Sin pasar por la tabla de verdad

Tenemos f(a,b,c,d)=a+ab+abc+abcd

Ejemplo

Simplificar

f(a,b,c)= ab+a/b+abc+a/bc+ac+a/c

Un ejemplo de implementación del Algebra de Boole en lenguaje funcional HASKELL

-- Definición del tipo de dato Álgebra de Boole
data BoolAlgebra = False_ | True_ deriving (Show, Eq)

-- Función de suma lógica (OR)
or' :: BoolAlgebra -> BoolAlgebra -> BoolAlgebra
or' False_ False_ = False_
or' _ _ = True_

-- Función de producto lógico (AND)
and' :: BoolAlgebra -> BoolAlgebra -> BoolAlgebra
and' True_ True_ = True_
and' _ _ = False_

-- Función de negación lógica (NOT)
not' :: BoolAlgebra -> BoolAlgebra
not' True_ = False_
not' False_ = True_

-- Función de disyunción exclusiva (XOR)
xor' :: BoolAlgebra -> BoolAlgebra -> BoolAlgebra
xor' True_ False_ = True_
xor' False_ True_ = True_
xor' _ _ = False_

-- Función de NOR
nor :: BoolAlgebra -> BoolAlgebra -> BoolAlgebra
nor a b = not' $ or' a b

-- Función de NAND
nand :: BoolAlgebra -> BoolAlgebra -> BoolAlgebra
nand a b = not' $ and' a b

-- Función de implicación
implies :: BoolAlgebra -> BoolAlgebra -> BoolAlgebra
implies a b = or' (not' a) b

-- Función de equivalencia
equiv :: BoolAlgebra -> BoolAlgebra -> BoolAlgebra
equiv a b = not' $ xor' a b

-- Función para dibujar una tabla de verdad
truthTable :: (BoolAlgebra -> BoolAlgebra -> BoolAlgebra) -> IO ()
truthTable op = do
putStrLn "Tabla de Verdad:"
putStrLn "----------------"
putStrLn "A B Resultado"
putStrLn "----------------"
mapM_ putStrLn [show a ++ " " ++ show b ++ " " ++ show (op a b) | a <- [False_, True_], b <- [False_, True_]]
putStrLn "----------------"

-- Función principal para probar las operaciones
main :: IO ()
main = do
putStrLn "Operaciones lógicas básicas:"
putStrLn $ "OR: " ++ show (or' True_ False_) -- Debería imprimir True_
putStrLn $ "AND: " ++ show (and' True_ False_) -- Debería imprimir False_
putStrLn $ "NOT: " ++ show (not' True_) -- Debería imprimir False_
putStrLn $ "XOR: " ++ show (xor' True_ False_) -- Debería imprimir True_

putStrLn "\nOperaciones lógicas extendidas:"
putStrLn $ "NOR: " ++ show (nor True_ False_) -- Debería imprimir False_
putStrLn $ "NAND: " ++ show (nand True_ False_) -- Debería imprimir True_
putStrLn $ "Implicación: " ++ show (implies True_ False_) -- Debería imprimir False_
putStrLn $ "Equivalencia: " ++ show (equiv True_ False_) -- Debería imprimir True_

putStrLn "\nTablas de Verdad:"
putStrLn "-----------------"
putStrLn "OR:"
truthTable or'
putStrLn "AND:"
truthTable and'
putStrLn "NOR:"
truthTable nor
putStrLn "NAND:"
truthTable nand
putStrLn "Implicación:"
truthTable implies
putStrLn "Equivalencia:"
truthTable equiv

Un código Haskell para el método de Karnaugh

-- Representación de un mapa de Karnaugh
type KMap = [[Bool]]

-- Función para simplificar una expresión booleana utilizando el método de Karnaugh
simplifyKMap :: KMap -> String
simplifyKMap kmap = "Expresión simplificada utilizando Karnaugh: " ++ show kmap -- Implementación pendiente

-- Función para dibujar un mapa de Karnaugh
drawKMap :: KMap -> String
drawKMap kmap = unlines $ map (concatMap (\b -> if b then "1" else "0")) kmap

-- Ejemplo de uso
main :: IO ()
main = do
putStrLn "Ejemplo de Simplificación con Mapa de Karnaugh:"
let exampleKMap = [
[False, True, True, False],
[False, True, True, False],
[False, False, False, False],
[False, True, True, False]
]
putStrLn "Mapa de Karnaugh:"
putStrLn (drawKMap exampleKMap)
putStrLn $ simplifyKMap exampleKMap

Aplicándolo a un ejemplo concreto

Supongamos que tenemos la siguiente función booleana:

F(A, B, C, D) = Σ(0, 1, 3, 5, 7, 8, 9, 10, 11, 15)

Queremos simplificar esta función utilizando el método de Karnaugh.

Primero, creamos un mapa de Karnaugh con las entradas apropiadas, donde las entradas son las combinaciones de valores de verdad para las variables A, B, C y D:

AB\CD 00 01 11 10
00 | 1 | 1 | 0 | 0
01 | 1 | 0 | 0 | 1
11 | 0 | 0 | 1 | 1
10 | 1 | 0 | 0 | 0

Cada celda del mapa de Karnaugh representa el valor de verdad de la función booleana en una combinación particular de valores de entrada. Las celdas activas (donde la función booleana es verdadera) están marcadas con 1, y las celdas inactivas (donde la función booleana es falsa) están marcadas con 0.

Luego, pasamos este mapa de Karnaugh a nuestra función simplifyKMap. Aunque la función simplifyKMap actualmente simplemente devuelve el mapa de Karnaugh original, en una implementación completa, esta función simplificaría el mapa de Karnaugh para encontrar la expresión booleana más simple que es equivalente a la función original.

Ahora, veamos cómo se implementaría esto en Haskell:


module Main where
-- Representación de un mapa de Karnaugh
type KMap = [[Bool]]
-- Función para simplificar una expresión booleana utilizando el método de Karnaugh
simplifyKMap :: KMap -> String
simplifyKMap kmap = "Expresión simplificada utilizando Karnaugh: " ++ show kmap -- Implementación pendiente
-- Función para dibujar un mapa de Karnaugh
drawKMap :: KMap -> String
drawKMap kmap = unlines $ map (concatMap (\b -> if b then "1" else "0")) kmap
-- Ejemplo de uso
main :: IO ()
main = do
putStrLn "Ejemplo de Simplificación con Mapa de Karnaugh:"
let exampleKMap = [
[True, True, False, False],
[True, False, False, True],
[False, False, True, True],
[True, False, False, False]
]
putStrLn "Mapa de Karnaugh:"
putStrLn (drawKMap exampleKMap)
putStrLn $ simplifyKMap exampleKMap


 

No hay comentarios:

Publicar un comentario

Arquitectura de Sistemas (Microprocesadores I)

  Arquitectura de Sistemas (Microprocesadores I) Ing. Angel Caffa, MSc. MBA angelcaffa@gmail.com Teoría de Arquitectura de Sistemas  © 2026 ...