| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | :- use_module(library(lists)). | |
| 5 | :- use_module(library(random),[random/3,random_member/2]). | |
| 6 | ||
| 7 | % Options: | |
| 8 | % size:X with X the amount of elements in the list | |
| 9 | ||
| 10 | % list of any type | |
| 11 | generate(list(Options),Value) :- | |
| 12 | is_list(Options) , | |
| 13 | generate(ground_type,Type) , | |
| 14 | generate(list(Type,Options),Value). | |
| 15 | ||
| 16 | generate(list(Type),Value) :- | |
| 17 | generate(list(Type,[]),Value). | |
| 18 | ||
| 19 | generate(list(_,Options),[]) :- | |
| 20 | member(size:0,Options), | |
| 21 | !. | |
| 22 | ||
| 23 | % list of given type | |
| 24 | generate(list(Type,Options),Value) :- | |
| 25 | (member(size:Size,Options) | |
| 26 | -> Size > 0 | |
| 27 | ; random(1,50,Size)) , | |
| 28 | length(Value,Size) , | |
| 29 | maplist(generate(Type),Value). | |
| 30 | ||
| 31 | % shrink list of list | |
| 32 | shrink(Type,Value,Shrunken) :- | |
| 33 | Type =..[list|_] , | |
| 34 | \+ flattened(Value) , | |
| 35 | maplist(shrink(list),Value,Shrunken). | |
| 36 | ||
| 37 | % check empty list | |
| 38 | shrink(Type,[_],[]) :- | |
| 39 | Type =..[list|_]. | |
| 40 | ||
| 41 | % remove random elements | |
| 42 | shrink(Type,L,NL) :- | |
| 43 | Type =.. [list|_] , | |
| 44 | is_list(L) , | |
| 45 | random_member(E,L) , | |
| 46 | delete(L,E,NL). | |
| 47 | ||
| 48 | % remove last element of a list | |
| 49 | remove_last([],[]). | |
| 50 | remove_last([_],[]). | |
| 51 | remove_last([H|T],[H|T2]) :- | |
| 52 | remove_last(T,T2). |