====== Reals ======
Hypatheon is useful for browsing libraries. In the Prelude, we have
* real_axioms,
* reals
* real_props
* extra_real_props.
For example, in real_props we have the Lemma "both_sides_div_pos_neg_ge1" which allows us to divide both sides of an inequality ''x >= y'' by the same value ''n0z: VAR nonzero_real'':
Lemma is: FORALL (n0z: nonzero_real, x, y: real):
IF n0z > 0 THEN x/n0z >= y/n0z ELSE y/n0z >= x/n0z ENDIF
IFF x >= y
This can be used to show, e.g. that ''x*x >= x'', under the right assumptions.
The [[http://shemesh.larc.nasa.gov/people/bld/manip.html|manip]] package introduces additional rules. For example, in Hypatheon, select Type = Defined_rule and search for ''div-by''.
There are also libraries of decision procedures such as
* [[http://shemesh.larc.nasa.gov/people/cam/Sturm/|sturm]]: Sturm's Theorem is a well-known result in real algebraic geometry that provides a function that computes the number of roots of a univariate polynomial in a semi-open interval, and is included in the NASA PVS libraries. Strategy ''mono-poly'' automatically discharges monotinicity properties of polynomials on a real interval.
* [[http://shemesh.larc.nasa.gov/people/cam/Tarski/|tarski]].Tarski's Theorem is a generalization of Sturm's theorem that provides a linear relationship between functions known as Tarski queries and cardinalities of certain sets. It's also in the NASA library.
These libraries can be imported as
IMPORTING Sturm@strategies
IMPORTING Tarski@strategies
(Tarski is heavy so wait for it to load and finish). Note that the ''(eval-formula)'' from PVSio can also be used to prove the D2 example.
===== Example Theory =====
real : THEORY
BEGIN
%(sturm) and (mono-poly) incorporate some nice decision procedures
IMPORTING Sturm@strategies
%IMPORTING Tarski@strategies
% Subtypes D1 and D2 which is the set {1,2,3,4,5}
D1: TYPE = {i: nat | i = 1 OR i= 2 OR i=3 OR i=4 OR i=5}
D2: TYPE = {i: nat | 1 <= i AND i <= 5}
conja1: CONJECTURE (FORALL (x:D1) : x*x >= x)
% The abobe proves wih (grind) or the proof below (saved with with C-c 2p):
%|- conja1 : PROOF
%|- (then (skeep) (typepred "x") (assert))
%|- QED
conja2: CONJECTURE (FORALL (x:D2) : x*x >= x)
%|- conja2 : PROOF
%|- (then (skeep) (lemma "both_sides_div_pos_neg_ge1") (grind))
%|- QED
% Lemma is: FORALL (n0z: nonzero_real, x, y: real):
% IF n0z > 0 THEN x/n0z >= y/n0z ELSE y/n0z >= x/n0z ENDIF
% IFF x >= y
% We could also prove the above automatically in one step using (sturm).
% The following should not prove because e.g. x = 0.5 is a counter-example
conjb: CONJECTURE (FORALL (x:real) : x^2 >= x)
conjc: CONJECTURE (FORALL (x: real): x >= 1.0 IMPLIES x * x >= x)
% (sturm) proves the above automatically.
% Alternatively, manip introduces additional rules such as (div-by):
%|- conj4 : PROOF
%|- (then (skeep) (div-by 1 "x"))
%|- QED
example_14 : LEMMA
FORALL (x:real) : x ## [| 0, oo |] IMPLIES -x^3 <= 0
%|- example_14 : PROOF
%|- (sturm)
%|- QED
mono_example_4: LEMMA
FORALL (x,y:real): x /= y IMPLIES x^3 /= y^3
%|- mono_example_4 : PROOF
%|- (mono-poly)
%|- QED
END real
Proof summary for theory real
conja1................................proved - complete [shostak](0.06 s)
conja2................................proved - complete [shostak](0.39 s)
conjb_TCC1............................proved - complete [shostak](0.00 s)
conjb.................................unfinished [shostak](0.03 s)
conjc.................................proved - complete [shostak](0.41 s)
example_14_TCC1.......................proved - complete [shostak](0.01 s)
example_14............................proved - complete [shostak](0.36 s)
mono_example_4_TCC1...................proved - complete [shostak](0.01 s)
mono_example_4_TCC2...................proved - complete [shostak](0.00 s)
mono_example_4........................proved - complete [shostak](0.54 s)
Theory totals: 10 formulas, 10 attempted, 9 succeeded (1.81 s)
Grand Totals: 10 proofs, 10 attempted, 9 succeeded (1.81 s)