まともなプログラミング言語ならばそれら四つの区別がある
例えばC/C++ではこのように対応する

// 変数値は不変で参照先も不変
Rust: let p1: &i32 = ...
C/C++: const int* const p1 = ...

// 変数値は可変で参照先は不変
Rust: let mut p2: &i32 = ...
C/C++: const int* p2 = ...

// 変数値は不変で参照先は可変
Rust: let p3: &mut i32 = ...
C/C++: int* const p3 = ...

// 変数値は可変で参照先も可変
Rust: let mut p4: &mut i32 =...
C/C++: int* p4 = ...

つまり可変な時にmutを付けるか
不変な時にconstを付けるかの些細な違いにすぎない