Source: https://github.com/mooculus
Linear algebra: https://ximera.osu.edu/laode/linearAlgebra
The website uses Fraser's differential synchronization algorithm, so a student's work is saved as they do it -- and that happens in real time, so an instructor can "look over their shoulder" and watch a student working in real time. The server is actually a git server, so an author publishes content by performing a git push, and because the server knows the history of the content, the server provides the version of the content on which the student last did work.
Expression equality is handled by https://github.com/kisonecat/math-expressions using a few heuristics, which is necessary because Richardson's theorem says this problem is undecidable. The main trick is to regard the expressions as complex-valued functions, find a point where the value is (nearly) equal, and then check for numerical equality in a neighborhood. (Doing this over the complex plane addresses the problem that many common expressions like sqrt(small number-x^2) have a restricted domain over the reals).
We rely on unit tests from Chris Sangwin (who wrote the textbook _Computer Aided Assessment of Mathematics_) to ensure that we're adjudicating expression equality mostly correctly.
https://ximera.osu.edu/introduction
you can see how to make your own materials.
There is a set of example environments here:
$ wolframscript --code "6 == 5 + 1"
True
Suppose you know that a function is equal to "(x - 1)(x + 1) - 42". You want to check whether the student has given an equivalent function, like "x^2 - 43": $ wolframscript --code "f[x_] := (x - 1)(x + 1) - 42;
Simplify[f[x]] == Simplify[x^2 - 43]"
True
But it should also return True for any other form, like "-43 + x^2". And indeed it does: $ wolframscript --code "f[x_] := (x - 1)(x + 1) - 42;
Simplify[f[x]] == Simplify[-43 + x^2]"
True
So in general, you can write a script which inserts the student's answer into the right-hand "Simplify[...]" block. If it prints True, they're equivalent.It's also possible to feed a natural language expression like "the integral of Sin(x) from 0 to pi is equal to 2" into wolfram alpha, and check whether it returns True or False:
http://www.wolframalpha.com/input/?i=the+integral+of+Sin(x)+...
(To be clear, I don't think this is how this project does it. I was just giving a way to do it.)
Ximera allows authors to write online interactive texts, that can serve as the HW system for a class.
The student's work can be directly sent to the grade book via LTI.
Moreover, you can simultaneously produce a PDF that looks like a traditional text.
http://www.lulu.com/shop/the-ohio-state-university-math-depa...
Which nobody needs to buy, since the PDF generating the text is freely available.