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]
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))
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))