I was reading through this topic here: https://webwork.maa.org/moodle/mod/forum/discuss.php?d=2910

but am wondering if there has been any updates since 2013 to the overlap of intervals and fraction contexts? I am wanting to have a problem where students must enter their answers in interval notation with reduced fractions. I have a working problem, code below, but I cannot seem to get it to show the error message that one of their fractions is correct but unreduced, though it does mark them wrong.

Maybe there is a smoother way to achieve this behavior? If not can someone help identify the issue in error messages I am having in this code? Thanks

DOCUMENT();

loadMacros(

"PGstandard.pl",

"MathObjects.pl",

"PGML.pl",

"AnswerFormatHelp.pl",

"contextFraction.pl",

"contextInequalitySetBuilder.pl",

"parserOneOf.pl",

"PGcourse.pl",

);

##############################################

Context("Numeric");

$m = random(1,10,1);

$b = non_zero_random(-10,10,1);

$a = random(1,4,1);

$c = random(5,9,1);

$f=Formula("abs($m*x+$b)+$a")->reduce;

Context("Fraction-NoDecimals");

Context()->parens->set(

'(' => {type => 'Interval'},

'[' => {type => 'Interval'},

'{' => {type => 'Set', removable => 0, emptyOK => 1},

);

Context()->constants->add(R => Interval("(-infinity,infinity)"));

Context()->constants->set(R => {TeX => '{\bf R}'});

$left = Fraction("($a-$c-$b)/$m");

$right = Fraction("($c-$a-$b)/$m");

$answer = Compute("[$left,$right]");

##############################################

TEXT(beginproblem());

BEGIN_PGML

Solve the following inequality involving absolute value. Enter the answer in interval notation using simplified fractions.

[`[$f] \le [$c]`]

END_PGML

BEGIN_TEXT

\{ans_rule(30)\}

END_TEXT

Context()->flags->set(reduceFractions=>0);

ANS($answer->cmp(

checker => sub {

my ($correct, $student, $ans, $nth, $value) = @_;

$student->context->setError("Your $nth $value contains an unreduced fraction","",undef,undef,$Value::CMP_WARNING)

if $student->{notReduced};

return 0 unless $correct == $student;

my $reduced = 1;

foreach $x ($student->value) {

if (Value::classMatch($x,'Fraction') && !$x->isReduced) {

$reduced = 0;

}

}

$student->{notReduced} = 1 unless $reduced || $ans->{isPreview};

return $reduced;

}

));