BackMath: a compile time symbolic math lib.
BCS
ao at pathlink.com
Tue Dec 4 13:45:43 PST 2007
I have written a library that allows for all of the following as native syntax:
A + B - D = C;
A - B - D = C;
A - D - B = C;
(B - A) - D = C;
A - D - B - D = C;
A - B - (D + D) = C;
C = A + B - D;
C = B * A;
C = B * A + B * D;
A / B + D / B = C;
In all of these cases the assignment is to B.
The library is works by using term re-writing to reverse evaluate the expression.
The fun part is that the term re-writing is done with the type system and
template expressions. This results in there being little inherent runtime
cost.
I hope to expand it to work with as wide a variety of equation forma as I
can. I wold love to be able to get it to even solve system of equations like
a*B + c*D = e;
f*B + g*D = h;
where B and D are both unknown.
Now, full disclosure:
-it's incomplete, there a lots of cases it won't handle (but I plan on improving
that)
-it is not thread safe, this is because the templates need alias to variables
to work correctly and the only variables that can be aliased are globals.*, #
-It's unproven, I can formally prove all the "single sided" rules, but haven't
figured out how to prove the "double sided" rules, yet like the last 2 examples,
%
-No, I didn't bang out 400 lines of static if's, the "business logic" is
generated using a lisp program that is harder to read than what it produces ^
Now for the challenge. Is anyone willing to try and generate a C++ equivalent?
I think it would be really cool to have a side by side comparison of the
two libs. I think the difference in readability say a lot.
hosted at:
http://www.dsource.org/projects/scrapple/browser/trunk/backmath
* Walter can we please get this fixed??
# I have a way in mind to fix this but it won't look near as good.
% I'm using ACL2 to do the proofs. http://www.cs.utexas.edu/users/moore/acl2/
^ I'll clean it up and post it as well soon. (finals week is coming soon
so don't hold your breath or anything)
More information about the Digitalmars-d-announce
mailing list