Avoiding state enumeration in dynamic checking of distributed programs