Merge branch 'minimum-excludant-other-versions' into 'master'
[why3.git] / examples / logic / lagrange_inequality.why
blob1c012451effc046bef684ff2f5ad1e6246ad29c5
2 (** {1 Lagrange Identity, Cauchy-Schwarz and Triangle Inequalities} *)
4 theory LagrangeInequality
6 (*
8 sum_squares a  \times sum_squares b = (scalar product a.b)^2 +
10 sum {1 <= i <j <=n} (a_i b_j - a_j b_i)^2
13   use real.Real
14   use real.Square
16   (** dot product, a.k.a. scalar product, of two vectors *)
17   function dot (x1:real) (x2:real) (y1:real) (y2:real) : real =
18      x1*y1 + x2*y2
20   (** square of the norm of a vector *)
21   function norm2 (x1:real) (x2:real) : real =
22      sqr x1 + sqr x2
24   (** square of the norm is non-negative *)
25   lemma norm2_pos :
26      forall x1 x2:real. norm2 x1 x2 >= 0.0
29   lemma Lagrange :
30     forall a1 a2 b1 b2 : real .
31        norm2 a1 a2 * norm2 b1 b2 = sqr (dot a1 a2 b1 b2) + sqr (a1 * b2 - a2 * b1)
33 end
36 theory CauchySchwarzInequality
39   use real.Real
40   use real.Square
41   use LagrangeInequality
43   lemma CauchySchwarz_aux:
44      forall x1 x2 y1 y2 : real.
45         sqr (dot x1 x2 y1 y2) <= norm2 x1 x2 * norm2 y1 y2
47   (** norm of a vector *)
48   function norm (x1:real) (x2:real) : real = sqrt (norm2 x1 x2)
50   (** norm is non-negative *)
51   lemma norm_pos :
52      forall x1 x2:real. norm x1 x2 >= 0.0
54   (** 2 lemmas to help the next one *)
55   lemma sqr_le_sqrt :
56     forall x y:real. sqr x <= y -> x <= sqrt y
58   lemma CauchySchwarz:
59      forall x1 x2 y1 y2 : real.
60         dot x1 x2 y1 y2 <= norm x1 x2 * norm y1 y2
62 end
65 theory TriangleInequality
67   use real.Real
68   use real.Square
69   use LagrangeInequality
70   use CauchySchwarzInequality
72 (** Triangle inequality, proved thanks to
73   ||x+y||² = ||x||² + 2<x,y> + ||y||²
74            <= ||x||² + 2||x||*||y|| + ||y||²
75            = (||x|| + ||y||)²
78   lemma triangle_aux :
79     forall x1 x2 y1 y2 : real.
80       norm2 (x1+y1) (x2+y2) <= sqr (norm x1 x2 + norm y1 y2)
81       by norm2 (x1+y1) (x2+y2) = norm2 x1 x2 + 2.0 * dot x1 x2 y1 y2 + norm2 y1 y2
82         <= norm2 x1 x2 + 2.0 * norm x1 x2 * norm y1 y2 + norm2 y1 y2
83         = sqr (norm x1 x2 + norm y1 y2)
85   (* lemma to help the next one *)
86   lemma sqr_sqrt_le :
87     forall x y:real. 0.0 <= y /\ 0.0 <= x <= sqr y -> sqrt x <= y
89   lemma triangle :
90     forall x1 x2 y1 y2 : real.
91       norm (x1+y1) (x2+y2) <= norm x1 x2 + norm y1 y2
93 end