Re: Simplifying a Boolean Expression
- To: mathgroup at smc.vnet.net
- Subject: [mg68802] Re: Simplifying a Boolean Expression
- From: Peter Pein <petsie at dordos.net>
- Date: Sat, 19 Aug 2006 00:41:05 -0400 (EDT)
- References: <ec3s0e$2v2$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hebhardt, Jon schrieb:
> Can Mathametica be used to simplify the following type of logic typically
> found in programming applications, and if so, how do I go about setting it
> up?
>
>
>
> EXAMPLE
>
> Variables A and T can have the values "none", "dense", "sparse"
>
> The variable X will be assigned a value of either "onepass" or "twopass"
> based on the following logic:
>
>
>
> IF
>
> [(A="none") AND (T="none")] OR [(A="dense") OR (A="sparse") AND (T="none")]
> OR [(A="dense") AND (T="dense")] THEN X = "onepass"
>
> ELSE IF
>
> [{A="sparse") AND (T="sparse")] OR [(A="sparse") AND (T="dense")] THEN X =
> "twopass"
>
>
>
> I want to be able to express this type of problem in Mathematica and have it
> return the simplest logic for assigning a value to X.
>
>
>
> Regards,
>
> Jon
>
>
>
> Work: 401-752-3821
>
> Cell: 508-873-9780
>
>
Hi Jon,
First, tell Mathematica about the variables:
In[1]:= $Assumptions = Join[Unequal @@@ Subsets[{n, s, d}, {2}],
Or @@@ Outer[Equal, {a, t}, {n, s, d}]]
Out[1]= {n != s, n != d, s != d, a == n || a == s || a == d, t == n || t
== s || t == d}
Then use Piecewise[] to declare the logical value:
In[2]:= f = Piecewise[
{{onepass,
(a == n && t == n) || (a == d || (a == s && t == n))
|| (a == d && t == d)},
{twopass, (a == s && t == s) || (a == s && t == d)}},
Indeterminate];
Simplify it
In[3]:= sf = FullSimplify[f]
Out[3]= Piecewise[{{onepass, (t == n && (n == a || s == a)) || d == a},
{twopass, s == a && (t == d || t == s)}}, Indeterminate]
It's not nice to have a or t on the rhs of an equation
In[4]:= sf = sf /. (x_) == (v:a | t) :> v == x
Out[4]= Piecewise[{{onepass, (t == n && (a == n || a == s)) || a == d},
{twopass, a == s && (t == d || t == s)}}, Indeterminate]
To test the resulting expression, type e.g.:
In[5]:=
Refine[({sf /. #1, #1} & ) /@ Apply[{a -> #1, t -> #2} & , Tuples[{n, s,
d}, 2], {1}]]
Out[5]=
{Indeterminate, {a -> n, t -> d}}
{Indeterminate, {a -> n, t -> s}}
{onepass, {a -> d, t -> d}}
{onepass, {a -> d, t -> n}}
{onepass, {a -> d, t -> s}}
{onepass, {a -> n, t -> n}}
{onepass, {a -> s, t -> n}}
{twopass, {a -> s, t -> d}}
{twopass, {a -> s, t -> s}}
HTH,
Peter