The new sympy statistics module can solve this iteratively for you. It's not in yet however and it takes some time. The following was done from my rv2 branch. It essentially tries all possibilities. You can also reinvent what it does using FiniteSets which are in master.
=== Using Random Variables === --input-- from sympy.statistics import * chickens, spiders, pigs = Die(20, 'chickens'), Die(20, 'spiders'), Die(20, 'pigs') Where(And(Eq(chickens+spiders+pigs, 20), Eq(2*chickens+4*pigs+8*spiders,56))).as_boolean() --output-- (spiders = 1 ∧ chickens = 14 ∧ pigs = 5) ∨ (pigs = 2 ∧ chickens = 16 ∧ spiders = 2) It's designed to solve a bigger problem where each outcome has an associated probability. I modeled chickens, spiders, and pigs as uniform discrete random variables (20 sided dice). The Where operator only cares about possibility though so these probabilities are forgotten in the answer, which is just a SymPy Boolean object. === Using Finite Sets === If you wanted to do the iteration in a fancy and complex way you could iterate through cartesian products of FiniteSets I.e. chicken_possibilities = FiniteSet(Eq(chicken, i) for i in range(20)) pig_possibilities = FiniteSet(Eq(pig, i) for i in range(20)) spider_possibilities = FiniteSet(Eq(spider, i) for i in range(20)) all_possibilities = [And(*possibility) for possibility in chicken_possiblities * pig_possiblities * spider_possibilities] all_possibilities[0] chicken = 4 ∧ pig = 13 ∧ spider = 14 You could transform this to a dict and then subs it into a condition condition = And(Eq(chickens+pigs+spiders, 20), Eq(2*chickens+4*pigs+8*spiders,56)) Really though this is just an obfuscated triple-for-loop. Really, a triple-for-loop with an if statement might be the clearest solution. -Matt On Fri, Nov 18, 2011 at 8:21 AM, Chris Smith <[email protected]> wrote: > OK, it's not too bad to have it solve the relationships such that the > spider relationships are positive (since those relationships tell you > the number of pigs and chickens there are): > > >>> var('spiders chickens pigs',integer=True, positive=True) > (spiders, chickens, pigs) > >>> solve([Eq(chickens+pigs+spiders, 20), > Eq(2*chickens+4*pigs+8*spiders,56)]) > {chickens: 2*spiders + 12, pigs: -3*spiders + 8} > >>> solve([Ge(v,0) for v in _.values()]) > And(-6 <= spiders, spiders <= 8/3) > >>> condition = _ > > That And can be used to test values for spiders if desired: > > >>> [i for i in range(8) if condition.subs(spiders, i)] > [0, 1, 2] > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/sympy?hl=en. > > -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sympy?hl=en.
