18#ifdef MODE_GLOBAL_TRIE_ENTRY
19#define INCREMENT_GLOBAL_TRIE_REFERENCE(ENTRY) \
21 register gt_node_ptr entry_node = (gt_node_ptr)(ENTRY); \
22 TrNode_child(entry_node) = \
23 (gt_node_ptr)((UInt)TrNode_child(entry_node) + 1); \
25#define NEW_SUBGOAL_TRIE_NODE(NODE, ENTRY, CHILD, PARENT, NEXT) \
26 INCREMENT_GLOBAL_TRIE_REFERENCE(ENTRY); \
27 new_subgoal_trie_node(NODE, ENTRY, CHILD, PARENT, NEXT)
28#define NEW_ANSWER_TRIE_NODE(NODE, INSTR, ENTRY, CHILD, PARENT, NEXT) \
29 INCREMENT_GLOBAL_TRIE_REFERENCE(ENTRY); \
30 new_answer_trie_node(NODE, INSTR, ENTRY, CHILD, PARENT, NEXT)
31#define NEW_GLOBAL_TRIE_NODE(NODE, ENTRY, CHILD, PARENT, NEXT) \
32 INCREMENT_GLOBAL_TRIE_REFERENCE(ENTRY); \
33 new_global_trie_node(NODE, ENTRY, CHILD, PARENT, NEXT)
35#define NEW_SUBGOAL_TRIE_NODE(NODE, ENTRY, CHILD, PARENT, NEXT) \
36 new_subgoal_trie_node(NODE, ENTRY, CHILD, PARENT, NEXT)
37#define NEW_ANSWER_TRIE_NODE(NODE, INSTR, ENTRY, CHILD, PARENT, NEXT) \
38 new_answer_trie_node(NODE, INSTR, ENTRY, CHILD, PARENT, NEXT)
39#define NEW_GLOBAL_TRIE_NODE(NODE, ENTRY, CHILD, PARENT, NEXT) \
40 new_global_trie_node(NODE, ENTRY, CHILD, PARENT, NEXT)
43#ifdef MODE_GLOBAL_TRIE_LOOP
44#define SUBGOAL_CHECK_INSERT_ENTRY(TAB_ENT, NODE, ENTRY) \
45 NODE = global_trie_check_insert_entry(NODE, ENTRY PASS_REGS)
46#define ANSWER_CHECK_INSERT_ENTRY(SG_FR, NODE, ENTRY, INSTR) \
47 NODE = global_trie_check_insert_entry(NODE, ENTRY PASS_REGS)
49#define SUBGOAL_CHECK_INSERT_ENTRY(TAB_ENT, NODE, ENTRY) \
50 NODE = subgoal_trie_check_insert_entry(TAB_ENT, NODE, ENTRY PASS_REGS)
51#define ANSWER_CHECK_INSERT_ENTRY(SG_FR, NODE, ENTRY, INSTR) \
52 NODE = answer_trie_check_insert_entry(SG_FR, NODE, ENTRY, INSTR PASS_REGS)
55#ifdef INCLUDE_ANSWER_SEARCH_MODE_DIRECTED
56#define ANSWER_SAFE_INSERT_ENTRY(NODE, ENTRY, INSTR) \
58 ans_node_ptr new_node; \
59 NEW_ANSWER_TRIE_NODE(new_node, INSTR, ENTRY, NULL, NODE, NULL); \
60 TrNode_child(NODE) = new_node; \
64#define INVALIDATE_ANSWER_TRIE_NODE(NODE, SG_FR) \
65 TrNode_next(NODE) = SgFr_invalid_chain(SG_FR); \
66 SgFr_invalid_chain(SG_FR) = NODE
68#define INVALIDATE_ANSWER_TRIE_NODE(NODE, SG_FR) FREE_ANSWER_TRIE_NODE(NODE)
70#define INVALIDATE_ANSWER_TRIE_LEAF_NODE(NODE, SG_FR) \
71 TAG_AS_ANSWER_INVALID_NODE(NODE); \
72 TrNode_next(NODE) = SgFr_invalid_chain(SG_FR); \
73 SgFr_invalid_chain(SG_FR) = NODE
80#ifdef INCLUDE_SUBGOAL_TRIE_CHECK_INSERT
81#ifndef SUBGOAL_TRIE_LOCK_AT_WRITE_LEVEL
84#ifdef MODE_GLOBAL_TRIE_ENTRY
95 LOCK_SUBGOAL_NODE(parent_node);
96 child_node = TrNode_child(parent_node);
97 if (child_node == NULL) {
98 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node, NULL);
99 TrNode_child(parent_node) = child_node;
100 UNLOCK_SUBGOAL_NODE(parent_node);
104 if (!IS_SUBGOAL_TRIE_HASH(child_node)) {
107 if (TrNode_entry(child_node) == t) {
108 UNLOCK_SUBGOAL_NODE(parent_node);
112 child_node = TrNode_next(child_node);
113 }
while (child_node);
114 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node,
115 TrNode_child(parent_node));
117 if (count_nodes >= MAX_NODES_PER_TRIE_LEVEL) {
121 new_subgoal_trie_hash(hash, count_nodes, tab_ent);
122 chain_node = child_node;
124 bucket = Hash_buckets(hash) +
125 HASH_ENTRY(TrNode_entry(chain_node), BASE_HASH_BUCKETS);
126 next_node = TrNode_next(chain_node);
127 TrNode_next(chain_node) = *
bucket;
129 chain_node = next_node;
130 }
while (chain_node);
133 TrNode_child(parent_node) = child_node;
135 UNLOCK_SUBGOAL_NODE(parent_node);
144 bucket = Hash_buckets(hash) + HASH_ENTRY(t, Hash_num_buckets(hash));
147 if (TrNode_entry(child_node) == t) {
148 UNLOCK_SUBGOAL_NODE(parent_node);
152 child_node = TrNode_next(child_node);
154 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node, *
bucket);
156 Hash_num_nodes(hash)++;
158 if (count_nodes >= MAX_NODES_PER_BUCKET &&
159 Hash_num_nodes(hash) > Hash_num_buckets(hash)) {
161 sg_node_ptr chain_node, next_node, *old_bucket, *old_hash_buckets,
164 num_buckets = Hash_num_buckets(hash) * 2;
165 ALLOC_BUCKETS(new_hash_buckets, num_buckets);
166 old_hash_buckets = Hash_buckets(hash);
167 old_bucket = old_hash_buckets + Hash_num_buckets(hash);
170 chain_node = *old_bucket;
172 bucket = new_hash_buckets +
173 HASH_ENTRY(TrNode_entry(chain_node), num_buckets);
174 next_node = TrNode_next(chain_node);
175 TrNode_next(chain_node) = *
bucket;
177 chain_node = next_node;
178 }
while (chain_node);
180 }
while (old_bucket != old_hash_buckets);
181 Hash_buckets(hash) = new_hash_buckets;
182 Hash_num_buckets(hash) = num_buckets;
183 FREE_BUCKETS(old_hash_buckets);
185 UNLOCK_SUBGOAL_NODE(parent_node);
190#ifdef MODE_GLOBAL_TRIE_ENTRY
202 child_node = TrNode_child(parent_node);
203 if (child_node == NULL) {
204#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
205 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node, NULL);
207 LOCK_SUBGOAL_NODE(parent_node);
208 if (TrNode_child(parent_node)) {
209 sg_node_ptr chain_node = TrNode_child(parent_node);
210 if (IS_SUBGOAL_TRIE_HASH(chain_node)) {
211#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
212 FREE_SUBGOAL_TRIE_NODE(child_node);
214 UNLOCK_SUBGOAL_NODE(parent_node);
219 if (TrNode_entry(chain_node) == t) {
220#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
221 FREE_SUBGOAL_TRIE_NODE(child_node);
223 UNLOCK_SUBGOAL_NODE(parent_node);
226 chain_node = TrNode_next(chain_node);
227 }
while (chain_node);
228#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
229 TrNode_next(child_node) = TrNode_child(parent_node);
231 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node,
232 TrNode_child(parent_node));
234 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node, NULL);
237 TrNode_child(parent_node) = child_node;
238 UNLOCK_SUBGOAL_NODE(parent_node);
242 if (!IS_SUBGOAL_TRIE_HASH(child_node)) {
246 if (TrNode_entry(child_node) == t)
249 child_node = TrNode_next(child_node);
250 }
while (child_node);
251#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
252 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node, first_node);
254 LOCK_SUBGOAL_NODE(parent_node);
255 if (first_node != TrNode_child(parent_node)) {
256 sg_node_ptr chain_node = TrNode_child(parent_node);
257 if (IS_SUBGOAL_TRIE_HASH(chain_node)) {
258#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
259 FREE_SUBGOAL_TRIE_NODE(child_node);
261 UNLOCK_SUBGOAL_NODE(parent_node);
266 if (TrNode_entry(chain_node) == t) {
267#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
268 FREE_SUBGOAL_TRIE_NODE(child_node);
270 UNLOCK_SUBGOAL_NODE(parent_node);
274 chain_node = TrNode_next(chain_node);
275 }
while (chain_node != first_node);
276#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
277 TrNode_next(child_node) = TrNode_child(parent_node);
279 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node,
280 TrNode_child(parent_node));
282 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node, first_node);
286 if (count_nodes >= MAX_NODES_PER_TRIE_LEVEL) {
289 new_subgoal_trie_hash(hash, count_nodes, tab_ent);
290 chain_node = child_node;
292 bucket = Hash_buckets(hash) +
293 HASH_ENTRY(TrNode_entry(chain_node), BASE_HASH_BUCKETS);
294 next_node = TrNode_next(chain_node);
295 TrNode_next(chain_node) = *
bucket;
297 chain_node = next_node;
298 }
while (chain_node);
301 TrNode_child(parent_node) = child_node;
303 UNLOCK_SUBGOAL_NODE(parent_node);
310 int num_buckets, count_nodes = 0;
313 num_buckets = Hash_num_buckets(hash);
315 bucket = Hash_buckets(hash) + HASH_ENTRY(t, num_buckets);
316 first_node = child_node = *
bucket;
317 }
while (num_buckets != Hash_num_buckets(hash));
319 if (TrNode_entry(child_node) == t)
322 child_node = TrNode_next(child_node);
324#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
325 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node, first_node);
327 LOCK_SUBGOAL_NODE(parent_node);
328 if (num_buckets != Hash_num_buckets(hash)) {
330#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
331 FREE_SUBGOAL_TRIE_NODE(child_node);
333 UNLOCK_SUBGOAL_NODE(parent_node);
336 if (first_node != *
bucket) {
339 if (TrNode_entry(chain_node) == t) {
340#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
341 FREE_SUBGOAL_TRIE_NODE(child_node);
343 UNLOCK_SUBGOAL_NODE(parent_node);
347 chain_node = TrNode_next(chain_node);
348 }
while (chain_node != first_node);
349#ifdef SUBGOAL_TRIE_ALLOC_BEFORE_CHECK
350 TrNode_next(child_node) = *
bucket;
352 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node, *
bucket);
354 NEW_SUBGOAL_TRIE_NODE(child_node, t, NULL, parent_node, first_node);
358 Hash_num_nodes(hash)++;
360 if (count_nodes >= MAX_NODES_PER_BUCKET &&
361 Hash_num_nodes(hash) > Hash_num_buckets(hash)) {
363 sg_node_ptr chain_node, next_node, *old_bucket, *old_hash_buckets,
365 num_buckets = Hash_num_buckets(hash) * 2;
366 ALLOC_BUCKETS(new_hash_buckets, num_buckets);
367 old_hash_buckets = Hash_buckets(hash);
368 old_bucket = old_hash_buckets + Hash_num_buckets(hash);
371 chain_node = *old_bucket;
373 bucket = new_hash_buckets +
374 HASH_ENTRY(TrNode_entry(chain_node), num_buckets);
375 next_node = TrNode_next(chain_node);
376 TrNode_next(chain_node) = *
bucket;
378 chain_node = next_node;
379 }
while (chain_node);
381 }
while (old_bucket != old_hash_buckets);
382 Hash_buckets(hash) = new_hash_buckets;
383 Hash_num_buckets(hash) = num_buckets;
384 FREE_BUCKETS(old_hash_buckets);
386 UNLOCK_SUBGOAL_NODE(parent_node);
397#ifdef INCLUDE_ANSWER_TRIE_CHECK_INSERT
398#ifndef ANSWER_TRIE_LOCK_AT_WRITE_LEVEL
401#ifdef MODE_GLOBAL_TRIE_ENTRY
404 Term t,
int instr USES_REGS) {
408 Term t,
int instr USES_REGS) {
412 TABLING_ERROR_CHECKING(answer_trie_check_insert_(gt) _entry,
413 IS_ANSWER_LEAF_NODE(parent_node));
414 LOCK_ANSWER_NODE(parent_node);
415 child_node = TrNode_child(parent_node);
416 if (child_node == NULL) {
417 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node, NULL);
418 TrNode_child(parent_node) = child_node;
419 UNLOCK_ANSWER_NODE(parent_node);
423 if (!IS_ANSWER_TRIE_HASH(child_node)) {
426 if (TrNode_entry(child_node) == t) {
427 UNLOCK_ANSWER_NODE(parent_node);
431 child_node = TrNode_next(child_node);
432 }
while (child_node);
433 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node,
434 TrNode_child(parent_node));
436 if (count_nodes >= MAX_NODES_PER_TRIE_LEVEL) {
440 new_answer_trie_hash(hash, count_nodes, sg_fr);
441 chain_node = child_node;
443 bucket = Hash_buckets(hash) +
444 HASH_ENTRY(TrNode_entry(chain_node), BASE_HASH_BUCKETS);
445 next_node = TrNode_next(chain_node);
446 TrNode_next(chain_node) = *
bucket;
448 chain_node = next_node;
449 }
while (chain_node);
452 TrNode_child(parent_node) = child_node;
454 UNLOCK_ANSWER_NODE(parent_node);
463 bucket = Hash_buckets(hash) + HASH_ENTRY(t, Hash_num_buckets(hash));
466 if (TrNode_entry(child_node) == t) {
467 UNLOCK_ANSWER_NODE(parent_node);
471 child_node = TrNode_next(child_node);
473 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node, *
bucket);
475 Hash_num_nodes(hash)++;
477 if (count_nodes >= MAX_NODES_PER_BUCKET &&
478 Hash_num_nodes(hash) > Hash_num_buckets(hash)) {
480 ans_node_ptr chain_node, next_node, *old_bucket, *old_hash_buckets,
483 num_buckets = Hash_num_buckets(hash) * 2;
484 ALLOC_BUCKETS(new_hash_buckets, num_buckets);
485 old_hash_buckets = Hash_buckets(hash);
486 old_bucket = old_hash_buckets + Hash_num_buckets(hash);
489 chain_node = *old_bucket;
491 bucket = new_hash_buckets +
492 HASH_ENTRY(TrNode_entry(chain_node), num_buckets);
493 next_node = TrNode_next(chain_node);
494 TrNode_next(chain_node) = *
bucket;
496 chain_node = next_node;
497 }
while (chain_node);
499 }
while (old_bucket != old_hash_buckets);
500 Hash_buckets(hash) = new_hash_buckets;
501 Hash_num_buckets(hash) = num_buckets;
502 FREE_BUCKETS(old_hash_buckets);
504 UNLOCK_ANSWER_NODE(parent_node);
509#ifdef MODE_GLOBAL_TRIE_ENTRY
512 Term t,
int instr USES_REGS) {
516 Term t,
int instr USES_REGS) {
521 TABLING_ERROR_CHECKING(answer_trie_check_insert_(gt) _entry,
522 IS_ANSWER_LEAF_NODE(parent_node));
523 child_node = TrNode_child(parent_node);
524 if (child_node == NULL) {
525#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
526 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node, NULL);
528 LOCK_ANSWER_NODE(parent_node);
529 if (TrNode_child(parent_node)) {
531 if (IS_ANSWER_TRIE_HASH(chain_node)) {
532#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
533 FREE_ANSWER_TRIE_NODE(child_node);
535 UNLOCK_ANSWER_NODE(parent_node);
540 if (TrNode_entry(chain_node) == t) {
541#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
542 FREE_ANSWER_TRIE_NODE(child_node);
544 UNLOCK_ANSWER_NODE(parent_node);
547 chain_node = TrNode_next(chain_node);
548 }
while (chain_node);
549#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
550 TrNode_next(child_node) = TrNode_child(parent_node);
552 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node,
553 TrNode_child(parent_node));
555 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node, NULL);
558 TrNode_child(parent_node) = child_node;
559 UNLOCK_ANSWER_NODE(parent_node);
563 if (!IS_ANSWER_TRIE_HASH(child_node)) {
567 if (TrNode_entry(child_node) == t)
570 child_node = TrNode_next(child_node);
571 }
while (child_node);
572#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
573 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node, first_node);
575 LOCK_ANSWER_NODE(parent_node);
576 if (first_node != TrNode_child(parent_node)) {
578 if (IS_ANSWER_TRIE_HASH(chain_node)) {
579#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
580 FREE_ANSWER_TRIE_NODE(child_node);
582 UNLOCK_ANSWER_NODE(parent_node);
587 if (TrNode_entry(chain_node) == t) {
588#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
589 FREE_ANSWER_TRIE_NODE(child_node);
591 UNLOCK_ANSWER_NODE(parent_node);
595 chain_node = TrNode_next(chain_node);
596 }
while (chain_node != first_node);
597#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
598 TrNode_next(child_node) = TrNode_child(parent_node);
600 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node,
601 TrNode_child(parent_node));
603 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node, first_node);
607 if (count_nodes >= MAX_NODES_PER_TRIE_LEVEL) {
610 new_answer_trie_hash(hash, count_nodes, sg_fr);
611 chain_node = child_node;
613 bucket = Hash_buckets(hash) +
614 HASH_ENTRY(TrNode_entry(chain_node), BASE_HASH_BUCKETS);
615 next_node = TrNode_next(chain_node);
616 TrNode_next(chain_node) = *
bucket;
618 chain_node = next_node;
619 }
while (chain_node);
622 TrNode_child(parent_node) = child_node;
624 UNLOCK_ANSWER_NODE(parent_node);
631 int num_buckets, count_nodes = 0;
634 num_buckets = Hash_num_buckets(hash);
636 bucket = Hash_buckets(hash) + HASH_ENTRY(t, num_buckets);
637 first_node = child_node = *
bucket;
638 }
while (num_buckets != Hash_num_buckets(hash));
640 if (TrNode_entry(child_node) == t)
643 child_node = TrNode_next(child_node);
645#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
646 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node, first_node);
648 LOCK_ANSWER_NODE(parent_node);
649 if (num_buckets != Hash_num_buckets(hash)) {
651#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
652 FREE_ANSWER_TRIE_NODE(child_node);
654 UNLOCK_ANSWER_NODE(parent_node);
657 if (first_node != *
bucket) {
660 if (TrNode_entry(chain_node) == t) {
661#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
662 FREE_ANSWER_TRIE_NODE(child_node);
664 UNLOCK_ANSWER_NODE(parent_node);
668 chain_node = TrNode_next(chain_node);
669 }
while (chain_node != first_node);
670#ifdef ANSWER_TRIE_ALLOC_BEFORE_CHECK
671 TrNode_next(child_node) = *
bucket;
673 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node, *
bucket);
675 NEW_ANSWER_TRIE_NODE(child_node, instr, t, NULL, parent_node, first_node);
679 Hash_num_nodes(hash)++;
681 if (count_nodes >= MAX_NODES_PER_BUCKET &&
682 Hash_num_nodes(hash) > Hash_num_buckets(hash)) {
684 ans_node_ptr chain_node, next_node, *old_bucket, *old_hash_buckets,
686 num_buckets = Hash_num_buckets(hash) * 2;
687 ALLOC_BUCKETS(new_hash_buckets, num_buckets);
688 old_hash_buckets = Hash_buckets(hash);
689 old_bucket = old_hash_buckets + Hash_num_buckets(hash);
692 chain_node = *old_bucket;
694 bucket = new_hash_buckets +
695 HASH_ENTRY(TrNode_entry(chain_node), num_buckets);
696 next_node = TrNode_next(chain_node);
697 TrNode_next(chain_node) = *
bucket;
699 chain_node = next_node;
700 }
while (chain_node);
702 }
while (old_bucket != old_hash_buckets);
703 Hash_buckets(hash) = new_hash_buckets;
704 Hash_num_buckets(hash) = num_buckets;
705 FREE_BUCKETS(old_hash_buckets);
707 UNLOCK_ANSWER_NODE(parent_node);
718#ifdef INCLUDE_GLOBAL_TRIE_CHECK_INSERT
719#ifndef GLOBAL_TRIE_LOCK_AT_WRITE_LEVEL
721#ifdef MODE_GLOBAL_TRIE_ENTRY
723global_trie_check_insert_gt_entry(
gt_node_ptr parent_node, Term t USES_REGS) {
726global_trie_check_insert_entry(
gt_node_ptr parent_node, Term t USES_REGS) {
730 LOCK_GLOBAL_NODE(parent_node);
731 child_node = TrNode_child(parent_node);
732 if (child_node == NULL) {
733 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node, NULL);
734 TrNode_child(parent_node) = child_node;
735 UNLOCK_GLOBAL_NODE(parent_node);
739 if (!IS_GLOBAL_TRIE_HASH(child_node)) {
742 if (TrNode_entry(child_node) == t) {
743 UNLOCK_GLOBAL_NODE(parent_node);
747 child_node = TrNode_next(child_node);
748 }
while (child_node);
749 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node,
750 TrNode_child(parent_node));
752 if (count_nodes >= MAX_NODES_PER_TRIE_LEVEL) {
756 new_global_trie_hash(hash, count_nodes);
757 chain_node = child_node;
759 bucket = Hash_buckets(hash) +
760 HASH_ENTRY(TrNode_entry(chain_node), BASE_HASH_BUCKETS);
761 next_node = TrNode_next(chain_node);
762 TrNode_next(chain_node) = *
bucket;
764 chain_node = next_node;
765 }
while (chain_node);
768 TrNode_child(parent_node) = child_node;
770 UNLOCK_GLOBAL_NODE(parent_node);
779 bucket = Hash_buckets(hash) + HASH_ENTRY(t, Hash_num_buckets(hash));
782 if (TrNode_entry(child_node) == t) {
783 UNLOCK_GLOBAL_NODE(parent_node);
787 child_node = TrNode_next(child_node);
789 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node, *
bucket);
791 Hash_num_nodes(hash)++;
793 if (count_nodes >= MAX_NODES_PER_BUCKET &&
794 Hash_num_nodes(hash) > Hash_num_buckets(hash)) {
796 gt_node_ptr chain_node, next_node, *old_bucket, *old_hash_buckets,
799 num_buckets = Hash_num_buckets(hash) * 2;
800 ALLOC_BUCKETS(new_hash_buckets, num_buckets);
801 old_hash_buckets = Hash_buckets(hash);
802 old_bucket = old_hash_buckets + Hash_num_buckets(hash);
805 chain_node = *old_bucket;
807 bucket = new_hash_buckets +
808 HASH_ENTRY(TrNode_entry(chain_node), num_buckets);
809 next_node = TrNode_next(chain_node);
810 TrNode_next(chain_node) = *
bucket;
812 chain_node = next_node;
813 }
while (chain_node);
815 }
while (old_bucket != old_hash_buckets);
816 Hash_buckets(hash) = new_hash_buckets;
817 Hash_num_buckets(hash) = num_buckets;
818 FREE_BUCKETS(old_hash_buckets);
820 UNLOCK_GLOBAL_NODE(parent_node);
825#ifdef MODE_GLOBAL_TRIE_ENTRY
827global_trie_check_insert_gt_entry(
gt_node_ptr parent_node, Term t USES_REGS) {
830global_trie_check_insert_entry(
gt_node_ptr parent_node, Term t USES_REGS) {
835 child_node = TrNode_child(parent_node);
836 if (child_node == NULL) {
837#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
838 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node, NULL);
840 LOCK_GLOBAL_NODE(parent_node);
841 if (TrNode_child(parent_node)) {
842 gt_node_ptr chain_node = TrNode_child(parent_node);
843 if (IS_GLOBAL_TRIE_HASH(chain_node)) {
844#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
845 FREE_GLOBAL_TRIE_NODE(child_node);
847 UNLOCK_GLOBAL_NODE(parent_node);
852 if (TrNode_entry(chain_node) == t) {
853#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
854 FREE_GLOBAL_TRIE_NODE(child_node);
856 UNLOCK_GLOBAL_NODE(parent_node);
859 chain_node = TrNode_next(chain_node);
860 }
while (chain_node);
861#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
862 TrNode_next(child_node) = TrNode_child(parent_node);
864 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node,
865 TrNode_child(parent_node));
867 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node, NULL);
870 TrNode_child(parent_node) = child_node;
871 UNLOCK_GLOBAL_NODE(parent_node);
875 if (!IS_GLOBAL_TRIE_HASH(child_node)) {
879 if (TrNode_entry(child_node) == t)
882 child_node = TrNode_next(child_node);
883 }
while (child_node);
884#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
885 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node, first_node);
887 LOCK_GLOBAL_NODE(parent_node);
888 if (first_node != TrNode_child(parent_node)) {
889 gt_node_ptr chain_node = TrNode_child(parent_node);
890 if (IS_GLOBAL_TRIE_HASH(chain_node)) {
891#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
892 FREE_GLOBAL_TRIE_NODE(child_node);
894 UNLOCK_GLOBAL_NODE(parent_node);
899 if (TrNode_entry(chain_node) == t) {
900#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
901 FREE_GLOBAL_TRIE_NODE(child_node);
903 UNLOCK_GLOBAL_NODE(parent_node);
907 chain_node = TrNode_next(chain_node);
908 }
while (chain_node != first_node);
909#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
910 TrNode_next(child_node) = TrNode_child(parent_node);
912 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node,
913 TrNode_child(parent_node));
915 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node, first_node);
919 if (count_nodes >= MAX_NODES_PER_TRIE_LEVEL) {
922 new_global_trie_hash(hash, count_nodes);
923 chain_node = child_node;
925 bucket = Hash_buckets(hash) +
926 HASH_ENTRY(TrNode_entry(chain_node), BASE_HASH_BUCKETS);
927 next_node = TrNode_next(chain_node);
928 TrNode_next(chain_node) = *
bucket;
930 chain_node = next_node;
931 }
while (chain_node);
934 TrNode_child(parent_node) = child_node;
936 UNLOCK_GLOBAL_NODE(parent_node);
943 int num_buckets, count_nodes = 0;
946 num_buckets = Hash_num_buckets(hash);
948 bucket = Hash_buckets(hash) + HASH_ENTRY(t, num_buckets);
949 first_node = child_node = *
bucket;
950 }
while (num_buckets != Hash_num_buckets(hash));
952 if (TrNode_entry(child_node) == t)
955 child_node = TrNode_next(child_node);
957#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
958 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node, first_node);
960 LOCK_GLOBAL_NODE(parent_node);
961 if (num_buckets != Hash_num_buckets(hash)) {
963#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
964 FREE_GLOBAL_TRIE_NODE(child_node);
966 UNLOCK_GLOBAL_NODE(parent_node);
969 if (first_node != *
bucket) {
972 if (TrNode_entry(chain_node) == t) {
973#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
974 FREE_GLOBAL_TRIE_NODE(child_node);
976 UNLOCK_GLOBAL_NODE(parent_node);
980 chain_node = TrNode_next(chain_node);
981 }
while (chain_node != first_node);
982#ifdef GLOBAL_TRIE_ALLOC_BEFORE_CHECK
983 TrNode_next(child_node) = *
bucket;
985 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node, *
bucket);
987 NEW_GLOBAL_TRIE_NODE(child_node, t, NULL, parent_node, first_node);
991 Hash_num_nodes(hash)++;
993 if (count_nodes >= MAX_NODES_PER_BUCKET &&
994 Hash_num_nodes(hash) > Hash_num_buckets(hash)) {
996 gt_node_ptr chain_node, next_node, *old_bucket, *old_hash_buckets,
998 num_buckets = Hash_num_buckets(hash) * 2;
999 ALLOC_BUCKETS(new_hash_buckets, num_buckets);
1000 old_hash_buckets = Hash_buckets(hash);
1001 old_bucket = old_hash_buckets + Hash_num_buckets(hash);
1003 if (*--old_bucket) {
1004 chain_node = *old_bucket;
1006 bucket = new_hash_buckets +
1007 HASH_ENTRY(TrNode_entry(chain_node), num_buckets);
1008 next_node = TrNode_next(chain_node);
1009 TrNode_next(chain_node) = *
bucket;
1011 chain_node = next_node;
1012 }
while (chain_node);
1014 }
while (old_bucket != old_hash_buckets);
1015 Hash_buckets(hash) = new_hash_buckets;
1016 Hash_num_buckets(hash) = num_buckets;
1017 FREE_BUCKETS(old_hash_buckets);
1019 UNLOCK_GLOBAL_NODE(parent_node);
1030#ifdef INCLUDE_SUBGOAL_SEARCH_LOOP
1031#ifdef MODE_GLOBAL_TRIE_LOOP
1032#ifdef GLOBAL_TRIE_FOR_SUBTERMS
1034subgoal_search_global_trie_terms_loop(Term t,
int *subs_arity_ptr,
1035 CELL **stack_vars_ptr,
1036 CELL *stack_terms USES_REGS) {
1039subgoal_search_global_trie_loop(Term t,
int *subs_arity_ptr,
1040 CELL **stack_vars_ptr USES_REGS) {
1043#ifdef MODE_TERMS_LOOP
1046 int *subs_arity_ptr,
1047 CELL **stack_vars_ptr USES_REGS) {
1051 int *subs_arity_ptr,
1052 CELL **stack_vars_ptr USES_REGS) {
1094#ifdef MODE_GLOBAL_TRIE_LOOP
1097 int subs_arity = *subs_arity_ptr;
1098 CELL *stack_vars = *stack_vars_ptr;
1099#if !defined(MODE_GLOBAL_TRIE_LOOP) || !defined(GLOBAL_TRIE_FOR_SUBTERMS)
1100 CELL *stack_terms = (CELL *)LOCAL_TrailTop;
1102 CELL *stack_terms_limit = (CELL *)TR;
1103 AUX_STACK_CHECK_EXPAND(
1104 stack_terms, stack_terms_limit + 1);
1106 STACK_PUSH_UP(NULL, stack_terms);
1108#if defined(MODE_GLOBAL_TRIE_LOOP)
1111 goto subgoal_search_loop_non_atomic;
1114#ifdef TRIE_RATIONAL_TERMS
1118 term_array_init(&Ts, 10);
1123 if (IsTableVarTerm(t)) {
1124 t = MakeTableVarTerm(VarIndexOfTerm(t));
1125 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, t);
1127 if (subs_arity == MAX_TABLE_VARS)
1128 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
1129 "subgoal_search_loop: MAX_TABLE_VARS exceeded");
1130 STACK_PUSH_UP(t, stack_vars);
1131 *((CELL *)t) = GLOBAL_table_var_enumerator(subs_arity);
1132 t = MakeTableVarTerm(subs_arity);
1133 subs_arity = subs_arity + 1;
1134 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, t);
1136 }
else if (IsAtomOrIntTerm(t)) {
1137 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, t);
1138#ifdef MODE_TERMS_LOOP
1141#ifdef GLOBAL_TRIE_FOR_SUBTERMS
1142 entry_node = subgoal_search_global_trie_terms_loop(
1143 t, &subs_arity, &stack_vars, stack_terms PASS_REGS);
1145 entry_node = subgoal_search_global_trie_loop(t, &subs_arity,
1146 &stack_vars PASS_REGS);
1148 current_node = subgoal_trie_check_insert_gt_entry(
1149 tab_ent, current_node, (Term)entry_node PASS_REGS);
1152#ifdef TRIE_RATIONAL_TERMS
1153 if (IsRationalTerm(t)) {
1154 t = STACK_POP_DOWN(stack_terms);
1155 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, t);
1158#if defined(MODE_GLOBAL_TRIE_LOOP)
1160 subgoal_search_loop_non_atomic:
1162#ifdef TRIE_COMPACT_PAIRS
1163 if (IsPairTerm(t)) {
1164#ifdef TRIE_RATIONAL_TERMS
1167 CELL *aux_pair = RepPair(t);
1168 if (aux_pair == PairTermMark) {
1169 t = STACK_POP_DOWN(stack_terms);
1170#ifdef TRIE_RATIONAL_TERMS
1171 if (IsPairTerm(t) && !IsRationalTerm(t)) {
1172 term_array_push(&Ts, (
void *)t, (
void *)current_node);
1174 if (IsPairTerm(t)) {
1176 aux_pair = RepPair(t);
1177 t = Deref(aux_pair[1]);
1178#ifdef TRIE_RATIONAL_TERMS
1179 if (IsVarTerm(aux_pair[1]) || IsPairTerm(aux_pair[1])) {
1180 CyclicTerm = term_array_member(Ts, (
void *)t);
1182 if (CyclicTerm != NULL) {
1183 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1184 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1185 STACK_PUSH_UP(AbsPair(PairTermMark), stack_terms);
1189 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node,
1190 CompactPairEndList);
1197 STACK_PUSH_UP(t, stack_terms);
1198 STACK_PUSH_UP(AbsPair(PairTermMark), stack_terms);
1200#ifdef TRIE_RATIONAL_TERMS
1202 if (IsVarTerm(aux_pair[0]) || IsPairTerm(aux_pair[0]))
1203 CyclicTerm = term_array_member(Ts, (
void *)Deref(aux_pair[0]));
1204 if (CyclicTerm != NULL) {
1205 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1206 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1209 STACK_PUSH_UP(Deref(aux_pair[0]), stack_terms);
1211 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, CompactPairEndTerm);
1212 STACK_PUSH_UP(t, stack_terms);
1214#if defined(MODE_GLOBAL_TRIE_LOOP) && defined(GLOBAL_TRIE_FOR_SUBTERMS)
1215 }
else if (current_node != GLOBAL_root_gt) {
1216 gt_node_ptr entry_node = subgoal_search_global_trie_terms_loop(
1217 t, &subs_arity, &stack_vars, stack_terms PASS_REGS);
1218 current_node = global_trie_check_insert_gt_entry(
1219 current_node, (Term)entry_node PASS_REGS);
1222#ifdef TRIE_RATIONAL_TERMS
1223 term_array_push(&Ts, (
void *)t, (
void *)current_node);
1225 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, CompactPairInit);
1226 t = Deref(aux_pair[1]);
1227#ifdef TRIE_RATIONAL_TERMS
1228 if (IsVarTerm(aux_pair[1]) || IsPairTerm(aux_pair[1])) {
1229 CyclicTerm = term_array_member(Ts, (
void *)t);
1231 if (CyclicTerm != NULL) {
1232 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1233 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1234 STACK_PUSH_UP(AbsPair(PairTermMark), stack_terms);
1238 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, CompactPairEndList);
1240 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 2);
1241 STACK_PUSH_UP(t, stack_terms);
1242 STACK_PUSH_UP(AbsPair(PairTermMark), stack_terms);
1244#ifdef TRIE_RATIONAL_TERMS
1246 if (IsVarTerm(aux_pair[0]) || IsPairTerm(aux_pair[0]))
1247 CyclicTerm = term_array_member(Ts, (
void *)Deref(aux_pair[0]));
1248 if (CyclicTerm != NULL) {
1249 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1250 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1253 STACK_PUSH_UP(Deref(aux_pair[0]), stack_terms);
1255#if defined(MODE_GLOBAL_TRIE_LOOP) && defined(GLOBAL_TRIE_FOR_SUBTERMS)
1256 }
else if (current_node != GLOBAL_root_gt) {
1257 gt_node_ptr entry_node = subgoal_search_global_trie_terms_loop(
1258 t, &subs_arity, &stack_vars, stack_terms PASS_REGS);
1259 current_node = global_trie_check_insert_gt_entry(
1260 current_node, (Term)entry_node PASS_REGS);
1263#if defined(MODE_GLOBAL_TRIE_LOOP) && defined(GLOBAL_TRIE_FOR_SUBTERMS)
1264 if (current_node != GLOBAL_root_gt) {
1265 gt_node_ptr entry_node = subgoal_search_global_trie_terms_loop(
1266 t, &subs_arity, &stack_vars, stack_terms PASS_REGS);
1267 current_node = global_trie_check_insert_gt_entry(
1268 current_node, (Term)entry_node PASS_REGS);
1271 if (IsPairTerm(t)) {
1272 CELL *aux_pair = RepPair(t);
1273 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, AbsPair(NULL));
1274 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 1);
1275 STACK_PUSH_UP(Deref(aux_pair[1]), stack_terms);
1276 STACK_PUSH_UP(Deref(aux_pair[0]), stack_terms);
1278 }
else if (IsApplTerm(t)) {
1280 if (f == FunctorDouble) {
1282 Term t_dbl[
sizeof(Float) /
sizeof(Term)];
1285 u.dbl = FloatOfTerm(t);
1286 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, AbsAppl((Term *)f));
1287#if SIZEOF_DOUBLE == 2 * SIZEOF_INT_P
1288 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, u.t_dbl[1]);
1290 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, u.t_dbl[0]);
1291#ifdef MODE_GLOBAL_TRIE_LOOP
1292 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, AbsAppl((Term *)f));
1294 }
else if (f == FunctorLongInt) {
1295 Int li = LongIntOfTerm(t);
1296 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, AbsAppl((Term *)f));
1297 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, li);
1298#ifdef MODE_GLOBAL_TRIE_LOOP
1299 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, AbsAppl((Term *)f));
1301 }
else if (f == FunctorBigInt || f == FunctorString) {
1302 CELL *
new = Yap_HeapStoreOpaqueTerm(t);
1303 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, AbsAppl((Term *)f));
1304 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, (CELL)
new);
1305#ifdef MODE_GLOBAL_TRIE_LOOP
1306 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, AbsAppl((Term *)f));
1308 }
else if (f == FunctorDBRef) {
1309 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
1310 "subgoal_search_loop: unsupported type tag FunctorDBRef");
1312#ifdef TRIE_RATIONAL_TERMS
1313 term_array_push(&Ts, (
void *)t, (
void *)current_node);
1316 CELL *aux_appl = RepAppl(t);
1317 SUBGOAL_CHECK_INSERT_ENTRY(tab_ent, current_node, AbsAppl((Term *)f));
1318 AUX_STACK_CHECK_EXPAND(stack_terms,
1319 stack_terms_limit + ArityOfFunctor(f) - 1);
1320 for (i = ArityOfFunctor(f); i >= 1; i--) {
1321#ifdef TRIE_RATIONAL_TERMS
1323 if (IsVarTerm(aux_appl[i]) || IsApplTerm(aux_appl[i]))
1324 CyclicTerm = term_array_member(Ts, (
void *)Deref(aux_appl[i]));
1325 if (CyclicTerm != NULL) {
1326 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1327 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1330 STACK_PUSH_UP(Deref(aux_appl[i]), stack_terms);
1334 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
1335 "subgoal_search_loop: unknown type tag");
1338 t = STACK_POP_DOWN(stack_terms);
1340#ifdef TRIE_RATIONAL_TERMS
1341 term_array_free(&Ts);
1343 *subs_arity_ptr = subs_arity;
1344 *stack_vars_ptr = stack_vars;
1345 return current_node;
1353#ifdef INCLUDE_ANSWER_SEARCH_LOOP
1354#ifdef MODE_GLOBAL_TRIE_LOOP
1355#ifdef GLOBAL_TRIE_FOR_SUBTERMS
1357answer_search_global_trie_terms_loop(Term t,
int *vars_arity_ptr,
1358 CELL *stack_terms USES_REGS) {
1361answer_search_global_trie_loop(Term t,
int *vars_arity_ptr USES_REGS) {
1364#ifdef MODE_TERMS_LOOP
1367 int *vars_arity_ptr USES_REGS) {
1371 int *vars_arity_ptr USES_REGS) {
1403#ifdef MODE_GLOBAL_TRIE_LOOP
1406 int vars_arity = *vars_arity_ptr;
1407#if !defined(MODE_GLOBAL_TRIE_LOOP) || !defined(GLOBAL_TRIE_FOR_SUBTERMS)
1408 CELL *stack_terms = (CELL *)LOCAL_TrailTop;
1410 CELL *stack_vars_base = (CELL *)TR;
1411#define stack_terms_limit (stack_vars_base + vars_arity)
1412#ifdef TRIE_COMPACT_PAIRS
1417 AUX_STACK_CHECK_EXPAND(
1418 stack_terms, stack_terms_limit + 1);
1420 STACK_PUSH_UP(NULL, stack_terms);
1422#if defined(MODE_GLOBAL_TRIE_LOOP)
1425 goto answer_search_loop_non_atomic;
1428#ifdef TRIE_RATIONAL_TERMS
1431 term_array_init(&Ts, 10);
1437 if (IsTableVarTerm(t)) {
1438 t = MakeTableVarTerm(VarIndexOfTerm(t));
1439 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, t,
1440 _trie_retry_val + in_pair);
1442 if (vars_arity == MAX_TABLE_VARS)
1443 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
1444 "answer_search_loop: MAX_TABLE_VARS exceeded");
1445 stack_vars_base[vars_arity] = t;
1446 *((CELL *)t) = GLOBAL_table_var_enumerator(vars_arity);
1447 t = MakeTableVarTerm(vars_arity);
1448 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, t,
1449 _trie_retry_var + in_pair);
1450 vars_arity = vars_arity + 1;
1452#ifdef TRIE_COMPACT_PAIRS
1455 }
else if (IsAtomOrIntTerm(t)) {
1456 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, t,
1457 _trie_retry_atom + in_pair);
1458#ifdef TRIE_COMPACT_PAIRS
1461#ifdef MODE_TERMS_LOOP
1464#ifdef GLOBAL_TRIE_FOR_SUBTERMS
1465 entry_node = answer_search_global_trie_terms_loop(t, &vars_arity,
1466 stack_terms PASS_REGS);
1468 entry_node = answer_search_global_trie_loop(t, &vars_arity PASS_REGS);
1470 current_node = answer_trie_check_insert_gt_entry(
1471 sg_fr, current_node, (Term)entry_node,
1472 _trie_retry_gterm + in_pair PASS_REGS);
1475#ifdef TRIE_RATIONAL_TERMS
1476 if (IsRationalTerm(t)) {
1477 t = STACK_POP_DOWN(stack_terms);
1478 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, t,
1483#if defined(MODE_GLOBAL_TRIE_LOOP)
1485 answer_search_loop_non_atomic:
1487#ifdef TRIE_COMPACT_PAIRS
1488 if (IsPairTerm(t)) {
1489#ifdef TRIE_RATIONAL_TERMS
1492 CELL *aux_pair = RepPair(t);
1493 if (aux_pair == PairTermMark) {
1494 t = STACK_POP_DOWN(stack_terms);
1495#ifdef TRIE_RATIONAL_TERMS
1496 if (IsPairTerm(t) && !IsRationalTerm(t)) {
1497 term_array_push(&Ts, (
void *)t, (
void *)current_node);
1499 if (IsPairTerm(t)) {
1501 aux_pair = RepPair(t);
1502 t = Deref(aux_pair[1]);
1503#ifdef TRIE_RATIONAL_TERMS
1504 if (IsVarTerm(aux_pair[1]) || IsPairTerm(aux_pair[1])) {
1505 CyclicTerm = term_array_member(Ts, (
void *)t);
1507 if (CyclicTerm != NULL) {
1508 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1509 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1510 STACK_PUSH_UP(AbsPair(PairTermMark), stack_terms);
1515 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, CompactPairEndList,
1523 STACK_PUSH_UP(t, stack_terms);
1524 STACK_PUSH_UP(AbsPair(PairTermMark), stack_terms);
1527#ifdef TRIE_RATIONAL_TERMS
1529 if (IsVarTerm(aux_pair[0]) || IsPairTerm(aux_pair[0]))
1530 CyclicTerm = term_array_member(Ts, (
void *)Deref(aux_pair[0]));
1531 if (CyclicTerm != NULL) {
1532 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1533 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1536 STACK_PUSH_UP(Deref(aux_pair[0]), stack_terms);
1538 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, CompactPairEndTerm,
1540 STACK_PUSH_UP(t, stack_terms);
1542#if defined(MODE_GLOBAL_TRIE_LOOP) && defined(GLOBAL_TRIE_FOR_SUBTERMS)
1543 }
else if (current_node != GLOBAL_root_gt) {
1544 gt_node_ptr entry_node = answer_search_global_trie_terms_loop(
1545 t, &vars_arity, stack_terms PASS_REGS);
1546 current_node = global_trie_check_insert_gt_entry(
1547 current_node, (Term)entry_node PASS_REGS);
1550#ifdef TRIE_RATIONAL_TERMS
1551 term_array_push(&Ts, (
void *)t, (
void *)current_node);
1553 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, CompactPairInit,
1554 _trie_retry_null + in_pair);
1555 t = Deref(aux_pair[1]);
1556#ifdef TRIE_RATIONAL_TERMS
1557 if (IsVarTerm(aux_pair[1]) || IsPairTerm(aux_pair[1])) {
1558 CyclicTerm = term_array_member(Ts, (
void *)t);
1560 if (CyclicTerm != NULL) {
1561 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1562 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1563 STACK_PUSH_UP(AbsPair(PairTermMark), stack_terms);
1568 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, CompactPairEndList,
1572 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 2);
1573 STACK_PUSH_UP(t, stack_terms);
1574 STACK_PUSH_UP(AbsPair(PairTermMark), stack_terms);
1577#ifdef TRIE_RATIONAL_TERMS
1579 if (IsVarTerm(aux_pair[0]) || IsPairTerm(aux_pair[0]))
1580 CyclicTerm = term_array_member(Ts, (
void *)Deref(aux_pair[0]));
1581 if (CyclicTerm != NULL) {
1582 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1583 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1586 STACK_PUSH_UP(Deref(aux_pair[0]), stack_terms);
1588#if defined(MODE_GLOBAL_TRIE_LOOP) && defined(GLOBAL_TRIE_FOR_SUBTERMS)
1589 }
else if (current_node != GLOBAL_root_gt) {
1590 gt_node_ptr entry_node = answer_search_global_trie_terms_loop(
1591 t, &vars_arity, stack_terms PASS_REGS);
1592 current_node = global_trie_check_insert_gt_entry(
1593 current_node, (Term)entry_node PASS_REGS);
1596#if defined(MODE_GLOBAL_TRIE_LOOP) && defined(GLOBAL_TRIE_FOR_SUBTERMS)
1597 if (current_node != GLOBAL_root_gt) {
1598 gt_node_ptr entry_node = answer_search_global_trie_terms_loop(
1599 t, &vars_arity, stack_terms PASS_REGS);
1600 current_node = global_trie_check_insert_gt_entry(
1601 current_node, (Term)entry_node PASS_REGS);
1604 if (IsPairTerm(t)) {
1605 CELL *aux_pair = RepPair(t);
1606 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, AbsPair(NULL),
1608 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 1);
1609 STACK_PUSH_UP(Deref(aux_pair[1]), stack_terms);
1610 STACK_PUSH_UP(Deref(aux_pair[0]), stack_terms);
1612 }
else if (IsApplTerm(t)) {
1614 if (f == FunctorDouble) {
1616 Term t_dbl[
sizeof(Float) /
sizeof(Term)];
1619 u.dbl = FloatOfTerm(t);
1620 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, AbsAppl((Term *)f),
1621 _trie_retry_null + in_pair);
1622#if SIZEOF_DOUBLE == 2 * SIZEOF_INT_P
1623 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, u.t_dbl[1],
1624 _trie_retry_extension);
1626 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, u.t_dbl[0],
1627 _trie_retry_extension);
1628 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, AbsAppl((Term *)f),
1629 _trie_retry_double);
1630 }
else if (f == FunctorLongInt) {
1631 Int li = LongIntOfTerm(t);
1632 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, AbsAppl((Term *)f),
1633 _trie_retry_null + in_pair);
1634 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, li,
1635 _trie_retry_extension);
1636 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, AbsAppl((Term *)f),
1637 _trie_retry_longint);
1638 }
else if (f == FunctorBigInt || f == FunctorString) {
1639 CELL *opq = Yap_HeapStoreOpaqueTerm(t);
1640 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, AbsAppl((Term *)f),
1641 _trie_retry_null + in_pair);
1642 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, (CELL)opq,
1643 _trie_retry_extension);
1644 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, AbsAppl((Term *)f),
1645 _trie_retry_bigint);
1646 }
else if (f == FunctorDBRef) {
1647 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
1648 "answer_search_loop: unsupported type tag FunctorDBRef");
1650#ifdef TRIE_RATIONAL_TERMS
1651 term_array_push(&Ts, (
void *)t, (
void *)current_node);
1654 CELL *aux_appl = RepAppl(t);
1655 ANSWER_CHECK_INSERT_ENTRY(sg_fr, current_node, AbsAppl((Term *)f),
1656 _trie_retry_appl + in_pair);
1657 AUX_STACK_CHECK_EXPAND(stack_terms,
1658 stack_terms_limit + ArityOfFunctor(f) - 1);
1659 for (i = ArityOfFunctor(f); i >= 1; i--) {
1660#ifdef TRIE_RATIONAL_TERMS
1662 if (IsVarTerm(aux_appl[i]) || IsApplTerm(aux_appl[i]))
1663 CyclicTerm = term_array_member(Ts, (
void *)Deref(aux_appl[i]));
1664 if (CyclicTerm != NULL) {
1665 STACK_PUSH_UP((Term)CyclicTerm, stack_terms);
1666 STACK_PUSH_UP((Term)RationalMark, stack_terms);
1669 STACK_PUSH_UP(Deref(aux_appl[i]), stack_terms);
1672#ifdef TRIE_COMPACT_PAIRS
1676 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
1677 "answer_search_loop: unknown type tag");
1680 t = STACK_POP_DOWN(stack_terms);
1682#ifdef TRIE_RATIONAL_TERMS
1683 term_array_free(&Ts);
1685 *vars_arity_ptr = vars_arity;
1686 return current_node;
1688#undef stack_terms_limit
1689#ifndef TRIE_COMPACT_PAIRS
1699#ifdef INCLUDE_ANSWER_SEARCH_MODE_DIRECTED
1702 Term t,
int mode USES_REGS) {
1705 Term trie_value = 0, term_value = t;
1709 child_node = TrNode_child(current_node);
1710 child_term = TrNode_entry(child_node);
1711 if (IsIntTerm(child_term)) {
1712 trie_value = child_term;
1713 }
else if (IsApplTerm(child_term)) {
1715 child_node = TrNode_child(child_node);
1716 if (f == FunctorLongInt) {
1717 trie_value = MkLongIntTerm((Int)TrNode_entry(child_node));
1718 }
else if (f == FunctorDouble) {
1720 Term t_dbl[
sizeof(Float) /
sizeof(Term)];
1723 u.t_dbl[0] = TrNode_entry(child_node);
1724#if SIZEOF_DOUBLE == 2 * SIZEOF_INT_P
1725 child_node = TrNode_child(child_node);
1726 u.t_dbl[1] = TrNode_entry(child_node);
1728 trie_value = MkFloatTerm(u.dbl);
1729 }
else if (f == FunctorBigInt) {
1730 trie_value = AbsAppl((CELL *)TrNode_entry(child_node));
1732 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
1733 "answer_search_min_max: invalid arithmetic value");
1734 child_node = TrNode_child(child_node);
1737 cmp = Yap_acmp(term_value, trie_value PASS_REGS);
1739 if ((mode == MODE_DIRECTED_MIN && cmp > 0) ||
1740 (mode == MODE_DIRECTED_MAX && cmp < 0))
1746 if (IsAtomOrIntTerm(t)) {
1747 ANSWER_SAFE_INSERT_ENTRY(current_node, t, _trie_retry_atom);
1748 }
else if (IsApplTerm(t)) {
1750 if (f == FunctorDouble) {
1752 Term t_dbl[
sizeof(Float) /
sizeof(Term)];
1755 u.dbl = FloatOfTerm(t);
1756 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1758#if SIZEOF_DOUBLE == 2 * SIZEOF_INT_P
1759 ANSWER_SAFE_INSERT_ENTRY(current_node, u.t_dbl[1], _trie_retry_extension);
1761 ANSWER_SAFE_INSERT_ENTRY(current_node, u.t_dbl[0], _trie_retry_extension);
1762 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1763 _trie_retry_double);
1764 }
else if (f == FunctorLongInt) {
1765 Int li = LongIntOfTerm(t);
1766 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1768 ANSWER_SAFE_INSERT_ENTRY(current_node, li, _trie_retry_extension);
1769 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1770 _trie_retry_longint);
1771 }
else if (f == FunctorBigInt) {
1772 CELL *li = Yap_HeapStoreOpaqueTerm(t);
1773 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1775 ANSWER_SAFE_INSERT_ENTRY(current_node, (CELL)li, _trie_retry_extension);
1776 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1777 _trie_retry_bigint);
1780 return current_node;
1788#ifdef INCLUDE_ANSWER_SEARCH_MODE_DIRECTED
1794 Term trie_value = 0, term_value = t, sum_value = 0;
1797 child_node = TrNode_child(current_node);
1798 child_term = TrNode_entry(child_node);
1799 if (IsIntTerm(child_term)) {
1800 trie_value = child_term;
1801 }
else if (IsApplTerm(child_term)) {
1803 child_node = TrNode_child(child_node);
1804 if (f == FunctorLongInt) {
1805 trie_value = MkLongIntTerm((Int)TrNode_entry(child_node));
1806 }
else if (f == FunctorDouble) {
1808 Term t_dbl[
sizeof(Float) /
sizeof(Term)];
1811 u.t_dbl[0] = TrNode_entry(child_node);
1812#if SIZEOF_DOUBLE == 2 * SIZEOF_INT_P
1813 child_node = TrNode_child(child_node);
1814 u.t_dbl[1] = TrNode_entry(child_node);
1816 trie_value = MkFloatTerm(u.dbl);
1817 }
else if (f == FunctorBigInt) {
1818 trie_value = AbsAppl((CELL *)TrNode_entry(child_node));
1820 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
1821 "answer_search_min_max: invalid arithmetic value");
1822 child_node = TrNode_child(child_node);
1825 sum_value = p_plus(trie_value, term_value PASS_REGS);
1826 if (IsAtomOrIntTerm(sum_value)) {
1827 ANSWER_SAFE_INSERT_ENTRY(current_node, sum_value, _trie_retry_atom);
1828 }
else if (IsApplTerm(sum_value)) {
1829 Functor f = FunctorOfTerm(sum_value);
1830 if (f == FunctorDouble) {
1832 Term t_dbl[
sizeof(Float) /
sizeof(Term)];
1835 u.dbl = FloatOfTerm(sum_value);
1836 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1838#if SIZEOF_DOUBLE == 2 * SIZEOF_INT_P
1839 ANSWER_SAFE_INSERT_ENTRY(current_node, u.t_dbl[1], _trie_retry_extension);
1841 ANSWER_SAFE_INSERT_ENTRY(current_node, u.t_dbl[0], _trie_retry_extension);
1842 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1843 _trie_retry_double);
1844 }
else if (f == FunctorLongInt) {
1845 Int li = LongIntOfTerm(sum_value);
1846 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1848 ANSWER_SAFE_INSERT_ENTRY(current_node, li, _trie_retry_extension);
1849 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1850 _trie_retry_longint);
1851 }
else if (f == FunctorBigInt) {
1852 CELL *li = Yap_HeapStoreOpaqueTerm(sum_value);
1853 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1855 ANSWER_SAFE_INSERT_ENTRY(current_node, (CELL)li, _trie_retry_extension);
1856 ANSWER_SAFE_INSERT_ENTRY(current_node, AbsAppl((Term *)f),
1857 _trie_retry_bigint);
1860 return current_node;
1868#ifdef INCLUDE_ANSWER_SEARCH_MODE_DIRECTED
1870 int position USES_REGS) {
1871 if (IS_ANSWER_TRIE_HASH(current_node)) {
1875 bucket = Hash_buckets(hash);
1876 last_bucket =
bucket + Hash_num_buckets(hash);
1881 if (IS_ANSWER_LEAF_NODE(current_node)) {
1882 INVALIDATE_ANSWER_TRIE_LEAF_NODE(current_node, sg_fr);
1884 invalidate_answer_trie(TrNode_child(current_node), sg_fr,
1885 TRAVERSE_POSITION_FIRST PASS_REGS);
1886 INVALIDATE_ANSWER_TRIE_NODE(current_node, sg_fr);
1889 current_node = next_node;
1890 next_node = TrNode_next(current_node);
1891 invalidate_answer_trie(current_node, sg_fr,
1892 TRAVERSE_POSITION_NEXT PASS_REGS);
1895 }
while (++
bucket != last_bucket);
1896 if (Hash_next(hash))
1897 Hash_previous(Hash_next(hash)) = Hash_previous(hash);
1898 if (Hash_previous(hash))
1899 Hash_next(Hash_previous(hash)) = Hash_next(hash);
1901 SgFr_hash_chain(sg_fr) = Hash_next(hash);
1902 FREE_BUCKETS(Hash_buckets(hash));
1903 FREE_ANSWER_TRIE_HASH(hash);
1905 if (position == TRAVERSE_POSITION_FIRST) {
1907 if (IS_ANSWER_LEAF_NODE(current_node)) {
1908 INVALIDATE_ANSWER_TRIE_LEAF_NODE(current_node, sg_fr);
1910 invalidate_answer_trie(TrNode_child(current_node), sg_fr,
1911 TRAVERSE_POSITION_FIRST PASS_REGS);
1912 INVALIDATE_ANSWER_TRIE_NODE(current_node, sg_fr);
1915 current_node = next_node;
1916 next_node = TrNode_next(current_node);
1917 invalidate_answer_trie(current_node, sg_fr,
1918 TRAVERSE_POSITION_NEXT PASS_REGS);
1921 if (IS_ANSWER_LEAF_NODE(current_node)) {
1922 INVALIDATE_ANSWER_TRIE_LEAF_NODE(current_node, sg_fr);
1924 invalidate_answer_trie(TrNode_child(current_node), sg_fr,
1925 TRAVERSE_POSITION_FIRST PASS_REGS);
1926 INVALIDATE_ANSWER_TRIE_NODE(current_node, sg_fr);
1938#ifdef INCLUDE_LOAD_ANSWER_LOOP
1939#ifdef MODE_GLOBAL_TRIE_LOOP
1940static inline CELL *load_substitution_loop(
gt_node_ptr current_node,
1941 int *vars_arity_ptr,
1942 CELL *stack_terms USES_REGS) {
1944static inline CELL *load_answer_loop(
ans_node_ptr current_node USES_REGS) {
1974#ifdef MODE_GLOBAL_TRIE_LOOP
1975 int vars_arity = *vars_arity_ptr;
1978 CELL *stack_terms = (CELL *)LOCAL_TrailTop;
1980 CELL *stack_vars_base = (CELL *)TR;
1981#define stack_terms_limit (stack_vars_base + vars_arity)
1982#ifdef TRIE_COMPACT_PAIRS
1983#define stack_terms_base ((CELL *)LOCAL_TrailTop)
1984 int stack_terms_pair_offset = 0;
1986 Term t = TrNode_entry(current_node);
1987#ifdef MODE_GLOBAL_TRIE_LOOP
1988 current_node = TrNode_parent(current_node);
1990 current_node = (
ans_node_ptr)UNTAG_ANSWER_NODE(TrNode_parent(current_node));
1993#ifdef TRIE_RATIONAL_TERMS
1996 term_array_init(&Ts, 10);
1997 Term RationalTermTMP;
2001#ifdef TRIE_RATIONAL_TERMS
2002 CyclicTerm = term_array_member(Ts, (
void *)current_node);
2005#ifdef TRIE_RATIONAL_TERMS
2006 if (t > VarIndexOfTableTerm(MAX_TABLE_VARS) &&
2011 RationalTermTMP = (Term)term_array_member(Ts, (
void *)t);
2012 if (RationalTermTMP) {
2014 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit);
2015 STACK_PUSH_UP(RationalTermTMP, stack_terms);
2017 RationalTermTMP = MkVarTerm();
2018 STACK_PUSH_UP(RationalTermTMP, stack_terms);
2020 term_array_push(&Ts, (
void *)t, (
void *)RationalTermTMP);
2025#if !defined(MODE_GLOBAL_TRIE_LOOP) || defined(GLOBAL_TRIE_FOR_SUBTERMS)
2026 if (t > VarIndexOfTableTerm(MAX_TABLE_VARS)) {
2027 stack_terms = load_substitution_loop((
gt_node_ptr)t, &vars_arity,
2028 stack_terms PASS_REGS);
2032 int var_index = VarIndexOfTableTerm(t);
2033 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit - vars_arity +
2035 if (var_index >= vars_arity) {
2036 while (vars_arity < var_index)
2037 stack_vars_base[vars_arity++] = 0;
2038 stack_vars_base[vars_arity++] = MkVarTerm();
2039 }
else if (stack_vars_base[var_index] == 0)
2040 stack_vars_base[var_index] = MkVarTerm();
2041 STACK_PUSH_UP(stack_vars_base[var_index], stack_terms);
2044 }
else if (IsAtomOrIntTerm(t)) {
2045 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit);
2046#ifdef TRIE_RATIONAL_TERMS
2048 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 4);
2049 STACK_PUSH_UP((Term)RationalMark, stack_terms);
2053 STACK_PUSH_UP(t, stack_terms);
2057 STACK_PUSH_UP((Term)RationalMark, stack_terms);
2063 STACK_PUSH_UP(t, stack_terms);
2064 }
else if (IsPairTerm(t)) {
2065#ifdef TRIE_COMPACT_PAIRS
2066 if (t == CompactPairInit) {
2067 Term *stack_aux = stack_terms_base - stack_terms_pair_offset;
2068 Term head, tail = STACK_POP_UP(stack_aux);
2069#ifdef TRIE_RATIONAL_TERMS
2070 if (IsRationalTerm(tail)) {
2071 Yap_Error(SYSTEM_ERROR_INTERNAL, tail,
"Rational element of a "
2072 "Rational Term appears as the "
2073 "first Tail of a list");
2076 while (STACK_NOT_EMPTY(stack_aux, stack_terms)) {
2077 head = STACK_POP_UP(stack_aux);
2078#ifdef TRIE_RATIONAL_TERMS
2079 if (IsRationalTerm(head)) {
2080 head = STACK_POP_UP(stack_aux);
2082 STACK_POP_UP(stack_aux);
2083 (void)STACK_POP_UP(stack_aux);
2084 tail = MkPairTerm(head, tail);
2085 Yap_unify(RationalTermTMP, tail);
2088 tail = MkPairTerm(head, tail);
2090 stack_terms = stack_terms_base - stack_terms_pair_offset;
2091 stack_terms_pair_offset = (int)STACK_POP_DOWN(stack_terms);
2092 STACK_PUSH_UP(tail, stack_terms);
2095 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit + 1);
2096 last = STACK_POP_DOWN(stack_terms);
2097#ifdef TRIE_RATIONAL_TERMS
2098 RationalTermTMP = TermNil;
2099 if (IsRationalTerm(last)) {
2101 RationalTermTMP = STACK_POP_DOWN(stack_terms);
2104 last = STACK_POP_DOWN(stack_terms);
2105 (void)STACK_POP_DOWN(stack_terms);
2108 STACK_PUSH_UP(stack_terms_pair_offset, stack_terms);
2109 stack_terms_pair_offset = (int)(stack_terms_base - stack_terms);
2110 if (t == CompactPairEndList)
2111 STACK_PUSH_UP(TermNil, stack_terms);
2112#ifdef TRIE_RATIONAL_TERMS
2113 if (RationalTermTMP && RationalTermTMP != TermNil) {
2115 STACK_PUSH_UP((Term)RationalMark, stack_terms);
2116 STACK_PUSH_UP(last, stack_terms);
2117 STACK_PUSH_UP(RationalTermTMP, stack_terms);
2118 STACK_PUSH_UP((Term)RationalMark, stack_terms);
2121 STACK_PUSH_UP(last, stack_terms);
2124 Term head = STACK_POP_DOWN(stack_terms);
2125 Term tail = STACK_POP_DOWN(stack_terms);
2126 t = MkPairTerm(head, tail);
2127 STACK_PUSH_UP(t, stack_terms);
2129 }
else if (IsApplTerm(t)) {
2131 if (f == FunctorDouble) {
2133 Term t_dbl[
sizeof(Float) /
sizeof(Term)];
2136 t = TrNode_entry(current_node);
2137 current_node = TrNode_parent(current_node);
2139#if SIZEOF_DOUBLE == 2 * SIZEOF_INT_P
2140 t = TrNode_entry(current_node);
2141 current_node = TrNode_parent(current_node);
2144 current_node = TrNode_parent(current_node);
2145 t = MkFloatTerm(u.dbl);
2146 }
else if (f == FunctorLongInt) {
2147 Int li = TrNode_entry(current_node);
2148 current_node = TrNode_parent(current_node);
2149 current_node = TrNode_parent(current_node);
2150 t = MkLongIntTerm(li);
2151 }
else if (f == FunctorBigInt || f == FunctorString) {
2152 CELL *ptr = (CELL *)TrNode_entry(current_node);
2153 current_node = TrNode_parent(current_node);
2154 current_node = TrNode_parent(current_node);
2157 int f_arity = ArityOfFunctor(f);
2158 t = Yap_MkApplTerm(f, f_arity, stack_terms);
2159 stack_terms += f_arity;
2161 AUX_STACK_CHECK_EXPAND(stack_terms, stack_terms_limit);
2162 STACK_PUSH_UP(t, stack_terms);
2164#ifdef TRIE_RATIONAL_TERMS
2166 RationalTermTMP = STACK_POP_DOWN(stack_terms);
2168 IsRationalTerm(RationalTermTMP) {
2171 else if (IsPairTerm(RationalTermTMP)) {
2172 Yap_unify((Term)CyclicTerm, RationalTermTMP);
2173 }
else if (IsApplTerm(RationalTermTMP)) {
2174 Yap_unify((Term)CyclicTerm, RationalTermTMP);
2176 STACK_PUSH_UP(RationalTermTMP, stack_terms);
2178 RationalTermTMP = TermNil;
2181 t = TrNode_entry(current_node);
2182 current_node = TrNode_parent(current_node);
2183 }
while (current_node);
2184#ifdef TRIE_RATIONAL_TERMS
2185 term_array_free(&Ts);
2187#ifdef MODE_GLOBAL_TRIE_LOOP
2188 *vars_arity_ptr = vars_arity;
2192#undef stack_terms_limit
2193#ifdef TRIE_COMPACT_PAIRS
2194#undef stack_terms_base
2203#undef INCREMENT_GLOBAL_TRIE_REFERENCE
2204#undef NEW_SUBGOAL_TRIE_NODE
2205#undef NEW_ANSWER_TRIE_NODE
2206#undef NEW_GLOBAL_TRIE_NODE
2207#undef SUBGOAL_CHECK_INSERT_ENTRY
2208#undef ANSWER_CHECK_INSERT_ENTRY