+void constraintList_printError (constraintList s, fileloc loc)
+{
+
+ constraintList_elements (s, elem)
+ {
+ if (elem != NULL)
+ {
+ constraint_printError (elem, loc);
+ }
+ }
+ end_constraintList_elements;
+ return;
+}
+
+cstring
+constraintList_printDetailed (constraintList s)
+{
+ int i;
+ cstring st = cstring_undefined;
+ bool first = TRUE;
+
+ if (s->nelements == 0)
+ st = cstring_makeLiteral("<List Empty>");
+
+ for (i = 0; i < s->nelements; i++)
+ {
+ cstring type = cstring_undefined;
+ constraint current = s->elements[i];
+
+ if (current != NULL)
+ {
+ cstring temp1 = constraint_printDetailed (current);
+ type = message ("%s %s\n", type, temp1 );
+ }
+
+ if (first)
+ {
+ st = type;
+ first = FALSE;
+ }
+ else
+ {
+ st = message ("%s %s", st, type);
+ }
+ }
+ return st;
+}
+
+/*{ x: constraint | (x in l1 -> resolve (x, l2) || (x in l2 -> resolve (x, l1)
+} */
+
+constraintList
+constraintList_logicalOr (constraintList l1, constraintList l2)
+{
+ constraint temp;
+ constraintList ret;
+ DPRINTF ( (message ("Logical of on %s and %s",
+ constraintList_print(l1),
+ constraintList_print(l2)) ) );
+
+ ret = constraintList_new();
+ constraintList_elements (l1, el)
+ {
+ temp = substitute (el, l2);
+
+ if (resolve (el, l2) || resolve(temp,l2) )
+ { /*avoid redundant constraints*/
+ if (!resolve (el, ret) )
+ ret = constraintList_add (ret, el);
+ }
+ }
+ end_constraintList_elements;
+
+ constraintList_elements (l2, el)
+ {
+ temp = substitute (el, l1);
+
+ if (resolve (el, l1) || resolve(temp,l1) )
+ {
+ /*avoid redundant constraints*/
+ if (!resolve (el, ret) )
+ ret = constraintList_add (ret, el);
+ }
+ }
+ end_constraintList_elements;
+
+
+ return ret;
+}
+