static ord_RESULT rpos_LexGreaterEqual(TERM T1, TERM T2, BOOL VarIsConst) /************************************************************** INPUT: Two terms with equal top symbols and lexicographic status. RETURNS: ord_GREATER_THAN if <T1> is greater than <T2>, ord_EQUAL if both terms are equal and ord_UNCOMPARABLE otherwise. CAUTION: If <VarIsConst> is set then variables are interpreted as constants with lowest precedence. They are ranked to each other using their variable index. ***************************************************************/ { ord_RESULT result; LIST l1, l2, scan1, scan2; if (symbol_HasProperty(term_TopSymbol(T1), ORDRIGHT)) { l1 = list_Reverse(term_ArgumentList(T1)); /* Create new lists */ l2 = list_Reverse(term_ArgumentList(T2)); } else { l1 = term_ArgumentList(T1); l2 = term_ArgumentList(T2); } /* First ignore equal arguments */ result = ord_Equal(); for (scan1 = l1, scan2 = l2; !list_Empty(scan1); scan1 = list_Cdr(scan1), scan2 = list_Cdr(scan2)) { result = rpos_GreaterEqual(list_Car(scan1), list_Car(scan2), VarIsConst); if (!ord_IsEqual(result)) break; } if (ord_IsEqual(result)) /* All arguments are equal, so the terms */ /* empty */; /* are equal with respect to RPOS */ else if (ord_IsGreaterThan(result)) { /* Check if T1 > each remaining argument of T2 */ for (scan2 = list_Cdr(scan2); !list_Empty(scan2) && rpos_Greater(T1, list_Car(scan2), VarIsConst); scan2 = list_Cdr(scan2)); /* Empty body */ if (list_Empty(scan2)) result = ord_GreaterThan(); else result = ord_Uncomparable(); } else { /* Argument of T1 was not >= argument of T2. */ /* Try to find an argument of T1 that is >= T2 */ for (scan1 = list_Cdr(scan1), result = ord_Uncomparable(); !list_Empty(scan1) && !ord_IsGreaterThan(result); scan1 = list_Cdr(scan1)) { if (!ord_IsUncomparable(rpos_GreaterEqual(list_Car(scan1), T2, VarIsConst))) result = ord_GreaterThan(); } } if (symbol_HasProperty(term_TopSymbol(T1), ORDRIGHT)) { list_Delete(l1); /* Delete the lists create above */ list_Delete(l2); } return result; }
static ord_RESULT rpos_ContLexGreaterEqual(CONTEXT C1, TERM T1, CONTEXT C2, TERM T2) /************************************************************** INPUT: Two contexts and two terms with equal top symbols and lexicographic status. RETURNS: ord_GREATER_THAN if <T1> is greater than <T2>, ord_EQUAL if both terms are equal and ord_UNCOMPARABLE otherwise. EFFECT: Variable bindings are considered. ***************************************************************/ { ord_RESULT result; LIST l1, l2, scan1, scan2; /* Don't apply bindings at top level, since that happened */ /* in rpos_ContGreaterEqual */ if (symbol_HasProperty(term_TopSymbol(T1), ORDRIGHT)) { l1 = list_Reverse(term_ArgumentList(T1)); /* Create new lists */ l2 = list_Reverse(term_ArgumentList(T2)); } else { l1 = term_ArgumentList(T1); l2 = term_ArgumentList(T2); } /* First ignore equal arguments */ result = ord_Equal(); for (scan1 = l1, scan2 = l2; !list_Empty(scan1); scan1 = list_Cdr(scan1), scan2 = list_Cdr(scan2)) { result = rpos_ContGreaterEqual(C1, list_Car(scan1), C2, list_Car(scan2)); if (!ord_IsEqual(result)) break; } if (ord_IsEqual(result)) /* All arguments are equal, so the terms */ /* empty */; /* are equal with respect to RPOS */ else if (ord_IsGreaterThan(result)) { /* Check if T1 > each remaining argument of T2 */ for (scan2 = list_Cdr(scan2); !list_Empty(scan2) && rpos_ContGreater(C1, T1, C2, list_Car(scan2)); scan2 = list_Cdr(scan2)); /* Empty body */ if (list_Empty(scan2)) result = ord_GreaterThan(); else result = ord_Uncomparable(); } else { /* Argument of T1 was not >= argument of T2. */ /* Try to find an argument of T1 that is >= T2 */ for (scan1 = list_Cdr(scan1), result = ord_Uncomparable(); !list_Empty(scan1) && !ord_IsGreaterThan(result); scan1 = list_Cdr(scan1)) { if (!ord_IsUncomparable(rpos_ContGreaterEqual(C1,list_Car(scan1),C2,T2))) result = ord_GreaterThan(); } } if (symbol_HasProperty(term_TopSymbol(T1), ORDRIGHT)) { list_Delete(l1); /* Delete the lists create above */ list_Delete(l2); } return result; }