| 1 | :- multifile generate/2. | |
| 2 | :- multifile shrink/3. | |
| 3 | ||
| 4 | :- use_module(library(random),[random/3]). | |
| 5 | ||
| 6 | % Options: | |
| 7 | % positive, negative | |
| 8 | ||
| 9 | generate(rational(Options),Value) :- | |
| 10 | member(positive,Options) , | |
| 11 | !, | |
| 12 | delete(Options,positive,NOptions) , | |
| 13 | random(0,2,R) , | |
| 14 | generate_rational_aux(positive,NOptions,R,Z,N) , | |
| 15 | Value = Z/N. | |
| 16 | ||
| 17 | generate(rational(Options),Value) :- | |
| 18 | member(negative,Options) , | |
| 19 | !, | |
| 20 | delete(Options,negative,NOptions) , | |
| 21 | random(0,2,R) , | |
| 22 | generate_rational_aux(negative,NOptions,R,Z,N) , | |
| 23 | Value = Z/N. | |
| 24 | ||
| 25 | generate(rational(Options),Value) :- | |
| 26 | random_member(Pol,[positive,negative]) , | |
| 27 | generate(rational([Pol|Options]),Value). | |
| 28 | ||
| 29 | generate_rational_aux(positive,Options,0,Z,N) :- | |
| 30 | generate(integer([positive|Options]),Z) , | |
| 31 | generate(integer([positive|Options]),N) , | |
| 32 | N \= 0. | |
| 33 | generate_rational_aux(positive,Options,1,Z,N) :- | |
| 34 | generate(integer([negative|Options]),Z) , | |
| 35 | generate(integer([negative|Options]),N) , | |
| 36 | N \= 0. | |
| 37 | generate_rational_aux(negative,Options,0,Z,N) :- | |
| 38 | generate(integer([positive|Options]),Z) , | |
| 39 | generate(integer([negative|Options]),N) , | |
| 40 | N \= 0. | |
| 41 | generate_rational_aux(negative,Options,1,Z,N) :- | |
| 42 | generate(integer([negative|Options]),Z) , | |
| 43 | generate(integer([positive|Options]),N) , | |
| 44 | N \= 0. | |
| 45 | ||
| 46 | shrink(rational(_),Val1/Val2,ShrunkenVal1/ShrunkenVal2) :- | |
| 47 | shrink(integer([]),Val1,ShrunkenVal1) , | |
| 48 | shrink(integer([]),Val2,ShrunkenVal2) , | |
| 49 | ShrunkenVal2 \= 0. | |
| 50 | ||
| 51 | shrink(rational(_),Value,Value). |