Last active
February 4, 2022 07:26
-
-
Save Kakusakov/bae9c156a60db7fa81b1048a5ae71298 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def simplifyExpr(target): | |
out = "" # output | |
brac = {} # dictionary matching ending positions of brackets to starting positions | |
bracStac = [] # stack containing positions of unclosed brackets | |
index = 0 # current position in target | |
outIndex = 0 # current position in out | |
skip = 0 # used to skip this many characters | |
for c in target: | |
app = '' | |
if(skip > 0): | |
skip -= 1 | |
elif(c == ' '): | |
pass | |
elif( | |
c == 'x' | |
or c == 'y' | |
or c == 'z' | |
or c == 'w' | |
): | |
app = '(' + c + ') ' | |
brac[outIndex + 2] = outIndex | |
elif(c == '('): | |
bracStac.append(outIndex) | |
app = c + ' ' | |
elif(c == ')'): | |
brac[outIndex] = bracStac.pop(-1) | |
app = c + ' ' | |
elif(c == '+'): | |
app = "or " | |
elif(c == '*'): | |
app = "and " | |
elif(c == '-'): | |
app = "not " | |
elif(c == '<' and target[index + 1] == '='): | |
skip += 1 | |
#out.append("<=") # dont use unless brave or stupid | |
if(out[outIndex - 2] == ')'): | |
sbrIndex = brac[outIndex - 2] | |
if(sbrIndex > 0): | |
out = out[:sbrIndex] + "not" + out[sbrIndex:] | |
else: | |
out = "not" + out | |
app = "or " | |
outIndex += 3 | |
else: | |
print("\nError in simplifyExpr(): implication failed\n") | |
print("index: ", index, "\nindexShift: ", outIndex, "\n") | |
raise | |
elif(c == '='): | |
if(target[index + 1] == '='): skip += 1 | |
app = "== " | |
else: | |
print("\nError in simplifyExpr(): unknown symbol\n") | |
print("c: \'", c, "\'\nindex: ", index, "\n") | |
raise | |
index += 1 | |
outIndex += len(app) | |
out = out + app | |
return out | |
def prExpr(varAmount, expr): | |
maxAmount = 4 # specify to set cap for varAmount | |
varNames = ['x', 'y', 'z', 'w'] | |
if(varAmount > maxAmount): | |
print("Error in prExpr(): varAmount exciedes limit\n") | |
print("limit: ", maxAmount, "\nvarAmount: ", varAmount) | |
raise | |
varValues = [0] * varAmount | |
glob = {} | |
for i in range(varAmount): | |
print(varNames[i], ' ') | |
for t in range(2 ** varAmount): | |
for i in range(varAmount): | |
glob[varNames[i]] = varValues[i] | |
print("\n") | |
for i in range(varAmount): | |
print(varValues[i], ' ') | |
try: | |
print(bool(eval(expr, glob))) | |
except SyntaxError: | |
print("Error in prExpr(): eval() can't read target\n") | |
print("expr: \"", expr, "\"\n") | |
print("glob: ", glob, "\n") | |
raise | |
for i in range(varAmount): | |
if(varValues[i] == 1): varValues[i] = 0 | |
else: | |
varValues[i] = 1 | |
break | |
prExpr(3 , simplifyExpr(' x +( y <= z )')) # test |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
def br(ch):
ch = ch.lower()
global x
if(ch == 'q'): return bool(37<=x<=37)
elif(ch == 'p'): return bool(17<=x<=54)
else: print(" error in br(): ch is of unknown value")
def simplifyExpr(target):
out = "" # output
brac = {} # dictionary matching ending positions of brackets to starting positions
bracStac = [] # stack containing positions of unclosed brackets
index = 0 # current position in target
outIndex = 0 # current position in out
skip = 0 # used to skip this many characters
for c in target:
app = ''
chOrd = -1
isASCII = all(ord(s) < 128 for s in c)
if(isASCII): chOrd = ord(c)
if (skip > 0):
skip -= 1
elif (c == ' '):
pass
elif (
isASCII
and ((41 <= chOrd <= 90)
or (67 <= chOrd <= 122))
#c == 'x'
#or c == 'y'
#or c == 'z'
#or c == 'w'
):
app = '(' + c + ') '
brac[outIndex + 2] = outIndex
elif (c == '('):
bracStac.append(outIndex)
app = c + ' '
elif (c == ')'):
brac[outIndex] = bracStac.pop(-1)
app = c + ' '
elif (
c == '+'
or c == '∨'
):
app = "or "
elif (c == '*'
or c == '∧'
):
app = "and "
elif (
c == '-'
or c == '¬'
):
app = "not"
elif (
(c == '<' and target[index + 1] == '=')
or c == '→'
):
if(c == '<' and target[index + 1] == '='): skip += 1
# out.append("<=") # dont use unless brave or stupid
if (out[outIndex - 2] == ')'):
sbrIndex = brac[outIndex - 2]
'''if (sbrIndex > 0):
out = out[:sbrIndex] + "not" + out[sbrIndex:]
if(out[sbrIndex - 1] == 't'):
else:
def prExpr(varAmount, expr):
maxAmount = 4 # specify to set cap for varAmount
varNames = ['x', 'y', 'z', 'w']
def evBruteIneq(expr):
res = ""
for A in range(100):
Skip = False
for m in range(100):
for n in range(100):
glob = {
'A':A, 'm':m, 'n':n
}
try:
if (not(bool(eval(expr, glob)))):
Skip = True
break
except SyntaxError:
print("Error in evBruteIneq(): eval() can't read target\n")
print("expr: "", expr, ""\n")
print("glob: ", glob, "\n")
raise
if (Skip): break
if (not Skip):
res = str(A)
break
if(len(res) != 0): return res
else: return "evBruteIneq() failed"
tst = simplifyExpr("(¬ R → y) → (x → z)")
print(tst) # test
#evBruteIneq("(3m + 4n > 66) and (m <= A) and (n < A)")