RingIndex(I, J): trait 
  introduces  
     first:             -> I
     left, right: I     -> I
     name:        I     -> J
     inbetween: I, I, I -> Bool
  asserts with i, j, k: I
    sort I generated by first, right;
    \E i (right(i) = first);
    right(i) = right(j) <=> i = j;
    left(right(i)) = i;
    name(i) = name(j) <=> i = j;
%inbetween(i,j,k) holds when j occurs on the shortest path from i to k
    inbetween(i,j,j);
    (inbetween(i,j,k) /\ right(k) ~= i) => inbetween(i,j,right(k));
    (inbetween(i,j,k) /\ i ~= j /\ j ~= k ) => ~ inbetween(k,j,i)
