Foundations of Separation Logic