limit backtracking; add list and union types