RichTextTests.v (153 lines of code) (raw):

Require Import Commons Tree OtDef RichText String Basics. Require Import mathcomp.algebra.ssrint. Require Import ListTools. Import intZmod. Theorem c1: forall (op1 op2 : int) (f : bool) (m m1 m2 : int), (fun c m0 : int => Some (addz m0 c)) op1 m = Some m1 -> (fun c m0 : int => Some (addz m0 c)) op2 m = Some m2 -> let m21 := exec_all (fun c m0 : int => Some (addz m0 c)) (Some m2) ((fun o1 : int => fun=> (fun=> [:: o1])) op1 op2 f) in let m12 := exec_all (fun c m0 : int => Some (addz m0 c)) (Some m1) ((fun o1 : int => fun=> (fun=> [:: o1])) op2 op1 (~~ f)) in m21 = m12 /\ (exists node : int, m21 = Some node). rewrite /exec_all /flip /= => m n _ x x1 x2 [] <- [] <-; split. by rewrite -addzA (addzC n) -addzA. eauto. Qed. Instance intOT : OTBase int int := {interp := (fun c m => Some (addz m c)); it := (fun o1 o2 f => [:: o1]); it_c1:=c1}. Theorem ip1: forall op m mr : int, interp op m = Some mr -> interp ([eta oppz] op) mr = Some m. move=> m x xr [] <- /=. by rewrite -addzA (addzC m) addNz addzC add0z. Qed. Instance intIP : OTInv _ _ intOT := {inv := (fun x => oppz x); ip1:=ip1}. Definition nattree := tree nat. Definition inttree := tree int. Definition nat_tree_to_int_tree (x : nattree) : inttree := match decode (map (fun (n : option nat)=> match n with Some n' => Some (Posz n') | _ => @None int end) (encode x)) with Some n => n | _ => Node (Posz 0) nil end. Definition test_model : inttree := nat_tree_to_int_tree (Node 1 [:: Node 2 [:: Node 3 [:: Node 4 nil; Node 5 nil]; Node 6 nil]; Node 7 nil; Node 8 [:: Node 9 [:: Node 10 nil; Node 11 nil]; Node 12 nil]]). Fixpoint read {X : eqType} (t : tree X) (idx : seq nat) := match t, idx with Node x ls, i :: xs => match nth i ls with Some t' => read t' xs | None => None end | _, nil => Some t end. Fixpoint list_gen (range len : nat) : list (list nat) := match len with 0 => (fix f1 (n : nat) : list (list nat) := match n with 0 => [::[::0]] | S n' => [::n] :: (f1 n') end) range | S len' => (fix f2 (n : nat) := match n with | 0 => map (fun xs => 0 :: xs ) (list_gen range len') | S n' => (map (fun xs => n :: xs ) (list_gen range len')) ++ (f2 n') end) range end. Fixpoint list_gen' (range len : nat) : list (list nat) := match len with 0 => list_gen range len | S len' => (list_gen range len) ++ (list_gen' range len') end. Fixpoint ei (nc : int) (idx : seq nat) := match idx with nil => @JEditLabel int_eqType int nc | n :: ns => JOpenRoot n (ei nc ns) end. Fixpoint li l (idx : seq nat) := match idx with nil => @JEditLabel int_eqType int (Posz O) | [:: n] => JInsert n l | n :: ns => JOpenRoot n (li l ns) end. Fixpoint create_lst (n : nat) (m : nat) := match n with 0 => nil | S n' => rcons (create_lst n' m) (m + n') end. Fixpoint filt (x : seq (option (tree int_eqType))) := match x with | [:: Some l] => Some [:: l] | (Some l) :: ls => match (filt ls) with | Some ls' => Some (l :: ls') | _ => None end | _ => None end. Fixpoint ri (t : tree int_eqType) (idx : seq nat) (count : nat) := match idx with nil => None | [:: n] => match (filt (map (fun k => read t [:: k]) (create_lst count n))) with Some l => Some (JRemove n l) | _ => None end | n :: ns => match read t [:: n] with Some x => match (ri x ns count) with Some cmd => Some (@JOpenRoot int_eqType int n cmd) | _ => None end | None => None end end. Fixpoint ui (t : tree int_eqType) (idx : seq nat) (p : int * nat) := let (x, count) := p in match idx with nil => None | [:: n] => match (filt (map (fun k => read t [:: k]) (create_lst count n))) with Some l => Some (JUnite n x l) | _ => None end | n :: ns => match read t [:: n] with Some x => match (ri x ns count) with Some cmd => Some (JOpenRoot n cmd) | _ => None end | None => None end end. Fixpoint fi (t : tree int_eqType) (idx : seq nat) := match idx, t with nil, _ => None | [:: n], Node x ls => match nth n ls with (Some t') => Some (JFlat n t') | _ => None end | n :: ns, Node x ls => match nth n ls with (Some t') => match fi t' ns with Some cmd => Some (@JOpenRoot int_eqType int n cmd) | None => None end | None => None end end. Definition all_indices := list_gen' 3 3. Definition filter_applicable := filter (fun x => match jinterp int x (test_model) with Some _ => true | _ => false end). Definition unite_ops := flatten (map (fun x => match x with None => nil | Some x' => [::x'] end) (allpairs (ui test_model) all_indices [seq (x, y) | x <- [:: Negz 1; Posz 1], y <- (create_lst 3 0)])). Definition remove_ops := flatten (map (fun x => match x with None => nil | Some x' => [::x'] end) (allpairs (ri test_model) all_indices (create_lst 3 0))). Definition insert_ops := (map (li [::Node (Posz 100) nil]) all_indices) ++ (map (li [::Node (Posz 100) nil; Node (Posz 101) nil]) all_indices). Definition edit_ops := (map (ei (Posz 10)) all_indices) ++ (map (ei (Negz 2)) all_indices). Definition flat_ops := flatten (map (fun x => match x with None => nil | Some x' => [::x'] end) (map (fi test_model) all_indices)). Definition ops := filter_applicable (remove_ops ++ insert_ops ++ edit_ops ++ flat_ops ++ unite_ops). Eval compute in size ops. Open Scope string_scope. Definition jt := @jit int_eqType int intOT. Definition jp := @jinterp int_eqType int intOT. Definition run_test (o : (jcmd int) * (jcmd int)) := let (op1, op2) := o in let (op1', op2') := (jt op1 op2 true, jt op2 op1 false) in match jp op1 test_model, jp op2 test_model with | _ , None | None, _ => None | Some tm1, Some tm2 => let (tm12, tm21) := (exec_all jp (Some tm1) op2', exec_all jp (Some tm2) op1') in if [|| tm12 == None, tm21 == None | ~~(tm12 == tm21)] then Some ("OP1=", op1, "OP2=", op2, "OP1'=", op1', "OP2'=", op2', "M1=", tm1, "M2=", tm2, "OP1'=", op1', "OP2'=", op2', "M12=", tm12, "M21=", tm21) else None end. Fixpoint run_suite tests := match tests with t :: ts => match run_test t with None => run_suite ts | Some o => Some o end | _ => None end. Eval compute in run_suite (allpairs (fun x y => (x, y)) ops ops).