Those rules check that the player is moving up/down next to the crates, but don’t check that the movement is up/down towards the crates. What you’d want is:
down [ > Player | CrateLeft ] [ > Player | CrateRight ] -> [ > Player | > CrateLeft ] [ > Player | > CrateRight ]
up [ > Player | CrateLeft ] [ > Player | CrateRight ] -> [ > Player | > CrateLeft ] [ > Player | > CrateRight ]
These blocks will break apart when pushed against a corner. If you don’t want that, you might need to cancel movement:
[ > Solid | stationary Solid ] -> [ Solid | Solid ]
right [ stationary CrateLeft | moving CrateRight ] -> [ CrateLeft | CrateRight ]
right [ moving CrateLeft | stationary CrateRight ] -> [ CrateLeft | CrateRight ]
Although once the block reaches a corner, it becomes immovable, since there’s no way to get two players under it. Canceling movement like this also lets you simplify the pushing:
Player, Crate, Wall
===========
RULES
===========
[ > Player | Crate ] -> [ > Player | > Crate ]
[ > Solid | stationary Solid ] -> [ Solid | Solid ]
right [ stationary CrateLeft | moving CrateRight ] -> [ CrateLeft | CrateRight ]
right [ moving CrateLeft | stationary CrateRight ] -> [ CrateLeft | CrateRight ]
===============
WINCONDITIONS
===============
all Target on Crate
=======
LEVELS
=======
PPXX##
##LR..
......
..S...
.X####