/*-------------------------------------------------------------------------* * COMPUTE_PRIME_RANGE * * * *-------------------------------------------------------------------------*/ static void Compute_Prime_Range(void) { int i, j; Vector vec, nvec, end; if (prime_range.vec) { Free(prime_range.vec); Free(not_prime_range.vec); } prime_range.vec = vec = (Vector) Malloc(pl_vec_size * sizeof(VecWord)); not_prime_range.vec = nvec = (Vector) Malloc(pl_vec_size * sizeof(VecWord)); Pl_Vector_Full(vec); Vector_Reset_Value(vec, 0); Vector_Reset_Value(vec, 1); i = 2; do { j = i; while ((j += i) <= pl_vec_max_integer) Vector_Reset_Value(vec, j); j = i; i = Pl_Vector_Next_After(vec, i); } while (i > 0); prime_range.extra_cstr = TRUE; prime_range.min = 2; prime_range.max = j; not_prime_range.extra_cstr = TRUE; not_prime_range.min = 0; not_prime_range.max = (j < pl_vec_max_integer) ? pl_vec_max_integer : pl_vec_max_integer - 1; end = vec + pl_vec_size; do { *nvec = ~(*vec); vec++; nvec++; } while (vec < end); prime_vec_size = pl_vec_size; }
/*-------------------------------------------------------------------------* * PL_FD_TELL_NOT_VALUE * * * *-------------------------------------------------------------------------*/ Bool Pl_Fd_Tell_Not_Value(WamWord *fdv_adr, int n) { Range *r; int min, max; int propag; start: r = Range(fdv_adr); if (!Pl_Range_Test_Value(r, n)) return TRUE; if (Fd_Variable_Is_Ground(fdv_adr)) { if (Extra_Cstr(fdv_adr)) Pl_Fd_Display_Extra_Cstr(fdv_adr); return FALSE; } min = r->min; max = r->max; if (Is_Interval(r) && n != min && n != max) { if (min > pl_vec_max_integer) { Pl_Fd_Display_Extra_Cstr(fdv_adr); return FALSE; } if (min == pl_vec_max_integer) { Pl_Fd_Display_Extra_Cstr(fdv_adr); Update_Range_From_Int(fdv_adr, min, propag); All_Propagations(fdv_adr, propag); return TRUE; } Trail_Range_If_Necessary(fdv_adr); Pl_Range_Becomes_Sparse(r); Nb_Elem(fdv_adr) = r->max - r->min + 1; if (r->extra_cstr) /* the max has been changed */ { propag = MASK_EMPTY; Set_Max_Mask(propag); Set_Min_Max_Mask(propag); Set_Dom_Mask(propag); All_Propagations(fdv_adr, propag); } goto start; } if (Nb_Elem(fdv_adr) == 2) { if (n == min) min = max; Update_Range_From_Int(fdv_adr, min, propag); goto do_propag; } /* here if sparse OR n==min OR n==max */ Trail_Range_If_Necessary(fdv_adr); propag = MASK_EMPTY; Set_Dom_Mask(propag); if (Is_Sparse(r)) Vector_Reset_Value(r->vec, n); Nb_Elem(fdv_adr)--; if (n == min) { Set_Min_Mask(propag); Set_Min_Max_Mask(propag); r->min = (Is_Interval(r)) ? n + 1 : Pl_Vector_Next_After(r->vec, n); goto do_propag; } if (n == max) { Set_Max_Mask(propag); Set_Min_Max_Mask(propag); r->max = (Is_Interval(r)) ? n - 1 : Pl_Vector_Next_Before(r->vec, n); goto do_propag; } do_propag: All_Propagations(fdv_adr, propag); return TRUE; }