1 | % (c) 2009-2019 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, | |
2 | % Heinrich Heine Universitaet Duesseldorf | |
3 | % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) | |
4 | ||
5 | ||
6 | :- module(tools_lists, | |
7 | [count_occurences/2, | |
8 | ord_member_nonvar_chk/2 | |
9 | ]). | |
10 | ||
11 | :- use_module(module_information). | |
12 | ||
13 | :- module_info(group,infrastructure). | |
14 | :- module_info(description,'A few utilities on lists seperated out from tools.pl to avoid cyclic module dependencies.'). | |
15 | ||
16 | ||
17 | % self-check in tools to avoid dependency on self_check module | |
18 | %:- assert_must_succeed((tools:count_occurences([a,b,a,a,b],R),R == [a-3,b-2])). | |
19 | :- use_module(library(avl), [avl_fetch/3, avl_to_list/2, avl_store/4,empty_avl/1]). | |
20 | ||
21 | % count number of occurences inside a list | |
22 | count_occurences(L,R) :- empty_avl(E), count_occ_aux(L,E,R). | |
23 | count_occ_aux([Term|T],A,Res) :- (avl_fetch(Term,A,Count) -> C is Count+1 ; C = 1), | |
24 | avl_store(Term,A,C,A2), | |
25 | count_occ_aux(T,A2,Res). | |
26 | count_occ_aux([],A,L) :- avl_to_list(A,L). | |
27 | ||
28 | % like ord_member but also allows nonvar lookup terms | |
29 | % note that this test fails for ord_member: | |
30 | %:- assert_must_succeed((tools:ord_member_nonvar_chk(p(b,X),[p(a,c),p(b,d)]),R == d)). | |
31 | ord_member_nonvar_chk(X, [H|T]) :- | |
32 | (X=H -> true | |
33 | ; X @>H -> ord_member_nonvar_chk(X,T)). |