destructive substitution instead of sharing constraints for IO