def distance(x, y) :
    """calculates the distance between two points"""
    """{ pre  x != y
         post d > 0
         return d      
    }"""
    #PREMISES FOR NEXT LINE: 
    # (x != y)
    if  x > y :
        #PREMISES FOR THEN-ARM: 
        # (x > y)
        # (x != y)
        d = x - y
        #PREMISES FOR ATTACHED PROOF, IF ANY: 
        # (d == (x - y))
        # (x > y)
        # (x != y)
        """{ 1.OK x > y      premise
             2.OK d == x - y  premise
             3.OK d > 0      algebra 1 2
        }"""
        #PREMISES FOR NEXT LINE: 
        # (d > 0)
    else :
        #PREMISES FOR ELSE-ARM: 
        # not (x > y)
        # (x != y)
        d = y - x
        #PREMISES FOR ATTACHED PROOF, IF ANY: 
        # (d == (y - x))
        # not (x > y)
        # (x != y)
        """{ 1.OK not(x > y)      premise
             2.OK d == y - x      premise
             3.OK x != y          premise   # from the precondition!
             4.OK d > 0           algebra 1 2 3
        }"""
        #PREMISES FOR NEXT LINE: 
        # (d > 0)
    #PREMISES FOR NEXT LINE: 
    # (d > 0)
    # (x != y)
    # IF ends here
    """{ 1.OK  d > 0     premise   }"""
    #PREMISES FOR NEXT LINE: 
    # (d > 0)
    # POSTCONDITION AND ALL GLOBAL INVARIANTS VERIFIED AT POINT OF RETURN
    return d
    #PREMISES FOR NEXT LINE: 
    # (d > 0)
    # POSTCONDITION AND ALL GLOBAL INVARIANTS VERIFIED AT END OF FUNCTION
#PREMISES FOR NEXT LINE: 
    
    
# We can call the function as needed:
"""{ 1.OK  3 != 5    algebra   }"""
#PREMISES FOR NEXT LINE: 
# (3 != 5)
a = distance(3, 5)
#PREMISES FOR ATTACHED PROOF, IF ANY: 
# (a > 0)
# (3 != 5)
"""{ 1.OK  a > 0     premise  }"""
#PREMISES FOR NEXT LINE: 
# (a > 0)