perm filename SIMPLE[3,2]1 blob sn#337040 filedate 1978-02-24 generic text, type C, neo UTF8

COMMENT ⊗ VALID 00002 PAGES C REC PAGE DESCRIPTION C00001 00001 C00002 00002 C00006 ENDMK C⊗; SIMPLE is a simplifier designed for use in program manipulation and verification. It finds a normal form for any expression over the language consisting of individual variables, the usual boolean connectives, the conditional function cond (denoting if-then-else), the integers (numerals), the arithmetic functions and predicates +, - and ≤, the LISP constants, functions and predicates nil, car, cdr, cons and atom, the functions store and select for storing into and selecting from arrays, and uninterpreted function symbols. Individual variables range over the union of the rationals, the set of arrays, the LISP s-expressions and the booleans true and false. The constant, function and predicate symbols take their natural interpretations. The simplifier is complete; that is, it simplifies every valid formula to true. Thus it is also a decision procedure for the quantifier-free theory of rationals, arrays and s-expressions under the above functions and predicates. To run the simplifier, R SIMPLE. Here are some examples of simplifications: P ⊃ ¬ P; ¬ P; X = F(X) ⊃ F(F(F(X))) = X; true; cons(X,Y) = Z ⊃ car(Z) + cdr(Z) - X - Y = 0; true; X ≤ Y ∧ Y + D ≤ X ∧ 3 * D ≥ 2 * D ⊃ V[2 * X - Y] = V[X + D]; true; V = store(store(V, I, V[J]), J, V[I]) ⊃ V[I] = V[J]; true This formula expresses the theorem that if the Ith and Jth elements of a vector V are swapped, and if the resulting vector is identical to the original vector, then the Ith and Jth elements were the same. A paper describing the simplifier is available from Derek Oppen.