/*-------------------------------------------------------------------------* * PL_FD_NEQ_2 * * * *-------------------------------------------------------------------------*/ Bool Pl_Fd_Neq_2(WamWord le_word, WamWord re_word) { int mask; WamWord l_word, r_word; PlLong c; #ifdef DEBUG cur_op = (pl_full_ac) ? "#\\=#" : "#\\="; #endif if (!Pl_Load_Left_Right(FALSE, le_word, re_word, &mask, &c, &l_word, &r_word)) return FALSE; switch (mask) { case MASK_EMPTY: if (c == 0) return FALSE; goto term_load; case MASK_LEFT: if (c > 0) { Pl_Fd_Prolog_To_Fd_Var(l_word, TRUE); goto term_load; } PRIM_CSTR_2(pl_x_neq_c, l_word, Tag_INT(-c)); goto term_load; case MASK_RIGHT: if (c < 0) { Pl_Fd_Prolog_To_Fd_Var(r_word, TRUE); goto term_load; } PRIM_CSTR_2(pl_x_neq_c, r_word, Tag_INT(c)); goto term_load; } if (c > 0) { PRIM_CSTR_3(pl_x_plus_c_neq_y, l_word, Tag_INT(c), r_word); goto term_load; } if (c < 0) { PRIM_CSTR_3(pl_x_plus_c_neq_y, r_word, Tag_INT(-c), l_word); goto term_load; } PRIM_CSTR_2(pl_x_neq_y, l_word, r_word); term_load: return Pl_Term_Math_Loading(l_word, r_word); }
/*-------------------------------------------------------------------------* * PL_FD_PROLOG_TO_ARRAY_FDV * * * *-------------------------------------------------------------------------*/ WamWord * Pl_Fd_Prolog_To_Array_Fdv(WamWord list_word, Bool pl_var_ok) { WamWord word, tag_mask; WamWord save_list_word; WamWord *lst_adr; int n = 0; WamWord *save_array; WamWord *array; /* compute the length of the list to */ /* reserve space in the heap for the */ /* array before pushing new FD vars. */ save_list_word = list_word; for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask != TAG_LST_MASK) break; lst_adr = UnTag_LST(word); n++; list_word = Cdr(lst_adr); } array = CS; CS = CS + n + 1; list_word = save_list_word; save_array = array; array++; /* +1 for the nb of elems */ for (;;) { DEREF(list_word, word, tag_mask); if (tag_mask == TAG_REF_MASK) Pl_Err_Instantiation(); if (word == NIL_WORD) break; if (tag_mask != TAG_LST_MASK) Pl_Err_Type(pl_type_list, save_list_word); lst_adr = UnTag_LST(word); *array++ = (WamWord) Pl_Fd_Prolog_To_Fd_Var(Car(lst_adr), pl_var_ok); list_word = Cdr(lst_adr); } *save_array = n; return save_array; }