Learning Data Structure Behaviour from Executions of Pointer ProgramsFoundations of Heterogeneous Specifications Using State Machines and Temporal Logic