Ah! I found a bad case for redundant assertions... but also a solution.
Let's simplify your code to the following (unwind_protect is a good idea,
but not relevant to this case):
simp_given( expr, [assumptions]) :=
block([to_forget, val],
to_forget: apply('assume,assumptions),
val: expand(expr, 0, 0),
apply('forget,to_forget),
val ) $
(%i56) simp_given(abs(x),abs(x)>0,x>0);
(%o56) x
(%i57) facts();
(%o57) [abs(x) > 0] <<<< oops! fact
was not forgotten
The problem is that 'forget' simplifies abs(x)>0 to x>0.
simp_given( expr, [assumptions]) :=
block([to_forget, val, simp],
to_forget: apply('assume,assumptions),
val: expand(expr, 0, 0),
simp: false, /* prevent
simplification of abs(x) to x within 'forget' */
apply('forget,to_forget),
val ) $
I would still recommend that you use the 'contexts' system.
-s
On Sat, Jun 2, 2012 at 3:32 PM, Stavros Macrakis <macrakis at alum.mit.edu>wrote:
> I was wrong: your code works correctly with redundant assertions.
>
> I'd recommend you throw an error if member('inconsistent,_ans).
>
> By the way, why are you defining simp_given as a macro?
>
> -s
>
> On Sat, Jun 2, 2012 at 3:00 PM, Richard Hennessy <
> rich.hennessy at verizon.net> wrote:
>
>> Maybe simp_given() could be modified to throw an exception if the facts
>> are inconsistent, I'm not sure. I don't think it is broken. I don?t know
>> of any bugs at all. The behavior with inconsistent assumptions is (maybe)
>> unpredictable but I am not sure if that is a bug. It looks like the
>> behavior when the facts are inconsistent is that is uses the facts given up
>> until it reaches an inconsistency and then just throws that one away and
>> continues with the next assumption in the list. Maybe the help should just
>> say that.
>>
>> kill(all)$
>> load(pwlimit)$
>> simp_given(e, [fcts]) ::= buildq([e,fcts], block([_ans],
>> unwind_protect((_ans:apply(**assume, fcts), expand(e,0,0)),
>> apply(forget,_ans))))$
>> display2d:false$
>> facts();
>> -> []
>> simp_given(signum(a)+signum(b)**,a<0,a>0,b<0);
>> -> -2
>> facts();
>> -> []
>> simp_given(signum(a)+signum(b)**,a<0,a<=b,b<0);
>> -> -2
>> facts();
>> -> []
>> simp_given(signum(a)+signum(b)**,a<0,a<b);
>> -> signum(b)-1
>> facts();
>> -> []
>> simp_given(signum(a)+2*signum(**b)+4*signum(c),a>0,b<c,a>c,a<**c);
>> -> 4*signum(c)+2*signum(b)+1
>> facts();
>> -> []
>> simp_given(signum(a)+2*signum(**b)+4*signum(c),a>0,b>a,c>a,a<**c);
>> -> 7
>> facts();
>> -> []
>> simp_given(signum(a)+2*signum(**b)+4*signum(c),a>0,b>a,c<a,a>**c);
>> -> 4*signum(c)+3
>> facts();
>> -> []
>> simp_given(signum(a)+2*signum(**b)+4*signum(c),a>0,b>a,c>a);
>> -> 7
>> simp_given(signum(a)+2*signum(**b)+4*signum(c),a>0,b>a,c>b);
>> -> 7
>> facts();
>> -> []
>> simp_given(signum(a)+2*signum(**b)+4*signum(c),a>0,b>a,c>b,c<**a);
>> -> 7
>> facts();
>> -> []
>>
>> RVH
>>
>> -----Original Message----- From: Richard Hennessy
>> Sent: Friday, June 01, 2012 8:20 PM
>> To: Stavros Macrakis ; Barton Willis
>>
>> Cc: maxima at math.utexas.edu
>> Subject: Re: [Maxima] pw.mac
>>
>> (%i1) simp_given(signum(a),a>0,a<0);
>> (out1) 1
>> (%i2) facts();
>> (out2) [kind(sinh, one_to_one), kind(log, one_to_one), kind(tanh,
>> one_to_one), kind(log, increasing)]
>>
>> Yes, if the assumptions are inconsistent who knows what you?re going to
>> get
>> and Maxima has a weak assume system anyway. If the assumptions are
>> redundant then I don?t know if it breaks the code. Can you give an
>> example.
>> Seems okay to me.
>>
>> Rich
>>
>> From: Stavros Macrakis
>> Sent: Friday, June 01, 2012 7:04 PM
>> To: Richard Hennessy ; Barton Willis
>> Cc: maxima at math.utexas.edu
>> Subject: Re: [Maxima] pw.mac
>>
>> Richard,
>>
>>
>> I don't know about other issues, but your simp_given won't work right if
>> some of the assumptions are redundant. You should use the context
>> mechanism, as Barton now is (see mail below).
>>
>>
>> I've also encouraged him to rewrite his simp_assuming and with_assumptions
>> functions using contexts.
>>
>>
>> -s
>>
>>
>> ---------- Forwarded message ----------
>> From: Barton Willis <willisb at unk.edu>
>> Date: Wed, May 16, 2012 at 1:57 PM
>> Subject: context based version of abs_integrate--no more
>> simp_assuming
>> To: "maxima at math.utexas.edu" <maxima at math.utexas.edu>
>>
>>
>> I committed a new version of abs_integrate that uses contexts instead of
>> the
>> buggy simp_assuming macro. The new code doesn't have a general purpose
>> with_assumptions function (or macro) replacement for simp_assuming.
>>
>> The new version also fixes some other bugs (rtest_abs_integrate bugs 148
>> and
>> 149).
>>
>> --bw
>>
>> ______________________________**_________________
>> Maxima mailing list
>> Maxima at math.utexas.edu
>> http://www.math.utexas.edu/**mailman/listinfo/maxima<http://www.math.utexas.edu/mailman/listinfo/maxima>
>>
>>
>> On Fri, Jun 1, 2012 at 6:13 PM, Richard Hennessy <
>> rich.hennessy at verizon.net>
>> wrote:
>>
>> "I don't know what your simp_given function looks like, but
>>
>> (%i27) ctsp(expr,x,c) := limit(expr, x, c, plus) - limit(expr, x, c,
>> minus);
>> (%o27) ctsp(expr, x, c) := limit(expr, x, c, plus) - limit(expr, x, c,
>> minus)
>> (%i28) ctsp(x^2*signum(x-4), x, c);
>> 2 2
>> (%o28) limit x signum(x - 4) - limit x signum(x - 4)
>> x -> c+ x -> c-
>>
>> However, of course:
>>
>> (%i29) ctsp(u^2*signum(u-4), x, c);
>> (%o29) 0
>>
>> Could you have a problem with what the dummy variable is or something?"
>>
>> I forgot to say kill(all). pw.mac was loaded, it changes the answer for
>> some reason. If I start with kill(all) then I get what you get. I don't
>> know why, maybe because of diff and integrate being modified by pw.mac or
>> abs_integrate.mac. Does limit ever call integrate or diff? Either way
>> this
>> method does not work.
>>
>> Rich
>>
>> PS
>> simp_given(e, [fcts]) ::= buildq([e,fcts], block([_ans],
>> unwind_protect((_ans:apply(**assume, fcts), expand(e,0,0)),
>> apply(forget,_ans))));
>>
>>
>>
>> ______________________________**_________________
>> Maxima mailing list
>> Maxima at math.utexas.edu
>> http://www.math.utexas.edu/**mailman/listinfo/maxima<http://www.math.utexas.edu/mailman/listinfo/maxima>
>>
>>
>> ______________________________**_________________
>> Maxima mailing list
>> Maxima at math.utexas.edu
>> http://www.math.utexas.edu/**mailman/listinfo/maxima<http://www.math.utexas.edu/mailman/listinfo/maxima>
>>
>
>