| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | :- use_module(library(random),[random_member/2]). | |
| 5 | ||
| 6 | % all options of any type can be used | |
| 7 | ||
| 8 | % in practice a maximum recursive depth of two is enough for sets and sequences | |
| 9 | generate(prob_value_any(Options),Value) :- | |
| 10 | (member(noset,Options) | |
| 11 | -> generate(ground_type(Options),Type) | |
| 12 | ; random_member(Type,[integer(Options),string(Options),boolean(Options), | |
| 13 | set(Options),set(set(Options)),seq(Options),seq(seq(Options))])) , | |
| 14 | gen_type(Type,value,NType) , | |
| 15 | generate(NType,Value). | |
| 16 | ||
| 17 | shrink(Type,int(Value),int(Shrunken)) :- | |
| 18 | Type =.. [prob_value_any|_] , | |
| 19 | shrink(integer(_),Value,Shrunken). | |
| 20 | ||
| 21 | shrink(Type,string(Value),string(Shrunken)) :- | |
| 22 | Type =.. [prob_value_any|_] , | |
| 23 | shrink(atom(_),Value,Shrunken). | |
| 24 | ||
| 25 | shrink(Type,Value,Shrunken) :- | |
| 26 | Type =.. [prob_value_any|_] , | |
| 27 | (is_list(Value) ; Value = avl_set(_)) , | |
| 28 | shrink(prob_value_set,Value,Shrunken). | |
| 29 | ||
| 30 | shrink(Type,Value,Shrunken) :- | |
| 31 | Type =.. [prob_value_any|_] , | |
| 32 | shrink(prob_value_boolean(_),Value,Shrunken). |