Most programs get used in just one direction, from input to output. But sometimes, having computed an output, we need to be able to
this output and then “calculate backwards” to find a correspondingly updated input. The problem of writing such
–arises in applications across a multitude of domains and has been attacked from many perspectives [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, etc.]. See  for a detailed survey.