Yes, that "clear set of logical rules" is called the Rust ownership and lifetime system, and the system that enforces it is called the borrow check. And, having designed a lot of Rust's borrow rules, I'm telling you that the borrow check only works because of the specific rules that Rust enforces: in particular, no more than one mutable pointer to a location. Non-Rust languages don't enforce those rules, so grafting the Rust borrow check onto the language will rule out a lot of idiomatic code. For example, in C++, you would be unable to write shared_ptr<T> for non-const T (this is just one of a mountain of examples), and I'm sure that the situation would be similar in Zig once you start diving into the details.
I'm much more interested in specific details of how to permit mutable aliasing while simultaneously avoiding use-after-free. From what I've seen, the only compelling answer is a garbage collector.