what is pattern generalisation and abstraction in computational thinking