GNU PROLOG with UTF8 support
fd_inst.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------*
2  * GNU Prolog *
3  * *
4  * Part : FD constraint solver *
5  * File : fd_inst.h *
6  * Descr.: FD instruction implementation - header file *
7  * Author: Daniel Diaz *
8  * *
9  * Copyright (C) 1999-2015 Daniel Diaz *
10  * *
11  * This file is part of GNU Prolog *
12  * *
13  * GNU Prolog is free software: you can redistribute it and/or *
14  * modify it under the terms of either: *
15  * *
16  * - the GNU Lesser General Public License as published by the Free *
17  * Software Foundation; either version 3 of the License, or (at your *
18  * option) any later version. *
19  * *
20  * or *
21  * *
22  * - the GNU General Public License as published by the Free *
23  * Software Foundation; either version 2 of the License, or (at your *
24  * option) any later version. *
25  * *
26  * or both in parallel, as here. *
27  * *
28  * GNU Prolog is distributed in the hope that it will be useful, *
29  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
30  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
31  * General Public License for more details. *
32  * *
33  * You should have received copies of the GNU General Public License and *
34  * the GNU Lesser General Public License along with this program. If *
35  * not, see http://www.gnu.org/licenses/. *
36  *-------------------------------------------------------------------------*/
37 
38 
39 /*---------------------------------*
40  * Constants *
41  *---------------------------------*/
42 
43  /* FD Variable Frame */
44 
45 #define FD_VARIABLE_FRAME_SIZE (OFFSET_RANGE + RANGE_SIZE + CHAINS_SIZE)
46 #define FD_INT_VARIABLE_FRAME_SIZE (OFFSET_RANGE + RANGE_SIZE)
47 
48 #define OFFSET_RANGE 4
49 #define RANGE_SIZE (2 + (sizeof(Range) / sizeof(WamWord)))
50 
51 #define OFFSET_CHAINS (OFFSET_RANGE + RANGE_SIZE)
52 #define CHAINS_SIZE 8
53 
54 
55 
56 #define FD_Tag_Value(fdv_adr) (((WamWord *) fdv_adr)[0])
57 #define FD_INT_Date(fdv_adr) (((PlULong *) fdv_adr)[1])
58 
59 #define Queue_Propag_Mask(fdv_adr) (((WamWord *) fdv_adr)[2])
60 #define Queue_Next_Fdv_Adr(fdv_adr)(((WamWord **) fdv_adr)[3])
61 
62 #define Range_Stamp(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_RANGE])
63 #define Nb_Elem(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_RANGE + 1])
64 #define Range(fdv_adr) ((Range *) ((WamWord *) fdv_adr+OFFSET_RANGE + 2))
65 
66 #define Chains_Stamp(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS])
67 #define Nb_Cstr(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS + 1])
68 #define Chains_Mask(fdv_adr) (((WamWord *) fdv_adr)[OFFSET_CHAINS + 2])
69 #define Chain_Min(fdv_adr) (((WamWord **) fdv_adr)[OFFSET_CHAINS + 3])
70 #define Chain_Max(fdv_adr) (((WamWord **) fdv_adr)[OFFSET_CHAINS + 4])
71 #define Chain_Min_Max(fdv_adr) (((WamWord **) fdv_adr)[OFFSET_CHAINS + 5])
72 #define Chain_Dom(fdv_adr) (((WamWord **) fdv_adr)[OFFSET_CHAINS + 6])
73 #define Chain_Val(fdv_adr) (((WamWord **) fdv_adr)[OFFSET_CHAINS + 7])
74 
75 
76 
77  /* Shorthands for Queue management */
78 
79 #define MASK_TO_KEEP_IN_QUEUE (1 << 8) /* only 5 chains */
80 
81 #define Is_Var_In_Queue(fdv_adr) (Queue_Propag_Mask(fdv_adr) != 0) /* mask = 0 <=> not in the queue */
82 #define Del_Var_From_Queue(fdv_adr)(Queue_Propag_Mask(fdv_adr) = 0)
83 
84 
85 
86 
87  /* Shorthands for Range(fdv_adr)'s fields */
88 
89 #define Extra_Cstr(fdv_adr) (Range(fdv_adr)->extra_cstr)
90 #define Min(fdv_adr) (Range(fdv_adr)->min)
91 #define Max(fdv_adr) (Range(fdv_adr)->max)
92 #define Vec(fdv_adr) (Range(fdv_adr)->vec)
93 
94 
95 
96 
97  /* Chain / Propagation Mask */
98 
99 
100 #define CHAIN_NB_MIN 0
101 #define CHAIN_NB_MAX 1
102 #define CHAIN_NB_MIN_MAX 2
103 #define CHAIN_NB_DOM 3
104 #define CHAIN_NB_VAL 4
105 
106 #define MASK_EMPTY 0
107 #define MASK_MIN 1
108 #define MASK_MAX 2
109 #define MASK_MIN_MAX 4
110 #define MASK_DOM 8
111 #define MASK_VAL 16
112 
113 
114 #define Has_Min_Mask(mask) ((mask) & MASK_MIN)
115 #define Has_Max_Mask(mask) ((mask) & MASK_MAX)
116 #define Has_Min_Max_Mask(mask) ((mask) & MASK_MIN_MAX)
117 #define Has_Dom_Mask(mask) ((mask) & MASK_DOM)
118 #define Has_Val_Mask(mask) ((mask) & MASK_VAL)
119 
120 
121 #define Set_Min_Mask(mask) ((mask) |= MASK_MIN)
122 #define Set_Max_Mask(mask) ((mask) |= MASK_MAX)
123 #define Set_Min_Max_Mask(mask) ((mask) |= MASK_MIN_MAX)
124 #define Set_Dom_Mask(mask) ((mask) |= MASK_DOM)
125 #define Set_Val_Mask(mask) ((mask) |= MASK_VAL)
126 
127 
128 
129 
130  /* Chain Record Frame */
131 
132 #define CHAIN_RECORD_FRAME_SIZE 2
133 
134 #define CF_Pointer(rec_adr) (*(WamWord **) &(rec_adr[0]))
135 #define Next_Chain(rec_adr) (*(WamWord **) &(rec_adr[1]))
136 
137 
138 
139 
140  /* Constraint Frame */
141 
142 #define CONSTRAINT_FRAME_SIZE 3
143 
144 #define OFFSET_OF_OPTIM_POINTER 1 /* this offset must correspond to >>> */
145 
146 #define AF_Pointer(cf) (*(WamWord **) &(cf[0]))
147 #define Optim_Pointer(cf) (*(PlULong **) &(cf[1])) /* >>> this cell */
148 #define Cstr_Address(cf) (*(PlLong (**)()) &(cf[2]))
149 
150 
151 
152 
153  /* Miscellaneous */
154 
155 #define ENV_VAR_VECTOR_MAX "VECTORMAX"
156 #define DEFAULT_VECTOR_MAX 127
157 
158 
159 #define Fd_Variable_Is_Ground(fdv_adr) (Tag_Of(FD_Tag_Value(fdv_adr)) == INT)
160 
161 
162 
163 
164 #define math_min(x, y) ((x) <= (y) ? (x) : (y))
165 #define math_max(x, y) ((x) >= (y) ? (x) : (y))
166 
167 
168 
169 
170 /*---------------------------------*
171  * Type Definitions *
172  *---------------------------------*/
173 
174 /*---------------------------------*
175  * Global Variables *
176  *---------------------------------*/
177 
178 #ifdef FD_INST_FILE
179 
182 
183 #else
184 
185 extern WamWord pl_vec_size;
187 
188 #endif
189 
190 
191 
192 
193 /*---------------------------------*
194  * Function Prototypes *
195  *---------------------------------*/
196 
197 WamWord *Pl_Fd_Prolog_To_Fd_Var(WamWord arg_word, Bool pl_var_ok);
198 
200 
201 int Pl_Fd_Prolog_To_Value(WamWord arg_word);
202 
204 
206 
207 WamWord *Pl_Fd_Prolog_To_Array_Fdv(WamWord list_word, Bool pl_var_ok);
208 
209 void Pl_Fd_List_Int_To_Range(Range *range, WamWord list_word);
210 
211 WamWord *Pl_Fd_New_Variable_Interval(int min, int max);
212 
214 
216 
218 
219 WamWord *Pl_Fd_Create_C_Frame(PlLong (*cstr_fct) (), WamWord *AF,
220  WamWord *fdv_adr, Bool optim2);
221 
222 void Pl_Fd_Add_Dependency(WamWord *fdv_adr, int chain_nb, WamWord *CF);
223 
224 void Pl_Fd_Add_List_Dependency(WamWord *array, int chain_nb, WamWord *CF);
225 
226 
227 
228 void Pl_Fd_Before_Add_Cstr(void);
229 
230 Bool Pl_Fd_After_Add_Cstr(Bool result_of_tell);
231 
233 
234 
235 
236 Bool Pl_Fd_Tell_Value(WamWord *fdv_adr, int n);
237 
238 Bool Pl_Fd_Tell_Not_Value(WamWord *fdv_adr, int n);
239 
240 Bool Pl_Fd_Tell_Int_Range(WamWord *fdv_adr, Range *range);
241 
242 Bool Pl_Fd_Tell_Interv_Interv(WamWord *fdv_adr, int min, int max);
243 
244 Bool Pl_Fd_Tell_Range_Range(WamWord *fdv_adr, Range *range);
245 
246 Bool Pl_Fd_Tell_Interval(WamWord *fdv_adr, int min, int max);
247 
248 Bool Pl_Fd_Tell_Range(WamWord *fdv_adr, Range *range);
249 
250 void Pl_Fd_Display_Extra_Cstr(WamWord *fdv_adr);
251 
252 
253 
254 void Pl_Fd_Init_Solver0(void);
255 
256 void Pl_Fd_Reset_Solver0(void);
257 
258 Bool Pl_Fd_In_Interval(WamWord *fdv_adr, int min, int max);
259 
260 Bool Pl_Fd_In_Range(WamWord *fdv_adr, Range *range);
261 
262 Bool Pl_Fd_Assign_Value_Fast(WamWord *fdv_adr, int n);
263 
264 #define Pl_Fd_Assign_Value(fdv, n) Pl_Fd_Unify_With_Integer0(fdv, n)
265 
266 Bool Pl_Fd_Unify_With_Integer0(WamWord *fdv_adr, int n);
267 
268 Bool Pl_Fd_Unify_With_Fd_Var0(WamWord *fdv_adr1, WamWord *fdv_adr2);
269 
270 Bool Pl_Fd_Remove_Value(WamWord *fdv_adr, int n);
271 
272 Bool Pl_Fd_Use_Vector(WamWord *fdv_adr);
273 
275 
276 int Pl_Fd_Variable_Size0(WamWord *fdv_adr);
277 
278 int Pl_Fd_Copy_Variable0(WamWord *dst_adr, WamWord *fdv_adr);
279 
280 char *Pl_Fd_Variable_To_String0(WamWord *fdv_adr);
281 
282 
283 #define Pl_Fd_New_Bool_Variable() Pl_Fd_New_Variable_Interval(0, 1)
284 
285 
286 #define Fd_Deref_Check_Fd_Var(fdv_word, word, tag_mask) \
287  DEREF(fdv_word, word, tag_mask); \
288  if (tag_mask == TAG_REF_MASK) \
289  Pl_Err_Instantiation(); \
290  \
291  if (tag_mask != TAG_INT_MASK && tag_mask != TAG_FDV_MASK) \
292  Pl_Err_Type(pl_type_fd_variable, word)
Bool Pl_Fd_After_Add_Cstr(Bool result_of_tell)
Definition: fd_inst.c:1345
Bool Pl_Fd_Unify_With_Integer0(WamWord *fdv_adr, int n)
Definition: fd_inst.c:1521
WamWord * Pl_Fd_New_Variable(void)
Definition: fd_inst.c:877
Range * Pl_Fd_Prolog_To_Range(WamWord list_word)
Definition: fd_inst.c:481
int Pl_Fd_Variable_Size0(WamWord *fdv_adr)
Definition: fd_inst.c:1661
WamWord * Pl_Fd_Prolog_To_Array_Int(WamWord list_word)
Definition: fd_inst.c:582
WamWord * Pl_Fd_New_Variable_Interval(int min, int max)
Definition: fd_inst.c:840
WamWord * Pl_Fd_New_Int_Variable(int n)
Definition: fd_inst.c:907
WamWord * Pl_Fd_Create_C_Frame(PlLong(*cstr_fct)(), WamWord *AF, WamWord *fdv_adr, Bool optim2)
Definition: fd_inst.c:769
Bool Pl_Fd_In_Range(WamWord *fdv_adr, Range *range)
Definition: fd_inst.c:1482
WamWord * Pl_Fd_Prolog_To_Array_Any(WamWord list_word)
Definition: fd_inst.c:646
Bool Pl_Fd_Check_For_Bool_Var(WamWord x_word)
Definition: fd_inst.c:1597
void Pl_Fd_Reset_Solver0(void)
Definition: fd_inst.c:430
intptr_t PlLong
Definition: gprolog.h:88
void Pl_Fd_Before_Add_Cstr(void)
Definition: fd_inst.c:934
void Pl_Fd_Init_Solver0(void)
Definition: fd_inst.c:400
Bool Pl_Fd_Remove_Value(WamWord *fdv_adr, int n)
Definition: fd_inst.c:1537
void Pl_Fd_Display_Extra_Cstr(WamWord *fdv_adr)
Definition: fd_inst.c:1720
Bool Pl_Fd_Use_Vector(WamWord *fdv_adr)
Definition: fd_inst.c:1568
void Pl_Fd_List_Int_To_Range(Range *range, WamWord list_word)
Definition: fd_inst.c:525
Bool Pl_Fd_Tell_Range(WamWord *fdv_adr, Range *range)
Definition: fd_inst.c:1306
int Pl_Fd_Prolog_To_Value(WamWord arg_word)
Definition: fd_inst.c:503
Bool Pl_Fd_Tell_Value(WamWord *fdv_adr, int n)
Definition: fd_inst.c:1031
WamWord * Pl_Fd_Prolog_To_Array_Fdv(WamWord list_word, Bool pl_var_ok)
Definition: fd_inst.c:700
int Pl_Fd_Copy_Variable0(WamWord *dst_adr, WamWord *fdv_adr)
Definition: fd_inst.c:1680
void Pl_Fd_Add_Dependency(WamWord *fdv_adr, int chain_nb, WamWord *CF)
Definition: fd_inst.c:795
Bool Pl_Fd_Unify_With_Fd_Var0(WamWord *fdv_adr1, WamWord *fdv_adr2)
Definition: fd_inst.c:1552
Bool Pl_Fd_Tell_Interv_Interv(WamWord *fdv_adr, int min, int max)
Definition: fd_inst.c:1188
Definition: fd_range.h:54
WamWord pl_vec_size
Bool Pl_Fd_In_Interval(WamWord *fdv_adr, int min, int max)
Definition: fd_inst.c:1466
Bool Pl_Fd_Tell_Interval(WamWord *fdv_adr, int min, int max)
Definition: fd_inst.c:1277
Bool Pl_Fd_Tell_Int_Range(WamWord *fdv_adr, Range *range)
Definition: fd_inst.c:1165
Bool Pl_Fd_Tell_Range_Range(WamWord *fdv_adr, Range *range)
Definition: fd_inst.c:1226
long WamWord
Definition: LINUX_SIGSEGV.c:4
WamWord * Pl_Fd_Prolog_To_Fd_Var(WamWord arg_word, Bool pl_var_ok)
Definition: fd_inst.c:445
WamWord pl_vec_max_integer
WamWord * Pl_Fd_New_Variable_Range(Range *r)
Definition: fd_inst.c:890
Bool Pl_Fd_Tell_Not_Value(WamWord *fdv_adr, int n)
Definition: fd_inst.c:1060
void Pl_Fd_Stop_Constraint(WamWord *CF)
Definition: fd_inst.c:1451
Bool Pl_Fd_Assign_Value_Fast(WamWord *fdv_adr, int n)
Definition: fd_inst.c:1501
int Bool
Definition: bool.h:65
void Pl_Fd_Add_List_Dependency(WamWord *array, int chain_nb, WamWord *CF)
Definition: fd_inst.c:824
char * Pl_Fd_Variable_To_String0(WamWord *fdv_adr)
Definition: fd_inst.c:1707