Skip to content

Instantly share code, notes, and snippets.

@simonesestito
Last active November 4, 2020 15:25
Show Gist options
  • Save simonesestito/f4de93a341d851c97b5c0db2a3683c6c to your computer and use it in GitHub Desktop.
Save simonesestito/f4de93a341d851c97b5c0db2a3683c6c to your computer and use it in GitHub Desktop.
Calcolo combinatorio: tabella verità, SOP e POS

Tabella della verità, forma SOP canonica e POS canonica

Come si usa

  • Scaricare i file lib.py e src.py
  • Nel file src.py, scrivere l'espressione nella lambda.

Per scrivere l'espressione, usare i simboli:

  • NOT: ~ (non !)
  • OR: | (non || o +)
  • AND: & (non &&)
  • XOR: ^

Dentro lib.py, ci sono le funzioni nand() e nor() implementate.

Si possono cambiare le variabili (sia il nome delle variabili che il loro numero)

Esempi

a XOR b XOR c

a XOR b XOR c


x AND y

x AND y

def _calc_func(argc, func):
res = []
for i in range(2 ** argc):
args = [ i >> n & 1 for n in range(argc) ]
argres = 1 if func(*args) & 1 else 0
res.append((args, argres))
return res
def _print_func(argc, argv, res):
endcol = 'out'
sxcols = argc * 2 + 1
dxcols = len(endcol) + 2
sxsep = chr(9472) * sxcols
dxsep = chr(9472) * dxcols
# ┌───────┬─────┐
print(chr(9484), end='')
print(sxsep, end='')
print(chr(9516), end='')
print(dxsep, end='')
print(chr(9488))
# │ a b c │ out │
print(chr(9474), end=' ')
for arg in argv: print(arg, end=' ')
print(chr(9474), end=' ')
print(endcol, end=' ')
print(chr(9474))
for n, (args, out) in enumerate(res):
if n % 4 == 0:
# ├───────┼─────┤
print(chr(9500), end='')
print(sxsep, end='')
print(chr(9532), end='')
print(dxsep, end='')
print(chr(9508))
# │ 0 1 0 │ 1 │
print(chr(9474), end=' ')
for arg in args: print(arg, end=' ')
print(chr(9474), end=' ')
print(' ' + str(out) + ' ', end=' ')
print(chr(9474))
# └───────┴─────┘
print(chr(9492), end='')
print(sxsep, end='')
print(chr(9524), end='')
print(dxsep, end='')
print(chr(9496))
def _sop(argv, res):
ones = [ args for args, val in res if val ]
return ' + '.join([ ''.join([
argv[i] if one_v
else argv[i] + '\u0305'
for i, one_v in enumerate(one)
]) for one in ones ])
def _pos(argv, res):
zeros = [ args for args, val in res if not val ]
zero_expr = [ '+'.join([
argv[i] if not zero_v
else argv[i] + '\u0305'
for i, zero_v in enumerate(zero)
]) for zero in zeros ]
return '(' + ') ('.join(zero_expr) + ')'
def test(func):
argc = func.__code__.co_argcount
argv = func.__code__.co_varnames
argv = [ x[0] for x in argv ] # Cut
res = _calc_func(argc, func)
_print_func(argc, argv, res)
print('SOP:', _sop(argv, res))
print('POS:', _pos(argv, res))
def nand(a, b):
return ~(a & b) & 1
def nor(a, b):
return ~(a & b) & 1
from lib import test, nand
# --- ESEMPI ---
# a XOR b XOR c
test(lambda a,b,c: a^b^c)
# x AND y
test(lambda x,y: x & y)
# a NAND b OR c
test(lambda a,b: nand(a, b) | c)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment