Situation calculus: how to find pre-conditions in 15-puzzle game?

I have been working on finding the preconditions for a situation calculus example for some time now. This example is called the game "15-puzzle" where you can find a discription here https://en.wikipedia.org/wiki/15_puzzle.

The following fluents are given for this game:

at(x,y,z,s) // which means: there is a tile z at position x,y. free(x,y,s) // which means: position x,y is free. 

And now I have to find the preconditions for the following actions (movements):

move_up() move_down() move_left() move_right() 

I have tried really cumbersome solutions where I am sure that they are not correct. I would be very grateful if someone has the right approach for me!