obj T1 = integer and real and string and boolean; obj T2 = integer and real and string and boolean; obj T3 = T1 and T2; obj T4 = integer or string; obj T5 = string or integer; obj T6 = string or boolean or integer; op Foo (t1:T1, t2:T2) = t1 = t2; (* These should be checked, but as of 22oct99 I don't think checking of tuple aggregates is done yet. 17jun09 update: they appear to work now. *) val T:T3 = { {1, 2.5, "xyz", true}, {2, 3.5, "abc", false} }; val T':T3 = [ {1, 2.5, "xyz", true}, {2, 3.5, "abc", false} ]; (* ERROR *) op FooOr(t4:T4, t5:T5) -> boolean = ( t4 = t5; t4 = 10; t4 = "abc"; t4 = false; (* ERROR (since bool is not an alternative of T4) *) );