| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | :- use_module(library(lists),[delete/3]). | |
| 5 | ||
| 6 | % Options: | |
| 7 | % not-well-defined-values, size:S, list, avl or none for random value set | |
| 8 | ||
| 9 | % generate any type | |
| 10 | generate(prob_value_set(Options),Value) :- | |
| 11 | is_list(Options) , | |
| 12 | generate(ground_type,Type) , | |
| 13 | generate(prob_value_set(Type,Options),Value). | |
| 14 | ||
| 15 | % no options | |
| 16 | generate(prob_value_set(Type),Value) :- | |
| 17 | generate(prob_value_set(Type,[]),Value). | |
| 18 | ||
| 19 | generate(prob_value_set(Type,Options),Value) :- | |
| 20 | (member(not-well-defined,Options) | |
| 21 | -> delete(Options,not-well-defined,T) , | |
| 22 | TOptions = [not-well-defined-values|T] | |
| 23 | ; TOptions = Options) , | |
| 24 | % only generate sets of the same type for any | |
| 25 | (Type = any(_) -> generate(ground_type,NType) ; NType = Type) , | |
| 26 | gen_type(NType,value,GenType) , | |
| 27 | ( member(size:Size,TOptions) | |
| 28 | -> Size > 0 , NOptions = TOptions | |
| 29 | ; random(1,50,Size) , NOptions = [size:Size|TOptions]) , | |
| 30 | ( member(avl,TOptions) | |
| 31 | -> % avl tree doesn't have duplicates | |
| 32 | generate(avl_tree(GenType,NOptions),Temp) , | |
| 33 | Temp \= empty, | |
| 34 | Value = avl_set(Temp) | |
| 35 | ; member(list,TOptions) | |
| 36 | -> generate(list(GenType,NOptions),Temp) , | |
| 37 | (member(not-well-defined-values,NOptions) | |
| 38 | -> Value = Temp | |
| 39 | ; remove_dups(Temp,Value)) | |
| 40 | ; random_member(SetType,[avl,list]) , | |
| 41 | generate(prob_value_set(NType,[SetType|NOptions]),Value)). | |
| 42 | ||
| 43 | shrink(Type,avl_set(Value),Shrunken) :- | |
| 44 | Type =.. [prob_value_set|_] , | |
| 45 | avl_to_list(Value,AVLList) , | |
| 46 | findall(Key,member(Key-_,AVLList),List) , | |
| 47 | ((flattened(List) , \+member(avl_set(_),List)) | |
| 48 | -> shrink(list,List,NewList) | |
| 49 | ; maplist(shrink(prob_value_any),List,NewList)) , | |
| 50 | findall(Key-true,member(Key,NewList),NewAVLList) , | |
| 51 | ( NewAVLList == [] | |
| 52 | -> Shrunken = [] | |
| 53 | ; list_to_avl(NewAVLList, NewAvl), | |
| 54 | Shrunken = avl_set(NewAvl) | |
| 55 | ). | |
| 56 | ||
| 57 | shrink(Type,Value,Shrunken) :- | |
| 58 | Type =.. [prob_value_set|_] , | |
| 59 | shrink(list,Value,Shrunken). |