Require terminaison.
Require Relations.
Require term.
Require List.
Require equational_theory.
Require rpo_extension.
Require equational_extension.
Require closure_extension.
Require term_extension.
Require dp.
Require Inclusion.
Require or_ext_generated.
Require ZArith.
Require ring_extention.
Require Zwf.
Require Inverse_Image.
Require matrix.
Require more_list_extention.
Import List.
Import ZArith.
Set Implicit Arguments.
Module algebra.
Module F
<:term.Signature.
Inductive symb :
Set :=
(* id_a *)
| id_a : symb
(* id_b *)
| id_b : symb
.
Definition symb_eq_bool (f1 f2:symb) : bool :=
match f1,f2 with
| id_a,id_a => true
| id_b,id_b => true
| _,_ => false
end.
(* Proof of decidability of equality over symb *)
Definition symb_eq_bool_ok(f1 f2:symb) :
match symb_eq_bool f1 f2 with
| true => f1 = f2
| false => f1 <> f2
end.
Proof.
intros f1 f2.
refine match f1 as u1,f2 as u2 return
match symb_eq_bool u1 u2 return
Prop with
| true => u1 = u2
| false => u1 <> u2
end with
| id_a,id_a => refl_equal _
| id_b,id_b => refl_equal _
| _,_ => _
end;intros abs;discriminate.
Defined.
Definition arity (f:symb) :=
match f with
| id_a => term.Free 1
| id_b => term.Free 1
end.
Definition symb_order (f1 f2:symb) : bool :=
match f1,f2 with
| id_a,id_a => true
| id_a,id_b => false
| id_b,id_a => true
| id_b,id_b => true
end.
Module Symb.
Definition A := symb.
Definition eq_A := @eq A.
Definition eq_proof : equivalence A eq_A.
Proof.
constructor.
red ;reflexivity .
red ;intros ;transitivity y ;assumption.
red ;intros ;symmetry ;assumption.
Defined.
Add Relation A eq_A
reflexivity proved by (@equiv_refl _ _ eq_proof)
symmetry proved by (@equiv_sym _ _ eq_proof)
transitivity proved by (@equiv_trans _ _ eq_proof) as EQA
.
Definition eq_bool := symb_eq_bool.
Definition eq_bool_ok := symb_eq_bool_ok.
End Symb.
Export Symb.
End F.
Module Alg := term.Make'(F)(term_extension.IntVars).
Module Alg_ext := term_extension.Make(Alg).
Module EQT := equational_theory.Make(Alg).
Module EQT_ext := equational_extension.Make(EQT).
End algebra.
Module R_xml_0_deep_rew.
Inductive R_xml_0_rules :
algebra.Alg.term ->algebra.Alg.term ->Prop :=
(* a(a(x_)) -> a(b(a(x_))) *)
| R_xml_0_rule_0 :
R_xml_0_rules (algebra.Alg.Term algebra.F.id_a ((algebra.Alg.Term
algebra.F.id_b ((algebra.Alg.Term algebra.F.id_a
((algebra.Alg.Var 1)::nil))::nil))::nil))
(algebra.Alg.Term algebra.F.id_a ((algebra.Alg.Term algebra.F.id_a
((algebra.Alg.Var 1)::nil))::nil))
.
Definition R_xml_0_rule_as_list_0 :=
((algebra.Alg.Term algebra.F.id_a ((algebra.Alg.Term algebra.F.id_a
((algebra.Alg.Var 1)::nil))::nil)),
(algebra.Alg.Term algebra.F.id_a ((algebra.Alg.Term algebra.F.id_b
((algebra.Alg.Term algebra.F.id_a
((algebra.Alg.Var 1)::nil))::nil))::nil)))::nil.
Definition R_xml_0_rule_as_list := R_xml_0_rule_as_list_0.
Lemma R_xml_0_rules_included :
forall l r, R_xml_0_rules r l <-> In (l,r) R_xml_0_rule_as_list.
Proof.
intros l r.
constructor.
intros H.
case H;clear H;
(apply (more_list.mem_impl_in (@eq (algebra.Alg.term*algebra.Alg.term)));
[tauto|idtac]);
match goal with
| |- _ _ _ ?t ?l =>
let u := fresh "u" in
(generalize (more_list.mem_bool_ok _ _
algebra.Alg_ext.eq_term_term_bool_ok t l);
set (u:=more_list.mem_bool algebra.Alg_ext.eq_term_term_bool t l) in *;
vm_compute in u|-;unfold u in *;clear u;intros H;refine H)
end
.
intros H.
case H;clear H;intros H.
injection H;intros ;subst;constructor 1.
elim H.
Qed.
Lemma R_xml_0_non_var : forall x t, ~R_xml_0_rules t (algebra.EQT.T.Var x).
Proof.
intros x t H.
inversion H.
Qed.
Lemma R_xml_0_reg :
forall s t,
(R_xml_0_rules s t) ->
forall x, In x (algebra.Alg.var_list s) ->In x (algebra.Alg.var_list t).
Proof.
intros s t H.
inversion H;intros x Hx;
(apply (more_list.mem_impl_in (@eq algebra.Alg.variable));[tauto|idtac]);
apply (more_list.in_impl_mem (@eq algebra.Alg.variable)) in Hx;
vm_compute in Hx|-*;tauto.
Qed.
Inductive and_1 (x3:Prop) : Prop :=
| conj_1 : x3->and_1 x3
.
Lemma are_constuctors_of_R_xml_0 :
forall t t',
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_rules) t' t) ->
and_1 (forall x4,
t = (algebra.Alg.Term algebra.F.id_b (x4::nil)) ->
exists x3,
t' = (algebra.Alg.Term algebra.F.id_b (x3::nil))/\
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_rules)
x3 x4)).
Proof.
intros t t' H.
induction H as [|y IH z z_to_y] using
closure_extension.refl_trans_clos_ind2.
constructor 1.
intros x4 H;exists x4;intuition;constructor 1.
inversion z_to_y as [t1 t2 H H0 H1|f l1 l2 H0 H H2];clear z_to_y;subst.
inversion H as [t1 t2 sigma H2 H1 H0];clear H IH;subst;inversion H2;
clear ;constructor;try (intros until 0 );clear ;intros abs;
discriminate abs.
destruct IH as [H_id_b].
constructor.
intros x4 H;injection H;clear H;intros ;subst;
repeat (
match goal with
| H:closure.one_step_list (algebra.EQT.one_step _) _ _ |- _ =>
inversion H;clear H;subst
end
).
match goal with
| H:algebra.EQT.one_step _ ?y x4 |- _ =>
destruct (H_id_b y (refl_equal _)) as [x3];intros ;intuition;exists x3;
intuition;eapply closure_extension.refl_trans_clos_R;eassumption
end
.
Qed.
Lemma id_b_is_R_xml_0_constructor :
forall t t',
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_rules) t' t) ->
forall x4,
t = (algebra.Alg.Term algebra.F.id_b (x4::nil)) ->
exists x3,
t' = (algebra.Alg.Term algebra.F.id_b (x3::nil))/\
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_rules) x3 x4).
Proof.
intros t t' H.
destruct (are_constuctors_of_R_xml_0 H).
assumption.
Qed.
Ltac impossible_star_reduction_R_xml_0 :=
match goal with
| H:closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_rules)
_ (algebra.Alg.Term algebra.F.id_b (?x3::nil)) |- _ =>
let x3 := fresh "x" in
(let Heq := fresh "Heq" in
(let Hred1 := fresh "Hred" in
(destruct (id_b_is_R_xml_0_constructor H (refl_equal _)) as
[x3 [Heq Hred1]];
(discriminate Heq)||
(injection Heq;intros ;subst;clear Heq;clear H;
impossible_star_reduction_R_xml_0 ))))
end
.
Ltac simplify_star_reduction_R_xml_0 :=
match goal with
| H:closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_rules)
_ (algebra.Alg.Term algebra.F.id_b (?x3::nil)) |- _ =>
let x3 := fresh "x" in
(let Heq := fresh "Heq" in
(let Hred1 := fresh "Hred" in
(destruct (id_b_is_R_xml_0_constructor H (refl_equal _)) as
[x3 [Heq Hred1]];
(discriminate Heq)||
(injection Heq;intros ;subst;clear Heq;clear H;
try (simplify_star_reduction_R_xml_0 )))))
end
.
End R_xml_0_deep_rew.
Module InterpGen := interp.Interp(algebra.EQT).
Module ddp := dp.MakeDP(algebra.EQT).
Module SymbType. Definition A := algebra.Alg.F.Symb.A. End SymbType.
Module Symb_more_list := more_list_extention.Make(SymbType)(algebra.Alg.F.Symb).
Module SymbSet := list_set.Make(algebra.F.Symb).
Module Interp.
Section S.
Require Import interp.
Hypothesis A : Type.
Hypothesis Ale Alt Aeq : A -> A -> Prop.
Hypothesis Aop : interp.ordering_pair Aeq Alt Ale.
Hypothesis A0 : A.
Notation Local "a <= b" := (Ale a b).
Hypothesis P_id_a : A ->A.
Hypothesis P_id_b : A ->A.
Hypothesis P_id_a_monotonic :
forall x4 x3, (A0 <= x4)/\ (x4 <= x3) ->P_id_a x4 <= P_id_a x3.
Hypothesis P_id_b_monotonic :
forall x4 x3, (A0 <= x4)/\ (x4 <= x3) ->P_id_b x4 <= P_id_b x3.
Hypothesis P_id_a_bounded : forall x3, (A0 <= x3) ->A0 <= P_id_a x3.
Hypothesis P_id_b_bounded : forall x3, (A0 <= x3) ->A0 <= P_id_b x3.
Fixpoint measure t { struct t } :=
match t with
| (algebra.Alg.Term algebra.F.id_a (x3::nil)) => P_id_a (measure x3)
| (algebra.Alg.Term algebra.F.id_b (x3::nil)) => P_id_b (measure x3)
| _ => A0
end.
Lemma measure_equation :
forall t,
measure t = match t with
| (algebra.Alg.Term algebra.F.id_a (x3::nil)) =>
P_id_a (measure x3)
| (algebra.Alg.Term algebra.F.id_b (x3::nil)) =>
P_id_b (measure x3)
| _ => A0
end.
Proof.
intros t;case t;intros ;apply refl_equal.
Qed.
Definition Pols f : InterpGen.Pol_type A (InterpGen.get_arity f) :=
match f with
| algebra.F.id_a => P_id_a
| algebra.F.id_b => P_id_b
end.
Lemma same_measure : forall t, measure t = InterpGen.measure A0 Pols t.
Proof.
fix 1 .
intros [a| f l].
simpl in |-*.
unfold eq_rect_r, eq_rect, sym_eq in |-*.
reflexivity .
refine match f with
| algebra.F.id_a =>
match l with
| nil => _
| _::nil => _
| _::_::_ => _
end
| algebra.F.id_b =>
match l with
| nil => _
| _::nil => _
| _::_::_ => _
end
end;simpl in |-*;unfold eq_rect_r, eq_rect, sym_eq in |-*;
try (reflexivity );f_equal ;auto.
Qed.
Lemma measure_bounded : forall t, A0 <= measure t.
Proof.
intros t.
rewrite same_measure in |-*.
apply (InterpGen.measure_bounded Aop).
intros f.
case f.
vm_compute in |-*;intros ;apply P_id_a_bounded;assumption.
vm_compute in |-*;intros ;apply P_id_b_bounded;assumption.
Qed.
Ltac generate_pos_hyp :=
match goal with
| H:context [measure ?x] |- _ =>
let v := fresh "v" in
(let H := fresh "h" in
(set (H:=measure_bounded x) in *;set (v:=measure x) in *;
clearbody H;clearbody v))
| |- context [measure ?x] =>
let v := fresh "v" in
(let H := fresh "h" in
(set (H:=measure_bounded x) in *;set (v:=measure x) in *;
clearbody H;clearbody v))
end
.
Hypothesis rules_monotonic :
forall l r,
(algebra.EQT.axiom R_xml_0_deep_rew.R_xml_0_rules r l) ->
measure r <= measure l.
Lemma measure_star_monotonic :
forall l r,
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_deep_rew.R_xml_0_rules)
r l) ->measure r <= measure l.
Proof.
intros .
do 2 (rewrite same_measure in |-*).
apply InterpGen.measure_star_monotonic with (1:=Aop) (Pols:=Pols)
(rules:=R_xml_0_deep_rew.R_xml_0_rules).
intros f.
case f.
vm_compute in |-*;intros ;apply P_id_a_monotonic;assumption.
vm_compute in |-*;intros ;apply P_id_b_monotonic;assumption.
intros f.
case f.
vm_compute in |-*;intros ;apply P_id_a_bounded;assumption.
vm_compute in |-*;intros ;apply P_id_b_bounded;assumption.
intros .
do 2 (rewrite <- same_measure in |-*).
apply rules_monotonic;assumption.
assumption.
Qed.
Hypothesis P_id_A : A ->A.
Hypothesis P_id_A_monotonic :
forall x4 x3, (A0 <= x4)/\ (x4 <= x3) ->P_id_A x4 <= P_id_A x3.
Definition marked_measure t :=
match t with
| (algebra.Alg.Term algebra.F.id_a (x3::nil)) => P_id_A (measure x3)
| _ => measure t
end.
Definition Marked_pols :
forall f,
(algebra.EQT.defined R_xml_0_deep_rew.R_xml_0_rules f) ->
InterpGen.Pol_type A (InterpGen.get_arity f).
Proof.
intros f H.
apply ddp.defined_list_complete with (1:=R_xml_0_deep_rew.R_xml_0_rules_included) in H .
apply (Symb_more_list.change_in algebra.F.symb_order) in H .
set (u := (Symb_more_list.qs algebra.F.symb_order
(Symb_more_list.XSet.remove_red
(ddp.defined_list R_xml_0_deep_rew.R_xml_0_rule_as_list)))) in * .
vm_compute in u .
unfold u in * .
clear u .
unfold more_list.mem_bool in H .
match type of H with
| orb ?a ?b = true =>
assert (H':{a = true}+{b = true});[
revert H;case a;[left;reflexivity|simpl;intros h;right;exact h]|
clear H;destruct H' as [H|H]]
end .
match type of H with
| _ _ ?t = true =>
generalize (algebra.F.symb_eq_bool_ok f t);
unfold algebra.Alg.eq_symb_bool in H;
rewrite H;clear H;intros ;subst
end .
vm_compute in |-*;intros x3;apply (P_id_A x3).
discriminate H.
Defined.
Lemma same_marked_measure :
forall t,
marked_measure t = InterpGen.marked_measure A0 Pols Marked_pols
(ddp.defined_dec _ _
R_xml_0_deep_rew.R_xml_0_rules_included) t.
Proof.
intros [a| f l].
simpl in |-*.
unfold eq_rect_r, eq_rect, sym_eq in |-*.
reflexivity .
refine match f with
| algebra.F.id_a =>
match l with
| nil => _
| _::nil => _
| _::_::_ => _
end
| algebra.F.id_b =>
match l with
| nil => _
| _::nil => _
| _::_::_ => _
end
end.
vm_compute in |-*;reflexivity .
lazy - [measure InterpGen.measure Pols] in |-* ;f_equal ;
apply same_measure.
vm_compute in |-*;reflexivity .
vm_compute in |-*;reflexivity .
lazy - [measure InterpGen.measure Pols] in |-* ;f_equal ;
apply same_measure.
vm_compute in |-*;reflexivity .
Qed.
Lemma marked_measure_equation :
forall t,
marked_measure t = match t with
| (algebra.Alg.Term algebra.F.id_a (x3::nil)) =>
P_id_A (measure x3)
| _ => measure t
end.
Proof.
reflexivity .
Qed.
Lemma marked_measure_star_monotonic :
forall f l1 l2,
(closure.refl_trans_clos (closure.one_step_list (algebra.EQT.one_step
R_xml_0_deep_rew.R_xml_0_rules)
) l1 l2) ->
marked_measure (algebra.Alg.Term f l1) <= marked_measure (algebra.Alg.Term
f l2).
Proof.
intros .
do 2 (rewrite same_marked_measure in |-*).
apply InterpGen.marked_measure_star_monotonic with (1:=Aop) (Pols:=
Pols) (rules:=R_xml_0_deep_rew.R_xml_0_rules).
clear f.
intros f.
case f.
vm_compute in |-*;intros ;apply P_id_a_monotonic;assumption.
vm_compute in |-*;intros ;apply P_id_b_monotonic;assumption.
clear f.
intros f.
case f.
vm_compute in |-*;intros ;apply P_id_a_bounded;assumption.
vm_compute in |-*;intros ;apply P_id_b_bounded;assumption.
intros .
do 2 (rewrite <- same_measure in |-*).
apply rules_monotonic;assumption.
clear f.
intros f.
clear H.
intros H.
generalize H.
apply ddp.defined_list_complete with (1:=R_xml_0_deep_rew.R_xml_0_rules_included) in H .
apply (Symb_more_list.change_in algebra.F.symb_order) in H .
set (u := (Symb_more_list.qs algebra.F.symb_order
(Symb_more_list.XSet.remove_red
(ddp.defined_list R_xml_0_deep_rew.R_xml_0_rule_as_list)))) in * .
vm_compute in u .
unfold u in * .
clear u .
unfold more_list.mem_bool in H .
match type of H with
| orb ?a ?b = true =>
assert (H':{a = true}+{b = true});[
revert H;case a;[left;reflexivity|simpl;intros h;right;exact h]|
clear H;destruct H' as [H|H]]
end .
match type of H with
| _ _ ?t = true =>
generalize (algebra.F.symb_eq_bool_ok f t);
unfold algebra.Alg.eq_symb_bool in H;
rewrite H;clear H;intros ;subst
end .
vm_compute in |-*;intros ;apply P_id_A_monotonic;assumption.
discriminate H.
assumption.
Qed.
End S.
End Interp.
Module InterpZ.
Section S.
Open Scope Z_scope.
Hypothesis min_value : Z.
Import ring_extention.
Notation Local "'Alt'" := (Zwf.Zwf min_value).
Notation Local "'Ale'" := Zle.
Notation Local "'Aeq'" := (@eq Z).
Notation Local "a <= b" := (Ale a b).
Notation Local "a < b" := (Alt a b).
Hypothesis P_id_a : Z ->Z.
Hypothesis P_id_b : Z ->Z.
Hypothesis P_id_a_monotonic :
forall x4 x3, (min_value <= x4)/\ (x4 <= x3) ->P_id_a x4 <= P_id_a x3.
Hypothesis P_id_b_monotonic :
forall x4 x3, (min_value <= x4)/\ (x4 <= x3) ->P_id_b x4 <= P_id_b x3.
Hypothesis P_id_a_bounded :
forall x3, (min_value <= x3) ->min_value <= P_id_a x3.
Hypothesis P_id_b_bounded :
forall x3, (min_value <= x3) ->min_value <= P_id_b x3.
Definition measure := Interp.measure min_value P_id_a P_id_b.
Lemma measure_equation :
forall t,
measure t = match t with
| (algebra.Alg.Term algebra.F.id_a (x3::nil)) =>
P_id_a (measure x3)
| (algebra.Alg.Term algebra.F.id_b (x3::nil)) =>
P_id_b (measure x3)
| _ => min_value
end.
Proof.
intros t;case t;intros ;apply refl_equal.
Qed.
Lemma measure_bounded : forall t, min_value <= measure t.
Proof.
unfold measure in |-*.
apply Interp.measure_bounded with Alt Aeq;
(apply interp.o_Z)||
(cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;auto with zarith).
Qed.
Ltac generate_pos_hyp :=
match goal with
| H:context [measure ?x] |- _ =>
let v := fresh "v" in
(let H := fresh "h" in
(set (H:=measure_bounded x) in *;set (v:=measure x) in *;
clearbody H;clearbody v))
| |- context [measure ?x] =>
let v := fresh "v" in
(let H := fresh "h" in
(set (H:=measure_bounded x) in *;set (v:=measure x) in *;
clearbody H;clearbody v))
end
.
Hypothesis rules_monotonic :
forall l r,
(algebra.EQT.axiom R_xml_0_deep_rew.R_xml_0_rules r l) ->
measure r <= measure l.
Lemma measure_star_monotonic :
forall l r,
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_deep_rew.R_xml_0_rules)
r l) ->measure r <= measure l.
Proof.
unfold measure in *.
apply Interp.measure_star_monotonic with Alt Aeq.
(apply interp.o_Z)||
(cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;auto with zarith).
intros ;apply P_id_a_monotonic;assumption.
intros ;apply P_id_b_monotonic;assumption.
intros ;apply P_id_a_bounded;assumption.
intros ;apply P_id_b_bounded;assumption.
apply rules_monotonic.
Qed.
Hypothesis P_id_A : Z ->Z.
Hypothesis P_id_A_monotonic :
forall x4 x3, (min_value <= x4)/\ (x4 <= x3) ->P_id_A x4 <= P_id_A x3.
Definition marked_measure :=
Interp.marked_measure min_value P_id_a P_id_b P_id_A.
Lemma marked_measure_equation :
forall t,
marked_measure t = match t with
| (algebra.Alg.Term algebra.F.id_a (x3::nil)) =>
P_id_A (measure x3)
| _ => measure t
end.
Proof.
reflexivity .
Qed.
Lemma marked_measure_star_monotonic :
forall f l1 l2,
(closure.refl_trans_clos (closure.one_step_list (algebra.EQT.one_step
R_xml_0_deep_rew.R_xml_0_rules)
) l1 l2) ->
marked_measure (algebra.Alg.Term f l1) <= marked_measure (algebra.Alg.Term
f l2).
Proof.
unfold marked_measure in *.
apply Interp.marked_measure_star_monotonic with Alt Aeq.
(apply interp.o_Z)||
(cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;auto with zarith).
intros ;apply P_id_a_monotonic;assumption.
intros ;apply P_id_b_monotonic;assumption.
intros ;apply P_id_a_bounded;assumption.
intros ;apply P_id_b_bounded;assumption.
apply rules_monotonic.
intros ;apply P_id_A_monotonic;assumption.
Qed.
End S.
End InterpZ.
Module WF_R_xml_0_deep_rew.
Inductive DP_R_xml_0 :
algebra.Alg.term ->algebra.Alg.term ->Prop :=
(* *)
| DP_R_xml_0_0 :
forall x1 x3,
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_deep_rew.R_xml_0_rules)
(algebra.Alg.Term algebra.F.id_a (x1::nil))
x3) ->
DP_R_xml_0 (algebra.Alg.Term algebra.F.id_a ((algebra.Alg.Term
algebra.F.id_b ((algebra.Alg.Term algebra.F.id_a
(x1::nil))::nil))::nil))
(algebra.Alg.Term algebra.F.id_a (x3::nil))
(* *)
| DP_R_xml_0_1 :
forall x1 x3,
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_deep_rew.R_xml_0_rules)
(algebra.Alg.Term algebra.F.id_a (x1::nil))
x3) ->
DP_R_xml_0 (algebra.Alg.Term algebra.F.id_a (x1::nil))
(algebra.Alg.Term algebra.F.id_a (x3::nil))
.
Module ddp := dp.MakeDP(algebra.EQT).
Lemma R_xml_0_dp_step_spec :
forall x y,
(ddp.dp_step R_xml_0_deep_rew.R_xml_0_rules x y) ->
exists f,
exists l1,
exists l2,
y = algebra.Alg.Term f l2/\
(closure.refl_trans_clos (closure.one_step_list (algebra.EQT.one_step
R_xml_0_deep_rew.R_xml_0_rules)
) l1 l2)/\
(ddp.dp R_xml_0_deep_rew.R_xml_0_rules x (algebra.Alg.Term f l1)).
Proof.
intros x y H.
induction H.
inversion H.
subst.
destruct t0.
refine ((False_ind) _ _).
refine (R_xml_0_deep_rew.R_xml_0_non_var H0).
simpl in H|-*.
exists a.
exists ((List.map) (algebra.Alg.apply_subst sigma) l).
exists ((List.map) (algebra.Alg.apply_subst sigma) l).
repeat (constructor).
assumption.
exists f.
exists l2.
exists l1.
constructor.
constructor.
constructor.
constructor.
rewrite <- closure.rwr_list_trans_clos_one_step_list.
assumption.
assumption.
Qed.
Ltac included_dp_tac H :=
injection H;clear H;intros;subst;
repeat (match goal with
| H: closure.refl_trans_clos (closure.one_step_list _) (_::_) _ |- _=>
let x := fresh "x" in
let l := fresh "l" in
let h1 := fresh "h" in
let h2 := fresh "h" in
let h3 := fresh "h" in
destruct (@algebra.EQT_ext.one_step_list_star_decompose_cons _ _ _ _ H) as [x [l[h1[h2 h3]]]];clear H;subst
| H: closure.refl_trans_clos (closure.one_step_list _) nil _ |- _ =>
rewrite (@algebra.EQT_ext.one_step_list_star_decompose_nil _ _ H) in *;clear H
end
);simpl;
econstructor eassumption
.
Ltac dp_concl_tac h2 h cont_tac
t :=
match t with
| False => let h' := fresh "a" in
(set (h':=t) in *;cont_tac h';
repeat (
let e := type of h in
(match e with
| ?t => unfold t in h|-;
(case h;
[abstract (clear h;intros h;injection h;
clear h;intros ;subst;
included_dp_tac h2)|
clear h;intros h;clear t])
| ?t => unfold t in h|-;elim h
end
)
))
| or ?a ?b => let cont_tac
h' := let h'' := fresh "a" in
(set (h'':=or a h') in *;cont_tac h'') in
(dp_concl_tac h2 h cont_tac b)
end
.
Module WF_DP_R_xml_0.
Inductive DP_R_xml_0_non_scc_1 :
algebra.Alg.term ->algebra.Alg.term ->Prop :=
(* *)
| DP_R_xml_0_non_scc_1_0 :
forall x1 x3,
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_deep_rew.R_xml_0_rules)
(algebra.Alg.Term algebra.F.id_a (x1::nil))
x3) ->
DP_R_xml_0_non_scc_1 (algebra.Alg.Term algebra.F.id_a
((algebra.Alg.Term algebra.F.id_b
((algebra.Alg.Term algebra.F.id_a
(x1::nil))::nil))::nil))
(algebra.Alg.Term algebra.F.id_a (x3::nil))
.
Lemma acc_DP_R_xml_0_non_scc_1 :
forall x y,
(DP_R_xml_0_non_scc_1 x y) ->Acc WF_R_xml_0_deep_rew.DP_R_xml_0 x.
Proof.
intros x y h.
inversion h;clear h;subst;
constructor;intros _y _h;inversion _h;clear _h;subst;
(R_xml_0_deep_rew.impossible_star_reduction_R_xml_0 )||
(eapply Hrec;econstructor (eassumption)||(algebra.Alg_ext.star_refl' )).
Qed.
Inductive DP_R_xml_0_scc_2 :
algebra.Alg.term ->algebra.Alg.term ->Prop :=
(* *)
| DP_R_xml_0_scc_2_0 :
forall x1 x3,
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_deep_rew.R_xml_0_rules)
(algebra.Alg.Term algebra.F.id_a (x1::nil))
x3) ->
DP_R_xml_0_scc_2 (algebra.Alg.Term algebra.F.id_a (x1::nil))
(algebra.Alg.Term algebra.F.id_a (x3::nil))
.
Module WF_DP_R_xml_0_scc_2.
Open Scope Z_scope.
Import ring_extention.
Notation Local "a <= b" := (Zle a b).
Notation Local "a < b" := (Zlt a b).
Definition P_id_a (x3:Z) := 2 + 2* x3.
Definition P_id_b (x3:Z) := 1.
Lemma P_id_a_monotonic :
forall x4 x3, (1 <= x4)/\ (x4 <= x3) ->P_id_a x4 <= P_id_a x3.
Proof.
intros x4 x3.
intros [H_1 H_0].
cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;intuition;
(auto with zarith)||(repeat (translate_vars );prove_ineq ).
Qed.
Lemma P_id_b_monotonic :
forall x4 x3, (1 <= x4)/\ (x4 <= x3) ->P_id_b x4 <= P_id_b x3.
Proof.
intros x4 x3.
intros [H_1 H_0].
cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;intuition;
(auto with zarith)||(repeat (translate_vars );prove_ineq ).
Qed.
Lemma P_id_a_bounded : forall x3, (1 <= x3) ->1 <= P_id_a x3.
Proof.
intros .
cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;intuition;
(auto with zarith)||(repeat (translate_vars );prove_ineq ).
Qed.
Lemma P_id_b_bounded : forall x3, (1 <= x3) ->1 <= P_id_b x3.
Proof.
intros .
cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;intuition;
(auto with zarith)||(repeat (translate_vars );prove_ineq ).
Qed.
Definition measure := InterpZ.measure 1 P_id_a P_id_b.
Lemma measure_equation :
forall t,
measure t = match t with
| (algebra.Alg.Term algebra.F.id_a (x3::nil)) =>
P_id_a (measure x3)
| (algebra.Alg.Term algebra.F.id_b (x3::nil)) =>
P_id_b (measure x3)
| _ => 1
end.
Proof.
intros t;case t;intros ;apply refl_equal.
Qed.
Lemma measure_bounded : forall t, 1 <= measure t.
Proof.
unfold measure in |-*.
apply InterpZ.measure_bounded;
cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;intuition;
(auto with zarith)||(repeat (translate_vars );prove_ineq ).
Qed.
Ltac generate_pos_hyp :=
match goal with
| H:context [measure ?x] |- _ =>
let v := fresh "v" in
(let H := fresh "h" in
(set (H:=measure_bounded x) in *;set (v:=measure x) in *;
clearbody H;clearbody v))
| |- context [measure ?x] =>
let v := fresh "v" in
(let H := fresh "h" in
(set (H:=measure_bounded x) in *;set (v:=measure x) in *;
clearbody H;clearbody v))
end
.
Lemma rules_monotonic :
forall l r,
(algebra.EQT.axiom R_xml_0_deep_rew.R_xml_0_rules r l) ->
measure r <= measure l.
Proof.
intros l r H.
fold measure in |-*.
inversion H;clear H;subst;inversion H0;clear H0;subst;
simpl algebra.EQT.T.apply_subst in |-*;
repeat (
match goal with
| |- context [measure (algebra.Alg.Term ?f ?t)] =>
rewrite (measure_equation (algebra.Alg.Term f t))
end
);repeat (generate_pos_hyp );
cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;intuition;
(auto with zarith)||(repeat (translate_vars );prove_ineq ).
Qed.
Lemma measure_star_monotonic :
forall l r,
(closure.refl_trans_clos (algebra.EQT.one_step R_xml_0_deep_rew.R_xml_0_rules)
r l) ->measure r <= measure l.
Proof.
unfold measure in *.
apply InterpZ.measure_star_monotonic.
intros ;apply P_id_a_monotonic;assumption.
intros ;apply P_id_b_monotonic;assumption.
intros ;apply P_id_a_bounded;assumption.
intros ;apply P_id_b_bounded;assumption.
apply rules_monotonic.
Qed.
Definition P_id_A (x3:Z) := 3* x3.
Lemma P_id_A_monotonic :
forall x4 x3, (1 <= x4)/\ (x4 <= x3) ->P_id_A x4 <= P_id_A x3.
Proof.
intros x4 x3.
intros [H_1 H_0].
cbv beta iota zeta delta - [Zle Zlt Zplus Zmult] ;intuition;
(auto with zarith)||(repeat (translate_vars );prove_ineq ).
Qed.
Definition marked_measure :=
InterpZ.marked_measure 1 P_id_a P_id_b P_id_A.
Lemma marked_measure_equation :
forall t,
marked_measure t = match t with
| (algebra.Alg.Term algebra.F.id_a (x3::nil)) =>
P_id_A (measure x3)
| _ => measure t
end.
Proof.
reflexivity .
Qed.
Lemma marked_measure_star_monotonic :
forall f l1 l2,
(closure.refl_trans_clos (closure.one_step_list (algebra.EQT.one_step
R_xml_0_deep_rew.R_xml_0_rules)
) l1 l2) ->
marked_measure (algebra.Alg.Term f l1) <= marked_measure (algebra.Alg.Term
f l2).
Proof.
unfold marked_measure in *.
apply InterpZ.marked_measure_star_monotonic.
intros ;apply P_id_a_monotonic;assumption.
intros ;apply P_id_b_monotonic;assumption.
intros ;apply P_id_a_bounded;assumption.
intros ;apply P_id_b_bounded;assumption.
apply rules_monotonic.
intros ;apply P_id_A_monotonic;assumption.
Qed.
Ltac rewrite_and_unfold :=
do 2 (rewrite marked_measure_equation);
repeat (
match goal with
| |- context [measure (algebra.Alg.Term ?f ?t)] =>
rewrite (measure_equation (algebra.Alg.Term f t))
| H:context [measure (algebra.Alg.Term ?f ?t)] |- _ =>
rewrite (measure_equation (algebra.Alg.Term f t)) in H|-
end
).
Lemma wf : well_founded WF_DP_R_xml_0.DP_R_xml_0_scc_2.
Proof.
intros x.
apply well_founded_ind with
(R:=fun x y => (Zwf.Zwf 1) (marked_measure x) (marked_measure y)).
apply Inverse_Image.wf_inverse_image with (B:=Z).
apply Zwf.Zwf_well_founded.
clear x.
intros x IHx.
repeat (
constructor;inversion 1;subst;
full_prove_ineq algebra.Alg.Term
ltac:(algebra.Alg_ext.find_replacement )
algebra.EQT_ext.one_step_list_refl_trans_clos marked_measure
marked_measure_star_monotonic (Zwf.Zwf 1) (interp.o_Z 1)
ltac:(fun _ => R_xml_0_deep_rew.impossible_star_reduction_R_xml_0 )
ltac:(fun _ => rewrite_and_unfold ) ltac:(fun _ => generate_pos_hyp )
ltac:(fun _ => cbv beta iota zeta delta - [Zplus Zmult Zle Zlt] in * ;
try (constructor))
IHx
).
Qed.
End WF_DP_R_xml_0_scc_2.
Definition wf_DP_R_xml_0_scc_2 := WF_DP_R_xml_0_scc_2.wf.
Lemma acc_DP_R_xml_0_scc_2 :
forall x y, (DP_R_xml_0_scc_2 x y) ->Acc WF_R_xml_0_deep_rew.DP_R_xml_0 x.
Proof.
intros x.
pattern x.
apply (@Acc_ind _ DP_R_xml_0_scc_2).
intros x' _ Hrec y h.
inversion h;clear h;subst;
constructor;intros _y _h;inversion _h;clear _h;subst;
(eapply Hrec;econstructor eassumption)||
((eapply acc_DP_R_xml_0_non_scc_1;
econstructor (eassumption)||(algebra.Alg_ext.star_refl' ))||
((R_xml_0_deep_rew.impossible_star_reduction_R_xml_0 )||
(eapply Hrec;
econstructor (eassumption)||(algebra.Alg_ext.star_refl' )))).
apply wf_DP_R_xml_0_scc_2.
Qed.
Lemma wf : well_founded WF_R_xml_0_deep_rew.DP_R_xml_0.
Proof.
constructor;intros _y _h;inversion _h;clear _h;subst;
(eapply acc_DP_R_xml_0_non_scc_1;
econstructor (eassumption)||(algebra.Alg_ext.star_refl' ))||
((eapply acc_DP_R_xml_0_non_scc_0;
econstructor (eassumption)||(algebra.Alg_ext.star_refl' ))||
((eapply acc_DP_R_xml_0_scc_2;
econstructor (eassumption)||(algebra.Alg_ext.star_refl' ))||
((eapply acc_DP_R_xml_0_scc_1;
econstructor (eassumption)||(algebra.Alg_ext.star_refl' ))||
((eapply acc_DP_R_xml_0_scc_0;
econstructor (eassumption)||(algebra.Alg_ext.star_refl' ))||
((R_xml_0_deep_rew.impossible_star_reduction_R_xml_0 )||(fail)))))).
Qed.
End WF_DP_R_xml_0.
Definition wf_H := WF_DP_R_xml_0.wf.
Lemma wf :
well_founded (algebra.EQT.one_step R_xml_0_deep_rew.R_xml_0_rules).
Proof.
apply ddp.dp_criterion.
apply R_xml_0_deep_rew.R_xml_0_non_var.
apply R_xml_0_deep_rew.R_xml_0_reg.
intros ;
apply (ddp.constructor_defined_dec _ _
R_xml_0_deep_rew.R_xml_0_rules_included).
refine (Inclusion.wf_incl _ _ _ _ wf_H).
intros x y H.
destruct (R_xml_0_dp_step_spec H) as [f [l1 [l2 [H1 [H2 H3]]]]].
destruct (ddp.dp_list_complete _ _
R_xml_0_deep_rew.R_xml_0_rules_included _ _ H3)
as [x' [y' [sigma [h1 [h2 h3]]]]].
clear H3.
subst.
vm_compute in h3|-.
let e := type of h3 in (dp_concl_tac h2 h3 ltac:(fun _ => idtac) e).
Qed.
End WF_R_xml_0_deep_rew.
(*
*** Local Variables: ***
*** coq-prog-name: "coqtop" ***
*** coq-prog-args: ("-emacs-U" "-I" "$COCCINELLE/examples" "-I" "$COCCINELLE/term_algebra" "-I" "$COCCINELLE/term_orderings" "-I" "$COCCINELLE/basis" "-I" "$COCCINELLE/list_extensions" "-I" "$COCCINELLE/examples/cime_trace/") ***
*** compile-command: "coqc -I $COCCINELLE/term_algebra -I $COCCINELLE/term_orderings -I $COCCINELLE/basis -I $COCCINELLE/list_extensions -I $COCCINELLE/examples/cime_trace/ -I $COCCINELLE/examples/ c_output/strat/tpdb-5.0___TRS___SK90___4.36.trs/a3pat.v" ***
*** End: ***
*)