Slipperiness

Each block in the game has a Slipperiness factor, noted S. Its value is between 0.6 (rough) and 1.0 (frictionless).

By default, a block's slipperiness is set to 0.6. This includes Air, and Soulsand.

In 1.8, the only blocks that have a different slipperiness are:


 * Ice and Packed Ice, S = 0.98
 * Slime Blocks, S = 0.8

In 1.13, another slippery block was added: Blue Ice, with a slipperiness of 0.99, making it the most slippery block in the game.

Relevant Minecraft Wiki articles:


 * Ice
 * Slime
 * Blue Ice

Effect on Movement
When moving, the Player loses some speed in between ticks to simulate drag, and gains some acceleration.

When the Player is on ground, drag and acceleration are calculated as so:


 * This amount of speed conserved on ground is proportional to $$0.91 \times S$$.
 * The acceleration gained on ground is proportional to $$\left ( \frac{0.6}{S} \right )^3$$.

When the Player is airborne, Slipperiness is ignored.

Characterization
Every tick, if on ground, the game checks for the block directly 1b below the Player's position to get S.

This means that non-full blocks take the slipperiness of the block below them.

For example, the surface of a slab above Ice has the same slipperiness as the Ice itself.

Finally, we can explain how Soulsand is affected by slippery blocks:

Soulsand is a non-full block (14px in height), meaning it gets its slipperiness from the block below it.

Let's consider the effects at work:


 * Slippery blocks grant less acceleration.
 * Soulsand cancels speed conservation.

These two effects combined create an net negative impact on the Player's movement, compared to regular Soulsand movement.

Therefore, walking on soulsand with ice below it is noticeably slower.