# simple example that shows how a function can reference a global var

pi = 3  # sorry --- the checker handles ints only  )-:
#PREMISES FOR ATTACHED PROOF, IF ANY: 
# (pi == 3)
#PREMISES FOR NEXT LINE: 
# (pi == 3)

# a read-only global variable acts like an extra parameter:
def circ(diameter) :
    """{ pre  diameter >= 0  and  pi >= 3
         post  answer == pi * diameter  
         return answer
    }"""
    #PREMISES FOR NEXT LINE: 
    # ((diameter >= 0) and (pi >= 3))
    answer = pi * diameter
    #PREMISES FOR ATTACHED PROOF, IF ANY: 
    # (answer == (pi * diameter))
    # ((diameter >= 0) and (pi >= 3))
    #PREMISES FOR NEXT LINE: 
    # (answer == (pi * diameter))
    # ((diameter >= 0) and (pi >= 3))
    # POSTCONDITION AND ALL GLOBAL INVARIANTS VERIFIED AT POINT OF RETURN
    return answer
    #PREMISES FOR NEXT LINE: 
    # (answer == (pi * diameter))
    # ((diameter >= 0) and (pi >= 3))
    # POSTCONDITION AND ALL GLOBAL INVARIANTS VERIFIED AT END OF FUNCTION
#PREMISES FOR NEXT LINE: 
# (pi == 3)


"""{ 1.OK pi == 3   premise 
     2.OK pi >= 3   algebra 1
}"""
#PREMISES FOR NEXT LINE: 
# (pi >= 3)
# the checker will use  p >= 3  plus its knowledge that  2 >= 0 to
#   validate that the precondition holds true for the upcoming call to  circ:
x = circ(2)
#PREMISES FOR ATTACHED PROOF, IF ANY: 
# (x == (pi * 2))
# (pi >= 3)
"""{ 1.OK  x == pi * 2   premise }"""   # we gain the postcondition as new knowledge
#PREMISES FOR NEXT LINE: 
# (x == (pi * 2))