obj T1 = integer and real and string and boolean; obj T1n = i:integer and r:real and s:string and b:boolean; obj T1n1 = i:integer and real and string and boolean; obj T1n2 = i:integer and r:real and string and boolean; obj T1n3 = i:integer and r:real and s: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; obj T7 extends T1 = integer and real; obj T8 extends T7 = boolean and string and string; op Foo (t1:T1, t1n:T1n, t1n1:T1n1, t1n2:T1n2, t1n3:T1n3, t2:T2, t3:T3, t7:T7, t8:T8) = ( t1 = t2; t1n = t2; t1n1 = t2; t1n2 = t2; t1n3 = t2; t1 = {1, 2.5, "xyz", true}; t1 = {2.5, 1, "xyz", true}; t1n = {1, 2.5, "xyz", true}; t1n1 = {1, 2.5, "xyz", true}; t3 = { {1, 2.5, "xyz", true}, {2, 3.5, "abc", false} }; t3 = {t1, t2}; t7 = {1, 2.5, "xyz", true, 2, 3.5}; t8 = {1, 2.5, "xyz", true, 2, 3.5, true, "xyz2", "xyz3"}; t1 = {1, 2.5, "xyz", true, 1}; (* ERROR *) t1 = {1, 2.5, "xyz"}; (* ERROR *) t1 = {1, 2.5, true, "xyz"}; (* ERROR *) t3 = { {1, 2.5, "xyz", true}, {2, 3.5, "abc", false}, 1 }; (* ERROR *) t3 = { {1, 2.5, "xyz", true}, {2, 3.5, "abc"} }; (* ERROR *) t3 = [ {1, 2.5, "xyz", true}, {2, 3.5, "abc", false} ]; (* ERROR *) t3 = {t1, t2, t1}; (* ERROR *) t7 = {2, 3.5, 1, 2.5, "xyz", true}; (* ERROR *) ); (* 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) *) );