| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | :- use_module(library(random),[random/3]). | |
| 5 | :- use_module(library(sets),[subset/2]). | |
| 6 | ||
| 7 | % Options: | |
| 8 | % small, positive, negative, nozero, between(A,B) or none | |
| 9 | ||
| 10 | generate(integer(Options),Value) :- | |
| 11 | member(between(A,B),Options) , | |
| 12 | generate(between(A,B),Value). | |
| 13 | ||
| 14 | generate(integer(Options),Value) :- | |
| 15 | subset([small,positive,nozero],Options) , | |
| 16 | !, | |
| 17 | random(1,128,Value). | |
| 18 | ||
| 19 | generate(integer(Options),Value) :- | |
| 20 | subset([small,positive],Options) , | |
| 21 | !, | |
| 22 | random(0,128,Value). | |
| 23 | ||
| 24 | generate(integer(Options),Value) :- | |
| 25 | subset([small,negative],Options) , | |
| 26 | !, | |
| 27 | random(-128,-1,Value). | |
| 28 | ||
| 29 | generate(integer(Options),Value) :- | |
| 30 | subset([positive,nozero],Options) , | |
| 31 | !, | |
| 32 | random(1,20000,Value). | |
| 33 | ||
| 34 | generate(integer(Options),Value) :- | |
| 35 | member(positive,Options) , | |
| 36 | !, | |
| 37 | random(0,20000,Value). | |
| 38 | ||
| 39 | generate(integer(Options),Value) :- | |
| 40 | member(negative,Options) , | |
| 41 | !, | |
| 42 | random(-20000,-1,Value). | |
| 43 | ||
| 44 | generate(integer(Options),Value) :- | |
| 45 | member(small,Options) , | |
| 46 | !, | |
| 47 | random(-64,64,Value). | |
| 48 | ||
| 49 | generate(integer(_),Value) :- | |
| 50 | random(-20000,20000,Value). | |
| 51 | ||
| 52 | % try 0 | |
| 53 | shrink(integer(_),_,0). | |
| 54 | ||
| 55 | % divide by two for big numbers | |
| 56 | shrink(integer(_),Value,Shrunken) :- | |
| 57 | (Value > 100 ; Value < -100) , | |
| 58 | Shrunken is round(Value / 2). | |
| 59 | ||
| 60 | % smaller steps | |
| 61 | shrink(integer(_),Value,Shrunken) :- | |
| 62 | Value > 0 , | |
| 63 | Shrunken is Value - 1 . | |
| 64 | shrink(integer(_),Value,Shrunken) :- | |
| 65 | Value < 0 , | |
| 66 | Shrunken is Value + 1. |