changeset 223:092189a2b2df

proof_burden: made it a stand-alone program
author Sigurd Meldgaard <stm@daimi.au.dk>
date Wed, 23 Dec 2009 14:41:29 +0100
parents 83996d1a8c4d
children f6a900294f62
files pysmcl/proof_burden.py
diffstat 1 files changed, 32 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/pysmcl/proof_burden.py	Wed Dec 23 14:40:26 2009 +0100
+++ b/pysmcl/proof_burden.py	Wed Dec 23 14:41:29 2009 +0100
@@ -17,36 +17,49 @@
         self.results = []
 
     def visit_While(self, node):
-        print "Prove the invariant is true in the initial case"
-        FindInvariant().visit(node)
-        print "Prove the invariant still holds given:"
-        FindInvariant().visit(node)
-        print "And", pysmcl.pretty_print.expr_string(node.test)
-        print "And this code is run:"
-        pysmcl.pretty_print.pprint(node)
         self.generic_visit(node)
 
     def visit_Call(self, node):
         if isinstance(node.func, ast.Name):
-            if node.func.id == "open":
-                self.openings.append(pysmcl.pretty_print.expr_string(node.args[0]))
+            if node.func.id == "output":
+                self.openings.append(node.args[0])
             if node.func.id == "result":
-                self.results.append(pysmcl.pretty_print.expr_string(node.args[0]))
+                self.results.append(node.args[0])
             elif node.func.id == "precondition":
-                print "You can assume: " + (node.args[0].s)
+                print "  You can assume: " + (node.args[0].s)
             elif node.func.id == "invariant":
-                print "Invariant"
+                print " Invariant"
                 print (node.args[0].s)
 
 
 def proof_burden(f):
     b = ProofBurden()
+    print "For the function: " + f.name
     b.visit(f)
-    print ("Show that you can compute:")
-    for i in b.openings:
-        print i
-    print ("From:")
-    for i in b.results:
-        print i
+    if b.openings!=[]:
+        print (" Show that you can compute:")
+        for i in b.openings:
+            print("  The value of " + pysmcl.pretty_print.expr_string(i)
+                  + " in line " + str(i.lineno))
+        print (" From:")
+        for i in b.results:
+            print("  The value of " + pysmcl.pretty_print.expr_string(i)
+                  + " in line " + str(i.lineno))
+    else:
+        print " Nothing has to be proved"
+    return f
 
-    return f
+def main():
+    from optparse import OptionParser
+    parser = OptionParser(usage="Usage: %prog [options] pysmcl_program")
+    (options, args) = parser.parse_args()
+    if len(args) < 1:
+        parser.error("Not enough arguments")
+    module = ast.parse(file(args[0]).read())
+    for i in module.body:
+        if isinstance(i, ast.FunctionDef):
+            proof_burden(i)
+
+    
+if __name__ == "__main__":
+    main()