2011-05-16 14:28:44 +02:00
|
|
|
(* This file is generated by Why3's Coq driver *)
|
|
|
|
|
(* Beware! Only edit allowed sections below *)
|
2012-12-04 16:17:50 +01:00
|
|
|
Require Import BuiltIn.
|
|
|
|
|
Require BuiltIn.
|
|
|
|
|
Require int.Int.
|
|
|
|
|
Require map.Map.
|
|
|
|
|
|
|
|
|
|
(* Why3 assumption *)
|
2011-05-16 14:28:44 +02:00
|
|
|
Definition unit := unit.
|
|
|
|
|
|
2012-12-04 16:17:50 +01:00
|
|
|
(* Why3 assumption *)
|
|
|
|
|
Inductive ref (a:Type) {a_WT:WhyType a} :=
|
2011-05-23 14:33:51 +02:00
|
|
|
| mk_ref : a -> ref a.
|
2012-12-04 16:17:50 +01:00
|
|
|
Axiom ref_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (ref a).
|
|
|
|
|
Existing Instance ref_WhyType.
|
|
|
|
|
Implicit Arguments mk_ref [[a] [a_WT]].
|
2011-05-23 14:33:51 +02:00
|
|
|
|
2012-12-04 16:17:50 +01:00
|
|
|
(* Why3 assumption *)
|
|
|
|
|
Definition contents {a:Type} {a_WT:WhyType a}(v:(ref a)): a :=
|
|
|
|
|
match v with
|
|
|
|
|
| (mk_ref x) => x
|
2011-05-23 14:33:51 +02:00
|
|
|
end.
|
2011-05-16 14:28:44 +02:00
|
|
|
|
2012-12-04 16:17:50 +01:00
|
|
|
(* Why3 assumption *)
|
|
|
|
|
Inductive array (a:Type) {a_WT:WhyType a} :=
|
|
|
|
|
| mk_array : Z -> (map.Map.map Z a) -> array a.
|
|
|
|
|
Axiom array_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (array a).
|
|
|
|
|
Existing Instance array_WhyType.
|
|
|
|
|
Implicit Arguments mk_array [[a] [a_WT]].
|
2011-05-16 14:28:44 +02:00
|
|
|
|
2012-12-04 16:17:50 +01:00
|
|
|
(* Why3 assumption *)
|
|
|
|
|
Definition elts {a:Type} {a_WT:WhyType a}(v:(array a)): (map.Map.map Z a) :=
|
|
|
|
|
match v with
|
|
|
|
|
| (mk_array x x1) => x1
|
2011-05-16 14:28:44 +02:00
|
|
|
end.
|
|
|
|
|
|
2012-12-04 16:17:50 +01:00
|
|
|
(* Why3 assumption *)
|
|
|
|
|
Definition length {a:Type} {a_WT:WhyType a}(v:(array a)): Z :=
|
|
|
|
|
match v with
|
|
|
|
|
| (mk_array x x1) => x
|
2011-05-16 14:28:44 +02:00
|
|
|
end.
|
|
|
|
|
|
2012-12-04 16:17:50 +01:00
|
|
|
(* Why3 assumption *)
|
|
|
|
|
Definition get {a:Type} {a_WT:WhyType a}(a1:(array a)) (i:Z): a :=
|
|
|
|
|
(map.Map.get (elts a1) i).
|
2011-05-23 14:33:51 +02:00
|
|
|
|
2012-12-04 16:17:50 +01:00
|
|
|
(* Why3 assumption *)
|
|
|
|
|
Definition set {a:Type} {a_WT:WhyType a}(a1:(array a)) (i:Z) (v:a): (array
|
|
|
|
|
a) := (mk_array (length a1) (map.Map.set (elts a1) i v)).
|
2011-05-16 14:28:44 +02:00
|
|
|
|
2012-12-04 16:17:50 +01:00
|
|
|
(* Why3 assumption *)
|
|
|
|
|
Definition make {a:Type} {a_WT:WhyType a}(n:Z) (v:a): (array a) :=
|
|
|
|
|
(mk_array n (map.Map.const v:(map.Map.map Z a))).
|
|
|
|
|
|
|
|
|
|
(* Why3 assumption *)
|
2011-05-16 14:28:44 +02:00
|
|
|
Definition decrease1(a:(array Z)): Prop := forall (i:Z), ((0%Z <= i)%Z /\
|
2012-12-04 16:17:50 +01:00
|
|
|
(i < ((length a) - 1%Z)%Z)%Z) -> (((get a i) - 1%Z)%Z <= (get a
|
2011-06-03 14:05:59 +02:00
|
|
|
(i + 1%Z)%Z))%Z.
|
2011-05-16 14:28:44 +02:00
|
|
|
|
2012-12-04 16:17:50 +01:00
|
|
|
|
|
|
|
|
(* Why3 goal *)
|
2011-05-16 14:28:44 +02:00
|
|
|
Theorem decrease1_induction : forall (a:(array Z)), (decrease1 a) ->
|
2012-12-04 16:17:50 +01:00
|
|
|
forall (i:Z) (j:Z), (((0%Z <= i)%Z /\ (i <= j)%Z) /\ (j < (length a))%Z) ->
|
|
|
|
|
((((get a i) + i)%Z - j)%Z <= (get a j))%Z.
|
2011-05-16 14:28:44 +02:00
|
|
|
(* YOU MAY EDIT THE PROOF BELOW *)
|
|
|
|
|
unfold decrease1.
|
|
|
|
|
intros a Ha i j Hij.
|
|
|
|
|
generalize Hij; pattern j.
|
|
|
|
|
apply (Zlt_lower_bound_ind _ i).
|
|
|
|
|
2: omega.
|
|
|
|
|
intuition.
|
|
|
|
|
assert (x = i \/ i < x)%Z by omega.
|
|
|
|
|
destruct H4.
|
|
|
|
|
subst x.
|
|
|
|
|
ring_simplify.
|
|
|
|
|
omega.
|
2012-12-04 16:17:50 +01:00
|
|
|
apply Zle_trans with (get a (x-1) - 1)%Z.
|
2011-05-16 14:28:44 +02:00
|
|
|
assert (i <= x-1 < x)%Z by omega.
|
|
|
|
|
assert (0 <= i <= x-1 /\ x-1 < length a)%Z by omega.
|
|
|
|
|
generalize (H (x-1)%Z H8 H9); clear H; intuition.
|
2012-12-04 16:17:50 +01:00
|
|
|
apply Zle_trans with (get a (x-1+1))%Z.
|
2011-05-16 14:28:44 +02:00
|
|
|
apply (Ha (x-1)%Z); omega.
|
|
|
|
|
ring_simplify (x-1+1)%Z.
|
|
|
|
|
omega.
|
|
|
|
|
Qed.
|
|
|
|
|
|
|
|
|
|
|