00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "xsb_config.h"
00028 #include "xsb_debug.h"
00029
00030 #include <stdio.h>
00031 #include <stdlib.h>
00032
00033
00034 #include "debugs/debug_delay.h"
00035
00036 #include "auxlry.h"
00037 #include "cell_xsb.h"
00038 #include "psc_xsb.h"
00039 #include "register.h"
00040 #include "trie_internals.h"
00041 #include "memory_xsb.h"
00042 #include "choice.h"
00043 #include "macro_xsb.h"
00044 #include "tr_utils.h"
00045 #include "inst_xsb.h"
00046 #include "error_xsb.h"
00047 #include "io_builtins_xsb.h"
00048 #include "thread_xsb.h"
00049
00050 static void simplify_neg_succeeds(CTXTdeclc VariantSF);
00051 extern void simplify_pos_unsupported(CTXTdeclc NODEptr);
00052 static void simplify_pos_unconditional(CTXTdeclc NODEptr);
00053
00054
00055
00056
00057
00058
00059 static unsigned long de_block_size_glc = 2048 * sizeof(struct delay_element);
00060 static unsigned long dl_block_size_glc = 2048 * sizeof(struct delay_list);
00061 static unsigned long pnde_block_size_glc = 2048 *sizeof(struct pos_neg_de_list);
00062
00063
00064 static char *current_de_block_gl = NULL;
00065 static char *current_dl_block_gl = NULL;
00066 static char *current_pnde_block_gl = NULL;
00067
00068 static DE released_des_gl = NULL;
00069 static DL released_dls_gl = NULL;
00070 static PNDE released_pndes_gl = NULL;
00071
00072 static DE next_free_de_gl = NULL;
00073 static DL next_free_dl_gl = NULL;
00074 static PNDE next_free_pnde_gl = NULL;
00075
00076 static DE current_de_block_top_gl = NULL;
00077 static DL current_dl_block_top_gl = NULL;
00078 static PNDE current_pnde_block_top_gl = NULL;
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 #define new_entry(NEW_ENTRY, \
00097 RELEASED, \
00098 NEXT_FREE, \
00099 CURRENT_BLOCK, \
00100 CURRENT_BLOCK_TOP, \
00101 NEXT_FUNCTION, \
00102 ENTRY_TYPE, \
00103 BLOCK_SIZE, \
00104 ABORT_MESG) \
00105 if (RELEASED) { \
00106 NEW_ENTRY = RELEASED; \
00107 RELEASED = NEXT_FUNCTION(RELEASED); \
00108 } \
00109 else if (NEXT_FREE < CURRENT_BLOCK_TOP) \
00110 NEW_ENTRY = NEXT_FREE++; \
00111 else { \
00112 char *new_block; \
00113 if ((new_block = (char *) mem_alloc(BLOCK_SIZE + sizeof(Cell),TABLE_SPACE)) == NULL)\
00114 xsb_abort(ABORT_MESG); \
00115 *(char **) new_block = CURRENT_BLOCK; \
00116 CURRENT_BLOCK = new_block; \
00117 NEXT_FREE = (ENTRY_TYPE)(new_block + sizeof(Cell)); \
00118 CURRENT_BLOCK_TOP = (ENTRY_TYPE)(new_block + sizeof(Cell) + BLOCK_SIZE);\
00119 NEW_ENTRY = NEXT_FREE++; \
00120 }
00121
00122 #define release_entry(ENTRY_TO_BE_RELEASED, \
00123 RELEASED, \
00124 NEXT_FUNCTION) { \
00125 NEXT_FUNCTION(ENTRY_TO_BE_RELEASED) = RELEASED; \
00126 RELEASED = ENTRY_TO_BE_RELEASED; \
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 #define remove_pnde(PNDE_HEAD, PNDE_ITEM) { \
00139 PNDE *pnde_head_ptr; \
00140 PNDE next; \
00141 \
00142 pnde_head_ptr = &(PNDE_HEAD); \
00143 next = pnde_next(PNDE_ITEM); \
00144 if (*pnde_head_ptr == PNDE_ITEM) \
00145 *pnde_head_ptr = next; \
00146 else { \
00147 pnde_next(pnde_prev(PNDE_ITEM)) = next; \
00148 if (next) \
00149 pnde_prev(next) = pnde_prev(PNDE_ITEM); \
00150 } \
00151 release_entry(PNDE_ITEM, released_pndes_gl, pnde_next); \
00152 }
00153
00154
00155
00156
00157
00158
00159
00160 unsigned long allocated_de_space(int * num_blocks)
00161 {
00162 int size = 0;
00163 char *t = current_de_block_gl;
00164
00165 *num_blocks = 0;
00166 SYS_MUTEX_LOCK_NOERROR( MUTEX_DELAY ) ;
00167 while (t) {
00168 (*num_blocks)++;
00169 size =+ (de_block_size_glc + sizeof(Cell));
00170 t = *(char **)t;
00171 }
00172 SYS_MUTEX_UNLOCK_NOERROR( MUTEX_DELAY ) ;
00173 return size;
00174 }
00175
00176 static int released_de_num(void)
00177 {
00178 int i = 0;
00179 DE p;
00180
00181 p = released_des_gl;
00182 SYS_MUTEX_LOCK_NOERROR( MUTEX_DELAY ) ;
00183 while (p != NULL) {
00184 i++;
00185 p = de_next(p);
00186 }
00187 SYS_MUTEX_UNLOCK_NOERROR( MUTEX_DELAY ) ;
00188 return(i);
00189 }
00190
00191 unsigned long unused_de_space(void)
00192 {
00193 return (current_de_block_top_gl
00194 - next_free_de_gl
00195 + released_de_num()) * sizeof(struct delay_element);
00196 }
00197
00198
00199 unsigned long allocated_dl_space(int * num_blocks)
00200 {
00201 int size = 0;
00202 char *t = current_dl_block_gl;
00203
00204 *num_blocks = 0;
00205 SYS_MUTEX_LOCK_NOERROR( MUTEX_DELAY ) ;
00206 while (t) {
00207 (*num_blocks)++;
00208 size =+ (dl_block_size_glc + sizeof(Cell));
00209 t = *(char **)t;
00210 }
00211 SYS_MUTEX_UNLOCK_NOERROR( MUTEX_DELAY ) ;
00212 return size;
00213 }
00214
00215 static int released_dl_num(void)
00216 {
00217 int i = 0;
00218 DL p;
00219
00220 p = released_dls_gl;
00221 SYS_MUTEX_LOCK_NOERROR( MUTEX_DELAY ) ;
00222 while (p != NULL) {
00223 i++;
00224 p = dl_next(p);
00225 }
00226 SYS_MUTEX_UNLOCK_NOERROR( MUTEX_DELAY ) ;
00227 return(i);
00228 }
00229
00230 unsigned long unused_dl_space(void)
00231 {
00232 return (current_dl_block_top_gl
00233 - next_free_dl_gl
00234 + released_dl_num()) * sizeof(struct delay_list);
00235 }
00236
00237
00238
00239
00240
00241
00242 static DE intern_delay_element(CTXTdeclc Cell delay_elem)
00243 {
00244 DE de;
00245 CPtr cptr = (CPtr) cs_val(delay_elem);
00246
00247
00248
00249
00250
00251 VariantSF subgoal;
00252 NODEptr ans_subst;
00253 CPtr ret_n = 0;
00254 int arity;
00255 Cell tmp_cell;
00256
00257 tmp_cell = cell(cptr + 1);
00258 subgoal = (VariantSF) addr_val(tmp_cell);
00259 tmp_cell = cell(cptr + 2);
00260 ans_subst = (NODEptr) addr_val(tmp_cell);
00261 tmp_cell = cell(cptr + 3);
00262
00263
00264
00265
00266
00267
00268
00269 if (isinteger(tmp_cell) || isstring(tmp_cell))
00270 arity = 0;
00271 else {
00272 ret_n = (CPtr) cs_val(tmp_cell);
00273 arity = get_arity((Psc) get_str_psc(cell(cptr + 3)));
00274 }
00275
00276 #ifdef DEBUG_DELAYVAR
00277 xsb_dbgmsg((LOG_DEBUG,">>>> "));
00278 dbg_print_delay_list(LOG_DEBUG,stddbg, delayreg);
00279 xsb_dbgmsg((LOG_DEBUG, "\n"));
00280 xsb_dbgmsg((LOG_DEBUG, ">>>> (Intern ONE de) arity of answer subsf = %d\n",
00281 arity));
00282 #endif
00283
00284 if (!was_simplifiable(subgoal, ans_subst)) {
00285 new_entry(de,
00286 released_des_gl,
00287 next_free_de_gl,
00288 current_de_block_gl,
00289 current_de_block_top_gl,
00290 de_next,
00291 DE,
00292 de_block_size_glc,
00293 "Not enough memory to expand DE space");
00294 de_subgoal(de) = subgoal;
00295 de_ans_subst(de) = ans_subst;
00296
00297 #ifdef DEBUG_DELAYVAR
00298 de_subs_fact(de) = NULL;
00299 #ifndef IGNORE_DELAYVAR
00300 if (arity != 0) {
00301 de_subs_fact_leaf(de) = delay_chk_insert(arity, ret_n + 1,
00302 (CPtr *) &de_subs_fact(de));
00303 }
00304 #endif
00305 #else
00306 #ifndef IGNORE_DELAYVAR
00307 if (arity != 0) {
00308 CPtr hook = NULL;
00309 de_subs_fact_leaf(de) = delay_chk_insert(CTXTc arity, ret_n + 1,
00310 &hook);
00311 }
00312 #endif
00313 #endif
00314 return de;
00315 }
00316 else
00317 return NULL;
00318 }
00319
00320
00321
00322
00323
00324
00325
00326 static DL intern_delay_list(CTXTdeclc CPtr dlist)
00327 {
00328 DE head = NULL, de;
00329 DL dl = NULL;
00330
00331 while (islist(dlist)) {
00332 dlist = clref_val(dlist);
00333 if ((de = intern_delay_element(CTXTc cell(dlist))) != NULL) {
00334 de_next(de) = head;
00335 head = de;
00336 }
00337 dlist = (CPtr) cell(dlist+1);
00338 }
00339 if (head) {
00340 new_entry(dl,
00341 released_dls_gl,
00342 next_free_dl_gl,
00343 current_dl_block_gl,
00344 current_dl_block_top_gl,
00345 dl_next,
00346 DL,
00347 dl_block_size_glc,
00348 "Not enough memory to expand DL space");
00349 dl_de_list(dl) = head;
00350 dl_asl(dl) = NULL;
00351 return dl;
00352 }
00353 else return NULL;
00354 }
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 static void record_de_usage(DL dl)
00371 {
00372 DE de;
00373 PNDE pnde, current_first;
00374 NODEptr as_leaf;
00375 #ifdef DEBUG_DELAYVAR
00376 PNDE tmp;
00377 #endif
00378
00379 de = dl_de_list(dl);
00380 while (de) {
00381 new_entry(pnde,
00382 released_pndes_gl,
00383 next_free_pnde_gl,
00384 current_pnde_block_gl,
00385 current_pnde_block_top_gl,
00386 pnde_next,
00387 PNDE,
00388 pnde_block_size_glc,
00389 "Not enough memory to expand PNDE space");
00390 pnde_dl(pnde) = dl;
00391 pnde_de(pnde) = de;
00392 pnde_prev(pnde) = NULL;
00393 if ((as_leaf = de_ans_subst(de)) == NULL) {
00394 current_first = subg_nde_list(de_subgoal(de));
00395 #ifdef DEBUG_DELAYVAR
00396 tmp = current_first;
00397 while (tmp) {
00398 if (pnde_de(tmp) == de) {
00399 printf(">>>> ERROR: tmp = %p, tmp->de = %p\n",
00400 tmp, pnde_de(tmp));
00401 }
00402 tmp = pnde_next(tmp);
00403 }
00404 #endif
00405 pnde_next(pnde) = current_first;
00406 if (current_first)
00407 pnde_prev(current_first) = pnde;
00408 subg_nde_list(de_subgoal(de)) = pnde;
00409 }
00410 else {
00411 current_first = asi_pdes(Delay(as_leaf));
00412 pnde_next(pnde) = current_first;
00413 if (current_first)
00414 pnde_prev(current_first) = pnde;
00415 asi_pdes(Delay(as_leaf)) = pnde;
00416 }
00417 de_pnde(de) = pnde;
00418 de = de_next(de);
00419 }
00420 }
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465 void do_delay_stuff(CTXTdeclc NODEptr as_leaf, VariantSF subgoal, xsbBool sf_exists)
00466 {
00467 ASI asi;
00468 DL dl = NULL;
00469
00470 #ifdef DEBUG_DELAYVAR
00471 xsb_dbgmsg((LOG_DEBUG, ">>>> Start do_delay_stuff ...\n"));
00472 xsb_dbgmsg((LOG_DEBUG, ">>>> The delay list for this subgoal itself is:\n"));
00473 xsb_dbgmsg((LOG_DEBUG, ">>>> "));
00474 dbg_print_delay_list(LOG_DEBUG,stddbg, delayreg);
00475 xsb_dbgmsg((LOG_DEBUG, "\n"));
00476 #endif
00477
00478 if (delayreg && (!sf_exists || is_conditional_answer(as_leaf))) {
00479 if ((dl = intern_delay_list(CTXTc delayreg)) != NULL) {
00480 SYS_MUTEX_LOCK( MUTEX_DELAY ) ;
00481 mark_conditional_answer(as_leaf, subgoal, dl);
00482 record_de_usage(dl);
00483 SYS_MUTEX_UNLOCK( MUTEX_DELAY ) ;
00484 }
00485 }
00486
00487
00488
00489 if (sf_exists && is_conditional_answer(as_leaf) &&
00490 (!delayreg || !dl)) {
00491
00492
00493
00494
00495 SYS_MUTEX_LOCK( MUTEX_DELAY ) ;
00496 simplify_pos_unconditional(CTXTc as_leaf);
00497 SYS_MUTEX_UNLOCK( MUTEX_DELAY ) ;
00498 }
00499 if (is_unconditional_answer(as_leaf) && subg_nde_list(subgoal)) {
00500 SYS_MUTEX_LOCK( MUTEX_DELAY ) ;
00501 simplify_neg_succeeds(CTXTc subgoal);
00502 SYS_MUTEX_UNLOCK( MUTEX_DELAY ) ;
00503 }
00504 }
00505
00506
00507
00508 xsbBool answer_is_junk(CPtr dlist)
00509 {
00510 CPtr cptr;
00511 VariantSF subgoal;
00512 NODEptr ans_subst;
00513 Cell tmp_cell;
00514
00515 while (islist(dlist)) {
00516 dlist = clref_val(dlist);
00517 cptr = (CPtr) cs_val(cell(dlist));
00518 tmp_cell = cell(cptr + 1);
00519 subgoal = (VariantSF) addr_val(tmp_cell);
00520 tmp_cell = cell(cptr + 2);
00521 ans_subst = (NODEptr) addr_val(tmp_cell);
00522 if (is_failing_delay_element(subgoal,ans_subst)) {
00523 return TRUE;
00524 }
00525 dlist = (CPtr) cell(dlist+1);
00526 }
00527 return FALSE;
00528 }
00529
00530
00531
00532
00533
00534
00535
00536 static xsbBool remove_de_from_dl(DE de, DL dl)
00537 {
00538 DE current = dl_de_list(dl);
00539 DE prev_de = NULL;
00540
00541 #ifdef DEBUG_DELAYVAR
00542 fprintf(stddbg, ">>>> start remove_de_from_dl()\n");
00543 #endif
00544
00545 while (current != de) {
00546 prev_de = current;
00547 current = de_next(current);
00548 }
00549 if (prev_de == NULL)
00550 dl_de_list(dl) = de_next(current);
00551 else
00552 de_next(prev_de) = de_next(current);
00553 release_entry(current, released_des_gl, de_next);
00554 return (NULL != dl_de_list(dl));
00555 }
00556
00557
00558
00559
00560
00561
00562
00563
00564 static xsbBool remove_dl_from_dl_list(DL dl, ASI asi)
00565 {
00566 DL current = asi_dl_list(asi);
00567 DL prev_dl = NULL;
00568
00569 #ifdef DEBUG_DELAYVAR
00570 fprintf(stddbg, ">>>> start remove_dl_from_dl_list()\n");
00571 #endif
00572
00573 while (current != dl) {
00574 prev_dl = current;
00575 current = dl_next(current);
00576 }
00577 if (prev_dl == NULL)
00578 asi_dl_list(asi) = dl_next(current);
00579 else
00580 dl_next(prev_dl) = dl_next(current);
00581
00582 release_entry(current, released_dls_gl, dl_next);
00583 return (NULL != asi_dl_list(asi));
00584 }
00585
00586
00587
00588
00589
00590
00591
00592 static void handle_empty_dl_creation(CTXTdeclc DL dl)
00593 {
00594 NODEptr as_leaf = dl_asl(dl);
00595 ASI asi = Delay(as_leaf);
00596 VariantSF subgoal;
00597
00598 #ifdef DEBUG_DELAYVAR
00599 fprintf(stddbg, ">>>> start handle_empty_dl_creation()\n");
00600 #endif
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612 if (is_conditional_answer(as_leaf)) {
00613 remove_dl_from_dl_list(dl, asi);
00614 subgoal = asi_subgoal(Delay(as_leaf));
00615 #ifdef DEBUG_DELAYVAR
00616 xsb_dbgmsg((LOG_DEBUG, ">>>> the subgoal is:"));
00617 dbg_print_subgoal(LOG_DEBUG,stddbg, subgoal);
00618 xsb_dbgmsg((LOG_DEBUG, "\n"));
00619 #endif
00620
00621
00622
00623
00624 simplify_pos_unconditional(CTXTc as_leaf);
00625
00626 if (!is_completed(subgoal) && most_general_answer(as_leaf)) {
00627 perform_early_completion(subgoal, subg_cp_ptr(subgoal));
00628 subg_compl_susp_ptr(subgoal) = NULL;
00629 }
00630 simplify_neg_succeeds(CTXTc subgoal);
00631 }
00632 }
00633
00634
00635
00636
00637
00638
00639
00640 static void handle_unsupported_answer_subst(CTXTdeclc NODEptr as_leaf)
00641 {
00642 ASI unsup_asi = Delay(as_leaf);
00643 VariantSF unsup_subgoal = asi_subgoal(unsup_asi);
00644
00645 #ifdef DEBUG_DELAYVAR
00646 fprintf(stddbg, ">>>> start handle_unsupported_answer_subst()\n");
00647 #endif
00648
00649 SET_TRIE_ALLOCATION_TYPE_SF(unsup_subgoal);
00650 delete_branch(CTXTc as_leaf, &subg_ans_root_ptr(unsup_subgoal));
00651 simplify_pos_unsupported(CTXTc as_leaf);
00652 if (is_completed(unsup_subgoal)) {
00653 if (subgoal_fails(unsup_subgoal)) {
00654 simplify_neg_fails(CTXTc unsup_subgoal);
00655 }
00656 }
00657 mem_dealloc(unsup_asi,sizeof(struct AS_info),TABLE_SPACE);
00658 }
00659
00660
00661
00662
00663
00664 void release_all_dls(ASI asi)
00665 {
00666 ASI de_asi;
00667 DE de, tmp_de;
00668 DL dl, tmp_dl;
00669
00670 dl = asi_dl_list(asi);
00671 while (dl) {
00672 tmp_dl = dl_next(dl);
00673 de = dl_de_list(dl);
00674 while (de) {
00675 tmp_de = de_next(de);
00676 if (de_ans_subst(de) == NULL) {
00677 remove_pnde(subg_nde_list(de_subgoal(de)), de_pnde(de));
00678 }
00679 else {
00680 de_asi = Delay(de_ans_subst(de));
00681 remove_pnde(asi_pdes(de_asi), de_pnde(de));
00682 }
00683 release_entry(de, released_des_gl, de_next);
00684 de = tmp_de;
00685 }
00686 release_entry(dl, released_dls_gl, dl_next);
00687 dl = tmp_dl;
00688 }
00689 }
00690
00691
00692
00693
00694
00695
00696
00697 static void simplify_pos_unconditional(CTXTdeclc NODEptr as_leaf)
00698 {
00699 ASI asi = Delay(as_leaf);
00700 PNDE pde;
00701 DE de;
00702 DL dl;
00703
00704 #ifdef DEBUG_DELAYVAR
00705 fprintf(stddbg, ">>>> start simplify_pos_unconditional()\n");
00706 #endif
00707
00708 release_all_dls(asi);
00709
00710 unmark_conditional_answer(as_leaf);
00711
00712 while ((pde = asi_pdes(asi))) {
00713 de = pnde_de(pde);
00714 dl = pnde_dl(pde);
00715 remove_pnde(asi_pdes(asi), pde);
00716 if (!remove_de_from_dl(de, dl))
00717 handle_empty_dl_creation(CTXTc dl);
00718 }
00719
00720
00721
00722
00723 Child(as_leaf) = NULL;
00724 mem_dealloc(asi,sizeof(struct AS_info),TABLE_SPACE);
00725 }
00726
00727
00728
00729
00730
00731
00732
00733 void simplify_neg_fails(CTXTdeclc VariantSF subgoal)
00734 {
00735 PNDE nde;
00736 DE de;
00737 DL dl;
00738
00739 #ifdef DEBUG_DELAYVAR
00740 xsb_dbgmsg((LOG_DEBUG, ">>>> start simplify_neg_fails()\n"));
00741 xsb_dbgmsg((LOG_DEBUG, ">>>> the subgoal is: "));
00742 dbg_print_subgoal(LOG_DEBUG,stddbg, subgoal);
00743 xsb_dbgmsg((LOG_DEBUG, "\n"));
00744 #endif
00745
00746 while ((nde = subg_nde_list(subgoal))) {
00747 de = pnde_de(nde);
00748 dl = pnde_dl(nde);
00749 remove_pnde(subg_nde_list(subgoal), nde);
00750 if (!remove_de_from_dl(de, dl))
00751 handle_empty_dl_creation(CTXTc dl);
00752 }
00753
00754 #ifdef DEBUG_DELAYVAR
00755 fprintf(stddbg, ">>>> end simplify_neg_fails()\n");
00756 #endif
00757
00758 }
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770 static void simplify_neg_succeeds(CTXTdeclc VariantSF subgoal)
00771 {
00772 PNDE nde;
00773 DL dl;
00774 DE de, tmp_de;
00775 ASI used_asi, de_asi;
00776 NODEptr used_as_leaf;
00777
00778 #ifdef DEBUG_DELAYVAR
00779 fprintf(stddbg, ">>>> start simplify_neg_succeeds()\n");
00780 #endif
00781
00782 while ((nde = subg_nde_list(subgoal))) {
00783 dl = pnde_dl(nde);
00784 used_as_leaf = dl_asl(dl);
00785 if (IsValidNode(used_as_leaf) &&
00786 (used_asi = Delay(used_as_leaf)) != NULL) {
00787 de = dl_de_list(dl);
00788 while (de) {
00789 tmp_de = de_next(de);
00790 if (de_ans_subst(de) == NULL) {
00791 remove_pnde(subg_nde_list(de_subgoal(de)), de_pnde(de));
00792 }
00793 else {
00794 de_asi = Delay(de_ans_subst(de));
00795 remove_pnde(asi_pdes(de_asi), de_pnde(de));
00796 }
00797 #ifdef DEBUG_DELAYVAR
00798 fprintf(stddbg, ">>>> release DE (in simplify_neg_succeeds)\n");
00799 #endif
00800 release_entry(de, released_des_gl, de_next);
00801 de = tmp_de;
00802 }
00803 if (!remove_dl_from_dl_list(dl, used_asi)) {
00804 handle_unsupported_answer_subst(CTXTc used_as_leaf);
00805 }
00806 }
00807 }
00808 }
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818 void simplify_pos_unsupported(CTXTdeclc NODEptr as_leaf)
00819 {
00820 ASI asi = Delay(as_leaf);
00821 PNDE pde;
00822 DL dl;
00823 DE de, tmp_de;
00824 ASI used_asi, de_asi;
00825 NODEptr used_as_leaf;
00826
00827 #ifdef DEBUG_DELAYVAR
00828 fprintf(stddbg, ">>>> start simplify_pos_unsupported()\n");
00829 #endif
00830
00831 while ((pde = asi_pdes(asi))) {
00832 dl = pnde_dl(pde);
00833 used_as_leaf = dl_asl(dl);
00834 if (IsValidNode(used_as_leaf) &&
00835 (used_asi = Delay(used_as_leaf)) != NULL) {
00836 de = dl_de_list(dl);
00837 while (de) {
00838 tmp_de = de_next(de);
00839 if (de_ans_subst(de) == NULL) {
00840 remove_pnde(subg_nde_list(de_subgoal(de)), de_pnde(de));
00841 }
00842 else {
00843 de_asi = Delay(de_ans_subst(de));
00844 remove_pnde(asi_pdes(de_asi), de_pnde(de));
00845 }
00846 #ifdef DEBUG_DELAYVAR
00847 fprintf(stddbg, ">>>> release DE (in simplify_pos_unsupported)");
00848 #endif
00849 release_entry(de, released_des_gl, de_next);
00850 de = tmp_de;
00851 }
00852 if (!remove_dl_from_dl_list(dl, used_asi)) {
00853 handle_unsupported_answer_subst(CTXTc used_as_leaf);
00854 }
00855 }
00856 }
00857 }
00858
00859
00860
00861 void abolish_wfs_space(CTXTdecl)
00862 {
00863 char *last_block;
00864
00865 #ifndef LOCAL_EVAL
00866 extern void abolish_edge_space();
00867 #endif
00868
00869
00870
00871
00872 while (current_de_block_gl) {
00873 last_block = *(char **) current_de_block_gl;
00874 mem_dealloc(current_de_block_gl,de_block_size_glc + sizeof(Cell),TABLE_SPACE);
00875 current_de_block_gl = last_block;
00876 }
00877
00878
00879
00880 while (current_dl_block_gl) {
00881 last_block = *(char **) current_dl_block_gl;
00882 mem_dealloc(current_dl_block_gl,dl_block_size_glc + sizeof(Cell),TABLE_SPACE);
00883 current_dl_block_gl = last_block;
00884 }
00885
00886
00887
00888 while (current_pnde_block_gl) {
00889 last_block = *(char **) current_pnde_block_gl;
00890 mem_dealloc(current_pnde_block_gl,pnde_block_size_glc + sizeof(Cell),TABLE_SPACE);
00891 current_pnde_block_gl = last_block;
00892 }
00893
00894
00895
00896 released_des_gl = NULL;
00897 released_dls_gl = NULL;
00898 released_pndes_gl = NULL;
00899
00900 next_free_de_gl = NULL;
00901 next_free_dl_gl = NULL;
00902 next_free_pnde_gl = NULL;
00903
00904 current_de_block_top_gl = NULL;
00905 current_dl_block_top_gl = NULL;
00906 current_pnde_block_top_gl = NULL;
00907
00908 #ifndef LOCAL_EVAL
00909 abolish_edge_space();
00910 #endif
00911
00912 }
00913
00914
00915
00916
00917
00918 void force_answer_true(CTXTdeclc NODEptr as_leaf)
00919 {
00920 VariantSF subgoal;
00921
00922 if (is_conditional_answer(as_leaf)) {
00923 SYS_MUTEX_LOCK( MUTEX_DELAY ) ;
00924 subgoal = asi_subgoal(Delay(as_leaf));
00925 simplify_pos_unconditional(CTXTc as_leaf);
00926 simplify_neg_succeeds(CTXTc subgoal);
00927 SYS_MUTEX_UNLOCK( MUTEX_DELAY ) ;
00928 }
00929 }
00930
00931 void force_answer_false(CTXTdeclc NODEptr as_leaf)
00932 {
00933 ASI asi = Delay(as_leaf);
00934 VariantSF subgoal;
00935
00936 if (is_conditional_answer(as_leaf)) {
00937 SYS_MUTEX_LOCK( MUTEX_DELAY ) ;
00938 subgoal = asi_subgoal(asi);
00939 release_all_dls(asi);
00940 SET_TRIE_ALLOCATION_TYPE_SF(subgoal);
00941 delete_branch(CTXTc as_leaf, &subg_ans_root_ptr(subgoal));
00942 simplify_pos_unsupported(CTXTc as_leaf);
00943 mark_subgoal_failed(subgoal);
00944 simplify_neg_fails(CTXTc subgoal);
00945 SYS_MUTEX_UNLOCK( MUTEX_DELAY ) ;
00946 }
00947 }
00948
00949