/* ------------------------------------------------------------ */ % set (list) operators % edited: 12 Jan 2003. % modified: 8 Feb 2003. % modified: 13-14 Feb 2003. % modified: 16,22-25 Mar 2003. % modified: 5 Apr 2003. tree_formation, analysis_of_list, and subtree. % modified: 7 Apr 2003. asymmetric_difference. % modified: 10 Apr 2003. identified_subtree. % modified: 27 May 2003. a simplified version of nth1. (mess) % modified: 20 Aug 2003. some basic list operations. % modified: 15 Jan 2003. sort by a list of ordering. % modified: 19 Jan 2004. seteq/2. case of generating equivalent set. % modified: 23 Jan 2004. subset/3. case of bound subset. % modified: 10 Sep 2004. permutation/2. referred the code in "The Art of Prolog." % modified: 24 Sep 2004. modified demo run for concat_dl/3. % modified: 15 Feb 2005. intersection_of_lists/2, sup_projection/2, and so on cited from kglp01. % modified: 3 Mar 2005. another simple asymmetric difference. % modified: 21 Sep 2005. find_subset/4. % modified: 2 Nov 2006. sort_by_list/3. % modified: 3 Feb 2012. permutation/2, assign_goods/3. /* ------------------------------------------------------------ */ % find a subcollection of items as a term of the given goal. % ----------------------------------------------------------- % % 21 Sep 2005 (from: price.pl) find_subset(Item, Goal, F, C):- findall( Item, Goal, F), list_projection( _, F, C). % intersection_of_lists/2 and so on % ----------------------------------------------------------- % % 15 Feb 2005 (cited from kglp01.pl) inductive_numbers([]). inductive_numbers([N|H]):- length(H,N), inductive_numbers(H). make_pairs([],[],[]). make_pairs([A-X|Z],[A|B],[X|Y]):- length(B,N), length(Y,N), length(Z,N), make_pairs(Z,B,Y). % intersection of list %---------------------------------------------------% % 6 Feb 2005. intersection_of_lists([],_). intersection_of_lists([X|H],Z):- intersection_of_lists(H,Y), intersection(X,Y,Z). % a simple asymmetric difference. % ----------------------------------------------------------- % % added: 2 Mar 2005. asymmetric_differences(A,B,D):- subtract(A,B,D1), subtract(B,A,D2), D=(D1,D2). % hexa and bits (intended for abbreviation of event) %---------------------------------------------------% % this part has also copied to moji.pl separatedly. % 5-6 Feb 2005. hexa_list(X,N,[Tx|Hx]):- \+ var(X), length(X,N), R is N mod 4, hexa_list_residual(R,X,Y,Tx), hexa_list_0(Y,Hx). hexa_list_0([],[]). hexa_list_0([A,B,C,D|X],[Hx|Y]):- hexa_list_0(X,Y), hexa_1([A,B,C,D],Hx). hexa_list_residual(0,[A,B,C,D|X],X,Hx):- hexa_1([A,B,C,D],Hx). hexa_list_residual(3,[A,B,C|X],X,Hx):- hexa_1([0,A,B,C],Hx). hexa_list_residual(2,[A,B|X],X,Hx):- hexa_1([0,0,A,B],Hx). hexa_list_residual(1,[A|X],X,Hx):- hexa_1([0,0,0,A],Hx). hexa_1(FourBits,Hx):- list_projection(FourBits,[a,b,c,d],_), bits(FourBits,Decimal,_B), hexa_pattern(Hx,Decimal). hexa_pattern(Hx,Hx):- Hx <10, !. hexa_pattern(Hx,D):- member((D,Hx),[ (10,a),(11,b),(12,c),(13,d),(14,e),(15,f) ]). hexa(L,Decimal,Hx):- concat_list(Hx,[0,x|L]), atom_chars(Hx,Atoms), number_chars(Decimal,Atoms). bits(L,Decimal,B):- concat_list(B,[0,b|L]), atom_chars(B,Atoms), number_chars(Decimal,Atoms). % concat list %---------------------------------------------------% % cited and modified from moji.pl(July 2003) concat_list(A,[A]). concat_list(Z,[L|R]):- concat_list(Q,R), concat(L,Q,Z). /* % ISO definition: 0[box]. % binary, octal hexadecimal numbers. ?- A is 0x101. A = 257 Yes ?- % system predicates ?- atom_chars(123,A),number_chars(B,A). A = ['1', '2', '3'] B = 123 Yes ?- number_chars(B,['0','x','1','1']). B = 17 Yes ?- */ %---------------------------------------------------% % 28 Jan 2005. forall_write(A):- forall(member(X,A),(nl,write(X))). forall_write_goals(A,B):- B,nl,write(A),fail. forall_write_goals(_,_):- nl,write(complete). % super set projection %---------------------------------------------------% % 1 Feb 2005. sup_projection([],[]). sup_projection([W|Z],[X|Y]):- member((X,W),[(1,1),(0,0),(0,1)]), sup_projection(Z,Y). % a naive program of distribution (index function). % this is not useful for generate a long list. %---------------------------------------------------% project_N_things_of(N,O,P,Q):- integer(N), length(O,U), N==N) ->!,true ; ( inductive_numbers([U|M]), member(N,[U|M]) )), length(P,U), choose_N_units_0(P,N,_L). % validation of bit sequence is_a_bounded_bit_sequence_of_length(P,L):- length(P,L), forall(member(X,P), ( \+ var(X), member(X,[0,1]) ) ). /************************************************* ?- choose_N_units_among(5000,2,[1,1|X]). X = [0, 0, 0, 0, 0, 0, 0, 0, 0|...] Yes *************************************************/ % generation of bit sequence choose_N_units_0([],0,0). choose_N_units_0(Z,0,0):- length(Z,R), zeros(Z,R). choose_N_units_0(Z,M,L):- length(Z,R), M>=R, ones(Z,R), L is M -R. choose_N_units_0([X|Y],M,L1):- length([X|Y],R), M >0, M U=0;integer(U)), inductive_numbers([U|M]), !, reverse([U|M],[0|R]), list_projection(P,R,W). /************************************************* ?- assign_values(A,[0,1,2],4,(sum(A,N),N = 5)). A = [2, 2, 1, 0] N = 5 ; A = [2, 1, 2, 0] N = 5 ; A = [1, 2, 2, 0] N = 5 ; ... ?- replace_sublist_with_values(A,[x],true,[a,b,c,d,e],[1,3,4]). A = [x, b, x, x, e] ; No ?- replace_sublist_with_values(A,[x,y],true,[a,b,c,d,e],[1,3,4]). A = [x, b, x, x, e] ; A = [y, b, x, x, e] ; A = [x, b, y, x, e] ; A = [y, b, y, x, e] ; A = [x, b, x, y, e] ; A = [y, b, x, y, e] ; A = [x, b, y, y, e] ; A = [y, b, y, y, e] ; No ?- subsequence_of_inductive_numbers(2,P,R,W). P = [0, 0] R = [1, 2] W = [] ; P = [0, 1] R = [1, 2] W = [2] ; P = [1, 0] R = [1, 2] W = [1] ; P = [1, 1] R = [1, 2] W = [1, 2] ; No ?- *************************************************/ % priority-considered version of bag0 %---------------------------------------------------% variation_seek_sequence([],_A,0). variation_seek_sequence([C|B],A,N):- length([C|B],N), member(C,A), subtract(A,[C],D), append(D,[C],E), variation_seek_sequence(B,E,_N1). :- dynamic temp_vss/1. update_temp_vss(C):- retract(temp_vss(H)), assert(temp_vss([C|H])). % ----------------------------------------------------------- % % distribution of goods among sites or people % ----------------------------------------------------------- % % added: 3 Feb 2012 % count frequency count( G, N):- findall( 1, G, L), length( L, N). % assign_colors( X -> Y, A). % A: a plan assigns a set of sites X a given set of colors Y. % X: a list % Y: a list assign_colors( X -> Y, A):- length( X, _N), length( Y, _M), assign_colors0( X, Y, A). assign_colors0( [], _, []). assign_colors0( [X | L], H, [ X->C | A]):- assign_colors0( L, H, A), member( C, H). % assign_goods( X -> Y, A). % A: a plan assigns a set of sites X a given set of goods Y. % X: a list % Y: a list assign_goods( X -> Y, A):- length( X, _N), length( Y, _M), assign_goods0( X, Y, A). assign_goods0( [], _, []). assign_goods0( [X | L], [], [ X->[] | A]):- assign_goods0( L, [], A). assign_goods0( [X | L], H, [ X->C | A]):- append( B, [C | D], H), \+ member( C, B), append( B, D, W), assign_goods0( L, W, A). % ----------------------------------------------------------- % % some basic list operations. % ----------------------------------------------------------- % % added: 20 Aug 2003. % len/2 : alternative to the length/2 len(A,B):- len_0(A,B). % length/2 of SWI-prolog fails at the case of both unbound variables. len_0(A,B):- var(A), var(B), !, fail. len_0([],0). len_0([_|A],N):- ((integer(N),N>0)->N0 is N -1; true), len_0(A,N0), ((integer(N0))->true; !,fail), N is N0 + 1. % kth/3 : alternative to the nth1/3 nth_1(K,Y,X):- kth_member(K,Y,X). kth(K,Y,X):- kth_member(K,Y,X). kth_member(1,[X|_],X). kth_member(K,[_|Y],X):- kth_member(K1,Y,X), K is K1 + 1. % rev/2 : alternative to the reverse/2 rev(A,B):- len(A,L), len(B,L), rev(A,[],B), !. rev(A,A,[]):-!. rev(A,B,[C|D]):- rev(A,[C|B],D). % descending/ascending natural number sequence less than N. % ----------------------------------------------------------- % dnum_seq([],N):-N<0,!. dnum_seq([0],1). dnum_seq([A|Q],N):- A is N - 1, length(Q,A), dnum_seq(Q,A). anum_seq(Aseq,N):-dnum_seq(Dseq,N),sort(Dseq,Aseq). dnum_seq1(Q,N):- M is N + 1, dnum_seq(Q0,M), subtract(Q0,[0],Q). anum_seq1(Q,N):- M is N + 1, anum_seq(Q0,M), subtract(Q0,[0],Q). % count frequency of occurence of the specified value of variable, M. % ----------------------------------------------------------- % % note: Both of M and L have to be specified. counter(N,M,L):- length(L,_), findall(M,member(M,L),Mx), length(Mx,N). % multiplicity of successful goals. % ----------------------------------------------------------- % sea_multiple(Goal,Cond,N,M):- Clause=..Goal, findall(Cond,Clause,Z),length(Z,N),sort(Z,Q),length(Q,M). % equality for pair of set % ----------------------------------------------------------- % % edited: 15 Nov 2002. % edited: 14 Feb 2003. % edited: 19 Jan 2004. case of generating equivalent set. % % equality for pair of set % ----------------------------------------------------------- % seteq(X,Y):- \+ var(X), length(X,N), \+ var(Y), length(Y,N), sort(X,Sort), sort(Y,Sort). seteq(X,Y):- \+ var(X), length(X,N), var(Y), bag1(Y,X,N). /* % older versions. seteq(X,Y,L):- length(X,L), length(Y,L), forall(member(Z,X),member(Z,Y)), forall(member(Z,Y),member(Z,X)). % edited: 15 Nov 2002. seteq(X,Y):- sort(X,Sort), sort(Y,Sort). */ % % bag0/3 : allow multiplicity % ----------------------------------------------------------- % bag0( [], _A, 0). bag0( [C | B], A, N):- length( [C | B], N), bag0( B, A, _N1), member( C, A). zeros(Zero,N):-bag0(Zero,[0],N). ones(One,N):-bag0(One,[1],N). % % bag1/3 : do not allow multiplicity % ----------------------------------------------------------- % % modified: 15 Oct 2002. bag fixed for unboundness. % modified: 27 Feb 2003. bag (asc_nnseq->anum_seq). bag1([],_A,0). bag1([C|B],A,N1):- \+var(A), length(A,L), anum_seq(Q,L), member(N,Q), length(B,N),bag1(B,A,N),N1 is N + 1, member(C,A),\+member(C,B). % % ordering/3 % ----------------------------------------------------------- % ordering(A,B,C):-bag1(A,B,C). % % sort without removal of duplicates %-------------------------------------------------- asort(A,B):- sort(A,C), bagof(CK, J^K^( nth1(J,C,CK), nth1(K,A,CK) ), B). % sort by a list of ordering %-------------------------------------------------- % revised: 2 Oct 2006. (cited from sp06d.pl) % sort_by_list( Object, +List, Result). sort_by_list(_,[],[]). sort_by_list(L,[X|O],R):- \+ var(O), \+ var(L), (\+ member(X,L)->R=R1; R=[X|R1]), subtract(L,[X],L1), sort_by_list(L1,O,R1). sort_by_list(L,O,R):- \+ var(O), var(L), (\+ var(R)->subset(R,O);true), sort_by_list(R,O,R). /* % depreciated % added: 14 Jan 2004. % modified: 16 Jan 2004. sort_by_list(X,OL,Y):- (var(X)->bag1(X,OL,_);true), list_projection(_,OL,Y), seteq(X,Y). */ % % a sequence of binary choice for a list: %-------------------------------------------------- % projection(3rd ar) of vector(2nd ar) using a sequence of digits(1st ar). % you must specify the second ('a base set') argument. % this predicate is important so that it is used in subset_of /3. % modified: 8 Feb 2003. list_projection([],[],[]). list_projection([X|Y],[_|B],C):- list_projection(Y,B,C), X = 0. list_projection([X|Y],[A|B],[A|C]):- list_projection(Y,B,C), X = 1. % % complementary list projection %-------------------------------------------------- % added: 10 Jan 2003. % modified: 22 Mar 2003. the earlier version has come back. % complementary list projection %-------------------------------------------------- c_list_projection([],[],[]). c_list_projection([X|Y],[_|B],C):- c_list_projection(Y,B,C), X = 1. c_list_projection([X|Y],[A|B],[A|C]):- c_list_projection(Y,B,C), X = 0. /* % 10 Jan 2003 version. c_list_projection(X,Y,Z):- list_complement(X,XC,_N), list_projection(XC,Y,Z). list_complement(X,XC,N):- \+ (var(X),var(N)), bag0(X,[1,0],N), zeros(Zero,N), ones(One,N), replace(X,Zero,One,XC). */ % % subset_of/3 : subset-enumeration % ----------------------------------------------------------- % % modified: 23 Jan 2004. to divide the case of subset-bound. subset_of(A,N,As):- var(A), length(As,L), length(D,L), list_projection(D,As,B), length(B,N), sort(B,A). subset_of(A,N,As):- \+ var(A), length(A,N), subset(A,As). % complement and symmetric complement % ----------------------------------------------------------- % % added: 22 Mar 2003. complement(AC,A,As):- subset_of(A,_N,As), subtract(As,A,AC). complement_1(AC,A,As):- list_projection(P,As,A), c_list_projection(P,As,AC). symmetric_complement(AC,A,As):- list_projection(P,As,A), c_list_projection(P,As,AC), list_projection(P1,As,AC), P @< P1. %subset_of(A,N,As):-multiple_subset_of(A,N,As). % % subset allowing multiple membership % ----------------------------------------------------------- % multiple_subset_of([],0,_):-!. multiple_subset_of([X|A],N,As):- length([X|A],N), multiple_subset_of(A,N1,As), member(X,As), N is N1 + 1. % an alternative, but not so aesthetic. % ----------------------------------------------------------- % % added: 22 Mar 2003. sub_list([],[]). sub_list(A,B):- \+ var(B), length(B,_), sub_list0(C,[],B), reverse(C,A). sub_list0([],A,A). sub_list0([X|B],Y,A):- length(A,N), length(Y,M), M < N, sublist0(B,[X|Y],A). sub_list0(B,Y,A):- length(A,N), length(Y,M), M < N, sub_list0(B,[_X|Y],A). % % index for table(=tuples). % ----------------------------------------------------------- % % 1) only mention for a direct product of sets. index_of_tuples(B,A,Index):- \+ var(B), \+ var(A), length(B,LN), % base sets length(A,LN), length(Index,LN), findall(L, ( nth1(K,B,BJ), %write(a(K,B,BJ)), nth1(L,BJ,AJ),%write(b(L,BJ,AJ)), nth1(K,A,AJ) %,write(c(K,A,AJ)),nl ), Index). index_of_tuples(B,A,Index):- \+ var(B), \+ var(Index), var(A), length(B,LN), % base sets length(Index,LN), length(A,LN), findall(AJ, ( nth1(K,B,BJ), nth1(K,Index,L), nth1(L,BJ,AJ) ), A). % % characteristic_vector/3 % ----------------------------------------------------------- % % modified: 8 Feb 2003. without using nth1. % modified: 13 Feb 2003. bug fix. without using member. characteristic_vector(X,B,Index):- \+ var(B), %member(X,B), list_projection(Index,B,[X]). characteristic_vector(1,X,[X|B],[1|DX]):- characteristic_vector(X,[X|B],[1|DX]). characteristic_vector(K,X,[_|B],[0|DX]):- characteristic_vector(K1,X,B,DX), K is K1 + 1. /* % an alternative characteristic_vector(N,N,[1|O]):- integer(N), N1 is N - 1, length(O,N1), zeros(O,N1). characteristic_vector(K,N,[0|V]):- integer(N), N1 is N - 1, length(V,N1), characteristic_vector(K,N1,V). % old version characteristic_vector(K,N,V):- integer(N), length(V,N), nth_1(K,V,1), findall(X,(nth_1(J,V,X),(J=K->X=1;X=0)),V). */ % % my nth %-------------------------------------------------- % added: 8 Feb 2003. nth1a(K,A,X):- \+ var(A), characteristic_vector(K,_,A,V), list_projection(V,A,[X]). nth0a(K,A,X):- nth1a(K1,A,X), K is K1 - 1. % added: 27 May 2003. nth1b(1,[A|_],A). nth1b(K,[_|B],A):- nth1b(K1,B,A), K is K1 + 1. /* nth0 and nth1 of SWI-prolog. nth1(A, B, C) :- integer(A), !, D is A - 1, nth0_1(D, B, C). nth1(A, B, C) :- var(A), nth0_2(D, B, C), A is D + 1. nth0(A, B, C) :- integer(A), !, nth0_1(A, B, C). nth0(A, B, C) :- var(A), !, nth0_2(A, B, C). nth0_1(0, [A|B], A) :- !. nth0_1(A, [B|C], D) :- E is A - 1, nth0(E, C, D). nth0_2(0, [A|B], A). nth0_2(A, [B|C], D) :- nth0_2(E, C, D), succ(E, A). */ % % replace(Project,Goal,Base,Goal1):- % ----------------------------------------------------------- % % added: 15 Oct 2002. % a sequence of replacement of a subset of elements in Goal % which specified by a list, Project, 0-1^n, over Base % a list of length n, which brings about Goal1. % summary: % X=1 --> preserve the value of Base. % X=0 --> do replace with Goal1. replace([],[],[],[]). replace([X|A],[_|B],[Z|C],[Z|D]):- X = 0, replace(A,B,C,D). replace([X|A],[Y|B],[_|C],[Y|D]):- X = 1, replace(A,B,C,D). % % replace/4 % ----------------------------------------------------------- % % modified: 14 Feb 2003. bug fix. replace(K/N,L,S,L1):- \+ var(S), \+ var(L), length(L,N), length(L1,N), nth1(K,L1,S), characteristic_vector(K,_S0,L,V), c_replace(V,L,L1,L1). % c_replace([],[],[],[]). c_replace([X|A],[_|B],[Z|C],[Z|D]):- X = 1, c_replace(A,B,C,D). c_replace([X|A],[Y|B],[_|C],[Y|D]):- X = 0, c_replace(A,B,C,D). % % asymmetric difference without reduction of duplicates. % ----------------------------------------------------------- % % added: 7 Apr 2003. asymmetric_difference(reduce(no),A,B,Resid,Meet):- length(A,_), length(B,_), %sort(A,Meet), findall(P, ( member(X,A), (member(X,B) -> P=0;P=1) ), ML), list_projection(ML,A,Meet), c_list_projection(ML,A,Resid). asymmetric_difference(reduce(yes),A,B,Resid,Meet):- length(A,_), length(B,_), %sort(A,Meet), findall(P, ( nth1(K,A,X), (member(X,B) -> P1=0;P1=1), ((nth1(K1,A,X),K1 P=0;P=P1) ), ML), list_projection(ML,A,Meet), c_list_projection(ML,A,Resid). % % permutation. % ----------------------------------------------------------- % % modified: 1 Sep 2002. to be used in is_neutral/2. % modified: 15 Oct 2002. add a non-variable constraint for the base set A. % modified: 10 Sep 2004. abolish the old code then replaced by the reference. % reference: % L. Sterling and E. Shapiro (1994). The Art of Prolog. 2nd edition. MIT Press, p.68. permutation([],[]). permutation(Q,[A|R]):- select(A,Q,Q1), % subtract(Q,[A],Q1) is not valid for multiple-occurence. permutation(Q1,R). % my old code for only verification. permutation_1([],[],[]). permutation_1(Q,[A->P|PoA1],R):- subtract(Q,[A],Q1),nth1(K,Q,A), subtract(R,[P],R1),nth1(K,R,P), permutation_1(Q1,PoA1,R1). % % projection operator via index set. (an exchange economy?) % ----------------------------------------------------------- % % choice1 from base1 :: choice2 from base2. % modified : 15 Oct 2002. to be order-neutral (pending:-) % pcm([Choice1,Base1],[Choice2,Base2]):- pairwise_contract_map([Choice1,Base1],[Choice2,Base2]). pairwise_contract_map([Choice1,Base1],[Choice2,Base2]):- % length(Base1,N2), % length(Base2,N2), subset_of(Choice1,N1,Base1), subset_of(Choice2,N1,Base2), list_projection(Project,Base1,Choice1), list_projection(Project,Base2,Choice2). % % ppcm /2 using plist_projection % added: 15 Oct 2002. ppcm([Choice1,Base1],[Choice2,Base2]):- subset_of(C1,N1,Base1), subset_of(C2,N1,Base2), plist_projection(Project,Base1,Choice1,C1), plist_projection(Project,Base2,Choice2,C2). % % concatenate for list elements % ----------------------------------------------------------- % concat_v([],'',0). %concat_v([b,c],Z,2):-length([c],1),concat_v([c],c,1),concat(b,c,Z). %concat_v([a,b,c],Z,3):-length([a,c],2),concat_v([b,c],bc,2),concat(a,bc,Z). concat_v([X|Y],Z,L):-concat_v(Y,Z1,L1),length(Y,L1),L is L1 + 1, concat(X,Z1,Z). % 差分リスト(参考) concat_dl(A-B,B-C,A-C). concat_dl_1(A,B,C):- concat_dl_0(A-B), concat_dl_0(B-C), concat_dl_0(A-C). concat_dl_0(A-B). /* sample executions ?- concat_dl([a,b|X]-X,[c,d|Y]-Y,R). X = [c,d|G1172] Y = G1172 R = [a,b,c,d|G1172] - G1172 Yes ?- concat_dl([a,b|X]-X,[c,d|Y]-Y,R-[]). X = [c, d] Y = [] R = [a, b, c, d] Yes ?- concat_dl([a,b|X]-X,[c,d|Y]-Y,R-[X]). X = [c, d, [c, d, [c, d, [...|...]]]] Y = [[c, d, [c, d, [c, d|...]]]] R = [a, b, c, d, [c, d, [c|...]]] Yes ?- concat_dl([a,b|X]-X,[c,d|Y]-Y,R-[Y]). X = [c, d, [[[[[[[...]]]]]]]] Y = [[[[[[[[[[...]]]]]]]]]] R = [a, b, c, d, [[[[[...]]]]]] Yes ?- */ % % cited from the system predicates of SWI-Prolog 1.9.0 % ----------------------------------------------------------- % /* apply /2 : not found in If-Prolog */ my_apply(A,B):-C=..[A|B],C. /* same as maplist /3,select /3, and sublist / 3of SWI-prolog */ my_maplist(_A, [], []). my_maplist(A, [B|C], [D|E]) :- apply(A, [B,D]), my_maplist(A, C, E). my_select([A|B], A, B). my_select([A|B], C, [A|D]) :- my_select(B, C, D). my_sublist(_A, [], []) :- !. my_sublist(A, [B|C], D) :- apply(A, [B]), !, D = [B|E], my_sublist(A, C, E). my_sublist(A, [_B|C], D) :- my_sublist(A, C, D). % decomposition of clause %----------------------------------------------- % added: 16 Mar 2001 decomposition_of_clause((A:- true),A,[]). decomposition_of_clause(A,A,[]):- atom(A). decomposition_of_clause((A:-B),A,C):- (A:-B) =.. [(:-),A,B], decomposition_of_body(B,C). decomposition_of_body((A,B),[A|C]):- \+ var(B), decomposition_of_body(B,C). decomposition_of_body((A,B),C):- var(B), decomposition_of_body(A,D), append(D,[B],C), !. decomposition_of_body(B,[B]):- atom(B); var(B); functor(B,_,_). %----------------------------------------- % generation of partitions and trees(herarchies) %----------------------------------------- % cited from: dpfirm0.pl (25 Mar 2003) % tree formations for the input data (i.e., information items) % by partitioning the set of input items recursively. % ?- tree_formation(Mode,levels:L,items:S,tree:T). % generating partitons %----------------------------------------- partition([S],1,S):- \+ var(S), length(S,_). partition([H|H1],N,S):- \+ var(S), length(S,_), symmetric_complement(H,S1,S), \+ member([], [H,S1]), partition(H1,N1,S1), N is N1 + 1, all_elements(S1,_,H1). all_elements([],0,[]). all_elements(A,N,[H|S]):- \+ var(S), length(S,_), \+ var(H), length(H,K), all_elements(B,N1,S), append(H,B,A), N is N1 + K. % tree_formation(Mode,levels:L, items:A, tree:T). %----------------------------------------- tree_formation(list,levels:1, items:A, tree:A):- \+ var(A), length(A,_). tree_formation(list,levels:K, items: S, tree: [T1|T2] ):- \+ var(S), %symmetric_complement(H1,H2,S), partition([H1|H2],_,S), \+ member([],[H1,H2]), tree_formation(list,levels:K1, items: H1, tree: T1 ), tree_formation(list,levels:K1, items: H2, tree: T2 ), K is K1+1. % skip-reporting tree_formation(list,levels:K, items:A, tree:[T]):- number(K), tree_formation(list,levels:K1, items: A, tree: T ), K is K1 + 1. % list - binary %------------ tree_formation(blist,levels:L, items:A, tree:A):- length(A,_), (var(L)->L =1; true). tree_formation(blist,levels:K, items: S, tree: T ):- \+ var(S), T = [T1,T2], symmetric_complement(H1,H2,S), \+ member([],[H1,H2]), tree_formation(blist,levels:K1, items: H1, tree: T1 ), tree_formation(blist,levels:K2, items: H2, tree: T2 ), (K1 >= K2 -> K is K1+1; K is K2+1). % utility: depth of tree %----------------------------------------- % modified: 5 Apr 2003 slightly modified in reputate.pl analyze_list([], levels:0, items:[]). analyze_list(A, levels:0, items:[A]):- A\=[], ( atom(A); number(A); (\+ atom(A),\+ number(A),A=..[F|_],F\='.') ). analyze_list([B|T], levels:L, items:H):- analyze_list(B, levels:L1, items:H2), analyze_list(T, levels:L2, items:H1), append(H2,H1,H), (L1 + 1 >= L2 -> L is L1 + 1; L is L2), !. % utility: subtrees %----------------------------------------- subtree(T,(level:L/L,no:1/1, superior:root, items:H),T):- % 1st element of the top layer . analyze_list(T, levels:L,items:H). subtree(S,(level:L/M, no:K/N, superior:(L1,K1),items:H),T):- %(var(T)->hierarchy(T);true), subtree(S1,(level:L1/M,no:K1/_, _,_),T), (L1=0->(!,fail);true), length(S1,N), nth1(K,S1,S), analyze_list(S, levels:L,items:H). % added: 10 Apr 2003. identified_subtree(T,[],H,T):- subtree(T,H,T). identified_subtree(S,[X|Path],I,T):- identified_subtree(S1,Path,I1,T), I1 = (level:L1/M,no:K1/_N1, superior:X,_), (L1=0->(!,fail);true), length(S1,N), nth1(K,S1,S), analyze_list(S, levels:L,items:H), I = (level:L/M, no:K/N, superior:(L1,K1),items:H). % ---- end of set operators.