Пример #1
0
def prepareStatement(izjava):
    # Metoda sprejme izjavo in jo pripravi takole:
    #   - izjavo pretvori v CNF obliko
    #   - izjavo pretvori v seznam seznamov oblike [ ... [ ... ] ...]
    #   - odstrani vse proste spremenljivke
    #   - preveri, da se ne zgodi primer (X and notX)
    #   - pobrise vse True izjave oblike (X or notX)
    #   - najde vse proste spremenljivke
    # Metoda vrne seznam, v katerem je izjava in vrednosti spremenljivk
    # Ce je primer na osnovi zgornjih ugotovitev neresljiv, potem metoda vrne False

    # poresetiram prejsno resitev
    global solutionVals
    global lockSolutionVals
    global newPureValFound
    solutionVals = {}
    lockSolutionVals = False
    newPureValFound = True

    izjava = CNF(izjava)                                    # pretvori izjavo v CNF
    izjava = izjava.poenostavi().vrni()                     # dobim [ ... (...) ...]
    izjava = get_2D_list(izjava)                            # dobim [ ... [...] ...]
    varValues = {}                                          # Zacetne vrednosti spremenljivk
    izjava = removeTrueSantences(izjava)                   # metoda odstrani podizjave tipa (X or notX) .... TODO: ali to pravilno deluje?
    izjava = sortByLength(izjava)
    
    # PREVERJAMO PROSTE SPREMENLJIVKE, DOKLER JE KAKsNA SE PROSTA!!
    while (True):
        changes = 0                                             # stevec za ustavitveni pogoj
        newVarDict = {}
        newVarDict = removeSingleVars(izjava)
        if (newVarDict == False):
            print('ERROR: getInfo[1] == False ..... returning False!!!')
            return False
        else:   
            varValues = concatDicts(varValues, newVarDict)            
            if varValues == False:                              # ce je prislo do protislovja (X and notX) potem ni resitve in vrnemo False
                print('ERROR: varValues == False ..... returning False!!!')
                return False
            izjava = processStatement(izjava, varValues)        # metoda odstrani OR-e, ki so True in spremenljivke znotraj OR-ov, ki so False

        if (newVarDict != {}):
            changes = changes + 1
        if (changes == 0):
            break

    # PREVERIMO CISTE SPREMENLJIVKE
    # Spodnja while zanka pridobiva ciste spremenljivke, poenostavlja izjavo in to ponavalja, dokler je kaksna spremenljivka cista
    while (newPureValFound == True):
        pureVals = getPureVals(izjava)                  # pridobim slovar cistih spremenljivk
        varValues = concatDicts(varValues, pureVals)    # zdruzim obstojece spremenljivke s cistimi

        #preverimo, da nismo prisli do protislovja:
        if varValues == False:
            return False
        izjava = processStatement(izjava, varValues)    # metoda odstrani OR-e, ki so True in spremenljivke znotraj OR-ov, ki so False
    izjava = sortByLength(izjava)                       # sortiranje izjave po dolzini podizjav (narascajoce)

    # vrnemo seznam, ki vsebuje na rekurzijo pripravljeno izjavo in slovar vrednosti spremenljivk (te niso vec zastopane v izjavi)
    return [izjava, varValues]
Пример #2
0
def valuacija():
##    s = [[5,3,0,0,7,0,0,0,0],[6,0,0,1,9,5,0,0,0],[0,9,8,0,0,0,0,6,0],[8,0,0,0,6,0,0,0,3],[4,0,0,8,0,3,0,0,1],[7,0,0,0,2,0,0,0,6],[0,6,0,0,0,0,2,8,0],[0,0,0,4,1,9,0,0,5],[0,0,0,0,8,0,0,7,9]]
##    s_r = [[5,3,4,6,7,8,9,1,2],[6,7,2,1,9,5,3,4,8],[1,9,8,3,4,2,5,6,7],[8,5,9,7,6,1,4,2,3],[4,2,6,8,5,3,7,9,1],[7,1,3,9,2,4,8,5,6],[9,6,1,5,3,7,2,8,4],[2,8,7,4,1,9,6,3,5],[3,4,5,2,8,6,1,7,9]]
    s = [[1,2,0,0],[3,0,1,0],[0,1,0,3],[0,0,2,1]]
    s_r = [[1,2,3,4],[3,4,1,2],[2,1,4,3],[4,3,2,1]]
    sud = sudoku(s)
    sudCNF = CNF(sud)
    sudCNFp = sudCNF.poenostavi()
    spremen = sud.var()
    val = {}
    for x in spremen:
        ime = x.vrni_ime()
        i = int(ime[2])
        j = int(ime[4])
        n = int(ime[6])
        if s_r[i][j]==n:
            val[x]= True
        else:
            val[x]= False
    print(sud.izracun(val))
    print(sudCNF.izracun(val))
    print(sudCNFp.izracun(val))
Пример #3
0
def valuacija():
    #h = [[1,1],[1,-1]]
    h = 2
    had = hadamard(h)
    hadCNF = CNF(had)
    hadCNFp = hadCNF.poenostavi()
    spremen = had.var()
    val = {}
    for x in spremen:
        ime = x.vrni_ime()
        i = int(ime[2])
        j = int(ime[4])
        if len(ime) == 9:
            n = int(ime[6]+ime[7])
        else:
            n = int(ime[6])
        if h[i][j]==n:
            val[x]= True
        else:
            val[x]= False
    print(had.izracun(val))
    print(hadCNF.izracun(val))
    print(hadCNFp.izracun(val))