## WeBWorK Problems

### Problem with implied multiplication?

by Jason Aubrey -
Number of replies: 1
Hi All,

I've written a problem in which the answer to a part should be something like -5a + 9. (Full source below.) The expected answer for that part is controlled by this line:

$limit2 = Compute("a*$xval+$c2")->reduce(); I've noticed that if I use$limit2 = Compute("a$xval+$c2")->reduce();

Then WW expects a-5+9 (and counts -5a+9 as incorrect but a+4 as correct).

On the other hand, if I use

a($xval),${xval}a, etc, then it interprets this implied multiplication correctly. Similarly, the implied multiplication in this line

$f2 = Compute("ax +$c2")->reduce();

seems to work ok - it displays correctly and does what is intended if I pass it values for a and x.

So, I expected my original "a$xval" to be interpreted as implied multiplication. It wasn't, so I'm asking if this is the intended behavior, if I'm doing something wrong, etc. Thanks, Jason DOCUMENT(); loadMacros( "PGstandard.pl", # Standard macros for PG language "MathObjects.pl", "contextCurrency.pl", "PGchoicemacros.pl", #"source.pl", # allows code to be displayed on certain sites. #"PGcourse.pl", # Customization file for the course ); # Print problem number and point value (weight) for the problem TEXT(beginproblem()); # Show which answers are correct and which ones are incorrect$showPartialCorrectAnswers = 1;

##############################################################
#
# Setup
#
#
Context("Numeric");

$c1 = non_zero_random(-9,9,1);$c2 = non_zero_random(-9,9,1);
$xval = non_zero_random(-9,9,1);$f1 = Compute("x^2 + $c1")->reduce();$f2 = Compute("ax + $c2")->reduce();$limit1 = $f1->eval(x=>$xval);
$limit2 = Compute("${xval}a+$c2")->reduce();$a = ($limit1 -$c2)/$xval;$i = random(0,3,1);
sub ineq {
if($i == 0) {$ineq1 = $LTS;$ineq2 = $GTS;$cont = "No";
$extra = "Yes"; return ($ineq1,$ineq2,$cont,$extra); } elsif($i == 1) {
$ineq1 =$LTS;
$ineq2 =$GTE;
$cont = "Yes";$extra = "No";
return ($ineq1,$ineq2,$cont,$extra);
} elsif($i == 2) {$ineq1 = $GTS;$ineq2 = $LTS;$cont = "No";
$extra = "Yes"; return ($ineq1,$ineq2,$cont,$extra); } else {$ineq1 = $GTS;$ineq2 = $LTE;$cont = "Yes";
$extra = "No"; return ($ineq1,$ineq2,$cont,$extra); } } @cases = ineq();$mc1 = new_multiple_choice();
$mc1->qa("If $$\displaystyle \lim_{x\rightarrow xval} f(x) = limit1$$, is $$f(x)$$ a continuous function?", "$cases[2]");
$mc1->extra("$cases[3]");

##############################################################
#
# Text
#
#

Context()->texStrings;
BEGIN_TEXT
Let
$f(x) = \begin{cases} f1 &\text{ if } x \{@cases[0]\} xval \\ f2 &\text{ if } x \{@cases[1]\} xval \end{cases}$

(a) $$\displaystyle \lim_{x\rightarrow xval^{+}} f(x) =$$ \{ans_rule(5)\}
$PAR (b) $$\displaystyle \lim_{x\rightarrow xval^{-}} f(x) =$$ \{ans_rule(5)\}$PAR
(c) If we suppose that $$\displaystyle \lim_{x\rightarrow xval} f(x) = limit1$$, then $$a =$$ \{ans_rule(5)\}
$PAR (d) \{$mc1->print_q() \}
\{ $mc1->print_a() \} END_TEXT Context()->normalStrings; ############################################################## # # Answers # # if($i > 1) {
ANS(Real($limit1) -> cmp()); ANS(Formula($limit2) -> cmp());
} else {
ANS(Real($limit2) -> cmp()); ANS(Formula($limit1) -> cmp());
}

ANS(Real($a) -> cmp()); ANS(radio_cmp($mc1->correct_ans() ) );

ENDDOCUMENT();

### Re: Problem with implied multiplication?

by Davide Cervone -
This is the expected behavior, not a bug. The problem is in not being entirely clear on how Perl interprets what you have written. When you type
    $limit2 = Compute("a$xval+$c2")->reduce();  what happens first is that Perl replaces $xval into the string "a$xval+$c" to produce the string "a-5+9". That gets done before Compute() is called, and so the expression that is used to create the MathObject is "a-5+9" which Compute() correctly interprets as a+4. It has no idea that the -5 comes from a perl variable originally.

When you use

    $limit2 = Compute("a$xval+$c2")->reduce();  however, the string is "a*-5+9", which is -5a+9. Alternatively, $limit2 = Compute("a($xval)+$c2")->reduce();

produces "a(-5)+9" which again is -5a+9, and similarly for the other forms.

Had you used a MathObject Real object rather than a Perl real, then it would have inserted the parentheses automatically itself, and it would have worked as you expected, but Perl reals don't. That is, if you had used

    $c2 = Real(non_zero_random(-9,9,1));$xval = Real(non_zero_random(-9,9,1));
$limit2 = Compute("a$xval+\$c2")->reduce();

you would have gotten "a(-5)+9", which would have done what you wanted.

Hope that clears things up.

Davide