Hacked reduction.
authorEugen Sawin <sawine@me73.com>
Tue, 17 May 2011 03:38:02 +0200
changeset 7cafa7d4b888d
parent 6 3d2eea446705
child 8 09cc70d6f115
Hacked reduction.
smm.py
     1.1 --- a/smm.py	Tue May 17 02:19:11 2011 +0200
     1.2 +++ b/smm.py	Tue May 17 03:38:02 2011 +0200
     1.3 @@ -8,6 +8,41 @@
     1.4  import re
     1.5  import token
     1.6  
     1.7 +def main():
     1.8 +    args = parse_arguments()
     1.9 +    scanner = Scanner(TOKENS)
    1.10 +    parser = Parser(SYNTAX, scanner)
    1.11 +    #(accepted, out, tree_nodes) = parser.parse(args.formula)
    1.12 +    #tree = SyntaxTree(out, tree_nodes)
    1.13 +    #print tree.root
    1.14 +    p = Variable(["p"])
    1.15 +    q = Variable(["q"])
    1.16 +    r = Variable(["r"])
    1.17 +    formula = Imp([Eq([p, q]), r])
    1.18 +    formula = Not([Or([p, q])])
    1.19 +    formula = Not([Not([p])])
    1.20 +    print formula
    1.21 +    print "reduced"
    1.22 +    print reduce(formula)
    1.23 +
    1.24 +
    1.25 +def reduce(formula):
    1.26 +    print formula   
    1.27 +    map = {IMP: lambda (a, b): Or([Not([a]), b]),
    1.28 +           EQ: lambda (a, b): And([Or([Not([a]), b]), Or([a, Not([b])])]),
    1.29 +           NOT: lambda (a,): isinstance(a, Operator) and a.__class__([Not([v]) for v in a.values] or Not([a])),
    1.30 +           AND: lambda (a, b): And([a, b]), 
    1.31 +           OR: lambda (a, b): Or([a, b]),
    1.32 +           VARIABLE: lambda (v,): v}
    1.33 +    def values():
    1.34 +        return [reduce(v) for v in formula.values] 
    1.35 +
    1.36 +    if not isinstance(formula, Operator) or formula.id not in map:
    1.37 +        return formula
    1.38 +    return map[formula.id](values())    
    1.39 +  
    1.40 +
    1.41 +
    1.42  NOT = "~"
    1.43  AND = "&"
    1.44  OR = "|"
    1.45 @@ -276,15 +311,6 @@
    1.46                      table.append(node)
    1.47                      unfinished.pop()            
    1.48          return table[0]
    1.49 -        
    1.50 -
    1.51 -def main():
    1.52 -    args = parse_arguments()
    1.53 -    scanner = Scanner(TOKENS)
    1.54 -    parser = Parser(SYNTAX, scanner)
    1.55 -    (accepted, out, tree_nodes) = parser.parse(args.formula)
    1.56 -    tree = SyntaxTree(out, tree_nodes)
    1.57 -    #print tree.root
    1.58  
    1.59  from argparse import ArgumentParser
    1.60