Thanks for your contributions.
I do not believe it is a good idea to extend function definitions in
inconsistent ways, even if it is sometimes convenient. In particular,
I believe "op" and "union" should give an error for atomic arguments
(as they do now). Painful experience shows that this kind of
extension tends to lead to more obscure bugs.
Also, I don't understand the intent of your "union" function. Not
only is it not set union (e.g. union( [3], [3] ) => [3,3], not [3],
but it has other peculiar behavior:
union( f(), 3 ) => 3
union( 3, f() ) => error
union( [3], f() ) => f(3)
union( [3], f[4] ) => f[3,4]
-s