Commit 088a76ba authored by MARCHE Claude's avatar MARCHE Claude

LCP: lemma permut_permutation proved in Coq

parent 3fa88b32
...@@ -78,6 +78,13 @@ that it does so correctly. ...@@ -78,6 +78,13 @@ that it does so correctly.
module LCP "longest common prefix" module LCP "longest common prefix"
use import int.Int use import int.Int
use map.Map
use map.MapPermut
use map.MapInjection
use import array.Array use import array.Array
use import array.ArrayPermut use import array.ArrayPermut
...@@ -98,9 +105,8 @@ lemma common_prefix_eq2: ...@@ -98,9 +105,8 @@ lemma common_prefix_eq2:
lemma not_common_prefix_if_last_different: lemma not_common_prefix_if_last_different:
forall a:array int, x y:int, l:int. forall a:array int, x y:int, l:int.
0 < l /\ x+l < a.length /\ y+l < a.length /\ a[x+(l-1)] <> a[y+(l-1)] -> 0 <= l /\ x+l < a.length /\ y+l < a.length /\ a[x+l] <> a[y+l] ->
not is_common_prefix a x y l not is_common_prefix a x y (l+1)
(* (*
function longest_common_prefix (a:array int) (x y:int) :int function longest_common_prefix (a:array int) (x y:int) :int
...@@ -127,6 +133,9 @@ let lcp (a:array int) (x y:int) : int ...@@ -127,6 +133,9 @@ let lcp (a:array int) (x y:int) : int
invariant { is_common_prefix a x y !l } invariant { is_common_prefix a x y !l }
incr l incr l
done; done;
(* not needed, lemma not_common_prefix_if_last_different is enough
assert { not is_common_prefix a x y (!l+1) };
*)
!l !l
...@@ -156,24 +165,28 @@ let test1 () = ...@@ -156,24 +165,28 @@ let test1 () =
arr[0]<-1; arr[1]<-2; arr[2]<-2; arr[3]<-5; arr[0]<-1; arr[1]<-2; arr[2]<-2; arr[3]<-5;
let x = lcp arr 1 2 in let x = lcp arr 1 2 in
assert { is_common_prefix arr 1 2 1}; assert { is_common_prefix arr 1 2 1};
assert { not is_common_prefix arr 1 2 2};
check { x = 1 }; check { x = 1 };
(* int[] brr = {1,2,3,5}; *) (* int[] brr = {1,2,3,5}; *)
let brr = Array.make 4 0 in let brr = Array.make 4 0 in
brr[0]<-1; brr[1]<-2; brr[2]<-3; brr[3]<-5; brr[0]<-1; brr[1]<-2; brr[2]<-3; brr[3]<-5;
let x = lcp brr 1 2 in let x = lcp brr 1 2 in
assert { is_common_prefix brr 1 2 0}; assert { is_common_prefix brr 1 2 0};
assert { not is_common_prefix brr 1 2 1};
check { x = 0 }; check { x = 0 };
(* int[] crr = {1,2,3,5}; *) (* int[] crr = {1,2,3,5}; *)
let crr = Array.make 4 0 in let crr = Array.make 4 0 in
crr[0]<-1; crr[1]<-2; crr[2]<-3; crr[3]<-5; crr[0]<-1; crr[1]<-2; crr[2]<-3; crr[3]<-5;
let x = lcp crr 2 3 in let x = lcp crr 2 3 in
assert { is_common_prefix crr 2 3 0}; assert { is_common_prefix crr 2 3 0};
assert { not is_common_prefix crr 2 3 1};
check { x = 0 }; check { x = 0 };
(* int[] drr = {1,2,3,3}; *) (* int[] drr = {1,2,3,3}; *)
let drr = Array.make 4 0 in let drr = Array.make 4 0 in
drr[0]<-1; drr[1]<-2; drr[2]<-3; drr[3]<-3; drr[0]<-1; drr[1]<-2; drr[2]<-3; drr[3]<-3;
let x = lcp drr 2 3 in let x = lcp drr 2 3 in
assert { is_common_prefix drr 2 3 1}; assert { is_common_prefix drr 2 3 1};
assert { not is_common_prefix drr 2 3 2};
check {x = 1} check {x = 1}
...@@ -214,9 +227,6 @@ let compare (a:array int) (x y:int) : int ...@@ -214,9 +227,6 @@ let compare (a:array int) (x y:int) : int
if a[x + l] > a[y + l] then 1 else if a[x + l] > a[y + l] then 1 else
absurd absurd
use map.Map
use map.MapPermut
use map.MapInjection
predicate permutation (m:Map.map int int) (u : int) = predicate permutation (m:Map.map int int) (u : int) =
MapInjection.range m u /\ MapInjection.injective m u MapInjection.range m u /\ MapInjection.injective m u
...@@ -265,17 +275,11 @@ let compare (a:array int) (x y:int) : int ...@@ -265,17 +275,11 @@ let compare (a:array int) (x y:int) : int
*) *)
(*
lemma map_permut_permutation :
forall m1 m2:Map.map int int, u:int [MapPermut.permut_sub m1 m2 0 u].
MapPermut.permut_sub m1 m2 0 u -> map_permutation m1 u -> map_permutation m2 u
*)
lemma permut_permutation : lemma permut_permutation :
forall a1 a2:array int. forall a1 a2:array int.
permut a1 a2 -> permutation a1.elts a1.length -> permutation a2.elts a2.length permut a1 a2 -> permutation a1.elts a1.length -> permutation a2.elts a2.length
use import int.MinMax use import int.MinMax
(* (*
lemma lcp_le_le_min: lemma lcp_le_le_min:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment