| | 10 | |
| | 11 | == Symbolic Module == |
| | 12 | |
| | 13 | Consider re-designing the symbolic module based on lessons learned. |
| | 14 | |
| | 15 | First, is the assumption argument necessary? Is it ever used for anything? How about removing it? |
| | 16 | |
| | 17 | Then we can separate entirely the code for manipulating symbolic expressions from the code responsible for proving things and simplifying expressions based on an assumption. |
| | 18 | |
| | 19 | How about multiple layers for the symbolic package: |
| | 20 | |
| | 21 | 1. Layer 0: Herbrand arithmetic. No simplifications of anything. This just produces new symbolic expressions based on the given arguments. Straightforward factory; operator, arguments type of thing. |
| | 22 | 1. Layer 1: Very basic simplifications only, such as x+0->x, 1*x->x, x+y->y+x. Integers commutative/associative, etc. All of which are applicable to IEEE arithmetic. Place boolean expressions in canonical form, such as CNF? |
| | 23 | 1. Layer 2: rational canonical form for real expressions. Valid for real arithmetic but does not necessarily preserve IEEE arithmetic. |
| | 24 | |
| | 25 | Each layer could implement the same interface, SymbolicUniverseIF. |
| | 26 | |
| | 27 | Add: a SymbolicSimplifierIF interface and a TheoremProverIF interface. |
| | 28 | |
| | 29 | So, the following are the items exported by the symbolic module: |
| | 30 | |
| | 31 | * {{{SymbolicUniverseIF}}} |
| | 32 | * methods for creating and manipulating symbolic expressions |
| | 33 | * {{{SymbolicExpressionIF}}} and all kinds of subtypes, operators, and so on |
| | 34 | * {{{SymbolicSimplifierIF}}} |
| | 35 | * see the simplifier class currently in the value package |
| | 36 | * {{{TheoremProverIF}}} |
| | 37 | * {{{boolean valid(BooleanSymbolicExpressionIF assumption, BooleanSymbolicExpressionIF predicate);}}} |
| | 38 | |
| | 39 | |
| | 40 | |