diff --git a/o-CNFpolymer/izda.py b/o-CNFpolymer/izda.py new file mode 100644 index 0000000000000000000000000000000000000000..fd6a4c60582a90568307503216524ead87f73723 --- /dev/null +++ b/o-CNFpolymer/izda.py @@ -0,0 +1,90 @@ +TABPOS=['a','A','b','B','c','C'] + +def invert(val): + assert val=='0' or val=='1' + return '1' if val=='0' else '0' + +def valueOf(var, assignment): + """ returns the value of a variable according to an assignment """ + pos= TABPOS.index(var) + val= assignment[pos//2] + if (pos%2==0): + return val + else: + return invert(val) + + +def ORop(valA, valB): + """ OR operator """ + assert valA=='0' or valA=='1' + assert valB=='0' or valB=='1' + return '0' if valA=='0' and valB=='0' else '1' + +def OR3op(valA, valB, valC): + """ OR operator """ + assert valA=='0' or valA=='1' + assert valB=='0' or valB=='1' + assert valC=='0' or valC=='1' + return '0' if valA=='0' and valB=='0' and valC=='0' else '1' + +def parseOR2(operation, assignment): + """ parsing x v y """ + assert operation[2]=="v" and len(operation)==5, print("oulala2:[%s]"%operation) + argA, argB= operation[0], operation[4] + valA=valueOf(argA,assignment) + valB=valueOf(argB,assignment) + return ORop(valA,valB) + +def parseOR3(operation, assignment): + """ parsing x v y v z""" + assert operation[2]=="v" and operation[6]=="v" and len(operation)==9, print("oulala3:[%s]"%operation) + argA, argB, argC= operation[0], operation[4],operation[8] + valA=valueOf(argA,assignment) + valB=valueOf(argB,assignment) + valC=valueOf(argC,assignment) + return OR3op(valA,valB,valC) + + + +def evaluate(operation,assignment): + arity=1+operation.count('v') + assert arity==2 or arity==3, print("oulala:"+operation) + if arity==2: + val=parseOR2(operation, assignment) + else: + val=parseOR3(operation, assignment) + #print("evaluating %s on assignment:%s >> %s"%(operation,assignment,val)) + return val + + +def assign(a,b,c): + return "%s%s%s"%(a,b,c) + +def scanTab(clause): + transtab="" + for i in range(8): + a,b,c,=i//4,(i//2)%2,i%2 + #print ( "i:%d %d %d %d"%(i,a,b,c) ) + assi=assign(a,b,c) + res= evaluate(clause, assi) + transtab+=res + + W=int(transtab[::-1],2) + print("clause:%s W:%d transtab:%s"%(clause, W, transtab)) + + +listf0=['a v b','b v c','a v c'] +listf1=['A v b','a v B', 'B v c', 'b v C', 'A v c','a v C'] + +listf2=['a v b v c','A v b v c','a v B v c', 'a v b v C', 'A v B v c', 'A v b v C', 'a v B v C', 'A v B v C'] + +def evalFormulae(listFormulae): + print("-"*30) + for form in listFormulae: + scanTab(form) + print("-"*30) + +evalFormulae(listf0) +evalFormulae(listf1) + +evalFormulae(listf2) \ No newline at end of file