The Omega Calculator allows certain restricted uses of uninterpreted function symbols in a Presburger formula. Functions may be declared in the symbolic statement as
symbolic Function ( Arity)where Function is the function name and Arity is its number of arguments. Functions of arity 0 are symbolic constants.
Functions may only be applied to a prefix of the input or output tuple of a relation, or a prefix of the tuple of a set. The function application may list the names of the argument variables explicitly ( not yet supported), or use the abbreviations Function( In), Function( Out), and Function( Set), to describe the application of a function to the appropriate length prefix of the desired tuple.
Our system relies on the following observation: Consider a formula F that contains references and , where i and j are free in F. Let be F with and substituted for and . F if satisfiable iff is satisfiable. For more details, see [Sho79].
Presburger Arithmetic with uninterpreted function symbols is in general undecidable, so in some circumstances we will have to produce approximate results (as we do with the transitive closure operation) [KPRS95].
The following examples show some legal uses of uninterpreted function symbols in the Omega Calculator:
# symbolic p(2), n, m; # # R := { [ir,jr] : 1 <= ir <= n && 1 <= jr <= m }; # # W1 := { [iw,jw] : 1 <= iw <= n && 1 <= jw <= m && p(Set) >= 0 }; # # W2 := { [iw,jw] : 1 <= iw <= n && 1 <= jw <= m && p(Set) < 0 }; # # Exposed := R intersection complement ( W1 union W2 ); # # Exposed; {[In_1,In_2] : FALSE } # # # symbolic f(1); # # R1 := { [i] -> [j] : 1 <= i = j <= 100 && f(In) <= f(Out)}; # # R2 := { [i] -> [j] : 1 <= i <= j <= 100 && f(In) = f(Out)}; # # # R1 intersection R2; {[i] -> [i] : 1 <= i <= 100} # # R1 union R2; {[i] -> [j] : f(j) = f(i) && 1 <= i < j <= 100} union {[i] -> [i] : 1 <= i <= 100} # # R1 intersection complement R2; {[i] -> [j] : FALSE } # # R1; {[i] -> [i] : 1 <= i <= 100}