From: K. A. <k_a...@ya...> - 2012-07-05 20:03:29
|
Hi David, Thanks for the quick reply. > Hi Konstantine, > I think that your program is (perhaps surprisingly) giving > the answer we would expect. > ******* > File init.P: > > :- table knows/2, likes/2. > :- set_prolog_flag(unknown,fail). > :- dynamic knows/2, likes/2. > :- multifile knows/2, likes/2. > > File i1.P: > > :-(abolish_all_tables). > :-(set_prolog_flag(unknown,fail)). > :-(multifile(/(knows,2))). > :-(multifile(/(likes,2))). > :-(dynamic(/(knows,2))). > :-(dynamic(/(likes,2))). > likes(foo,bar). > > File i2.P: > > :-(abolish_all_tables). > :-(set_prolog_flag(unknown,fail)). > :-(multifile(/(knows,2))). > :-(multifile(/(likes,2))). > :-(dynamic(/(knows,2))). > :-(dynamic(/(likes,2))). > knows(bar,bob). > > > Now, consider the following interaction with XSB: > > ------------------------------------------------------- > > Step 1: load_dyn('init.P'). > > Step 2: load_dync('i1.P'). > > At this point, the query likes(X,Y) correct returns X -> > foo, Y -> bar, and knows(X,Y) correctly fails. > > Step 3: load_dync('i2.P'). > > Now: Query likes(X,Y) correct returns X -> foo, Y -> > bar and knows(X,Y) correctly returns X -> bar, Y -> > bob. > > Step 4: abolish(likes/2). abolish(knows/2). > abolish_all_tables. > > Now: likes(X,Y) and knows(X,Y) correctly fail. > > Step 5: load_dync('i1.P'). > > Now: likes(X,Y) correctly returns X -> foo, Y -> bar > BUT the query knows(X,Y) ALSO (and INCORRECTLY!!) returns X > -> bar, Y -> bob. > > ----------------------------------------------------- > If this interaction happens when one is running XSB proper, > the error at the last step doesn't happen, i.e. the query > knows(X,Y) correctly fails. But when these steps are taken > from within C, sent to XSB as commands (as specified in the > manual chapter "Embedding XSB in a Process"), I always run > into this bizarre error at the last step. > **************************** > This behavior is what I get when I'm running in XSB proper, > from the command line. I do the following: > > bash-4.1$ xsb > xsb > [xsb_configuration loaded] > [sysinitrc loaded] > > XSB Version 3.3.6 (Pignoletto) of January 2, 2012 > [x64-pc-windows; mode: optimal; engine: slg-wam; scheduling: > local] > [Patch date: 2012/03/09 18:27:01] > > | ?- load_dyn('init'). > [term_abstract loaded] > [C:\xsb-tests\katests\init.P dynamically loaded, cpu time > used: 0.0310 seconds] > > yes > | ?- load_dync(i1). > [C:\xsb-tests\katests\i1.P dynamically loaded, cpu time > used: 0.0000 seconds] > > yes > | ?- likes(X,Y). > > X = foo > Y = bar; > > no > | ?- knows(X,Y). > > no > | ?- load_dync(i2). > [C:\xsb-tests\katests\i2.P dynamically loaded, cpu time > used: 0.0150 seconds] > > yes > | ?- likes(X,Y). > > X = foo > Y = bar; > > no > | ?- knows(X,Y). > > X = bar > Y = bob; > > no > | ?- abolish_all_tables. > > yes > | ?- load_dync(i1). > [C:\xsb-tests\katests\i1.P dynamically loaded, cpu time > used: 0.0000 seconds] > > yes > | ?- likes(X,Y). > > X = foo > Y = bar; > > no > | ?- knows(X,Y). > > X = bar > Y = bob; > > no > | ?- > > So I get this behavior at the command line. And I > think this is the correct behavior. However, I think your scenario above forgot the abolish(knows/2) and abolish(likes/2) directives that I issued on step 4 (my "step 4" was really 3 different steps: two different calls to abolish and one call to abolish_all_tables; sorry for any confusion). I thought the effect of "abolish(p/arity)" was to completely nuke any current information about the given predicate p, regardless of where (or which file) that information came from - no? Basically, what I want to do on step 4 is completely retract any and all information in the database about likes and knows, effectively rendering them undefined again (or rather, taking them back to the point immediately following step 1). Two questions: (a) is my understanding of abolish wrong, and if so, (b) is there any other mechanism to achieve the desired effect? (I tried a couple of retract versions but that didn't work either). Thanks! Konstantine |
From: K. A. <k_a...@ya...> - 2012-08-15 01:04:51
|
Let foo.P contain the following: -------------------------------------- :- table before/2 as shared. :- table after/2 as shared. :- dynamic before/2 as shared. :- dynamic after/2 as shared. before(X,Y) :- after(Y,X). after(X,Y) :- before(Y,X). -------------------------------------- Now consider the following steps: (1) load_dyn('foo.P'). (2) assert(before(a,b)). (3) before(X,Y). I would expect the query on step (3) to result in exactly one answer: X -> a, Y -> b. Instead, it hangs up in a (seemingly) infinite loop. If the 'as shared' specs are removed btw, I do get the expected result. But with the shared declarations I get the infinite loop. Could somebody shed some light on this? Thanks, Konstantine P.S. I'm running the multi-threaded version of XSB. |