I know you posted this question a long time ago, but I just wrestled with this problem, and the "solution" I came works like this:

Students will be required to use C for the arbitrary constant, and C should be added as a variable to the context.

Next suppose "the" answer is:

$answer = Formula("1/(x+C)");

which is the solution to

y' = -y^2

Make a custom answer checker that checks for two things:

1. the student's answer solves the differential equation

2. whatever the student has entered in place of C is a linear (and nonconstant) function of C

I probably do not have the most efficient way to do this, but my custom checker works like this:

ANS( $answer->cmp( checker=>sub {

my ( $correct, $student, $ansHash ) = @_;

my $dstudent = $student->D('x');

my $lhs = Formula("$dstudent");

my $rhs = Formula("-($student)^2");

my $studentC = Formula("1/$student - x");

my $dstudentC = $studentC->D('C');

my $ddstudentC = $dstudentC->D('C');

if (($lhs == $rhs) && ($ddstudentC == Formula("0")))

{ if ($dstudentC != Formula("0"))

{return 1}

else {Value->Error("Your answer is not the most general solution.")}

}

else {return 0};

} ) );

This lets students enter things like 1/(x+2C-5), if that happens to be where they ended up after solving process. There is a check in there that prevents things like 1/(x+5) from being counted as correct too. Ideally, the checker would allow 1/(x+f(C)) for any one-to-one function f that covers R, but I don't know how to check that. Looking at first and second derivatives lets us check linearity though.

Take care if you use this in problems where the answer has domain issues.