Update of /cvsroot/xsb/xsbtests/sub_table_tests In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv3992 Added Files: abol_test.P abol_test2.P abol_test2_module.P abol_test2_old abol_test2a.P abol_test2a_old abol_test3.P abol_test3_old abol_test3a.P abol_test3a_old abol_test3b.P abol_test3b_old abol_test3c.P abol_test3c_old abol_test_old abolish_cascade.P abolish_cascade_old abolish_cascade_pred.P abolish_cascade_pred_old aggregs1_test.P aggregs_test.P aggregs_test_old atc_test.P atc_test_old bug.P bugtest.P bulk_trie_test_old cantrdat.P concomp.P concomp_old correct.P cycle.P dipti.P dipti_old edge_dag.P empty_answer.P empty_answer_old exec.P expand.P expand_old float.P float1.P float_old flora1.P flora1_old grammarlrk3.P grammarlrk3_old incremental.P incremental_old kalah_ox.P lists.P lrbug.P lrbug_old makefile.P makefile_old pps.P pps_old recursive_aboltest.P recursive_aboltest_old sets.P stest.sh testdyntable.P testdyntable_old testh.P testh_old tfinda.P tfinda_old trdat.P unw_tr1.P unw_tr1_old utils.P Log Message: Adding a copy of table_tests to be used for testing the subsumptive engine. This includes a number of miscellaneous tests, and more importantly table reclamation and garbage collection tests. --- NEW FILE: abol_test.P --- %------------------------------------------------------------------------- % Created by Kostis Sagonas to test the basic functionality of tabling % built-in predicates abolish_table_pred/1. %------------------------------------------------------------------------- :- import numbervars/1 from num_vars. :- import get_calls/3, abolish_table_pred/1, abolish_table_call/1 from tables. arc(1,2). arc(2,3). arc(2,4). arc(4,1). :- table path/2. path(X,Y) :- arc(X,Y). path(X,Y) :- path(X,Z), arc(Z,Y). % test case with no calls first test :- abolish_table_pred(path(_,_)), fail. % create completed tables test :- path(_X,_Y), fail. test :- path(1,_), fail. test :- path(1,4), fail. test :- path(_X,4), fail. % inspect these tables while selecively deleting some of them test :- print(1,0), fail. % STUFF FOR abolish_table_call/1 to be added here % test :- print(1,1), fail. test :- abolish_table_pred(path/2), fail. test :- print(1,2), fail. % create some more and test the other mode of calling test :- path(1,_), fail. test :- path(1,4), fail. test :- print(2,0), fail. % STUFF FOR abolish_table_call/1 to be added here % test :- print(2,1), fail. test :- abolish_table_pred(path(_,_)), fail. test :- print(2,2), fail. test. print(N,M) :- get_calls(path(X,Y),_C,_R), write(N), write('.'), write(M), write(' '), numbervars(path(X,Y)), writeln(path(X,Y)), fail. print(_,_). --- NEW FILE: abol_test2.P --- arc(1,2). arc(2,3). arc(2,4). arc(4,1). :- table upath/2. upath(X,Y) :- arc(X,Y). upath(X,Y) :- upath(X,Z), arc(Z,Y). :- import mpath/2 from abol_test2_module. :- import abolish_module_tables/1 from tables. test:- upath(1,_),fail. test:- mpath(1,_),fail. test:- get_residual(upath(1,Y),_),writeln(answer(u(a,Y))),fail. test:- get_residual(mpath(1,Y),_),writeln(answer(m(a,Y))),fail. test:- writeln('-------'),fail. test:- abolish_module_tables(abol_test2_module),fail. test:- get_residual(upath(1,Y),_),writeln(answer(u(b,Y))),fail. test:- get_residual(mpath(1,Y),_),writeln(answer(m(b,Y))),fail. test:- abolish_module_tables(usermod),fail. test:- writeln('-------'),fail. test:- get_residual(upath(1,Y),_),writeln(answer(u(c,Y))),fail. test:- get_residual(mpath(1,Y),_),writeln(answer(m(c,Y))),fail. test:- gc_tables(N),writeln(remaining(N)). --- NEW FILE: abol_test2_module.P --- :- export mpath/2. :- import arc/2 from usermod. :- table mpath/2. mpath(X,Y) :- arc(X,Y). mpath(X,Y) :- mpath(X,Z), arc(Z,Y). --- NEW FILE: abol_test2_old --- ------- ------- answer(m(a,1)) answer(m(a,2)) answer(m(a,3)) answer(m(a,4)) answer(u(a,1)) answer(u(a,2)) answer(u(a,3)) answer(u(a,4)) answer(u(b,1)) answer(u(b,2)) answer(u(b,3)) answer(u(b,4)) remaining(0) --- NEW FILE: abol_test2a.P --- arc(1,2). arc(2,3). arc(2,4). arc(4,1). :- table upath/2. upath(X,Y) :- arc(X,Y). upath(X,Y) :- upath(X,Z), arc(Z,Y). :- import mpath/2 from abol_test2_module. :- import abolish_module_tables/1 from tables. test:- upath(1,_),fail. test:- mpath(1,_),fail. test:- mpath(1,X),abolish_module_tables(abol_test2_module),fail. test:- abolish_module_tables(abol_test2_module),fail. test:- upath(1,_),abolish_module_tables(usermod),fail. test:- get_residual(upath(1,Y),_),writeln(answer(u(a,Y))),fail. test:- get_residual(mpath(1,Y),_),writeln(answer(m(a,Y))),fail. test:- gc_tables(N),write(remaining(N)),fail. test. --- NEW FILE: abol_test2a_old --- remaining(0) --- NEW FILE: abol_test3.P --- /* Tests DTF creation and garbage collection of two tables for the same predicate. */ :- table tpred/1. tpred(X):- p(X). p(f(1)). p(f(2)). p(f(3)). p(g(1)). p(g(2)). p(g(3)). %------------------ :- dynamic tr/1. :- index(tr/1,trie). test:- assert(tr(a)),assert(tr(b)),assert(tr(c)),fail. test:- tpred(_X),fail. test:- tpred(X),tr(Y), abolish_table_pred(tpred/1), writeln((X,Y)),fail. test:- tpred(_X),fail. test:- tpred(X),tr(Y), abolish_table_pred(tpred/1), fail. test:- get_residual(tpred(X),_),writeln(first(X)),fail. test:- gc_tables(N),writeln(remaining(N)). --- NEW FILE: abol_test3_old --- (g(3) ',' c) (g(3) ',' b) (g(3) ',' a) (g(2) ',' c) (g(2) ',' b) (g(2) ',' a) (g(1) ',' c) (g(1) ',' b) (g(1) ',' a) (f(3) ',' c) (f(3) ',' b) (f(3) ',' a) (f(2) ',' c) (f(2) ',' b) (f(2) ',' a) (f(1) ',' c) (f(1) ',' b) (f(1) ',' a) remaining(0) --- NEW FILE: abol_test3a.P --- /* Tests DTF creation and garbage collection of two tables for different predicates. */ :- table tpred/1. tpred(X):- p(X). :- table upred/1. upred(X):- p(X). p(f(1)). p(f(2)). p(f(3)). p(g(1)). p(g(2)). p(g(3)). %------------------ :- dynamic tr/1. :- index(tr/1,trie). test:- assert(tr(a)),assert(tr(b)),assert(tr(c)),fail. test:- tpred(_X),fail. test:- tpred(X),tr(Y), abolish_table_pred(tpred/1), writeln((X,Y)),fail. test:- upred(_X),fail. test:- upred(X),tr(Y), abolish_table_pred(upred/1), fail. test:- get_residual(tpred(X),_),writeln(first(X)),fail. test:- get_residual(upred(X),_),writeln(first(X)),fail. test:- gc_tables(N),writeln(remaining(N)). --- NEW FILE: abol_test3a_old --- (f(1) ',' a) (f(1) ',' b) (f(1) ',' c) (f(2) ',' a) (f(2) ',' b) (f(2) ',' c) (f(3) ',' a) (f(3) ',' b) (f(3) ',' c) (g(1) ',' a) (g(1) ',' b) (g(1) ',' c) (g(2) ',' a) (g(2) ',' b) (g(2) ',' c) (g(3) ',' a) (g(3) ',' b) (g(3) ',' c) remaining(0) --- NEW FILE: abol_test3b.P --- /* Tests DTF creation and garbage collection of two tables for different predicates. */ :- table tpred/1. tpred(X):- p(X). :- table upred/1. upred(X):- p(X). p(f(1)). p(f(2)). p(f(3)). p(g(1)). p(g(2)). p(g(3)). %------------------ :- dynamic tr/1. :- index(tr/1,trie). test:- assert(tr(a)),assert(tr(b)),assert(tr(c)),fail. test:- tpred(_X),fail. test:- tpred(X),tr(Y), abolish_table_pred(tpred/1), writeln((X,Y)),fail. test:- upred(_X),fail. test:- upred(X),tr(Y), abolish_table_pred(upred/1), fail. test:- upred(_),fail. test:- get_residual(tpred(X),_),writeln(first(X)),fail. test:- get_residual(upred(X),_),writeln(first(X)),fail. test:- gc_tables(N),writeln(remaining(N)),fail. test:- get_residual(upred(X),_),writeln(first(X)),fail. test. --- NEW FILE: abol_test3b_old --- (f(1) ',' a) (f(1) ',' b) (f(1) ',' c) (f(2) ',' a) (f(2) ',' b) (f(2) ',' c) (f(3) ',' a) (f(3) ',' b) (f(3) ',' c) (g(1) ',' a) (g(1) ',' b) (g(1) ',' c) (g(2) ',' a) (g(2) ',' b) (g(2) ',' c) (g(3) ',' a) (g(3) ',' b) (g(3) ',' c) first(f(1)) first(f(1)) first(f(2)) first(f(2)) first(f(3)) first(f(3)) first(g(1)) first(g(1)) first(g(2)) first(g(2)) first(g(3)) first(g(3)) remaining(0) --- NEW FILE: abol_test3c.P --- /* Tests DTF creation and garbage collection of two tables for different predicates, when one of the predicates has a valid table.*/ :- table tpred/1. tpred(X):- p(X). :- table upred/1. upred(X):- p(X). p(f(1)). p(f(2)). p(f(3)). p(g(1)). p(g(2)). p(g(3)). %------------------ :- dynamic tr/1. :- index(tr/1,trie). test:- assert(tr(a)),assert(tr(b)),assert(tr(c)),fail. test:- tpred(_X),fail. test:- tpred(X),tr(Y), abolish_table_pred(tpred/1), writeln((X,Y)),fail. test:- upred(_X),fail. test:- upred(X),tr(Y), abolish_table_pred(upred/1), fail. %test:- writeln('-------'),fail. test:- upred(X),abolish_table_pred(upred/1),gc_tables(N), writeln(remaining1(N)),fail. test:- gc_tables(N),writeln(remaining2(N)),fail. test. end_of_file. test:- upred(X),writeln(X),abolish_table_pred(upred/1), gc_tables(N), fail. --- NEW FILE: abol_test3c_old --- (f(1) ',' a) (f(1) ',' b) (f(1) ',' c) (f(2) ',' a) (f(2) ',' b) (f(2) ',' c) (f(3) ',' a) (f(3) ',' b) (f(3) ',' c) (g(1) ',' a) (g(1) ',' b) (g(1) ',' c) (g(2) ',' a) (g(2) ',' b) (g(2) ',' c) (g(3) ',' a) (g(3) ',' b) (g(3) ',' c) remaining1(0) remaining1(1) remaining1(1) remaining1(1) remaining1(1) remaining1(1) remaining2(0) --- NEW FILE: abol_test_old --- 1.0 path(A,B) 2.0 path(1,A) --- NEW FILE: abolish_cascade.P --- :- import find_components/1, find_forward_dependencies/1, find_backward_dependencies/1, find_answers/1 from tables. test:- p1(_,_,_),p1(a,b,_),s,abolish_table_call(undefined),fail. test:- get_residual(p1(A,B,C),D),writeln(get_residual(p1(A,B,C),D)),fail. test:- get_residual(s,F),writeln(get_residual(s,F)),fail. test:- p1(_,_,_),p1(_,_,_),s,abolish_table_call(undefined),fail. test:- get_residual(p1(A,B,C),D),writeln(get_residual(p1(A,B,C),D)),fail. test:- get_residual(s,F),writeln(get_residual(s,F)),fail. test:- p1(_,_,_),s,abolish_table_call(undefined),abolish_table_call(p1(_,_,_)),fail. test:- get_residual(p1(A,B,C),D),writeln(get_residual(p1(A,B,C),D)),fail. test:- get_residual(s,F),writeln(get_residual(s,F)),fail. %test:- p1(_,_,_),p1(_,_,_),s,abolish_table_call(undefined,[abolish_tables_singly]),fail. %test:- get_residual(p1(A,B,C),D),writeln(get_residual(p1(A,B,C),D)),fail. %test:- get_residual(s,F),writeln(get_residual(s,F)),fail. test:- p2(_,_,_),abolish_table_call(r2(_,_,_)),abolish_table_call(r3(_,_,_)),fail. test:- get_residual(p2(A,B,C),F),writeln(get_residual(p2(A,B,C),F)),fail. test:- get_residual(r2(A,B,C),F),writeln(get_residual(r2(A,B,C),F)),fail. test:- get_residual(r3(A,B,C),F),writeln(get_residual(r3(A,B,C),F)),fail. test:- writeln('cascading abolish test completed'). :- table p1/3, r1/3, undefined/0. p1(X,Y,Z):- r1(X,Y,Z). r1(a,b,c):- undefined. r1(a,b,d):- undefined. r1(a,c,c):- undefined. r1(a,c,d):- undefined. r1(b,c,d):- undefined. r1(b,c,e):- undefined. r1(c,c,e):- undefined. r1(d,c,e):- undefined. r1(3,c,e):- undefined. r1(f,c,e):- undefined. r1(g,c,e):- undefined. r1(h,c,e):- undefined. r1(i,c,e):- undefined. %undefined :- tnot(undefined). :- table s/0,t/0. s:- tnot(t). t:- tnot(undefined). :- table p2/3, r2/3, r3/3. p2(X,Y,Z):- r2(X,Y,Z). p2(X,Y,Z):- r3(X,Y,Z). r2(a,b,c):- undefined. r2(a,b,d):- undefined. r2(a,c,c):- undefined. r2(a,c,d):- undefined. r2(b,c,d):- undefined. r2(b,c,e):- undefined. r2(c,c,e):- undefined. r3(d,c,e):- undefined. r3(3,c,e):- undefined. r3(f,c,e):- undefined. r3(g,c,e):- undefined. r3(h,c,e):- undefined. r3(i,c,e):- undefined. --- NEW FILE: abolish_cascade_old --- cascading abolish test completed --- NEW FILE: abolish_cascade_pred.P --- :- import find_components/1, find_forward_dependencies/1, find_backward_dependencies/1, find_answers/1 from tables. init:- p1(_,_,_),p1(a,_,_),s. test:- p1(_,_,_),p1(a,b,_),s,abolish_table_pred(undefined),fail. test:- get_residual(p1(A,B,C),D),writeln(get_residual(p1(A,B,C),D)),fail. test:- get_residual(s,F),writeln(get_residual(s,F)),fail. test:- p1(_,_,_),p1(_,_,_),abolish_table_pred(undefined),fail. test:- get_residual(p1(A,B,C),D),writeln(get_residual(p1(A,B,C),D)),fail. test:- get_residual(s,F),writeln(get_residual(s,F)),fail. test:- p1(_,_,_),s,abolish_table_pred(undefined),abolish_table_pred(p1(_,_,_)),fail. test:- get_residual(p1(A,B,C),D),writeln(get_residual(p1(A,B,C),D)),fail. test:- get_residual(s,F),writeln(get_residual(s,F)),fail. %test:- p1(_,_,_),p1(_,_,_),s,abolish_table_pred(undefined,[abolish_tables_singly]),fail. %test:- get_residual(p1(A,B,C),D),writeln(get_residual(p1(A,B,C),D)),fail. %test:- get_residual(s,F),writeln(get_residual(s,F)),fail. test:- p2(_,_,_),abolish_table_pred(r2(_,_,_)),abolish_table_pred(r3(_,_,_)),fail. test:- get_residual(p2(A,B,C),F),writeln(get_residual(p2(A,B,C),F)),fail. test:- get_residual(r2(A,B,C),F),writeln(get_residual(r2(A,B,C),F)),fail. test:- get_residual(r3(A,B,C),F),writeln(get_residual(r3(A,B,C),F)),fail. test:- writeln('cascading abolish test completed'). test_fc(X):- call(X), find_components(X). test_bd(X):- call(X), find_backward_dependencies(X). test_ans(X):- (call(X),fail ; true), find_answers(X). :- table p1/3, r1/3, undefined/0. p1(X,Y,Z):- r1(X,Y,Z). r1(a,b,c):- undefined. r1(a,b,d):- undefined. r1(a,c,c):- undefined. r1(a,c,d):- undefined. r1(b,c,d):- undefined. r1(b,c,e):- undefined. r1(c,c,e):- undefined. r1(d,c,e):- undefined. r1(3,c,e):- undefined. r1(f,c,e):- undefined. r1(g,c,e):- undefined. r1(h,c,e):- undefined. r1(i,c,e):- undefined. undefined :- tnot(undefined). :- table s/0,t/0. s:- tnot(t). t:- tnot(undefined). tbd:- p1(_,_,_),p1(a,b,_),s,find_backward_dependencies(undefined). ta:- p1(_,_,_),p1(a,b,_),s,abolish_table_call(undefined). ta1:- p1(_,_,_),p1(_,_,_),s,abolish_table_call(undefined). ta1a:- p1(_,_,_),s,abolish_table_call(undefined),abolish_table_call(p1(_,_,_)). ta2:- p1(_,_,_),p1(_,_,_),s,abolish_table_call(undefined,[abolish_tables_singly]). :- table p2/3, r2/3, r3/3. p2(X,Y,Z):- r2(X,Y,Z). p2(X,Y,Z):- r3(X,Y,Z). r2(a,b,c):- undefined. r2(a,b,d):- undefined. r2(a,c,c):- undefined. r2(a,c,d):- undefined. r2(b,c,d):- undefined. r2(b,c,e):- undefined. r2(c,c,e):- undefined. r3(d,c,e):- undefined. r3(3,c,e):- undefined. r3(f,c,e):- undefined. r3(g,c,e):- undefined. r3(h,c,e):- undefined. r3(i,c,e):- undefined. ta3:- p2(_,_,_),abolish_table_call(r2(_,_,_)),abolish_table_call(r3(_,_,_)). --- NEW FILE: abolish_cascade_pred_old --- cascading abolish test completed --- NEW FILE: aggregs1_test.P --- :- import bagReduce/4, bagPO/3, bagPOv/2, bagOf/2, bagMin/2, bagMax/2, bagSum/2, bagCount/2, bagAvg/2, bagPO/4, filterReduce/4, filterPO/3, filterPO/2, filterPOA/4, filterMin/2, filterMax/2 from aggregs1. :- import subsumes_chk/2,variant/2 from subsumes. :- import numbervars/3, numbervars/1 from num_vars. /***********************************************************************/ :- import abolish_table_info/0 from machine. :- import abolish_table_pred/1 from tables. :- import member/2 from basics. at :- abolish_table_info. :- [edge_dag]. % data for testing shortest path ?- [subsumes]. :- compiler_options([spec_off]). /* test data and query: test. */ test :- at,fail. test :- ainterp(app([a,b],[c,d],R),V), writeln([R,V]),fail. test :- ainterp(app(X,Y,[a,b,c,d]),V), writeln([X,Y,V]),fail. test :- bagPO(hi_call,p(X,Y),subsumed), numbervars(p(X,Y),0,_),writeln(p(X,Y)),fail. test :- bagOf(sal(Dept),M), sortbag(M,S), write('Dept'=Dept),write(', '),writeln('SalList'=S),fail. test :- % a funny way to do bagOf, inefficient! and not recommended! bagReduce(sal(Dept),M,cons,[]), sortbag(M,S), write('Dept'=Dept),write(', '), writeln('SalList(reduce)'=S),fail. test :- bagMin(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Minsal'=M),fail. test :- bagMax(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Maxsal'=M),fail. test :- bagAvg(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Avgsal'=M),fail. test :- bagCount(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Count'=M),fail. test :- bagSum(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Sumsal'=M),fail. test :- bagPO(tp(I),V,po), write('I'=I),write(', '),writeln('Val'=V),fail. % bigger tests. /****/ test :- bagMin(sp(0,T),Dist), writeln([T,Dist]),fail. test :- bagCount(targsof(X),Count), write('Node'=X),write(', '),writeln('NumTargs'=Count),fail. test:- filterReduce(p(a,X),max,neginf,Y),nvarwriteln(fmax(p(a,X),Y)),fail. test:- filterReduce(p(a,b),max,neginf,Y),nvarwriteln(fmax(p(a,b),Y)),fail. test:- filterReduce(p(X,c),max,neginf,Y),nvarwriteln(fmax(p(X,c),Y)),fail. test:- filterPO(po1(a,b),Var,subsumes_chk),nvarwriteln(po1_1(a,b,Var)),fail. test:- filterPO(po1(a,c),Var,subsumes_chk),nvarwriteln(po1_2(a,c,Var)),fail. test:- filterPO(po1(X,c),Var,subsumes_chk),nvarwriteln(po1_3(X,c,Var)),fail. test:- filterPO(fpo2(X,Y),aliasPrefer),nvarwriteln(fpo2(X,Y)),fail. test:- filterMax(salary(Dept),Sal),writeln(filterMax(salary(Dept),Sal)),fail. test:- filterMin(salary(Dept),Sal),writeln(filterMin(salary(Dept),Sal)),fail. test:- filterPOA(place,Place,more_general_than,abstract),writeln(Place),fail. test. test1:- bagPO(Y,v(X,Y),Min,(=<)),writeln(bpo1(X,Y,Min)),fail. test2:- bagPO(Y,X^v(X,Y),Min,(=<)),writeln(bpo2(X,Y,Min)),fail. v(a,2). v(b,4). v(_,3). varlte(v(_,B1),v(_,B2)):- B1 =< B2. varlte(B1,B2):- number(B1),number(B2),B1 =< B2. %filterPOA(place,Place,more_general_than,abstract) place([place(p1,1),place(p2,2),place(p3,3)]). place([place(p1,2),place(p2,1),place(p3,3)]). place([place(p1,2),place(p2,1),place(p3,6)]). place([place(p1,2),place(p2,2),place(p3,4)]). more_general_than([],[]). more_general_than([place(P,N1)|R1],[place(P,N2)|R2]):- N2 @=< N1, more_general_than(R1,R2). abstract([],Answer,Answer):-!. abstract(Lists,Answer,NewAnswer):- factor(Lists,Places), abstract_1(Places,Answer,NewAnswer). factor([],[]). factor([[place(P1,N)|L1]|R1],[place(P1,Max)|R2]):- factor_1(R1,N,Rn,Max), (L1 == [] -> Rnew = Rn ; Rnew = [L1|Rn]), factor(Rnew,R2). factor([[]|R],R1):- factor(R,R1). factor_1([],Max,[],Max). factor_1([[place(_,M)|L1]|R1],N,[L1|Rnew],Max):- (N @< M -> N1 = M ; N1 = N), factor_1(R1,N1,Rnew,Max). factor_1([[]|R],N,R1,Max):- factor_1(R,N,R1,Max). abstract_1([],[],[]). abstract_1([place(P,N)|R1],[place(P,Ans)|R2],[place(P,NewAns)|R3]):- (N @< Ans -> NewAns = omega ; NewAns = Ans), abstract_1(R1,R2,R3). fpo2(a,b). fpo2(a,c). fpo2(a,a). fpo2(b,c). fpo2(X,X). %aliasPrefer(fpo2(X,X),fpo2(Y,Z)):- \+ \+ (X = Y), \+ (Y == Z). aliasPrefer(fpo2(X,X),fpo2(Y,_Z)):- variant(X,Y). nvarwriteln(Term):- numbervars(Term), writeln(Term). max(X,Y,Y):- \+ number(X),!. max(X,Y,X):- \+ number(Y),!. max(X,Y,Z):- (X > Y -> Z = X ; Z = Y). min(X,Y,Y):- \+ number(X),!. min(X,Y,X):- \+ number(Y),!. min(One,Two,Min):- One > Two -> Min = Two ; Min = One. sortbag(B,S) :- findall(p(X,_),member(X,B),L), sort(L,L1), findall(X,member(p(X,_),L1),S). %%:- table empp/2. % to eliminate duplicates empp(Dept,Sal) :- emp(_,Dept,Sal). emp(david,cse,20000). emp(phil,cse,25000). emp(iv,cse,22000). emp(sas,cse,22000). emp(richard,lin,21000). emp(mark,lin,51000). /* Have to put ALL hilog declarations together. This is a serious problem. */ % to use this table decl, must compile(aggregs,[unfold_off,spec_repr]). %%:- table sal(_)(_). sal(Dept)(Sal) :- empp(Dept,Sal). salary(Dept,Sal):- emp(_,Dept,Sal). po1(a,X,p(f(X),g(X))). po1(a,b,p(f(1),g(2))). po1(a,b,p(f(1),g(_))). po1(a,c,p(f(2),g(2))). po1(b,c,p(f(_),g(2))). :- hilog po. po(false,top). po(true,top). po(bot,top). po(bot,true). po(bot,false). /* test data for partial order */ tp(1)(bot). tp(1)(false). tp(1)(true). tp(2)(bot). tp(2)(true). tp(2)(top). tp(3)(false). tp(3)(true). tp(4)(bot). tp(4)(true). tp(4)(false). tp(4)(top). /* This defines sp(X,Y) as a set of (some short) distances from X to Y. Then one can find the shortest paths between points 0 and X, e.g., by calling bagMin(sp(0,X),Min). */ sp(X,Y)(D) :- edge(X,Y,D). sp(X,Y)(D) :- bagMin(sp(X,Z),D1),edge(Z,Y,D2),D is D1+D2. targsof(X)(Y) :- edge(X,Y,_). :- hilog cons. % for (badly) defining bagOf in terms of bagReduce cons(Y,X,[X|Y]). :- hilog minimum. minimum(X,Y,Z) :- X @< Y -> Z=X ; Z=Y. :- hilog maximum. maximum(X,Y,Z) :- X @< Y -> Z=Y ; Z=X. :- hilog sum. sum(X,Y,Z) :- Z is X+Y. :- hilog successor. successor(X,_Y,Z) :- Z is X+1. :- hilog sumcount. sumcount([S|C],X,[S1|C1]) :- S1 is S+X, C1 is C+1. /*******************************************************/ p(a,_X,1). p(a,b,2). p(a,b,3). p(a,c,2). p(b,c,3). % bagMax(sal(Dept),M), bag_p(a,_X)(1). bag_p(a,b)(2). bag_p(a,b)(3). bag_p(a,c)(2). /*******************************************************/ /* An annotated logic meta-interpreter */ ainterp(G,N) :- bagMax(ainterp(G),N). ainterp(true)(100000) :- !. ainterp((A,B))(N) :- !, ainterp(A,N1),ainterp(B,N2), minimum(N1,N2,N). ainterp(A)(N) :- arule(A,B)(N1), ainterp(B,N2), N is floor(N1*N2). arule(app([],L,L),true)(1.0). arule(app([X|L1],L2,[X|L3]),app(L1,L2,L3))(0.9). arule(a,true)(1.0). arule(a,true)(0.5). arule(b,(a,c))(0.9). arule(c,true)(0.5). arule(c,(b,a))(0.4). % to use bagPOv to get lubs by subsumption. :- hilog subsumed. subsumed(X,Y) :- subsumes_chk(Y,X). p(a,b). p([a],[c,d]). p([a,b,c],[c,d,e,f]). p(a,_X). p([_,_|_],[_|_]). :- hilog hi_call. hi_call(X) :- call(X). --- NEW FILE: aggregs_test.P --- :- import bagReduce/4, bagPO/3, bagPOv/2, bagOf/2, bagMin/2, bagMax/2, bagSum/2, bagCount/2, bagAvg/2, bagPO/4, filterReduce/4, filterPO/3, filterPO/2, filterPOA/4, filterMin/2, filterMax/2 from aggregs. :- import subsumes_chk/2,variant/2 from subsumes. :- import numbervars/3, numbervars/1 from num_vars. /***********************************************************************/ :- import abolish_table_info/0 from machine. :- import abolish_table_pred/1 from tables. :- import member/2 from basics. at :- abolish_table_info. :- [edge_dag]. % data for testing shortest path ?- [subsumes]. :- compiler_options([spec_off]). /* test data and query: test. */ test :- at,fail. test :- ainterp(app([a,b],[c,d],R),V), writeln([R,V]),fail. test :- ainterp(app(X,Y,[a,b,c,d]),V), writeln([X,Y,V]),fail. test :- bagPO(hi_call,p(X,Y),subsumed), numbervars(p(X,Y),0,_),writeln(p(X,Y)),fail. test :- bagOf(sal(Dept),M), sortbag(M,S), write('Dept'=Dept),write(', '),writeln('SalList'=S),fail. test :- % a funny way to do bagOf, inefficient! and not recommended! bagReduce(sal(Dept),M,cons,[]), sortbag(M,S), write('Dept'=Dept),write(', '), writeln('SalList(reduce)'=S),fail. test :- bagMin(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Minsal'=M),fail. test :- bagMax(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Maxsal'=M),fail. test :- bagAvg(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Avgsal'=M),fail. test :- bagCount(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Count'=M),fail. test :- bagSum(sal(Dept),M), write('Dept'=Dept),write(', '),writeln('Sumsal'=M),fail. test :- bagPO(tp(I),V,po), write('I'=I),write(', '),writeln('Val'=V),fail. % bigger tests. /****/ test :- bagMin(sp(0,T),Dist), writeln([T,Dist]),fail. test :- bagCount(targsof(X),Count), write('Node'=X),write(', '),writeln('NumTargs'=Count),fail. test:- filterReduce(p(a,X),max,neginf,Y),nvarwriteln(fmax(p(a,X),Y)),fail. test:- filterReduce(p(a,b),max,neginf,Y),nvarwriteln(fmax(p(a,b),Y)),fail. test:- filterReduce(p(X,c),max,neginf,Y),nvarwriteln(fmax(p(X,c),Y)),fail. test:- filterPO(po1(a,b),Var,subsumes_chk),nvarwriteln(po1_1(a,b,Var)),fail. test:- filterPO(po1(a,c),Var,subsumes_chk),nvarwriteln(po1_2(a,c,Var)),fail. test:- filterPO(po1(X,c),Var,subsumes_chk),nvarwriteln(po1_3(X,c,Var)),fail. test:- filterPO(fpo2(X,Y),aliasPrefer),nvarwriteln(fpo2(X,Y)),fail. test:- filterMax(salary(Dept),Sal),writeln(filterMax(salary(Dept),Sal)),fail. test:- filterMin(salary(Dept),Sal),writeln(filterMin(salary(Dept),Sal)),fail. test:- filterPOA(place,Place,more_general_than,abstract),writeln(Place),fail. test. test1:- bagPO(Y,v(X,Y),Min,(=<)),writeln(bpo1(X,Y,Min)),fail. test2:- bagPO(Y,X^v(X,Y),Min,(=<)),writeln(bpo2(X,Y,Min)),fail. v(a,2). v(b,4). v(_,3). varlte(v(_,B1),v(_,B2)):- B1 =< B2. varlte(B1,B2):- number(B1),number(B2),B1 =< B2. %filterPOA(place,Place,more_general_than,abstract) place([place(p1,1),place(p2,2),place(p3,3)]). place([place(p1,2),place(p2,1),place(p3,3)]). place([place(p1,2),place(p2,1),place(p3,6)]). place([place(p1,2),place(p2,2),place(p3,4)]). more_general_than([],[]). more_general_than([place(P,N1)|R1],[place(P,N2)|R2]):- N2 @=< N1, more_general_than(R1,R2). abstract([],Answer,Answer):-!. abstract(Lists,Answer,NewAnswer):- factor(Lists,Places), abstract_1(Places,Answer,NewAnswer). factor([],[]). factor([[place(P1,N)|L1]|R1],[place(P1,Max)|R2]):- factor_1(R1,N,Rn,Max), (L1 == [] -> Rnew = Rn ; Rnew = [L1|Rn]), factor(Rnew,R2). factor([[]|R],R1):- factor(R,R1). factor_1([],Max,[],Max). factor_1([[place(_,M)|L1]|R1],N,[L1|Rnew],Max):- (N @< M -> N1 = M ; N1 = N), factor_1(R1,N1,Rnew,Max). factor_1([[]|R],N,R1,Max):- factor_1(R,N,R1,Max). abstract_1([],[],[]). abstract_1([place(P,N)|R1],[place(P,Ans)|R2],[place(P,NewAns)|R3]):- (N @< Ans -> NewAns = omega ; NewAns = Ans), abstract_1(R1,R2,R3). fpo2(a,b). fpo2(a,c). fpo2(a,a). fpo2(b,c). fpo2(X,X). %aliasPrefer(fpo2(X,X),fpo2(Y,Z)):- \+ \+ (X = Y), \+ (Y == Z). aliasPrefer(fpo2(X,X),fpo2(Y,_Z)):- variant(X,Y). nvarwriteln(Term):- numbervars(Term), writeln(Term). max(X,Y,Y):- \+ number(X),!. max(X,Y,X):- \+ number(Y),!. max(X,Y,Z):- (X > Y -> Z = X ; Z = Y). min(X,Y,Y):- \+ number(X),!. min(X,Y,X):- \+ number(Y),!. min(One,Two,Min):- One > Two -> Min = Two ; Min = One. sortbag(B,S) :- findall(p(X,_),member(X,B),L), sort(L,L1), findall(X,member(p(X,_),L1),S). %%:- table empp/2. % to eliminate duplicates empp(Dept,Sal) :- emp(_,Dept,Sal). emp(david,cse,20000). emp(phil,cse,25000). emp(iv,cse,22000). emp(sas,cse,22000). emp(richard,lin,21000). emp(mark,lin,51000). /* Have to put ALL hilog declarations together. This is a serious problem. */ % to use this table decl, must compile(aggregs,[unfold_off,spec_repr]). %%:- table sal(_)(_). sal(Dept)(Sal) :- empp(Dept,Sal). salary(Dept,Sal):- emp(_,Dept,Sal). po1(a,X,p(f(X),g(X))). po1(a,b,p(f(1),g(2))). po1(a,b,p(f(1),g(_))). po1(a,c,p(f(2),g(2))). po1(b,c,p(f(_),g(2))). :- hilog po. po(false,top). po(true,top). po(bot,top). po(bot,true). po(bot,false). /* test data for partial order */ tp(1)(bot). tp(1)(false). tp(1)(true). tp(2)(bot). tp(2)(true). tp(2)(top). tp(3)(false). tp(3)(true). tp(4)(bot). tp(4)(true). tp(4)(false). tp(4)(top). /* This defines sp(X,Y) as a set of (some short) distances from X to Y. Then one can find the shortest paths between points 0 and X, e.g., by calling bagMin(sp(0,X),Min). */ sp(X,Y)(D) :- edge(X,Y,D). sp(X,Y)(D) :- bagMin(sp(X,Z),D1),edge(Z,Y,D2),D is D1+D2. targsof(X)(Y) :- edge(X,Y,_). :- hilog cons. % for (badly) defining bagOf in terms of bagReduce cons(Y,X,[X|Y]). :- hilog minimum. minimum(X,Y,Z) :- X @< Y -> Z=X ; Z=Y. :- hilog maximum. maximum(X,Y,Z) :- X @< Y -> Z=Y ; Z=X. :- hilog sum. sum(X,Y,Z) :- Z is X+Y. :- hilog successor. successor(X,_Y,Z) :- Z is X+1. :- hilog sumcount. sumcount([S|C],X,[S1|C1]) :- S1 is S+X, C1 is C+1. /*******************************************************/ p(a,_X,1). p(a,b,2). p(a,b,3). p(a,c,2). p(b,c,3). % bagMax(sal(Dept),M), bag_p(a,_X)(1). bag_p(a,b)(2). bag_p(a,b)(3). bag_p(a,c)(2). /*******************************************************/ /* An annotated logic meta-interpreter */ ainterp(G,N) :- bagMax(ainterp(G),N). ainterp(true)(100000) :- !. ainterp((A,B))(N) :- !, ainterp(A,N1),ainterp(B,N2), minimum(N1,N2,N). ainterp(A)(N) :- arule(A,B)(N1), ainterp(B,N2), N is floor(N1*N2). arule(app([],L,L),true)(1.0). arule(app([X|L1],L2,[X|L3]),app(L1,L2,L3))(0.9). arule(a,true)(1.0). arule(a,true)(0.5). arule(b,(a,c))(0.9). arule(c,true)(0.5). arule(c,(b,a))(0.4). % to use bagPOv to get lubs by subsumption. :- hilog subsumed. subsumed(X,Y) :- subsumes_chk(Y,X). p(a,b). p([a],[c,d]). p([a,b,c],[c,d,e,f]). p(a,_X). p([_,_|_],[_|_]). :- hilog hi_call. hi_call(X) :- call(X). --- NEW FILE: aggregs_test_old --- Dept = cse, Avgsal = 22250.0000 Dept = cse, Count = 4 Dept = cse, Maxsal = 25000 Dept = cse, Minsal = 20000 Dept = cse, SalList = [20000,22000,22000,25000] Dept = cse, SalList(reduce) = [20000,22000,22000,25000] Dept = cse, Sumsal = 89000 Dept = lin, Avgsal = 36000.0000 Dept = lin, Count = 2 Dept = lin, Maxsal = 51000 Dept = lin, Minsal = 21000 Dept = lin, SalList = [21000,51000] Dept = lin, SalList(reduce) = [21000,51000] Dept = lin, Sumsal = 72000 I = 1, Val = false I = 1, Val = true I = 2, Val = top I = 3, Val = false I = 3, Val = true I = 4, Val = top Node = 0, NumTargs = 5 Node = 1, NumTargs = 5 Node = 10, NumTargs = 5 Node = 11, NumTargs = 5 Node = 12, NumTargs = 5 Node = 13, NumTargs = 5 Node = 14, NumTargs = 5 Node = 15, NumTargs = 5 Node = 16, NumTargs = 5 Node = 17, NumTargs = 5 Node = 18, NumTargs = 5 Node = 19, NumTargs = 5 Node = 2, NumTargs = 5 Node = 20, NumTargs = 5 Node = 21, NumTargs = 5 Node = 22, NumTargs = 5 Node = 23, NumTargs = 5 Node = 24, NumTargs = 5 Node = 25, NumTargs = 5 Node = 26, NumTargs = 5 Node = 27, NumTargs = 5 Node = 28, NumTargs = 5 Node = 29, NumTargs = 5 Node = 3, NumTargs = 5 Node = 30, NumTargs = 5 Node = 31, NumTargs = 5 Node = 32, NumTargs = 5 Node = 33, NumTargs = 5 Node = 34, NumTargs = 5 Node = 35, NumTargs = 5 Node = 36, NumTargs = 5 Node = 37, NumTargs = 5 Node = 38, NumTargs = 5 Node = 39, NumTargs = 5 Node = 4, NumTargs = 5 Node = 40, NumTargs = 5 Node = 41, NumTargs = 5 Node = 42, NumTargs = 5 Node = 43, NumTargs = 5 Node = 44, NumTargs = 5 Node = 45, NumTargs = 5 Node = 46, NumTargs = 5 Node = 47, NumTargs = 5 Node = 48, NumTargs = 5 Node = 49, NumTargs = 5 Node = 5, NumTargs = 5 Node = 50, NumTargs = 5 Node = 51, NumTargs = 5 Node = 52, NumTargs = 5 Node = 53, NumTargs = 5 Node = 54, NumTargs = 5 Node = 55, NumTargs = 5 Node = 56, NumTargs = 5 Node = 57, NumTargs = 5 Node = 58, NumTargs = 5 Node = 59, NumTargs = 5 Node = 6, NumTargs = 5 Node = 60, NumTargs = 5 Node = 61, NumTargs = 5 Node = 62, NumTargs = 5 Node = 63, NumTargs = 5 Node = 64, NumTargs = 5 Node = 65, NumTargs = 5 Node = 66, NumTargs = 5 Node = 67, NumTargs = 5 Node = 68, NumTargs = 5 Node = 69, NumTargs = 5 Node = 7, NumTargs = 5 Node = 70, NumTargs = 5 Node = 71, NumTargs = 5 Node = 72, NumTargs = 5 Node = 73, NumTargs = 5 Node = 74, NumTargs = 5 Node = 75, NumTargs = 5 Node = 76, NumTargs = 5 Node = 77, NumTargs = 5 Node = 78, NumTargs = 5 Node = 79, NumTargs = 5 Node = 8, NumTargs = 5 Node = 80, NumTargs = 5 Node = 81, NumTargs = 5 Node = 82, NumTargs = 5 Node = 83, NumTargs = 5 Node = 84, NumTargs = 5 Node = 85, NumTargs = 5 Node = 86, NumTargs = 5 Node = 87, NumTargs = 5 Node = 88, NumTargs = 5 Node = 89, NumTargs = 5 Node = 9, NumTargs = 5 Node = 90, NumTargs = 5 Node = 91, NumTargs = 5 Node = 92, NumTargs = 5 Node = 93, NumTargs = 5 Node = 94, NumTargs = 5 Node = 95, NumTargs = 5 Node = 96, NumTargs = 5 Node = 97, NumTargs = 5 Node = 98, NumTargs = 5 Node = 99, NumTargs = 1 [0,16] [11,12] [12,22] [13,28] [14,2] [15,12] [16,14] [17,10] [18,8] [19,6] [20,14] [21,4] [22,12] [23,10] [24,8] [25,8] [26,14] [27,10] [29,12] [3,6] [30,6] [31,20] [32,14] [33,6] [34,14] [35,12] [36,14] [37,6] [38,12] [39,16] [40,10] [41,8] [42,16] [43,10] [44,14] [45,8] [46,8] [47,14] [48,8] [49,14] [50,18] [51,10] [52,10] [53,12] [54,16] [55,12] [56,8] [57,16] [58,18] [59,14] [60,16] [61,10] [62,12] [63,14] [64,12] [65,10] [66,22] [67,12] [68,12] [69,14] [7,12] [70,14] [71,10] [72,26] [73,10] [74,12] [75,12] [76,16] [77,14] [78,16] [79,12] [80,16] [81,22] [82,12] [83,14] [84,16] [85,12] [86,14] [87,14] [88,16] [89,16] [90,16] [91,18] [92,16] [93,14] [94,14] [95,16] [96,16] [97,18] [98,14] [99,15] [[],[a,b,c,d],100000] [[a,b,c,d],81000] [[a,b,c,d],[],65610] [[a,b,c],[d],72900] [[a,b],[c,d],81000] [[a],[b,c,d],90000] [place(p1,1),place(p2,2),place(p3,3)] [place(p1,2),place(p2,1),place(p3,3)] [place(p1,2),place(p2,1),place(p3,omega)] [place(p1,2),place(p2,2),place(p3,omega)] filterMax(salary(cse),25000) filterMax(salary(lin),51000) filterMin(salary(cse),20000) filterMin(salary(lin),21000) fmax(p(a,A),1) fmax(p(a,b),3) fmax(p(a,b),3) fmax(p(a,c),2) fmax(p(a,c),2) fmax(p(b,c),3) fpo2(A,A) fpo2(a,a) fpo2(b,c) p([A,B|C],[D|E]) p([a],[c,d]) p(a,A) po1_1(a,b,p(f(1),g(A))) po1_1(a,b,p(f(b),g(b))) po1_2(a,c,p(f(2),g(2))) po1_2(a,c,p(f(c),g(c))) po1_3(a,c,p(f(2),g(2))) po1_3(a,c,p(f(c),g(c))) po1_3(b,c,p(f(A),g(2))) --- NEW FILE: atc_test.P --- :- table p/2. :- dynamic p/2. test:- assert(p(a,b)), assert(p(a,c)),assert(p(b,c)),fail. test:- test1. test:- test2. test:- test3. test:- test4. test:- test5. test:- test6. test:- test7. test:- test8. test:- test9. test:- test10. test:- test11. test. /* abolish and gc variant call */ test1:- p(a,X), abolish_table_call(p(a,X)),writeln(a1(X)),fail. test1:- gc_tables(N),writeln(N),fail. test1:- get_residual(p(a,X),_),writeln(a1_2(X)),fail. test1:- writeln('---------------'),fail. /* abolish and gc unifying call */ test2:- p(a,X), abolish_table_call(p(a,b)),writeln(a2(X)),fail. test2:- gc_tables(N),writeln(N),fail. test2:- get_residual(p(a,X),_),writeln(a2_2(X)),fail. test2:- writeln('---------------'),fail. /* make sure p(b,X) does not get abolished. */ test3:- p(b,X), abolish_table_call(p(a,b)),writeln(a3(X)),fail. test3:- gc_tables(N),writeln(N),fail. test3:- get_residual(p(b,X),_),writeln(a3_2(X)),fail. test3:- writeln('---------------'),fail. /* make sure p(b,X) does not get abolished. */ test4:- p(b,X), p(a,_),abolish_table_call(p(a,b)),writeln(a4(X)),fail. test4:- gc_tables(N),writeln(N),fail. test4:- get_residual(p(b,X),_),writeln(a4_2(X)),fail. test4:- get_residual(p(a,X),_),writeln(a4_3(X)),fail. test4:- writeln('---------------'),fail. /* Redundant abolish atc-v + atc-u */ test5:- p(a,X),abolish_table_call(p(a,b)), abolish_table_call(p(a,X)),writeln(a5(X)),fail. test5:- gc_tables(N),writeln(N),fail. test5:- get_residual(p(b,X),_),writeln(a5_3(b,X)),fail. test5:- get_residual(p(a,X),_),writeln(a5_3(X)),fail. test5:- writeln('---------------'),fail. /* Redundant abolish atc + atp */ test6:- p(a,X),abolish_table_call(p(a,b)), abolish_table_pred(p/2),writeln(a6(X)),fail. test6:- gc_tables(N),writeln(N),fail. test6:- get_residual(p(b,X),_),writeln(a6_3(b,X)),fail. test6:- get_residual(p(a,X),_),writeln(a6_3(X)),fail. test6:- writeln('---------------'),fail. /* Redundant abolish atp + atc */ test7:- p(a,X),abolish_table_pred(p/2),abolish_table_call(p(a,b)), writeln(a7(X)),fail. test7:- gc_tables(N),writeln(N),fail. test7:- get_residual(p(a,X),_),writeln(a7_3(X)),fail. test7:- writeln('---------------'),fail. /* Redundant abolish atc-v + atc-v */ test8:- p(a,X),abolish_table_call(p(a,b)),abolish_table_call(p(a,b)), writeln(a8(X)),fail. test8:- gc_tables(N),writeln(N),fail. test8:- get_residual(p(a,X),_),writeln(a8_3(X)),fail. test8:- writeln('---------------'),fail. /* check on safety of gc -- old subgoal */ test9:- p(a,X),abolish_table_call(p(a,b)), writeln(a9(X)),fail. test9:- p(a,X),gc_tables(N),writeln(N),fail. test9:- gc_tables(N),writeln(N),fail. test9:- get_residual(p(a,X),_),writeln(a9_3(X)),fail. test9:- writeln('---------------'),fail. /* check on safety of gc -- same subgoal */ test10:- p(a,X),abolish_table_call(p(a,b)),gc_tables(N), writeln(a10(X,N)),fail. test10:- get_residual(p(a,X),_),writeln(a10_2(X)),fail. test10:- gc_tables(N),writeln(N),fail. test10:- get_residual(p(a,X),_),writeln(a10_3(X)),fail. test10:- writeln('---------------'),fail. /* check on safety of gc -- same table */ test11:- p(a,X),abolish_table_pred(p/2),gc_tables(N), writeln(a11(X,N)),fail. test11:- get_residual(p(a,X),_),writeln(a11_2(X)),fail. test11:- gc_tables(N),writeln(N),fail. test11:- get_residual(p(a,X),_),writeln(a11_3(X)),fail. test11:- writeln('---------------'),fail. end_of_file. Proper output: | ?- test. Delaying abolish of call in use for: p/2 a1(c) a1(b) Garbage Collecting Subgoal: p/2 0 --------------- Delaying abolish of call in use for: p/2 a2(c) a2(b) Garbage Collecting Subgoal: p/2 0 --------------- a3(c) 0 a3_2(c) --------------- Delaying abolish of call in use for: p/2 a4(c) a4(c) Garbage Collecting Subgoal: p/2 0 a4_2(c) --------------- Delaying abolish of call in use for: p/2 a5(c) a5(b) Garbage Collecting Subgoal: p/2 0 a5_3(b,c) --------------- Delaying abolish of call in use for: p/2 Delaying abolish of table in use: p/2 Predicate over-riding subgoal for p/2 a6(c) a6(b) Garbage Collecting Predicate: p/2 0 --------------- Delaying abolish of table in use: p/2 a7(c) a7(b) Garbage Collecting Predicate: p/2 0 --------------- Delaying abolish of call in use for: p/2 a8(c) a8(b) Garbage Collecting Subgoal: p/2 0 --------------- Delaying abolish of call in use for: p/2 a9(c) a9(b) Garbage Collecting Subgoal: p/2 0 0 0 a9_3(c) a9_3(b) --------------- Delaying abolish of call in use for: p/2 Skipping: p/2 a10(c,1) Garbage Collecting Subgoal: p/2 a10(b,0) 0 --------------- Delaying abolish of table in use: p/2 Skipping: p/2 a11(c,1) Garbage Collecting Predicate: p/2 a11(b,0) 0 --------------- --- NEW FILE: atc_test_old --- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- 0 0 0 0 0 0 0 0 0 0 0 0 0 a1(b) a1(c) a10(b,0) a10(c,1) a11(b,0) a11(c,1) a2(b) a2(c) a3(c) a3_2(c) a4(c) a4(c) a4_2(c) a5(b) a5(c) a5_3(b,c) a6(b) a6(c) a7(b) a7(c) a8(b) a8(c) a9(b) a9(c) a9_3(b) a9_3(c) --- NEW FILE: bug.P --- :- export mycall/2. :- import append/3 from basics. mycall(Term,Var):- apply_last(Term,Var,Newcall), call(Newcall). apply_last(Call,Var,Newcall):- Call =.. List, append(List,[Var],Newlist), Newcall =.. Newlist. --- NEW FILE: bugtest.P --- :- import mycall/2 from bug. test1:- mycall(po(X,c),V),writeln(p3(V)),fail. test2:- mycall(po(X),V),writeln(p2(V)),fail. po(a,X,p(f(X),g(X))). po(a,b,p(f(1),g(2))). po(a,b,p(f(1),g(_))). po(a,c,p(f(2),g(2))). po(b,c,p(f(_),g(2))). :- hilog po. po(false,top). po(true,top). po(bot,top). po(bot,true). po(bot,false). --- NEW FILE: bulk_trie_test_old --- intrie(pras,1,[pair(1,5),pair(2,5),pair(3,5),pair(4,5),pair(5,5)]) intrie(pras,1,[pair(2,5),pair(3,5),pair(4,5),pair(5,5)]) intrie(prge,1,[pair(1,1),pair(1,2),pair(1,3),pair(1,4),pair(1,5),pair(2,1),pair(2,2),pair(2,3),pair(2,4),pair(2,5),pair(3,1),pair(3,2),pair(3,3),pair(3,4),pair(3,5),pair(4,1),pair(4,2),pair(4,3),pair(4,4),pair(4,5),pair(5,1),pair(5,2),pair(5,3),pair(5,4),pair(5,5)]) intrie(prge,2,[pair(2,1),pair(2,2),pair(2,3),pair(2,4),pair(2,5),pair(3,1),pair(3,2),pair(3,3),pair(3,4),pair(3,5),pair(4,1),pair(4,2),pair(4,3),pair(4,4),pair(4,5),pair(5,1),pair(5,2),pair(5,3),pair(5,4),pair(5,5)]) --- NEW FILE: cantrdat.P --- :-(index(/(p,1),trie)). p(1). p(1). --- NEW FILE: concomp.P --- /* Compute connected components. This one does NOT use tabling but CHEATS and uses assert. */ t :- leader(_,_),fail. t. :- import get_calls/3, get_returns/2 from tables. d1 :- get_calls(leader(_,_),C,S), get_returns(C,S), tab(2), writeln(S), fail. d1 :- writeln('-------d1 finished - d2 begins--------'). d2 :- leader(N,M),writeln([N,M]),fail. d2. :- dynamic visited/1. :- index(visited/1,1,1001). :- import ensure_dync_loaded/1 from consult. :- ensure_dync_loaded('more_edgesP'). :- ensure_dync_loaded('nodesP'). :- table leader/2. leader(N,M) :- retractall(visited(_)), node(N), (N == sts1 -> true ; \+ visited(N) ), reachable(N,M),assert(visited(M)). :- table reachable/2. reachable(L,L). reachable(L,T) :- reachable(L,T1),(edge(T1,T);edge(T,T1)). % make a bad edge graph. makebad :- retractall(edge(_,_)),retractall(node(_)), bad(900). bad(N) :- (N =:= 0 -> true ; assert(node(N)), N1 is N-1, assert(edge(N1,N)), bad(N1) ). --- NEW FILE: concomp_old --- ret(sts1,sts1) ret(sts1,sts137) ret(sts1,sts138) ret(sts1,sts139) ret(sts1,sts140) ret(sts1,sts141) ret(sts1,sts142) ret(sts1,sts143) ret(sts1,sts144) ret(sts1,sts145) ret(sts1,sts146) ret(sts1,sts147) ret(sts1,sts632) ret(sts1,sts633) ret(sts1,sts634) ret(sts1,sts635) ret(sts1,sts636) ret(sts1,sts637) ret(sts10,sts10) [...1714 lines suppressed...] [sts780,sts797] [sts780,sts798] [sts780,sts799] [sts800,sts800] [sts800,sts801] [sts800,sts802] [sts806,sts806] [sts806,sts807] [sts806,sts808] [sts806,sts809] [sts814,sts814] [sts814,sts815] [sts814,sts816] [sts814,sts817] [sts814,sts818] [sts814,sts819] [sts814,sts820] [sts814,sts821] [sts814,sts822] [sts814,sts823] --- NEW FILE: correct.P --- % module shared_graph. /* Shape-graph with sharing information */ % export var_edge(bff). % export sel_edge(bfff). % export is_shared(bf). :- import member/2 from basics. /* Auxiliary functions ----------------------------------------------- */ singleton(X,NX) :- create_set(Temp), add_elem(X,Temp,NX). del_elem(X,NX,NY) :- singleton(X,Xset), difference(NX,Xset,NY). :- table transitively_points_to/3. transitively_points_to(U, NX, Z) :- var_edge(U, Z, NX). transitively_points_to(U, NX, Z) :- sel_edge(U, NY, _, NX), transitively_points_to(U, NY, Z). disjoint_or_equal(X,Y) :- set_equal(X, Y). disjoint_or_equal(X,Y) :- inter(X, Y, []). rename_var_to_var(NT,X,Y,NZ) :- member(Y,NT), add_elem(X,NT,NZ). rename_var_to_var(NT,_,Y,NZ) :- not member(Y,NT), set_equal(NT, NZ). :- table var_edge/3, sel_edge/4, is_shared/2. /* Explicit Initializations */ var_edge(V, X, NX) :- init_var_edge(V, X, NX). sel_edge(V, NX1,Sel,NX2) :- init_sel_edge(V, NX1, Sel, NX2). is_shared(V, NX) :- init_is_shared(V, NX). /* Edges with no pointer manipulation */ var_edge(V,X,NX) :- identity(U, V), var_edge(U, X, NX). sel_edge(V,NX1,Sel,NX2) :- identity(U, V), sel_edge(U, NX1, Sel, NX2). is_shared(V,NX) :- identity(U, V), is_shared(U, NX). /* x := nil ------------------------------------------------------- */ var_edge(V, Y, NYP) :- assign_nil_to_var(U,V,X), var_edge(U, Y ,NY), Y\==X, del_elem(X, NY, NYP). sel_edge(V, NY1P, Sel, NY2P) :- assign_nil_to_var(U,V,X), sel_edge(U, NY1, Sel, NY2), transitively_points_to(U, NY1, Y1), Y1 \== X, transitively_points_to(U, NY2, Y2), Y2 \== X, del_elem(X, NY1, NY1P), del_elem(X, NY2, NY2P). is_shared(V, NYP) :- assign_nil_to_var(U,V,X), is_shared(U, NY), transitively_points_to(U, NY, Y), Y \== X, del_elem(X, NY, NYP). /* x.sel_0 := nil ----------------------------------------------------- */ var_edge(V, Z, NZ) :- assign_nil_to_sel(U,V,_,_Sel0), var_edge(U, Z, NZ). sel_edge(V, NZ1, Sel, NZ2) :- assign_nil_to_sel(U,V,_,Sel0), sel_edge(U, NZ1, Sel, NZ2), Sel \== Sel0. sel_edge(V, NZ1, Sel, NZ2) :- assign_nil_to_sel(U,V,X,_Sel0), sel_edge(U, NZ1, Sel, NZ2), not member(X,NZ1). is_shared(V, NZ) :- assign_nil_to_sel(U,V,_,_Sel0), is_shared(U, NZ), sel_edge(V, NZ1, _, NZ), sel_edge(V, NZ2, _, NZ), inter(NZ1, NZ2, []). is_shared(V, NZ) :- assign_nil_to_sel(U,V,_,_Sel0), is_shared(U, NZ), sel_edge(V, NW, Sel1, NZ), sel_edge(V, NW, Sel2, NZ), Sel1 \== Sel2. /* x := new ------------------------------------ */ var_edge(V, Z, NZ) :- assign_new_to_var(U,V,_), var_edge(U, Z, NZ). var_edge(V, X, NX) :- /* Create the new var_edge from X */ assign_new_to_var(_,V,X), singleton(X,NX). sel_edge(V, NY, Sel, NZ) :- assign_new_to_var(U,V,_), sel_edge(U, NY, Sel, NZ). is_shared(V, NZ) :- assign_new_to_var(U,V,_), is_shared(U, NZ). /* x := y --------------------------- */ var_edge(V, Z, NZP) :- assign_var_to_var(U,V,X,Y), var_edge(U, Z, NZ), rename_var_to_var(NZ,X,Y,NZP). var_edge(V, X, NXY) :- assign_var_to_var(U,V,X,Y), var_edge(U, Y, NY), rename_var_to_var(NY,X,Y,NXY). sel_edge(V, NZ1P, Sel, NZ2P) :- assign_var_to_var(U,V,X,Y), sel_edge(U, NZ1, Sel, NZ2), rename_var_to_var(NZ1,X,Y,NZ1P), rename_var_to_var(NZ2,X,Y,NZ2P). is_shared(V, NZP) :- assign_var_to_var(U,V,X,Y), is_shared(U, NZ), rename_var_to_var(NZ,X,Y,NZP). /* x := y.sel0 ---------------------------- */ var_edge(V, Z, NZ) :- assign_sel_to_var(U,V,_X,_Y,_Sel0), var_edge(U, Z, NZ). var_edge(V, X, NXZ) :- assign_sel_to_var(U,V,X,Y,Sel0), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NZ), add_elem(X,NZ,NXZ). var_edge(V, Z, NXZ) :- assign_sel_to_var(U,V,X,Y,Sel0), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NZ), add_elem(X,NZ,NXZ), var_edge(U, Z, NZ). /* old -> old */ sel_edge(V, NZ1, Sel, NZ2) :- assign_sel_to_var(U,V,_X,Y,_Sel0), sel_edge(U, NZ1, Sel, NZ2), not member(Y,NZ1). /* old -> old */ sel_edge(V, NZ1, Sel, NZ2) :- assign_sel_to_var(U,V,_X,_Y,Sel0), sel_edge(U, NZ1, Sel, NZ2), Sel \== Sel0. /* old -> new */ sel_edge(V, NY, Sel0, NXZ) :- assign_sel_to_var(U,V,X,Y,Sel0), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NZ), add_elem(X,NZ,NXZ), not set_equal(NY, NZ). % NY \== NZ. /* new -> old */ sel_edge(V, NXZ, Sel, NT) :- assign_sel_to_var(U,V,X,Y,Sel0), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NZ), add_elem(X,NZ,NXZ), sel_edge(U, NZ, Sel, NT), not set_equal(NZ, NY), % NZ \== NY, disjoint_or_equal(NXZ, NT). /* Can be replaced by NZ <> NT or NZ = {} */ /* new -> old */ sel_edge(V, NXZ, Sel, NT) :- assign_sel_to_var(U,V,X,Y,Sel0), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NZ), add_elem(X,NZ,NXZ), sel_edge(U, NZ, Sel, NT), Sel \== Sel0, disjoint_or_equal(NXZ, NT). /* Can be replaced by NZ <> NT or NZ = {} */ /* new -> new */ sel_edge(V, NXY, Sel0, NXY1) :- assign_sel_to_var(U,V,X,Y,Sel0), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NY), add_elem(X,NY,NXY), set_equal(NXY, NXY1). /* new -> new */ sel_edge(V, NXZ, Sel, NXZ1) :- assign_sel_to_var(U,V,X,Y,Sel0), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NZ), is_shared(U, NZ), sel_edge(U, NZ, Sel, NZ), add_elem(X,NZ,NXZ), set_equal(NXZ, NXZ1). /* old -> new */ sel_edge(V, NT, Sel, NXZ) :- assign_sel_to_var(U,V,X,Y,Sel0), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NZ), is_shared(U, NZ), add_elem(X,NZ,NXZ), sel_edge(U, NT, Sel, NZ), not member(Y,NT), disjoint_or_equal(NT, NXZ). /* Can be replaced by NT <> NZ or NT = {} */ /* old -> new */ sel_edge(V, NT, Sel, NXZ) :- assign_sel_to_var(U,V,X,Y,Sel0), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NZ), is_shared(U, NZ), add_elem(X,NZ,NXZ), sel_edge(U, NT, Sel, NZ), Sel \== Sel0, disjoint_or_equal(NT, NXZ). /* Can be replaced by NT <> NZ or NT = {} */ is_shared(V, NZ) :- assign_sel_to_var(U,V,_X,_Y,_Sel0), is_shared(U, NZ). is_shared(V, NXZ) :- assign_sel_to_var(U,V,X,Y,Sel0), is_shared(U,NZ), var_edge(U, Y, NY), sel_edge(U, NY, Sel0, NZ), add_elem(X,NZ,NXZ). /* x.sel0 := y ------------------------------------------- */ var_edge(V, Z, NZ) :- assign_var_to_sel(U,V,_X,_Sel0,_Y), var_edge(U, Z, NZ). /* old edges */ sel_edge(V, NZ, Sel, NT) :- assign_var_to_sel(U,V,_X,_Sel0,_Y), sel_edge(U, NZ, Sel, NT). /* new edges */ sel_edge(V, NX, Sel0, NY) :- assign_var_to_sel(U,V,X,Sel0,Y), var_edge(U, X, NX), var_edge(U, Y, NY), disjoint_or_equal(NX, NY). is_shared(V, NZ) :- assign_var_to_sel(U,V,_X,_Sel0,_Y), is_shared(U, NZ). is_shared(V, NY) :- assign_var_to_sel(U,V,_X,_Sel0,Y), var_edge(U, Y, NY), sel_edge(U, _, _, NY). --- NEW FILE: cycle.P --- move2k(1,2). move2k(2,3). move2k(3,4). move2k(4,5). move2k(5,6). move2k(6,7). move2k(7,8). move2k(8,9). move2k(9,10). move2k(10,11). move2k(11,12). move2k(12,13). move2k(13,14). move2k(14,15). move2k(15,16). move2k(16,17). move2k(17,18). move2k(18,19). move2k(19,20). [...2008 lines suppressed...] move2k(2028,2029). move2k(2029,2030). move2k(2030,2031). move2k(2031,2032). move2k(2032,2033). move2k(2033,2034). move2k(2034,2035). move2k(2035,2036). move2k(2036,2037). move2k(2037,2038). move2k(2038,2039). move2k(2039,2040). move2k(2040,2041). move2k(2041,2042). move2k(2042,2043). move2k(2043,2044). move2k(2044,2045). move2k(2045,2046). move2k(2046,2047). move2k(2047,1). --- NEW FILE: dipti.P --- /* Dipti sent me the following program that is a very short pure Datalog program for which XSB gives the wrong answer. I haven't seen a bug like this in years. He says it worked in XSB version 2.4 but it doesn't work now. We should try to fix it soon. You know this code better than I, but if you don't have time, let me know and I'll see what I can do. Goal: execCode(workstation,X). Right answer is X=root and X=a It gives just X=a Works if 1st table decl is deleted Works if clause order is reversed. Works if clause 1 or 3 of accessFile is removed. Works if query is execCode(X,Y). */ test:- execCode(workstation,X),writeln(execCode(X)),fail. test. %% program :- table execCode/2. % works if delete this table decl. :- table accessFile/3. execCode(H, root) :- % writeln(execCode(H, root)), accessFile(H, write, _Path). execCode(_H, a). accessFile(H, _Access, _Path) :- execCode( H, _Usr). accessFile(Server, Access, ServerPath) :- nfsMounted(Client, ClientPath, Server, ServerPath, Access), accessFile(Client, Access, ClientPath). accessFile(_Server, _Access, _Path) :- execCode(_Client, _User). nfsMounted(workstation, 'share', fileserver, 'export', write). display:- get_calls_for_table(execCode/2,Call), write(Call),writeln(':'), get_returns_for_call(Call,Answer), tab(5),writeln(Answer), fail ; get_calls_for_table(accessFile/3,Call), write(Call),writeln(':'), get_returns_for_call(Call,Answer), tab(5),writeln(Answer), fail. --- NEW FILE: dipti_old --- execCode(root) execCode(a) --- NEW FILE: edge_dag.P --- edge(0,19,6). edge(0,14,2). edge(0,17,10). edge(0,3,6). edge(0,18,8). edge(1,4,2). edge(1,6,2). edge(1,16,2). edge(1,15,10). edge(1,16,10). edge(2,6,6). edge(2,20,2). edge(2,6,6). edge(2,11,2). edge(2,14,6). edge(3,18,2). edge(3,15,6). edge(3,7,6). edge(3,16,10). edge(3,11,6). edge(4,10,10). edge(4,19,4). edge(4,11,2). edge(4,7,6). edge(4,19,8). edge(5,14,8). edge(5,17,8). edge(5,15,6). edge(5,17,4). edge(5,13,6). edge(6,11,6). edge(6,26,4). edge(6,7,10). edge(6,19,2). edge(6,24,4). edge(7,26,2). edge(7,20,10). edge(7,11,4). edge(7,14,2). edge(7,12,10). edge(8,22,4). edge(8,16,2). edge(8,27,8). edge(8,21,6). edge(8,9,6). edge(9,13,4). edge(9,21,6). edge(9,24,6). edge(9,28,10). edge(9,25,6). edge(10,13,6). edge(10,15,10). edge(10,31,2). edge(10,27,10). edge(10,27,8). edge(11,20,6). edge(11,26,6). edge(11,20,8). edge(11,15,10). edge(11,20,10). edge(12,19,6). edge(12,27,8). edge(12,18,8). edge(12,27,4). edge(12,13,6). edge(13,20,2). edge(13,31,8). edge(13,22,8). edge(13,34,2). edge(13,24,10). edge(14,33,4). edge(14,33,4). edge(14,30,4). edge(14,21,2). edge(14,33,4). edge(15,21,2). edge(15,35,4). edge(15,19,4). edge(15,16,2). edge(15,34,2). edge(16,20,10). edge(16,19,6). edge(16,32,10). edge(16,22,8). edge(16,35,6). edge(17,25,6). edge(17,24,6). edge(17,19,6). edge(17,20,4). edge(17,37,8). edge(18,22,4). edge(18,33,4). edge(18,38,6). edge(18,30,4). edge(18,33,8). edge(19,23,10). edge(19,29,6). edge(19,21,2). edge(19,25,2). edge(19,35,6). edge(20,31,6). edge(20,31,6). edge(20,32,6). edge(20,32,6). edge(20,37,8). edge(21,24,4). edge(21,37,2). edge(21,23,6). edge(21,40,6). edge(21,25,8). edge(22,43,10). edge(22,33,10). edge(22,32,4). edge(22,26,10). edge(22,29,2). edge(23,43,4). edge(23,25,10). edge(23,27,2). edge(23,29,4). edge(23,39,6). edge(24,27,2). edge(24,44,8). edge(24,43,2). edge(24,27,6). edge(24,41,6). edge(25,29,8). edge(25,44,6). edge(25,27,4). edge(25,37,6). edge(25,32,8). edge(26,38,6). edge(26,43,4). edge(26,40,10). edge(26,41,6). edge(26,45,2). edge(27,34,10). edge(27,34,4). edge(27,34,8). edge(27,35,2). edge(27,32,4). edge(28,40,8). edge(28,47,4). edge(28,32,8). edge(28,48,4). edge(28,40,10). edge(29,44,4). edge(29,30,8). edge(29,40,2). edge(29,44,4). edge(29,36,2). edge(30,41,6). edge(30,51,4). edge(30,51,8). edge(30,41,6). edge(30,41,2). edge(31,37,10). edge(31,36,10). edge(31,45,6). edge(31,35,8). edge(31,37,2). edge(32,51,10). edge(32,39,10). edge(32,40,2). edge(32,39,6). edge(32,37,6). edge(33,45,2). edge(33,48,2). edge(33,38,6). edge(33,37,10). edge(33,47,8). edge(34,43,10). edge(34,52,6). edge(34,50,10). edge(34,55,2). edge(34,47,8). edge(35,44,4). edge(35,46,2). edge(35,47,6). edge(35,51,8). edge(35,46,4). edge(36,52,4). edge(36,52,4). edge(36,45,6). edge(36,39,4). edge(36,50,8). edge(37,56,2). edge(37,47,10). edge(37,55,6). edge(37,48,6). edge(37,46,2). edge(38,58,6). edge(38,50,6). edge(38,59,2). edge(38,49,2). edge(38,39,8). edge(39,46,2). edge(39,50,8). edge(39,50,4). edge(39,49,10). edge(39,47,2). edge(40,59,4). edge(40,52,4). edge(40,55,8). edge(40,41,4). edge(40,49,4). edge(41,49,10). edge(41,42,8). edge(41,46,2). edge(41,46,8). edge(41,53,6). edge(42,52,8). edge(42,49,6). edge(42,48,10). edge(42,52,6). edge(42,62,8). edge(43,61,4). edge(43,54,6). edge(43,64,2). edge(43,59,4). edge(43,52,2). edge(44,65,2). edge(44,54,4). edge(44,55,2). edge(44,59,2). edge(44,45,4). edge(45,49,6). edge(45,48,4). edge(45,61,2). edge(45,52,2). edge(45,48,2). edge(46,63,6). edge(46,59,6). edge(46,51,4). edge(46,61,8). edge(46,65,2). edge(47,48,6). edge(47,53,6). edge(47,58,4). edge(47,57,2). edge(47,60,2). edge(48,62,6). edge(48,62,4). edge(48,55,4). edge(48,56,10). edge(48,58,10). edge(49,56,6). edge(49,57,6). edge(49,63,4). edge(49,66,8). edge(49,50,8). edge(50,67,8). edge(50,67,4). edge(50,70,6). edge(50,53,8). edge(50,60,10). edge(51,62,2). edge(51,67,2). edge(51,65,8). edge(51,53,2). edge(51,62,8). edge(52,53,2). edge(52,68,2). edge(52,62,6). edge(52,55,6). edge(52,69,6). edge(53,68,10). edge(53,70,4). edge(53,73,2). edge(53,57,8). edge(53,60,6). edge(54,68,8). edge(54,74,2). edge(54,69,8). edge(54,68,10). edge(54,57,6). edge(55,75,10). edge(55,59,4). edge(55,64,8). edge(55,69,6). edge(55,58,8). edge(56,67,10). edge(56,59,8). edge(56,73,2). edge(56,68,10). edge(56,71,2). edge(57,72,10). edge(57,77,6). edge(57,71,4). edge(57,66,10). edge(57,64,4). edge(58,70,10). edge(58,68,2). edge(58,66,8). edge(58,59,8). edge(58,79,6). edge(59,78,10). edge(59,69,10). edge(59,60,4). edge(59,63,8). edge(59,78,4). edge(60,78,2). edge(60,68,2). edge(60,73,8). edge(60,70,8). edge(60,67,6). edge(61,70,4). edge(61,64,10). edge(61,75,2). edge(61,74,8). edge(61,74,2). edge(62,83,4). edge(62,77,2). edge(62,83,6). edge(62,67,2). edge(62,83,6). edge(63,70,6). edge(63,75,2). edge(63,70,4). edge(63,74,8). edge(63,64,10). edge(64,74,2). edge(64,77,4). edge(64,85,8). edge(64,75,6). edge(64,79,4). edge(65,70,6). edge(65,85,2). edge(65,86,6). edge(65,83,4). edge(65,76,8). edge(66,84,8). edge(66,70,10). edge(66,71,4). edge(66,78,10). edge(66,68,4). edge(67,75,10). edge(67,76,4). edge(67,81,10). edge(67,70,4). edge(67,84,4). edge(68,87,2). edge(68,89,4). edge(68,81,10). edge(68,69,2). edge(68,75,2). edge(69,82,8). edge(69,83,4). edge(69,87,2). edge(69,89,8). edge(69,73,6). edge(70,79,4). edge(70,79,4). edge(70,78,2). edge(70,85,6). edge(70,88,8). edge(71,84,8). edge(71,89,6). edge(71,92,10). edge(71,74,4). edge(71,79,2). edge(72,83,4). edge(72,83,6). edge(72,80,10). edge(72,90,10). edge(72,75,6). edge(73,83,10). edge(73,94,4). edge(73,75,8). edge(73,74,10). edge(73,82,2). edge(74,78,8). edge(74,91,6). edge(74,94,4). edge(74,83,10). edge(74,85,2). edge(75,87,2). edge(75,93,2). edge(75,80,4). edge(75,78,4). edge(75,89,4). edge(76,77,2). edge(76,89,4). edge(76,79,2). edge(76,87,10). edge(76,90,6). edge(77,97,6). edge(77,91,6). edge(77,89,2). edge(77,81,8). edge(77,91,4). edge(78,79,6). edge(78,81,6). edge(78,84,10). edge(78,96,8). edge(78,94,4). edge(79,92,4). edge(79,90,4). edge(79,92,8). edge(79,90,10). edge(79,80,6). edge(80,95,8). edge(80,89,6). edge(80,97,4). edge(80,95,8). edge(80,85,4). edge(81,90,8). edge(81,96,2). edge(81,96,8). edge(81,84,6). edge(81,90,10). edge(82,86,10). edge(82,91,10). edge(82,99,6). edge(82,98,2). edge(82,83,2). edge(83,92,4). edge(83,90,4). edge(83,88,2). edge(83,86,8). edge(83,84,8). edge(84,91,10). edge(84,95,2). edge(84,98,8). edge(84,91,8). edge(84,94,8). edge(85,90,8). edge(85,88,6). edge(85,86,2). edge(85,96,4). edge(85,96,6). edge(86,96,4). edge(86,87,4). edge(86,87,8). edge(86,93,8). edge(86,93,4). edge(87,88,4). edge(87,90,8). edge(87,96,6). edge(87,98,6). edge(87,96,8). edge(88,93,4). edge(88,96,6). edge(88,93,2). edge(88,92,6). edge(88,94,4). edge(89,96,6). edge(89,92,10). edge(89,96,8). edge(89,98,4). edge(89,94,2). edge(90,92,10). edge(90,92,8). edge(90,96,4). edge(90,99,2). edge(90,99,4). edge(91,92,10). edge(91,98,8). edge(91,96,4). edge(91,94,10). edge(91,92,4). edge(92,94,10). edge(92,93,8). edge(92,93,6). edge(92,98,6). edge(92,93,4). edge(93,96,10). edge(93,96,4). edge(93,98,8). edge(93,96,8). edge(93,96,10). edge(94,96,8). edge(94,97,4). edge(94,99,4). edge(94,99,8). edge(94,95,2). edge(95,96,10). edge(95,98,8). edge(95,96,4). edge(95,98,4). edge(95,96,10). edge(96,98,6). edge(96,99,6). edge(96,99,4). edge(96,99,10). edge(96,99,8). edge(97,98,4). edge(97,98,4). edge(97,98,8). edge(97,98,4). edge(97,98,10). edge(98,99,1). edge(98,99,8). edge(98,99,3). edge(98,99,10). edge(98,99,7). % to make it cyclic edge(99,0,1). --- NEW FILE: empty_answer.P --- /* Juliana Freire - March 25th, 96 * tests whether the checking for deleted answers works correctly */ :- import get_calls/3, get_returns/3, delete_return/2 from tables. arc(1,2). arc(2,3). arc(2,4). arc(4,1). :- table path/2. path(X,Y) :- arc(X,Y). path(X,Y) :- path(X,Z), arc(Z,Y). test :- path(_X1,_Y1), path(X,Y), % writeln(path(X,Y)), (((X=1, Y=2); (X=2, Y=2)) -> get_calls(path(_,_),Cs,Oskel), get_returns(Cs,Oskel,Leaf), delete_return(Cs,Leaf), % delete first answer % writeln(deleted(X,Y)), fail ; fail ). test :- writeln('Empty answer OK'). --- NEW FILE: empty_answer_old --- Empty answer OK --- NEW FILE: exec.P --- % Author: Bart Demoen K.U.Leuven % Date: Oct 21 1996 makeground([]) . makeground([X|R]) :- mkgr(X) , makeground(R) . mkgr(X) :- var(X) , ! , (X = g ; X = i ; X = v) . mkgr(_) . mymember(X,[Y|R]) :- mm(X,R,Y) . mm(X,_,X) . mm(X,[Y|R],_) :- mm(X,R,Y) . :- table(compute1/4) . compute(Vars,DRs,Mal,DR) :- compute1(Vars,DRs,Mal,DR), fail . compute(Vars,DRs,Mal,DR) :- compute1(Vars,DRs,Mal,DR). compute1(Vars,DRs,Mal,DR) :- findall(Mal,(lookup(Vars,DRs),makeground(Mal)),All), sort(All,DR) . lookup([],[]) . lookup([V|VarList],[DR|DRList]) :- mymember(V,DR) , lookup(VarList,DRList) . fail_iff_0([],_) :- fail . iffequal_2([_,_],[[g,g],[i,i],[v,v]]) . iff_1([_],[[g]]) . iff_2([_,_], [[g,g], [i,i], [i,v]]) . iff_3([_,_,_], [[g,g,g], [i,g,i], [i,g,v], [i,i,g], [i,i,i], [i,i,v], [i,v,g], [i,v,i], [i,v,v]]) . iff_4([_,_,_,_], [[g,g,g,g], [i,g,g,i], [i,g,g,v], [i,g,i,g], [i,g,i,i], [i,g,i,v], [i,g,v,g]|R]) :- r4_1(R) . r4_1([ [i,g,v,i], [i,g,v,v], [i,i,g,g], [i,i,g,i], [i,i,g,v], [i,i,i,g], [i,i,i,i], [i,i,i,v], [i,i,v,g], [i,i,v,i], [i,i,v,v]|R]) :- r4_2(R) . r4_2([ [i,v,g,g], [i,v,g,i], [i,v,g,v], [i,v,i,g], [i,v,i,i], [i,v,i,v], [i,v,v,g], [i,v,v,i], [i,v,v,v]]) . iff_5([_,_,_,_,_], [[g,g,g,g,g], [i,g,g,g,i], [i,g,g,g,v], [i,g,g,i,g], [i,g,g,i,i], [i,g,g,i,v], [i,g,g,v,g], [i,g,g,v,i], [i,g,g,v,v], [i,g,i,g,g]|R]) :- r5_1(R) . r5_1([ [i,g,i,g,i], [i,g,i,g,v], [i,g,i,i,g], [i,g,i,i,i], [i,g,i,i,v], [i,g,i,v,g], [i,g,i,v,i], [i,g,i,v,v], [i,g,v,g,g], [i,g,v,g,i]|R]) :- r5_2(R) . r5_2([ [i,g,v,g,v], [i,g,v,i,g], [i,g,v,i,i], [i,g,v,i,v], [i,g,v,v,g], [i,g,v,v,i], [i,g,v,v,v], [i,i,g,g,g], [i,i,g,g,i]|R]) :- r5_3(R) . r5_3([ [i,i,g,g,v], [i,i,g,i,g], [i,i,g,i,i], [i,i,g,i,v], [i,i,g,v,g], [i,i,g,v,i], [i,i,g,v,v], [i,i,i,g,g], [i,i,i,g,i]|R]) :- r5_4(R) . r5_4([ [i,i,i,g,v], [i,i,i,i,g], [i,i,i,i,i], [i,i,i,i,v], [i,i,i,v,g], [i,i,i,v,i], [i,i,i,v,v], [i,i,v,g,g], [i,i,v,g,i]|R]) :- r5_5(R) . r5_5([ [i,i,v,g,v], [i,i,v,i,g], [i,i,v,i,i], [i,i,v,i,v], [i,i,v,v,g], [i,i,v,v,i], [i,i,v,v,v], [i,v,g,g,g], [i,v,g,g,i]|R]) :- r5_6(R) . r5_6([ [i,v,g,g,v], [i,v,g,i,g], [i,v,g,i,i], [i,v,g,i,v], [i,v,g,v,g], [i,v,g,v,i], [i,v,g,v,v], [i,v,i,g,g], [i,v,i,g,i]|R]) :- r5_7(R) . r5_7([ [i,v,i,g,v], [i,v,i,i,g], [i,v,i,i,i], [i,v,i,i,v], [i,v,i,v,g], [i,v,i,v,i], [i,v,i,v,v], [i,v,v,g,g]|R]) :- r5_8(R) . r5_8([ [i,v,v,g,i], [i,v,v,g,v], [i... [truncated message content] |