Optimize the argument of not

Optimize the argument of a “not” in a Boolean context. Also, recognize some constructors to eliminate them from the “not” argument. 

(not (if x y 1)) => (not (if x y #t))
(not (list x (random) z)) => (begin (random) #f))

--
But this still doesn’t work: (not (if x y (list 1 2))) => (not (if x y #t))