Re: How to use de morgan and other laws to reduce expression - Mux
The normal way to reduce expressions like this is with Karnaugh maps, which are just a visual way to identify certain Boolean algebraic simplification.
The primary one is
X·Y + X·Y' = X·(Y+Y') = X·1 = X
Using that identity, you should be able to reduce your logic to 1 NOT, 2 AND, and 1 OR.
For Nand2Tetris, this is perfectly fine.
But if you are trying to really understand logic minimization, then the following might be of interest to you.
While this NOT/AND/OR implementation might appear to be very simple, in fact it isn't as simple as it could be. The reason is that AND and OR gates (in CMOS) have more transistors and longer propagation delays than NAND and NOR gates. The "simplified" circuit has 20 transistors and 5 gate delays. It can be converted to 1 NOT and 3 NAND gates which only needs 14 transistors and 3 gate delays. A "gate delay" is the propagation delay through a NOT gate.
Even this can be improved upon with a direct transistor-level CMOS implementation that can get it down to either 14 transistors with 2 gate delays or 12 transistors with 3 gate delays. A transmission-gate implementation can do it with only 6 transistors and two gate delays, but introduces signal coupling between input and output, which is often not desirable and at the very least complicates circuit verification.