forked from coq-community/corn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
diff.v
210 lines (183 loc) · 6.62 KB
/
diff.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
(*
Require Import CPoly_Newton.
Require Import CRArith.
Require Import Unicode.Utf8
Setoid Arith List Program Permutation metric2.Classified
CSetoids CPoly_ApZero CRings CPoly_Degree
CRArith Qmetric Qring CReals
stdlib_omissions.Pair stdlib_omissions.Q
list_separates SetoidPermutation.
Require ne_list.
Import ne_list.notations.
(* Require Import ProductMetric CompleteProduct.*)
(** Outline of the definition of the derivative using div diff.
Should lead to FTC.
Should also be the basis for Newton iteration.
Becomes very sketchy at the end.
*)
Notation "'one' a":=(ne_list.one a) (at level 60).
Implicit Arguments ne_zip [A B].
Section divdiff.
Definition divdiff2 (f: Q-> CR) :=fun x:Q*Q =>
let (p , q) := x in let l:= (p ::: (one q)) in (divdiff (ne_zip l (ne_list.map f l) )).
End divdiff.
(*
Section extra.
Context {X Y : MetricSpace} (f: X → Complete Y) `{!UniformlyContinuous_mu f} `{!UniformlyContinuous f}.
Definition Cbind_slowC: UCFunction (Complete X) (Complete Y):=
ucFunction (Cbind_slow (wrap_uc_fun' f)).
End extra.
Notation " x >>= f ":= (Cbind_slowC f x) (at level 50).
*)
Section derivative.
(* Notation Q:=Q_as_MetricSpace.*)
(** Definition of the derivative. The usual rules should follow from the ones for dd*)
Context (f:Q->CR) `{!UniformlyContinuous_mu f}
`{!UniformlyContinuous f}.
Context `{!UniformlyContinuous_mu (divdiff2 f)}
`{!UniformlyContinuous (divdiff2 f)}.
Definition der : UCFunction Q CR := ucFunction (compose (divdiff2 f) diagonal).
End derivative.
Section towardsLBC.
(** We work towards the Law of Bounded change *)
(* This is seq 1 (S n) *)
Fixpoint posnats (n: nat): ne_list nat:=
match n with
| O => one (S O)
| S n' => (S (S n')) ::: (posnats n')
end.
Eval compute in (posnats 2).
Notation QPoint := (Q * CR)%type.
Notation CRPoint := (CR * CR)%type.
Local Notation Σ := cm_Sum.
(* Unfortunately, this is not allowed:
Fixpoint interleave {A:Type} (l1 l2 : list A) {struct l1}: list A :=
match l1 with
| nil => l2
| a :: l1 => a :: (interleave l2 l1)
end.
*)
Fixpoint interleave {A:Type} (l1 l2 : ne_list A) {struct l1}: ne_list A :=
match l1 with
| one a => a ::: l2
| a ::: l1 => a ::: match l2 with | one b => b :::l1
| b ::: l2 => b ::: (interleave l1 l2) end
end.
(*
Fixpoint ne_removelast {A:Set} (l:ne_list A) : ne_list A :=
match l with
| one a => one a
| a ::: l => a ::: ne_removelast l
end.
*)
Eval compute in (interleave ( 1 ::: (one 2#1)) (ne_list.map Qopp (ne_list.app (one 3#1) (one 0)))).
Definition diff_list (x y: Q) (m:nat) (f:Q->CR):=
let h:=(x-y)/(S m) in
let l:= (ne_list.map (λ x: Q * Q, fst x + snd x)
(ne_zip (ne_list.map (λ n:nat, h * n) (posnats m)) (ne_list.replicate_Sn x m))) in
Σ (ne_list.map (divdiff2 f) (ne_zip (x ::: l) (ne_list.app l (one 0)))).
(* (map (λ x0 : Q and Q, let (p, q) := x0 in (f p - f q )* ' (/p -q))%CR)*)
Check (diff_list 1 1 2 inject_Q_CR).
Section telescope.
(*
This really holds for a group, but we do not want to use the group tactic plugin.
*)
(* Should be type classified *)
Context {R:CRing}.
Add Ring R: (CRing_Ring R)(preprocess [unfold cg_minus;simpl]).
Lemma telescope_sum : forall l:ne_list R, forall x y:R,
Σ (interleave (x ::: l) (ne_list.map cg_inv (ne_list.app l (one y)))) [=] x [-] y.
Proof with ring.
induction l.
unfold ne_list.last;simpl. intros...
intros; simpl.
change (x [+] ([--] t [+] Σ (interleave (t ::: l) (ne_list.map cg_inv (ne_list.app l (one y))))) [=] x[-]y).
rewrite IHl...
Qed.
End telescope.
Require Import Morphisms.
(* We would like to use a Map2 for vectors. However, this only works for lists of a fixed length.
Define a general theory of applicative functors from a (strong) monad using type classes.
https://secure.wikimedia.org/wikibooks/en/wiki/Haskell/Applicative_Functors
Map2 should be for vectors
We need the rules:
f ^@> l <@> C a = fun x => (f x a) ^@> l
f ^@> C a <@> l = (f a) ^@> l
Or even f ^@> C a = C f a
*)
Definition dd_pointfree(f:Q->Q):=(compose (uncurry Qdiv)
(compose (map_pair (compose (uncurry Qminus) (map_pair f f))
(uncurry Qminus)) (@diagonal (Q*Q)))).
(* This example seems to be too difficult for pointfree:
Require Export PointFree.
Definition test0: PointFree (@fst (unit*unit) unit) _ := _.
Check test0.
Definition test1: PointFree (λ x y: Q, (Qdiv x y)) _ := _.
Check test1.
Opaque Qdiv.
Definition test2: PointFree (uncurry (λ x y: Q, (Qdiv x y))) _ := _.
Check test2.
Definition test1: PointFree (λ x y: Q, (x-y)) _ := (uncurry Qminus (map_pair fst snd)).
*)
(* Sanity check: The derivative of 2x is 2*)
Eval compute in (dd_pointfree (fun x =>(2#1)*x) (1#1,0#1)).
Context (f:Q->CR).
Lemma dd_sum:forall x y:Q, forall m:nat,
(('(S m))* (divdiff2 f (x, y)))%CR [=] diff_list x y m f.
intros.
pose h:=(x-y)/(S m).
transitivity ( ((f x) - (f y))*('(/h))%CR)%CR.
change divdiff2 with dd_pointfree.
unfold divdiff2.
change ((' S m * ((f x - f y) * ' (/ (x - y))))%CR[=]
((f x - f y) * ' (/ h))%CR).
unfold h.
unfold Qdiv.
set ((f x) - (f y))%CR.
rewrite Qinv_mult_distr Qinv_involutive -CRmult_Qmult.
set (/(x - y)). ring.
unfold diff_list. fold h. unfold divdiff2.
set l:= (ne_list.map (λ x: Q * Q, fst x + snd x)
(ne_zip (ne_list.map (λ n:nat, h * n) (posnats m)) (ne_list.replicate_Sn x m))).
set fl:= (ne_list.map f l).
transitivity (Σ (interleave (f x ::: fl) (ne_list.map cg_inv (ne_list.app fl (one f y))))*'(/h))%CR.
rewrite (telescope_sum fl); reflexivity.
(* setoid_rewrite divdiff_e. *)(* we need map to be a morphism *)
transitivity (Σ
(ne_list.map
(λ x0 : Q and Q,
let (p, q) := x0 in
((f p [-] f q)%CR *'(/ (p -q))))%CR
(ne_zip
(x
::: l) (ne_list.app l (one 0))))).
2:admit.
(* transitivity Σ
(ne_list.map (fun x => (fst x *snd x))
etc.
(λ x0 : Q and Q, let (p, q) := x0 in ((f p[-]f q) * ' (/ (p - q)))%CR)
(ne_zip (x ::: l) (ne_list.app l (one 0))))
set (ne_list.map (λ x0 : Q and Q, fst x0 + snd x0)
(ne_zip (ne_list.map (λ n : nat, h * n) (posnats m))
(ne_list.replicate_Sn x m))).
*)
admit.
Qed.
Context (f:Q->CR) `{!UniformlyContinuous_mu f}
`{!UniformlyContinuous f}.
Context `{!UniformlyContinuous_mu (divdiff2 f)}
`{!UniformlyContinuous (divdiff2 f)}.
(* Use compare to avoid dependency on proofs of being in the interval *)
Lemma der_pos_dd_pos: (forall x:Q, (('0 <= (der f) x)%CR))
-> forall x y, ('0<= (divdiff2 f (x, y)))%CR.
intros.
rewrite CRle_not_lt. intro.
contradict H.
(* definition of der is not correct *)
unfold der . simpl. unfold diagonal. simpl. unfold compose. simpl.
setoid_rewrite divdiff_e. simpl.
SearchAbout [CRlt].
admit.
Qed.
End bla.
*)