use FiniteSet and move more canonicalization to __init__