Differences between declarative and imperative programming