Temporal Logic of Programs