/* * @(#) ari_lib.txt - Sample library in Prolog. * (c) 1997 Ivan Maidanski http://ivmai.chat.ru * Freeware program source. All rights reserved. ** * Language: Prolog * Tested with: Arity Prolog v1.0 * Last modified: 1997-04-11 16:30:00 GMT+04:00 */ max(X,Y,X):-X>=Y,!. max(X,Y,Y). min(X,Y,X):-X=0,XX is X-2,even(XX). is_list([_]). list_len([],0). list_len([_|V],L):-list_len(V,LL),inc(LL,L). get_elem([X|V],1,X). get_elem([X|V],N,Y):-dec(N,NN),get_elem(V,NN,Y). sub_list(U,[],[]). sub_list(U,[N|V],[X|W]):-sub_list(U,V,W),get_elem(U,N,X). del_elem([X|V],1,V). del_elem([X|U],N,[X|V]):-dec(N,NN),del_elem(U,NN,V). del_all_matches([],X,[]). del_all_matches([X|U],X,V):-!,del_all_matches(U,X,V). del_all_matches([Y|U],X,[Y|V]):-del_all_matches(U,X,V). del_all_elems_reps([],[]). del_all_elems_reps([X|U],[X|V]):-del_all_matches(U,X,W), del_all_elems_reps(W,V). get_elem_count([],X,0). get_elem_count([X|V],X,C):-!,get_elem_count(V,X,CC),inc(CC,C). get_elem_count([_|V],X,C):-get_elem_count(V,X,C). list_elem_sum([],0). list_elem_sum([X|V],S):-list_elem_sum(V,SS),S is SS+X. get_list_all_even_elem([],[]). get_list_all_even_elem([X|U],[X|V]):-even(X),!,get_list_all_even_elem(U,V). get_list_all_even_elem([X|U],V):-get_list_all_even_elem(U,V). get_list_all_even_pos_elem([],[]). get_list_all_even_pos_elem([X],[]). get_list_all_even_pos_elem([X,Y|U],[Y|V]):-get_list_all_even_pos_elem(U,V). max_elem([X],X). max_elem([X|V],Y):-max_elem(V,Z),max(X,Z,Y). min_elem([X],X). min_elem([X|V],Y):-min_elem(V,Z),min(X,Z,Y). reverse_list(U,V):-reverse_list_temp(U,V,[]). reverse_list_temp([],V,V). reverse_list_temp([X|U],V,W):-reverse_list_temp(U,V,[X|W]). concat_list([],V,V). concat_list([X|U],V,[X|W]):-concat_list(U,V,W). sort_list([],[]). sort_list([X|U],V):-sort_list(U,W),sort_list_temp(X,W,V). sort_list_temp(X,[],[X]). sort_list_temp(X,[Y|U],[X,Y|U]):-X0. is_subset(U,V):-cross_set(U,V,U). all_subsets(U,V):-all_list_sublists(U,V). set_range(H,L,[]):-H>L,!. set_range(L,H,[L|V]):-inc(L,LL),set_range(LL,H,V). join_set(U,V,W):-concat_list(U,V,WW),del_all_elems_reps(WW,W). cross_set(U,V,W):-substract_set(U,V,WW),substract_set(U,WW,W). substract_set(U,[],U). substract_set(U,[X|V],W):-del_all_matches(U,X,WW),substract_set(WW,V,W). mul_set([],U,[]). mul_set([X],[],[]):-!. mul_set([X],[Y|V],[[X,Y]|W]):-mul_set([X],V,W),!. mul_set([X|U],V,W):-mul_set([X],V,S),mul_set(U,V,T),join_set(S,T,W).