pub open spec fn exchanges_nondeterministic<K, V, P: Protocol<K, V>>(
    p1: P,
    s1: Map<K, V>,
    new_values: Set<(P, Map<K, V>)>
) -> bool
Expand description
{
    forall |q: P, t1: Map<K, V>| {
        P::rel(P::op(p1, q), t1)
            ==> exists |p2: P, s2: Map<K, V>, t2: Map<K, V>| {
                new_values.contains((p2, s2)) && P::rel(P::op(p2, q), t2)
                    && t1.dom().disjoint(s1.dom()) && t2.dom().disjoint(s2.dom())
                    && t1.union_prefer_right(s1) =~= t2.union_prefer_right(s2)
            }
    }
}