JPaniagua13 / Quine-McCluskey1

0 stars 0 forks source link

Crear una función que combina los mintérminos para hallar los primos #16

Open Siuuuuuuu07 opened 2 years ago

Siuuuuuuu07 commented 2 years ago

La función recursiva combina los mintérminos y finalmente halla los primos.

Shiofi commented 2 years ago

Entradas

    - numBits(int): numero de bits de la expresion booleana. Ejemplo: ABC || BC'D -> numBits es 4
    - listaInicial(list): una lista de listas de mintérminos. 
    Ejemplo: [[1],[3],[4],[5],[7],[9],[10],[11],[15]]
    - listaPrimos(list): aquí almacena los implicantes primos que encuentra. Comienza vacía
    Ejemplo: []

Salidas

    - (list) la lista de implicantes primos. 
    Ejemplo: [[4, 5], [10, 11], [1, 3, 5, 7], [1, 3, 9, 11], [3, 7, 11, 15]]

Código


def hallarPrimos( numBits, listaInicial, listaPrimos, primerCorrida):
    paresAgrupados = list()
    implicantesUtilizados = list()
    huboCombinacion = False

    for i in range(0, len(listaInicial)):
        if len(listaInicial[i]) == 0: # si la lista esta vacía no tiene que comparar
            pass
        else:
            for j in range(0, len(listaInicial)):
                if len(listaInicial[j]) == 0: # si la lista esta vacía no tiene que comparar
                    pass
                else:
                    # la comparación 'j > i' compara dos elementos una sola vez. 
                    # 'primerCorrida = True' porque la primera combinacion es diferente del resto
                    if j > i and primerCorrida == True:
                        if difierenUnaCifra(numBits, combinarMinTerDecBin(numBits, listaInicial[i][0]),
                            combinarMinTerDecBin(numBits, listaInicial[j][0])) == True:
                            paresAgrupados.append([listaInicial[i][0], listaInicial[j][0]])
                            huboCombinacion = True
                            if implicantesUtilizados.count(listaInicial[i]) == 0:

                                implicantesUtilizados.append(listaInicial[i])
                            if implicantesUtilizados.count(listaInicial[j]) == 0:
                                implicantesUtilizados.append(listaInicial[j])                                

                    elif j > i:
                        if difierenUnaCifra(numBits, combinarMin(numBits, listaInicial[i]),
                            combinarMin(numBits, listaInicial[j])) == True:
                            paresAgrupados.append(listaInicial[i] + listaInicial[j])
                            huboCombinacion = True

                            if implicantesUtilizados.count(listaInicial[i]) == 0:
                                implicantesUtilizados.append(listaInicial[i])
                            if implicantesUtilizados.count(listaInicial[j]) == 0:
                                implicantesUtilizados.append(listaInicial[j])   

    for k in listaInicial:
        if implicantesUtilizados.count(k) == 0:
            if primerCorrida == False and implicanteRepetido(numBits, k ,listaPrimos) == False:
                listaPrimos.append(k)
            if primerCorrida == True:
                listaPrimos.append(k)

    if huboCombinacion == False: #No hubo combinaciones, no repita más
        return listaPrimos

    else:
        primerCorrida = False

        #Con los elementos que mezclo vuelva a hacer el mismo procedimiento hasta que no se puedan mezclar más
        return hallarPrimos(numBits, paresAgrupados, listaPrimos, primerCorrida)