From 50fdaa80f47df1a425de592b085a8f3b371ef078 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:36:07 +0100 Subject: [PATCH 01/51] initial work --- src/sequentialization/Sequent.v | 225 ++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 src/sequentialization/Sequent.v diff --git a/src/sequentialization/Sequent.v b/src/sequentialization/Sequent.v new file mode 100644 index 0000000..cd416e6 --- /dev/null +++ b/src/sequentialization/Sequent.v @@ -0,0 +1,225 @@ +Require Import AuxDef. +Require Import Core. +Require Import AuxRel AuxRel2. +Require Import Srf Rhb. +Require Import SimrelCommon. +Require Import StepOps. +Require Import AuxInj. +Require Import xmm_s_hb. +Require Import Lia. + +From hahn Require Import Hahn. +From hahnExt Require Import HahnExt. +From imm Require Import Events Execution Execution_eco. +Require Import Setoid Morphisms Program.Basics. + +Open Scope program_scope. + +Set Implicit Arguments. + +Section SimRelSeq. + +Variable X_s X_t : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'lab_t'" := (lab G_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'val_t'" := (val lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rhb_t'" := (rhb G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rpo_imm_t'" := (rpo_imm G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). + +Notation "'G_s'" := (WCore.G X_s). +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rhb_s'" := (rhb G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rpo_imm_s'" := (rpo_imm G_s). +Notation "'vf_s'" := (vf G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Definition po_seq := (Tid_ t_1 ∩₁ E_s) × (Tid_ t_2 ∩₁ E_s). + +Record seq_simrel : Prop := { + seq_inj : inj_dom E_t mapper; + seq_tid_1 : forall tid, tid <> Tid_ t_2 -> eq_dom E_t (tid ∘ mapper) tid; + seq_tid_2 : eq_dom E_t (Tid_ t_2 ∘ mapper) Tid_ t_1; + seq_lab : eq_dom E_t (lab_s ∘ mapper) lab_t; + seq_acts : E_s ≡₁ mapper ↑₁ E_t; + seq_sb : sb_s ∪ po_seq ≡ mapper ↑ sb_t; + seq_rf : rf_s ≡ mapper ↑ rf_t; + seq_co : co_s ≡ mapper ↑ co_t; + seq_rmw : rmw_s ≡ mapper ↑ rmw_t; + seq_threads : threads_set G_s ≡₁ threads_set G_t ∪₁ eq t_2; + + seq_ctrl : ctrl_s ≡ ctrl_t; + seq_data : data_s ≡ data_t; + seq_addr : addr_s ≡ addr_t; + seq_rmw_dep : rmw_dep_s ≡ rmw_dep_t; + + seq_init : fixset is_init mapper; + (* rsr_mid : eq_dom (E_t \₁ eq a_t \₁ eq b_t) mapper id; *) +}. + +End SimRelSeq. + +Section SeqSimrelInit. + +Variable X_t X_s : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'G_s'" := (WCore.G X_s). + +Lemma seq_simrel_init threads + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRD1 : threads t_1) + (THRD2 : threads t_2) + (THRDNEQ : t_1 <> t_2) + (INIT : threads tid_init) : + << SIMREL : seq_simrel + (WCore.Build_t (WCore.init_exec threads) ∅₂) + (WCore.Build_t (WCore.init_exec threads) ∅₂) + t_1 t_2 + id >>. +Proof using. + assert (IWF : Wf (WCore.init_exec threads)). + { now apply WCore.wf_init_exec. } + split; red; vauto; ins. + { unfold compose. unfold is_init in DX. desf. + unfold tid. desf. unfold not in *. + apply PropExtensionality.propositional_extensionality. + split; ins; desf. } + { clear; basic_solver. } + { unfold po_seq; ins. + assert (EMP1 : (fun e : actid => tid e = t_1) + ∩₁ (fun a : actid => is_init a) ≡₁ ∅). + { split; [|basic_solver]. + intros x COND. destruct COND as [TID ISINIT]. + unfold is_init in ISINIT. desf. } + assert (EMP2 : (fun e : actid => tid e = t_2) + ∩₁ (fun a : actid => is_init a) ≡₁ ∅). + { split; [|basic_solver]. + intros x COND. destruct COND as [TID ISINIT]. + unfold is_init in ISINIT. desf. } + rewrite EMP1, EMP2. clear; basic_solver 8. } + { clear; basic_solver. } + { clear; basic_solver. } + { clear; basic_solver. } + basic_solver. +Qed. + +End SeqSimrelInit. + +Section SimrelStep. + +Variable X_t X_t' X_s : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'G_t''" := (WCore.G X_t'). +Notation "'G_s'" := (WCore.G X_s). + +Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). +Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). +Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). +Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). +Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). +Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). + +Notation "'lab_t'" := (lab G_t). +Notation "'val_t'" := (val lab_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'same_loc_t'" := (same_loc lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). +Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). +Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). +Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). + +Notation "'lab_t''" := (lab G_t'). +Notation "'val_t''" := (val lab_t'). +Notation "'loc_t''" := (loc lab_t'). +Notation "'same_loc_t''" := (same_loc lab_t'). +Notation "'E_t''" := (acts_set G_t'). +Notation "'sb_t''" := (sb G_t'). +Notation "'rf_t''" := (rf G_t'). +Notation "'co_t''" := (co G_t'). +Notation "'rmw_t''" := (rmw G_t'). +Notation "'rpo_t''" := (rpo G_t'). +Notation "'rmw_dep_t''" := (rmw_dep G_t'). +Notation "'data_t''" := (data G_t'). +Notation "'ctrl_t''" := (ctrl G_t'). +Notation "'addr_t''" := (addr G_t'). +Notation "'W_t''" := (fun x => is_true (is_w lab_t' x)). +Notation "'R_t''" := (fun x => is_true (is_r lab_t' x)). +Notation "'Loc_t_'' l" := (fun e => loc_t' e = l) (at level 1). + +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'same_loc_s'" := (same_loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). +Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). +Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). +Notation "'F_s'" := (F G_s). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Lemma simrel_step_e e l + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRDNEQ : t_1 <> t_2) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) + (STEP : WCore.exec_inst X_t X_t' e l) : + exists mapper' X_s', + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ + << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. +Proof using. + admit. +Admitted. + +End SimrelStep. From dead729f932a956f2942a0983093bb0f80eca934 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 11 Feb 2025 22:45:46 +0100 Subject: [PATCH 02/51] draft statements --- src/sequentialization/Sequent.v | 167 +++++++++++++++++++++++++++++++- 1 file changed, 166 insertions(+), 1 deletion(-) diff --git a/src/sequentialization/Sequent.v b/src/sequentialization/Sequent.v index cd416e6..580b7f7 100644 --- a/src/sequentialization/Sequent.v +++ b/src/sequentialization/Sequent.v @@ -141,6 +141,12 @@ Variable X_t X_t' X_s : WCore.t. Variable t_1 t_2 : thread_id. Variable mapper : actid -> actid. +Variable e : actid. +Variable l : label. + +Variable dtrmt_t cmt_t : actid -> Prop. +Variable thrdle : relation thread_id. + Notation "'G_t'" := (WCore.G X_t). Notation "'G_t''" := (WCore.G X_t'). Notation "'G_s'" := (WCore.G X_s). @@ -209,7 +215,9 @@ Notation "'F_s'" := (F G_s). Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). -Lemma simrel_step_e e l +(* Definition mapper' := upd mapper e e. *) + +Lemma simrel_step_e (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) (THRDNEQ : t_1 <> t_2) @@ -222,4 +230,161 @@ Proof using. admit. Admitted. +Definition seq_graph_rex : execution := {| + acts_set := id ↑₁ E_t'; + threads_set := threads_set G_s; + lab := lab_t' ∘ id; + rf := id ↑ rf_t'; + co := id ↑ co_t'; + rmw := id ↑ rmw_t'; + rmw_dep := rmw_dep_t'; + ctrl := ctrl_t'; + data := data_t'; + addr := addr_t'; +|}. + +Definition seq_rex := {| + WCore.sc := WCore.sc X_t; + WCore.G := seq_graph_rex; +|}. + +Notation "'X_s''" := (seq_rex). +Notation "'G_s''" := (WCore.G X_s'). +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'same_loc_s'" := (same_loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). +Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). +Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). +Notation "'F_s'" := (F G_s). + +Definition cmt' := mapper ↑₁ cmt_t. +Definition dtrmt' := mapper ↑₁ dtrmt_t. + +Lemma simrel_step_reex + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRDNEQ : t_1 <> t_2) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) + (STEP : WCore.reexec X_t X_t' mapper dtrmt_t cmt_t) : + seq_simrel X_s' X_t' t_1 t_2 id. +Proof using. + constructor; vauto. + all : admit. +Admitted. + +Lemma reex_step_reex + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRDNEQ : t_1 <> t_2) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) + (STEP : WCore.reexec X_t X_t' mapper dtrmt_t cmt_t) : + WCore.reexec X_s X_s' id dtrmt' cmt'. +Proof using. + admit. +Admitted. + End SimrelStep. + +Section SimrelMain. + +Variable X_t X_t' X_s : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. + +Variable dtrmt_t cmt_t : actid -> Prop. +Variable thrdle : relation thread_id. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'G_t''" := (WCore.G X_t'). +Notation "'G_s'" := (WCore.G X_s). + +Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). +Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). +Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). +Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). +Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). +Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). + +Notation "'lab_t'" := (lab G_t). +Notation "'val_t'" := (val lab_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'same_loc_t'" := (same_loc lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). +Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). +Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). +Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). + +Notation "'lab_t''" := (lab G_t'). +Notation "'val_t''" := (val lab_t'). +Notation "'loc_t''" := (loc lab_t'). +Notation "'same_loc_t''" := (same_loc lab_t'). +Notation "'E_t''" := (acts_set G_t'). +Notation "'sb_t''" := (sb G_t'). +Notation "'rf_t''" := (rf G_t'). +Notation "'co_t''" := (co G_t'). +Notation "'rmw_t''" := (rmw G_t'). +Notation "'rpo_t''" := (rpo G_t'). +Notation "'rmw_dep_t''" := (rmw_dep G_t'). +Notation "'data_t''" := (data G_t'). +Notation "'ctrl_t''" := (ctrl G_t'). +Notation "'addr_t''" := (addr G_t'). +Notation "'W_t''" := (fun x => is_true (is_w lab_t' x)). +Notation "'R_t''" := (fun x => is_true (is_r lab_t' x)). +Notation "'Loc_t_'' l" := (fun e => loc_t' e = l) (at level 1). + +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'same_loc_s'" := (same_loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). +Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). +Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). +Notation "'F_s'" := (F G_s). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Lemma seq_step_gen + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRDNEQ : t_1 <> t_2) + (STEP : xmm_step X_t X_t') + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) : + exists X_s' mapper', + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ + << STEP : xmm_step⁺ X_s X_s' >>. +Proof using. + admit. +Admitted. + +End SimrelMain. From f4bc49b36600ab60c0a28a14e0914984a88d2ebe Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 19 Feb 2025 13:47:55 +0100 Subject: [PATCH 03/51] proof drafts --- src/sequentialization/Sequent.v | 315 +++++++++++++++++++++++++++++++- 1 file changed, 313 insertions(+), 2 deletions(-) diff --git a/src/sequentialization/Sequent.v b/src/sequentialization/Sequent.v index 580b7f7..00aaef9 100644 --- a/src/sequentialization/Sequent.v +++ b/src/sequentialization/Sequent.v @@ -81,6 +81,7 @@ Record seq_simrel : Prop := { seq_init : fixset is_init mapper; (* rsr_mid : eq_dom (E_t \₁ eq a_t \₁ eq b_t) mapper id; *) + seq_codom : mapper ↑₁ E_t ⊆₁ E_s; }. End SimRelSeq. @@ -130,7 +131,8 @@ Proof using. { clear; basic_solver. } { clear; basic_solver. } { clear; basic_solver. } - basic_solver. + { basic_solver. } + destruct H; basic_solver. Qed. End SeqSimrelInit. @@ -141,6 +143,8 @@ Variable X_t X_t' X_s : WCore.t. Variable t_1 t_2 : thread_id. Variable mapper : actid -> actid. +Print actid. + Variable e : actid. Variable l : label. @@ -217,9 +221,21 @@ Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). (* Definition mapper' := upd mapper e e. *) +(* Lemma seq_actsE + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRDNEQ : t_1 <> t_2) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) : + E_s ≡₁ E_t. +Proof using. + admit. +Admitted. *) + Lemma simrel_step_e + (n : nat) (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) + (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) (STEP : WCore.exec_inst X_t X_t' e l) : @@ -227,7 +243,302 @@ Lemma simrel_step_e << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. - admit. + destruct STEP as [ADD RFC CONS]. + destruct ADD as (r & R1 & w & W1 & W2 & ADD). + + destruct classic with (tid e = t_1) as [TIDE | TIDE]. + { destruct classic with (index e < n) as [LQ | BQ]. + { + set (mapper' := upd mapper e e). + + assert (ENOTIN : ~E_t e) by apply ADD. + assert (MAPEQ : eq_dom E_t mapper' mapper). + { subst mapper'. unfolder. intros x XINE. + clear - ENOTIN XINE. rewrite updo. + all: congruence. } + assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq e). + { subst mapper'. rewrite set_collect_eq. now rupd. } + assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). + { clear - MAPEQ. now apply set_collect_eq_dom. } + assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + + assert (NEWE : + << NINIT : ~is_init e >> /\ + << NOTIN : ~E_s e >> /\ + << TID : tid e = t_1 >>). + (* /\ + << NEWSB : ⦗E_s ∪₁ eq e⦘ ⨾ ext_sb ⨾ ⦗E_s ∪₁ eq e⦘ ≡ + sb_s ∪ WCore.sb_delta e E_s >>). *) + { unfold NW; splits; vauto. + { intro FALSO. unfold is_init in FALSO. desf. } + admit. } + + + (* { unfold sb. + rewrite (rsr_actsE CORR SIMREL). + unfold extra_a; desf; [exfalso; now apply ETID|]. + rewrite set_union_empty_r. + rewrite <- EQACTS. apply ADD. } + unfold sb. + rewrite rsr_actsE + with (X_s := X_s) (X_t := X_t) + (a_t := a_t) (b_t := b_t); eauto. + unfold extra_a; desf. + { rewrite <- (rsr_at_bt_tid CORR) in NQT. + rewrite id_union, !seq_union_l, !seq_union_r. + arewrite_false (⦗eq e⦘ ⨾ ext_sb ⨾ ⦗eq e⦘). + { clear. unfolder. ins. desf. + eapply ext_sb_irr; eauto. } + arewrite_false (⦗eq e⦘ ⨾ ext_sb ⨾ ⦗E_t ∪₁ eq a_t⦘). + { admit. } + rewrite id_union at 3. rewrite seq_union_l. + arewrite_false (⦗eq a_t⦘ ⨾ ext_sb ⨾ ⦗eq e⦘). + { clear - NQT CORR. unfolder. unfold ext_sb. + ins. desf; ins; [| desf]. + apply (rsr_at_ninit CORR). auto. } + rewrite sb_delta_union. + assert (SUB : WCore.sb_delta e (eq a_t) ⊆ WCore.sb_delta e E_t). + { clear - NQT. unfolder. ins. desf. auto. } + rewrite union_absorb_r with (r := WCore.sb_delta e (eq a_t)); auto. + rewrite !union_false_r. apply union_more; [reflexivity |]. + arewrite (⦗E_t⦘ ⨾ ext_sb ⨾ ⦗eq e⦘ ≡ ⦗E_t⦘ ⨾ sb_t' ⨾ ⦗eq e⦘). + { unfold sb. rewrite !seqA. seq_rewrite <- !id_inter. + rewrite EQACTS. clear - ENOTIN. basic_solver 11. } + rewrite (WCore.add_event_sb ADD), seq_union_l. + arewrite_false (sb_t ⨾ ⦗eq e⦘). + { clear - ENOTIN. rewrite wf_sbE. basic_solver. } + rewrite union_false_l. unfold WCore.sb_delta. + seq_rewrite <- cross_inter_l. + rewrite set_inter_union_r, 2!set_inter_absorb_l. + all: try now apply CORR. + all: basic_solver 11. } + rewrite !set_union_empty_r. + rewrite <- EQACTS. apply ADD. } *) + unfold NW in NEWE. + destruct NEWE as (NINIT & NOTIN & TID). + + set (G_s' := {| + acts_set := mapper' ↑₁ E_t'; + threads_set := threads_set G_s; + lab := lab_t' ∘ mapper'; + rf := mapper' ↑ rf_t'; + co := mapper' ↑ co_t'; + rmw := mapper' ↑ rmw_t'; + rmw_dep := rmw_dep_t'; + ctrl := ctrl_t'; + data := data_t'; + addr := addr_t'; + |}). + set (X_s' := {| + WCore.sc := WCore.sc X_s; + WCore.G := G_s'; + |}). + + exists mapper', X_s'; split. + { constructor; vauto; simpl; try basic_solver 6. + { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. + { clear - SIMREL MAPEQ. + unfolder. ins. apply (seq_inj SIMREL); ins. + now rewrite <- !MAPEQ. } + { clear. basic_solver. } + rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). + clear - NOTIN. basic_solver. } + { intros tid TIDNEQ. rewrite (WCore.add_event_acts ADD). + apply eq_dom_union; split. + { destruct SIMREL. intros x COND. + unfold compose. unfold mapper'. rewrite updo. + { apply seq_tid_3; auto. } + intros EQ. basic_solver. } + unfold mapper'. intros x COND. + unfold compose. subst x. + rewrite upds; vauto. } + { rewrite (WCore.add_event_acts ADD). + rewrite eq_dom_union; splits. + { destruct SIMREL. unfold mapper'. + intros x COND. unfold compose. + rewrite updo. + { apply seq_tid_4; auto. } + intros EQ. basic_solver. } + intros x COND. unfold compose. + unfold mapper'; subst. rewrite upds. + admit. (*TODO : messed up*) } + { intros x COND. unfold compose. unfold mapper'. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. do 2 rewrite upds. vauto. } + rewrite updo. + { rewrite updo; vauto. + (*TODO : make inv lemma?*) + admit. } + admit. } + { admit. } + { rewrite (seq_threads SIMREL). + destruct ADD. rewrite add_event_threads; vauto. } + unfold mapper'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. + apply (seq_init SIMREL); vauto. } + constructor. + { unfold WCore.add_event. + exists (option_map mapper' r), (mapper' ↑₁ R1), + (option_map mapper' w), + (mapper' ↑₁ W1), + (mapper' ↑₁ W2). + apply add_event_to_wf; simpl; vauto. + { apply sico_init_acts_s with + (X_t := X_t) (mapper := mapper). + { constructor. all : admit. } + destruct ADD. apply add_event_init. } + { unfold mapper'. rewrite upds. exact NOTIN. } + { unfold mapper'. rewrite upds; vauto. } + { unfold mapper'. rewrite upds. basic_solver. } + { rewrite EQACTS. rewrite set_collect_union. + rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). + unfold mapper'. rewrite upds. basic_solver. } + { unfold mapper'. rewrite upds. + destruct ADD. rewrite add_event_lab. + destruct SIMREL. admit. } + all : admit. } + all : admit. } + { set (mapper' := upd mapper e (ThreadEvent t_2 (index e - n))). + assert (ENOTIN : ~E_t e) by apply ADD. + assert (MAPEQ : eq_dom E_t mapper' mapper). + { subst mapper'. unfolder. intros x XINE. + clear - ENOTIN XINE. rewrite updo. + all: congruence. } + assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq (ThreadEvent t_2 (index e - n))). + { subst mapper'. rewrite set_collect_eq. now rupd. } + assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). + { clear - MAPEQ. now apply set_collect_eq_dom. } + assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + + assert (NEWE : + << NINIT : ~is_init e >> /\ + << NOTIN : ~E_s e >> /\ + << TID : tid e = t_1 >>). + { admit. } + unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). + set (G_s' := {| + acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - n)); + threads_set := threads_set G_s; + lab := upd lab_s (ThreadEvent t_2 (index e - n)) l; + rf := rf_s ∪ ⦗codom_rel (rf_t' ⨾ ⦗eq e⦘)⦘ ⨾ ⦗eq (ThreadEvent t_2 (index e - n))⦘; + co := co_s ∪ ⦗codom_rel (co_t' ⨾ ⦗eq e⦘)⦘ ⨾ ⦗eq (ThreadEvent t_2 (index e - n))⦘; + rmw := rmw_s ∪ ⦗codom_rel (rmw_t' ⨾ ⦗eq e⦘)⦘ ⨾ ⦗eq (ThreadEvent t_2 (index e - n))⦘; + rmw_dep := rmw_dep_t'; + ctrl := ctrl_t'; + data := data_t'; + addr := addr_t'; + |}). + set (X_s' := {| + WCore.sc := WCore.sc X_s; + WCore.G := G_s'; + |}). + exists mapper', X_s'; split. + { constructor; vauto; simpl; try basic_solver 6. + { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. + { clear - SIMREL MAPEQ. + unfolder. ins. apply (seq_inj SIMREL); ins. + now rewrite <- !MAPEQ. } + { clear. basic_solver. } + rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). + admit. } + { intros tid TIDNEQ. rewrite (WCore.add_event_acts ADD). + apply eq_dom_union; split. + { destruct SIMREL. intros x COND. + unfold compose. unfold mapper'. rewrite updo. + { apply seq_tid_3; auto. } + intros EQ. basic_solver. } + unfold mapper'. intros x COND. + unfold compose. subst x. + rewrite upds; vauto. + admit. } + { rewrite (WCore.add_event_acts ADD). + rewrite eq_dom_union; splits. + { destruct SIMREL. unfold mapper'. + intros x COND. unfold compose. + rewrite updo. + { apply seq_tid_4; auto. } + intros EQ. basic_solver. } + intros x COND. unfold compose. + unfold mapper'; subst. rewrite upds. + admit. } + { intros x COND. unfold compose. unfold mapper'. + destruct classic with (x = e) as [EQ | NEQ]. + { admit. } + admit. } + { admit. } + all : admit. } + constructor. + { unfold WCore.add_event. + exists (option_map mapper' r), (mapper' ↑₁ R1), + (option_map mapper' w), + (mapper' ↑₁ W1), + (mapper' ↑₁ W2). + apply add_event_to_wf; simpl; vauto. + { apply sico_init_acts_s with + (X_t := X_t) (mapper := mapper). + { constructor. all : admit. } + destruct ADD. apply add_event_init. } + { unfold mapper'. rewrite upds. admit. } + { unfold mapper'. rewrite upds; vauto. } + { unfold mapper'. rewrite upds. basic_solver. } + { clear - MAPER_E. admit. } + + { unfold mapper'. rewrite upds. + destruct ADD; vauto. } + all : admit. } + all : admit. } } + + set (mapper' := upd mapper e e). + + assert (ENOTIN : ~E_t e) by apply ADD. + assert (MAPEQ : eq_dom E_t mapper' mapper). + { subst mapper'. unfolder. intros x XINE. + clear - ENOTIN XINE. rewrite updo. + all: congruence. } + assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq e). + { subst mapper'. rewrite set_collect_eq. now rupd. } + assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). + { clear - MAPEQ. now apply set_collect_eq_dom. } + assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + + assert (NEWE : + << NINIT : ~is_init e >> /\ + << NOTIN : ~E_s e >> /\ + << TID : tid e = t_1 >>). + { admit. } + unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). + + set (G_s' := {| + acts_set := mapper' ↑₁ E_t'; + threads_set := threads_set G_s; + lab := lab_t' ∘ mapper'; + rf := mapper' ↑ rf_t'; + co := mapper' ↑ co_t'; + rmw := mapper' ↑ rmw_t'; + rmw_dep := rmw_dep_t'; + ctrl := ctrl_t'; + data := data_t'; + addr := addr_t'; + |}). + set (X_s' := {| + WCore.sc := WCore.sc X_s; + WCore.G := G_s'; + |}). + + exists mapper', X_s'; split. + { constructor; vauto; simpl; try basic_solver 6. } + + constructor. + { unfold WCore.add_event. + exists (option_map mapper' r), (mapper' ↑₁ R1), + (option_map mapper' w), + (mapper' ↑₁ W1), + (mapper' ↑₁ W2). + apply add_event_to_wf; simpl; vauto. } + all : admit. + Admitted. Definition seq_graph_rex : execution := {| From da9e48ece1320546db2fffa9a26a54278a5dafdd Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 25 Feb 2025 23:06:11 +0100 Subject: [PATCH 04/51] drafting --- Makefile | 2 +- src/sequentialization/Programs.v | 109 +++++++++++++++++++++++++++++++ src/sequentialization/Sequent.v | 80 ++++++++++++++++------- 3 files changed, 167 insertions(+), 24 deletions(-) create mode 100644 src/sequentialization/Programs.v diff --git a/Makefile b/Makefile index 8a4f677..c9a388c 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ COQMODULE := xmm -COQTHEORIES := src/reordering/*.v src/xmm/*.v src/lib/*.v src/traces/*.v src/xmm_cons/*.v +COQTHEORIES := src/reordering/*.v src/xmm/*.v src/lib/*.v src/traces/*.v src/xmm_cons/*.v src/sequentialization/*.v .PHONY: all theories clean tounicode diff --git a/src/sequentialization/Programs.v b/src/sequentialization/Programs.v new file mode 100644 index 0000000..78495cc --- /dev/null +++ b/src/sequentialization/Programs.v @@ -0,0 +1,109 @@ +From hahn Require Import Hahn. +From hahnExt Require Import HahnExt. +From imm Require Import Events Execution. +From xmm Require Import Instructions. +Require Import Lia Setoid Program.Basics. +Require Import Coq.Sorting.Mergesort. +Require Import Coq.Structures.OrderedType. + +Open Scope nat_scope. +Open Scope program_scope. + +Section Program. + +Definition state : Set := location -> value. +Definition prog_threads : Set := nat. +Definition state_init := prog_threads -> state. + +Inductive labels_e : Set := + | L : label -> labels_e + | Epsilon : labels_e. + +Definition state_upd (s : state) (l : location) (v : value) : state := + upd s l v. + +Inductive transition : state -> (intr_info * labels_e) -> state -> Prop := + | trans_load : + forall s t i m l v, + s l = v -> + transition s (Build_intr_info i t, L (Aload true m l v)) s + | trans_store : + forall s t i xm m l v, + transition s (Build_intr_info i t, L (Astore xm m l v)) (state_upd s l v) + | trans_fence : + forall s t i m, + transition s (Build_intr_info i t, L (Afence m)) s + | trans_epsilon : + forall s t i, + transition s (Build_intr_info i t, Epsilon) s. + +Definition program : Set := list (intr_info * labels_e). + +Variable G : execution. +Notation "'sb'" := (sb G). + +Definition thread_events t : actid -> Prop := + fun x => exists n, ThreadEvent t n = x. + +Fixpoint thread_event_list (t : thread_id) (N : nat) : list actid := + match N with + | 0 => [] + | S n' => thread_event_list t n' ++ [ThreadEvent t n'] + end. + +(*TODO : N?*) + +Definition sb_cmp (x y : actid) : comparison := + if excluded_middle_informative (sb x y) then Lt + else if excluded_middle_informative (sb y x) then Gt + else Eq. + +(*TODO : sort*) + +Definition thread_events_labs (lst : list actid) : list label := + map (fun x => match x with + | ThreadEvent _ _ => (lab G) x + | InitEvent _ => Afence Orlx + end) lst. + +Definition extract_labels_from_program (prog : program) : list label := + map (fun '(_, lbl) => match lbl with + | L l => l + | Epsilon => Afence Orlx + end) prog. + +Definition same_label label1 label2 := + match label1, label2 with + | Aload r1 o1 l1 v1, Aload r2 o2 l2 v2 => r1 = r2 /\ o1 = o2 /\ l1 = l2 /\ v1 = v2 + | Astore s1 o1 l1 v1, Astore s2 o2 l2 v2 => s1 = s2 /\ o1 = o2 /\ l1 = l2 /\ v1 = v2 + | Afence o1, Afence o2 => o1 = o2 + | _,_ => False + end. + +Lemma same_label_dec : forall l1 l2, {same_label l1 l2} + {~ same_label l1 l2}. +Proof. + intros l1 l2. admit. +Admitted. + +Definition same_label_bool (l1 l2 : label) : bool := + if same_label_dec l1 l2 then true else false. + +Fixpoint is_subsequence (sub seq : list label) : bool := + match sub, seq with + | [], _ => true + | _, [] => false + | x :: xs, y :: ys => + if same_label_bool x y + then is_subsequence xs ys + else is_subsequence sub ys + end. + +Definition trace_conforming_thread (prog : program) (t : thread_id) (N : nat) : Prop := + is_subsequence (thread_events_labs (thread_event_list t N)) (extract_labels_from_program prog). + +Definition trace_conforming (prog : program) (N : nat) : Prop := + forall t, trace_conforming_thread prog t N. + + + +End Program. diff --git a/src/sequentialization/Sequent.v b/src/sequentialization/Sequent.v index 00aaef9..5decc8c 100644 --- a/src/sequentialization/Sequent.v +++ b/src/sequentialization/Sequent.v @@ -7,6 +7,7 @@ Require Import StepOps. Require Import AuxInj. Require Import xmm_s_hb. Require Import Lia. +From xmm Require Import Reordering. From hahn Require Import Hahn. From hahnExt Require Import HahnExt. @@ -143,8 +144,6 @@ Variable X_t X_t' X_s : WCore.t. Variable t_1 t_2 : thread_id. Variable mapper : actid -> actid. -Print actid. - Variable e : actid. Variable l : label. @@ -238,8 +237,10 @@ Lemma simrel_step_e (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) - (STEP : WCore.exec_inst X_t X_t' e l) : + (STEP : WCore.exec_inst X_t X_t' e l) + (MAPINV : eq_dom E_t (mapper ∘ mapper) id) : exists mapper' X_s', + << MAPINV' : eq_dom E_t' (mapper' ∘ mapper') id >> /\ << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. @@ -334,7 +335,26 @@ Proof using. WCore.G := G_s'; |}). - exists mapper', X_s'; split. + exists mapper', X_s'. + assert (MAPPINV' : eq_dom E_t' (mapper' ∘ mapper') id). + { unfold mapper'. unfold eq_dom. intros x XINE. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold compose. rewrite !upds; vauto. } + unfold compose. rewrite !updo; vauto. + assert (NINE : E_t x). + { apply EQACTS in XINE. + destruct XINE as [XINE | XINE]; vauto. } + { apply MAPINV; vauto. } + rewrite updo; vauto. + intros FALSE. + assert (INE : E_s (mapper x)). + { apply SIMREL. unfold set_collect. + exists x; split. + { apply EQACTS in XINE. + clear - XINE NEQ. destruct XINE; basic_solver. } + vauto. } + basic_solver. } + splits; vauto. { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -362,14 +382,8 @@ Proof using. intros x COND. unfold compose. unfold mapper'; subst. rewrite upds. admit. (*TODO : messed up*) } - { intros x COND. unfold compose. unfold mapper'. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. do 2 rewrite upds. vauto. } - rewrite updo. - { rewrite updo; vauto. - (*TODO : make inv lemma?*) - admit. } - admit. } + { intros x COND. unfold compose. + arewrite (mapper' (mapper' x) = x); vauto. } { admit. } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } @@ -387,7 +401,7 @@ Proof using. apply add_event_to_wf; simpl; vauto. { apply sico_init_acts_s with (X_t := X_t) (mapper := mapper). - { constructor. all : admit. } + { constructor. all : apply SIMREL. } destruct ADD. apply add_event_init. } { unfold mapper'. rewrite upds. exact NOTIN. } { unfold mapper'. rewrite upds; vauto. } @@ -395,9 +409,10 @@ Proof using. { rewrite EQACTS. rewrite set_collect_union. rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). unfold mapper'. rewrite upds. basic_solver. } - { unfold mapper'. rewrite upds. + { unfold mapper'. destruct ADD. rewrite add_event_lab. - destruct SIMREL. admit. } + unfold compose. rewrite upds. + admit. } all : admit. } all : admit. } { set (mapper' := upd mapper e (ThreadEvent t_2 (index e - n))). @@ -419,12 +434,12 @@ Proof using. { admit. } unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). set (G_s' := {| - acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - n)); + acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - n)); threads_set := threads_set G_s; - lab := upd lab_s (ThreadEvent t_2 (index e - n)) l; - rf := rf_s ∪ ⦗codom_rel (rf_t' ⨾ ⦗eq e⦘)⦘ ⨾ ⦗eq (ThreadEvent t_2 (index e - n))⦘; - co := co_s ∪ ⦗codom_rel (co_t' ⨾ ⦗eq e⦘)⦘ ⨾ ⦗eq (ThreadEvent t_2 (index e - n))⦘; - rmw := rmw_s ∪ ⦗codom_rel (rmw_t' ⨾ ⦗eq e⦘)⦘ ⨾ ⦗eq (ThreadEvent t_2 (index e - n))⦘; + lab := lab_t' ∘ mapper'; + rf := mapper' ↑ rf_t'; + co := mapper' ↑ co_t'; + rmw := mapper' ↑ rmw_t'; rmw_dep := rmw_dep_t'; ctrl := ctrl_t'; data := data_t'; @@ -434,7 +449,8 @@ Proof using. WCore.sc := WCore.sc X_s; WCore.G := G_s'; |}). - exists mapper', X_s'; split. + exists mapper', X_s'; splits. + { admit. } { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -527,7 +543,8 @@ Proof using. WCore.G := G_s'; |}). - exists mapper', X_s'; split. + exists mapper', X_s'; splits. + { admit. } { constructor; vauto; simpl; try basic_solver 6. } constructor. @@ -608,7 +625,7 @@ Admitted. End SimrelStep. -Section SimrelMain. +Section SimrelGen. Variable X_t X_t' X_s : WCore.t. Variable t_1 t_2 : thread_id. @@ -698,4 +715,21 @@ Proof using. admit. Admitted. +End SimrelGen. + +Section SimrelMain. + +Variable X_t_init X_s_init X_t : WCore.t. +Variable t_1 t_2 : thread_id. + +Lemma simrel_main + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRDNEQ : t_1 <> t_2) + (TARGETPTH : xmm_step* X_t_init X_t) : + exists X_s mapper, + << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper >> /\ + << STEP : xmm_step* X_s_init X_s >> /\ + << BEHR : + End SimrelMain. From af64de17cac6a43facc1aaeabf234d0aa2e2952f Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 26 Feb 2025 06:19:39 +0100 Subject: [PATCH 05/51] drafting --- src/sequentialization/Sequent.v | 195 ++++++++++++++++++++++---------- 1 file changed, 136 insertions(+), 59 deletions(-) diff --git a/src/sequentialization/Sequent.v b/src/sequentialization/Sequent.v index 5decc8c..c449353 100644 --- a/src/sequentialization/Sequent.v +++ b/src/sequentialization/Sequent.v @@ -8,6 +8,7 @@ Require Import AuxInj. Require Import xmm_s_hb. Require Import Lia. From xmm Require Import Reordering. +From xmm Require Import ThreadTrace. From hahn Require Import Hahn. From hahnExt Require Import HahnExt. @@ -65,8 +66,10 @@ Definition po_seq := (Tid_ t_1 ∩₁ E_s) × (Tid_ t_2 ∩₁ E_s). Record seq_simrel : Prop := { seq_inj : inj_dom E_t mapper; - seq_tid_1 : forall tid, tid <> Tid_ t_2 -> eq_dom E_t (tid ∘ mapper) tid; - seq_tid_2 : eq_dom E_t (Tid_ t_2 ∘ mapper) Tid_ t_1; + + seq_tid_1 : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> tid e = tid (mapper e); + seq_tid_2 : forall e : actid, E_t e -> tid (mapper e) = t_2 -> tid e = t_1; + seq_lab : eq_dom E_t (lab_s ∘ mapper) lab_t; seq_acts : E_s ≡₁ mapper ↑₁ E_t; seq_sb : sb_s ∪ po_seq ≡ mapper ↑ sb_t; @@ -100,24 +103,24 @@ Lemma seq_simrel_init threads (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) (THRD1 : threads t_1) - (THRD2 : threads t_2) (THRDNEQ : t_1 <> t_2) (INIT : threads tid_init) : << SIMREL : seq_simrel - (WCore.Build_t (WCore.init_exec threads) ∅₂) + (WCore.Build_t (WCore.init_exec (threads ∪₁ eq t_2)) ∅₂) (WCore.Build_t (WCore.init_exec threads) ∅₂) t_1 t_2 id >>. Proof using. assert (IWF : Wf (WCore.init_exec threads)). { now apply WCore.wf_init_exec. } - split; red; vauto; ins. - { unfold compose. unfold is_init in DX. desf. - unfold tid. desf. unfold not in *. - apply PropExtensionality.propositional_extensionality. - split; ins; desf. } + split; vauto; ins. + { assert (FALSE : t_2 = tid_init). + { rewrite <- H0. unfold tid. desf. + unfold is_init in H. desf. } + desf. } { clear; basic_solver. } - { unfold po_seq; ins. + { rewrite collect_rel_id; split; vauto. + unfold po_seq; ins. assert (EMP1 : (fun e : actid => tid e = t_1) ∩₁ (fun a : actid => is_init a) ≡₁ ∅). { split; [|basic_solver]. @@ -129,11 +132,7 @@ Proof using. intros x COND. destruct COND as [TID ISINIT]. unfold is_init in ISINIT. desf. } rewrite EMP1, EMP2. clear; basic_solver 8. } - { clear; basic_solver. } - { clear; basic_solver. } - { clear; basic_solver. } - { basic_solver. } - destruct H; basic_solver. + all : clear; basic_solver. Qed. End SeqSimrelInit. @@ -218,18 +217,6 @@ Notation "'F_s'" := (F G_s). Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). -(* Definition mapper' := upd mapper e e. *) - -(* Lemma seq_actsE - (NINIT1 : t_1 <> tid_init) - (NINIT2 : t_2 <> tid_init) - (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) : - E_s ≡₁ E_t. -Proof using. - admit. -Admitted. *) - Lemma simrel_step_e (n : nat) (NINIT1 : t_1 <> tid_init) @@ -363,28 +350,21 @@ Proof using. { clear. basic_solver. } rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). clear - NOTIN. basic_solver. } - { intros tid TIDNEQ. rewrite (WCore.add_event_acts ADD). - apply eq_dom_union; split. - { destruct SIMREL. intros x COND. - unfold compose. unfold mapper'. rewrite updo. - { apply seq_tid_3; auto. } - intros EQ. basic_solver. } - unfold mapper'. intros x COND. - unfold compose. subst x. - rewrite upds; vauto. } - { rewrite (WCore.add_event_acts ADD). - rewrite eq_dom_union; splits. - { destruct SIMREL. unfold mapper'. - intros x COND. unfold compose. - rewrite updo. - { apply seq_tid_4; auto. } - intros EQ. basic_solver. } - intros x COND. unfold compose. - unfold mapper'; subst. rewrite upds. - admit. (*TODO : messed up*) } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]. + { subst ev. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_tid_1 SIMREL); vauto. + apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]; vauto. + apply (seq_tid_2 SIMREL); vauto. + { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. } + unfold mapper'. rewrite updo; vauto. } { intros x COND. unfold compose. arewrite (mapper' (mapper' x) = x); vauto. } - { admit. } + { admit. (*TODO : po-work*) } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } unfold mapper'. intros x COND. @@ -459,17 +439,25 @@ Proof using. { clear. basic_solver. } rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). admit. } - { intros tid TIDNEQ. rewrite (WCore.add_event_acts ADD). - apply eq_dom_union; split. - { destruct SIMREL. intros x COND. - unfold compose. unfold mapper'. rewrite updo. - { apply seq_tid_3; auto. } - intros EQ. basic_solver. } - unfold mapper'. intros x COND. - unfold compose. subst x. - rewrite upds; vauto. - admit. } - { rewrite (WCore.add_event_acts ADD). + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]. + { subst ev. unfold mapper'. rewrite upds; vauto. + unfold mapper' in TIDCOND. rewrite upds in TIDCOND; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_tid_1 SIMREL); vauto. + apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]; vauto. + { rewrite EQ; vauto. } + apply (seq_tid_2 SIMREL); vauto. + { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + exfalso; basic_solver. } + unfold mapper' in TIDCOND. + rewrite updo in TIDCOND; vauto. } + { unfold compose. + + rewrite (WCore.add_event_acts ADD). rewrite eq_dom_union; splits. { destruct SIMREL. unfold mapper'. intros x COND. unfold compose. @@ -717,11 +705,97 @@ Admitted. End SimrelGen. +Section BehaviorGraph. + +Variable G_1 G_2 : execution. + +Notation "'E_1'" := (acts_set G_1). + +Notation "'lab'" := (lab G_1). +Notation "'loc'" := (loc lab). +Notation "'val'" := (val lab). + +Definition graph_locations (G : execution) : Set := + { l : location | exists e, acts_set G e /\ loc e = Some l }. + +Definition same_behaviors (G_1 G_2 : execution) : Prop := + behavior_spec G_1 = behavior_spec G_2. + +End BehaviorGraph. + Section SimrelMain. Variable X_t_init X_s_init X_t : WCore.t. Variable t_1 t_2 : thread_id. +Notation "'G_t_init'" := (WCore.G X_t_init). +Notation "'G_s_init'" := (WCore.G X_s_init). +Notation "'G_t'" := (WCore.G X_t). + +Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). +Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). +Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). +Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). +Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). +Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). + +Notation "'lab_t_init'" := (lab G_t_init). +Notation "'val_t_init'" := (val lab_t_init). +Notation "'loc_t_init'" := (loc lab_t_init). +Notation "'same_loc_t_init'" := (same_loc lab_t_init). +Notation "'E_t_init'" := (acts_set G_t_init). +Notation "'sb_t_init'" := (sb G_t_init). +Notation "'rf_t_init'" := (rf G_t_init). +Notation "'co_t_init'" := (co G_t_init). +Notation "'rmw_t_init'" := (rmw G_t_init). +Notation "'rpo_t_init'" := (rpo G_t_init). +Notation "'rmw_dep_t_init'" := (rmw_dep G_t_init). +Notation "'data_t_init'" := (data G_t_init). +Notation "'ctrl_t_init'" := (ctrl G_t_init). +Notation "'addr_t_init'" := (addr G_t_init). +Notation "'W_t_init'" := (fun x => is_true (is_w lab_t_init x)). +Notation "'R_t_init'" := (fun x => is_true (is_r lab_t_init x)). +Notation "'Loc_t_init_' l" := (fun e => loc_t_init e = l) (at level 1). + +Notation "'lab_s_init'" := (lab G_s_init). +Notation "'val_s_init'" := (val lab_s_init). +Notation "'loc_s_init'" := (loc lab_s_init). +Notation "'same_loc_s_init'" := (same_loc lab_s_init). +Notation "'E_s_init'" := (acts_set G_s_init). +Notation "'loc_s_init'" := (loc lab_s_init). +Notation "'sb_s_init'" := (sb G_s_init). +Notation "'rf_s_init'" := (rf G_s_init). +Notation "'co_s_init'" := (co G_s_init). +Notation "'rmw_s_init'" := (rmw G_s_init). +Notation "'rpo_s_init'" := (rpo G_s_init). +Notation "'rmw_dep_s_init'" := (rmw_dep G_s_init). +Notation "'data_s_init'" := (data G_s_init). +Notation "'ctrl_s_init'" := (ctrl G_s_init). +Notation "'addr_s_init'" := (addr G_s_init). +Notation "'W_s_init'" := (fun x => is_true (is_w lab_s_init x)). +Notation "'R_s_init'" := (fun x => is_true (is_r lab_s_init x)). +Notation "'Loc_s_init_' l" := (fun e => loc_s_init e = l) (at level 1). + +Notation "'lab_t'" := (lab G_t). +Notation "'val_t'" := (val lab_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'same_loc_t'" := (same_loc lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). +Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). +Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). +Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + Lemma simrel_main (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) @@ -730,6 +804,9 @@ Lemma simrel_main exists X_s mapper, << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper >> /\ << STEP : xmm_step* X_s_init X_s >> /\ - << BEHR : + << BEHRS : same_behaviors (WCore.G X_s) G_t >>. +Proof using. + admit. +Admitted. End SimrelMain. From 17dbe183e17a507f81b04ccaeddd8a0ff59fd8e9 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 5 Mar 2025 13:50:49 +0100 Subject: [PATCH 06/51] prog draft finished --- src/sequentialization/Programs.v | 35 +- src/sequentialization/Sequent.v | 690 +++++++++++++++++-------------- 2 files changed, 410 insertions(+), 315 deletions(-) diff --git a/src/sequentialization/Programs.v b/src/sequentialization/Programs.v index 78495cc..b3ecc69 100644 --- a/src/sequentialization/Programs.v +++ b/src/sequentialization/Programs.v @@ -2,6 +2,7 @@ From hahn Require Import Hahn. From hahnExt Require Import HahnExt. From imm Require Import Events Execution. From xmm Require Import Instructions. +From xmm Require Import Core. Require Import Lia Setoid Program.Basics. Require Import Coq.Sorting.Mergesort. Require Import Coq.Structures.OrderedType. @@ -11,7 +12,35 @@ Open Scope program_scope. Section Program. -Definition state : Set := location -> value. +Definition program_trace := thread_id -> list label. +Definition program := program_trace -> Prop. + +Record program_trace_sequented (p_tr1 p_tr2 : program_trace) (t1 t2 : thread_id) : Prop := + { p_tr_eq : forall t, t <> t1 /\ t <> t2 -> p_tr1 t = p_tr2 t; + p_tr_empty : p_tr2 t2 = []; + p_tr_concat : p_tr2 t1 = p_tr1 t1 ++ p_tr1 t2; + }. + +Definition corresp_px (exec : WCore.t) (p_tr : program_trace) : Prop := + forall t i, (acts_set (WCore.G exec)) (ThreadEvent t i) -> + Some (lab (WCore.G exec) (ThreadEvent t i)) = nth_error (p_tr t) i. + +Definition program_sequented (p1 p2 : program) (t1 t2 : thread_id) : Prop := + forall p_tr : program_trace, + p2 p_tr -> exists p_tr', p1 p_tr' /\ + program_trace_sequented p_tr' p_tr t1 t2. + +Record exec_sequent (ex1 ex2 : WCore.t) (p1 p2 : program) + (t1 t2 : thread_id) : Prop := { + exec_sequented : program_sequented p1 p2 t1 t2; + traces_cond : forall p_tr1 p_tr2 : program_trace, + p1 p_tr1 -> p2 p_tr2 -> + corresp_px ex1 p_tr1 -> + corresp_px ex2 p_tr2 -> + program_trace_sequented p_tr1 p_tr2 t1 t2; + }. + +(* Definition state : Set := location -> value. Definition prog_threads : Set := nat. Definition state_init := prog_threads -> state. @@ -102,8 +131,6 @@ Definition trace_conforming_thread (prog : program) (t : thread_id) (N : nat) : is_subsequence (thread_events_labs (thread_event_list t N)) (extract_labels_from_program prog). Definition trace_conforming (prog : program) (N : nat) : Prop := - forall t, trace_conforming_thread prog t N. - - + forall t, trace_conforming_thread prog t N. *) End Program. diff --git a/src/sequentialization/Sequent.v b/src/sequentialization/Sequent.v index c449353..ecda935 100644 --- a/src/sequentialization/Sequent.v +++ b/src/sequentialization/Sequent.v @@ -9,6 +9,7 @@ Require Import xmm_s_hb. Require Import Lia. From xmm Require Import Reordering. From xmm Require Import ThreadTrace. +From xmm Require Import Programs. From hahn Require Import Hahn. From hahnExt Require Import HahnExt. @@ -142,6 +143,7 @@ Section SimrelStep. Variable X_t X_t' X_s : WCore.t. Variable t_1 t_2 : thread_id. Variable mapper : actid -> actid. +Variable mapper_rev : actid -> actid. Variable e : actid. Variable l : label. @@ -217,8 +219,10 @@ Notation "'F_s'" := (F G_s). Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). -Lemma simrel_step_e - (n : nat) +Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. + +Lemma simrel_step_e_t1 (n : nat) + (T1 : tid e = t_1) (IND: index e < n) (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) (T2NOTIN : ~ threads_set G_t t_2) @@ -233,317 +237,335 @@ Lemma simrel_step_e Proof using. destruct STEP as [ADD RFC CONS]. destruct ADD as (r & R1 & w & W1 & W2 & ADD). - - destruct classic with (tid e = t_1) as [TIDE | TIDE]. - { destruct classic with (index e < n) as [LQ | BQ]. - { - set (mapper' := upd mapper e e). - - assert (ENOTIN : ~E_t e) by apply ADD. - assert (MAPEQ : eq_dom E_t mapper' mapper). - { subst mapper'. unfolder. intros x XINE. - clear - ENOTIN XINE. rewrite updo. - all: congruence. } - assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq e). - { subst mapper'. rewrite set_collect_eq. now rupd. } - assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). - { clear - MAPEQ. now apply set_collect_eq_dom. } - assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. - - assert (NEWE : - << NINIT : ~is_init e >> /\ - << NOTIN : ~E_s e >> /\ - << TID : tid e = t_1 >>). - (* /\ - << NEWSB : ⦗E_s ∪₁ eq e⦘ ⨾ ext_sb ⨾ ⦗E_s ∪₁ eq e⦘ ≡ - sb_s ∪ WCore.sb_delta e E_s >>). *) - { unfold NW; splits; vauto. - { intro FALSO. unfold is_init in FALSO. desf. } - admit. } - - - (* { unfold sb. - rewrite (rsr_actsE CORR SIMREL). - unfold extra_a; desf; [exfalso; now apply ETID|]. - rewrite set_union_empty_r. - rewrite <- EQACTS. apply ADD. } - unfold sb. - rewrite rsr_actsE - with (X_s := X_s) (X_t := X_t) - (a_t := a_t) (b_t := b_t); eauto. - unfold extra_a; desf. - { rewrite <- (rsr_at_bt_tid CORR) in NQT. - rewrite id_union, !seq_union_l, !seq_union_r. - arewrite_false (⦗eq e⦘ ⨾ ext_sb ⨾ ⦗eq e⦘). - { clear. unfolder. ins. desf. - eapply ext_sb_irr; eauto. } - arewrite_false (⦗eq e⦘ ⨾ ext_sb ⨾ ⦗E_t ∪₁ eq a_t⦘). - { admit. } - rewrite id_union at 3. rewrite seq_union_l. - arewrite_false (⦗eq a_t⦘ ⨾ ext_sb ⨾ ⦗eq e⦘). - { clear - NQT CORR. unfolder. unfold ext_sb. - ins. desf; ins; [| desf]. - apply (rsr_at_ninit CORR). auto. } - rewrite sb_delta_union. - assert (SUB : WCore.sb_delta e (eq a_t) ⊆ WCore.sb_delta e E_t). - { clear - NQT. unfolder. ins. desf. auto. } - rewrite union_absorb_r with (r := WCore.sb_delta e (eq a_t)); auto. - rewrite !union_false_r. apply union_more; [reflexivity |]. - arewrite (⦗E_t⦘ ⨾ ext_sb ⨾ ⦗eq e⦘ ≡ ⦗E_t⦘ ⨾ sb_t' ⨾ ⦗eq e⦘). - { unfold sb. rewrite !seqA. seq_rewrite <- !id_inter. - rewrite EQACTS. clear - ENOTIN. basic_solver 11. } - rewrite (WCore.add_event_sb ADD), seq_union_l. - arewrite_false (sb_t ⨾ ⦗eq e⦘). - { clear - ENOTIN. rewrite wf_sbE. basic_solver. } - rewrite union_false_l. unfold WCore.sb_delta. - seq_rewrite <- cross_inter_l. - rewrite set_inter_union_r, 2!set_inter_absorb_l. - all: try now apply CORR. - all: basic_solver 11. } - rewrite !set_union_empty_r. - rewrite <- EQACTS. apply ADD. } *) - unfold NW in NEWE. - destruct NEWE as (NINIT & NOTIN & TID). - - set (G_s' := {| - acts_set := mapper' ↑₁ E_t'; - threads_set := threads_set G_s; - lab := lab_t' ∘ mapper'; - rf := mapper' ↑ rf_t'; - co := mapper' ↑ co_t'; - rmw := mapper' ↑ rmw_t'; - rmw_dep := rmw_dep_t'; - ctrl := ctrl_t'; - data := data_t'; - addr := addr_t'; - |}). - set (X_s' := {| - WCore.sc := WCore.sc X_s; - WCore.G := G_s'; - |}). - - exists mapper', X_s'. - assert (MAPPINV' : eq_dom E_t' (mapper' ∘ mapper') id). - { unfold mapper'. unfold eq_dom. intros x XINE. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold compose. rewrite !upds; vauto. } - unfold compose. rewrite !updo; vauto. - assert (NINE : E_t x). - { apply EQACTS in XINE. - destruct XINE as [XINE | XINE]; vauto. } - { apply MAPINV; vauto. } - rewrite updo; vauto. - intros FALSE. - assert (INE : E_s (mapper x)). - { apply SIMREL. unfold set_collect. - exists x; split. - { apply EQACTS in XINE. - clear - XINE NEQ. destruct XINE; basic_solver. } - vauto. } - basic_solver. } - splits; vauto. - { constructor; vauto; simpl; try basic_solver 6. - { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. - { clear - SIMREL MAPEQ. - unfolder. ins. apply (seq_inj SIMREL); ins. - now rewrite <- !MAPEQ. } - { clear. basic_solver. } - rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). - clear - NOTIN. basic_solver. } - { intros ev INE' TIDCOND. - destruct classic with (ev = e) as [EQ | NEQ]. - { subst ev. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_tid_1 SIMREL); vauto. - apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. - unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } - { intros ev INE' TIDCOND. - destruct classic with (ev = e) as [EQ | NEQ]; vauto. - apply (seq_tid_2 SIMREL); vauto. - { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. } - unfold mapper'. rewrite updo; vauto. } - { intros x COND. unfold compose. - arewrite (mapper' (mapper' x) = x); vauto. } - { admit. (*TODO : po-work*) } - { rewrite (seq_threads SIMREL). - destruct ADD. rewrite add_event_threads; vauto. } - unfold mapper'. intros x COND. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. rewrite upds; vauto. } - rewrite updo; vauto. - apply (seq_init SIMREL); vauto. } - constructor. - { unfold WCore.add_event. - exists (option_map mapper' r), (mapper' ↑₁ R1), - (option_map mapper' w), - (mapper' ↑₁ W1), - (mapper' ↑₁ W2). - apply add_event_to_wf; simpl; vauto. - { apply sico_init_acts_s with - (X_t := X_t) (mapper := mapper). - { constructor. all : apply SIMREL. } - destruct ADD. apply add_event_init. } - { unfold mapper'. rewrite upds. exact NOTIN. } - { unfold mapper'. rewrite upds; vauto. } - { unfold mapper'. rewrite upds. basic_solver. } - { rewrite EQACTS. rewrite set_collect_union. - rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). - unfold mapper'. rewrite upds. basic_solver. } - { unfold mapper'. - destruct ADD. rewrite add_event_lab. - unfold compose. rewrite upds. - admit. } - all : admit. } - all : admit. } - { set (mapper' := upd mapper e (ThreadEvent t_2 (index e - n))). - assert (ENOTIN : ~E_t e) by apply ADD. - assert (MAPEQ : eq_dom E_t mapper' mapper). - { subst mapper'. unfolder. intros x XINE. - clear - ENOTIN XINE. rewrite updo. - all: congruence. } - assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq (ThreadEvent t_2 (index e - n))). - { subst mapper'. rewrite set_collect_eq. now rupd. } - assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). - { clear - MAPEQ. now apply set_collect_eq_dom. } - assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. - - assert (NEWE : - << NINIT : ~is_init e >> /\ - << NOTIN : ~E_s e >> /\ - << TID : tid e = t_1 >>). - { admit. } - unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). - set (G_s' := {| - acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - n)); - threads_set := threads_set G_s; - lab := lab_t' ∘ mapper'; - rf := mapper' ↑ rf_t'; - co := mapper' ↑ co_t'; - rmw := mapper' ↑ rmw_t'; - rmw_dep := rmw_dep_t'; - ctrl := ctrl_t'; - data := data_t'; - addr := addr_t'; - |}). - set (X_s' := {| - WCore.sc := WCore.sc X_s; - WCore.G := G_s'; - |}). - exists mapper', X_s'; splits. + set (mapper' := upd mapper e e). + set (mapper_rev' := upd mapper_rev e e). + assert (ENOTIN : ~E_t e) by apply ADD. + assert (MAPEQ : eq_dom E_t mapper' mapper). + { subst mapper'. unfolder. intros x XINE. + clear - ENOTIN XINE. rewrite updo. + all: congruence. } + assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq e). + { subst mapper'. rewrite set_collect_eq. now rupd. } + assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). + { clear - MAPEQ. now apply set_collect_eq_dom. } + assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + assert (NEWE : + << NINIT : ~is_init e >> /\ + << NOTIN : ~E_s e >> /\ + << TID : tid e = t_1 >>). + (* /\ + << NEWSB : ⦗E_s ∪₁ eq e⦘ ⨾ ext_sb ⨾ ⦗E_s ∪₁ eq e⦘ ≡ + sb_s ∪ WCore.sb_delta e E_s >>). *) + { unfold NW; splits; vauto. + { intro FALSO. unfold is_init in FALSO. desf. } + admit. } + (* { unfold sb. + rewrite (rsr_actsE CORR SIMREL). + unfold extra_a; desf; [exfalso; now apply ETID|]. + rewrite set_union_empty_r. + rewrite <- EQACTS. apply ADD. } + unfold sb. + rewrite rsr_actsE + with (X_s := X_s) (X_t := X_t) + (a_t := a_t) (b_t := b_t); eauto. + unfold extra_a; desf. + { rewrite <- (rsr_at_bt_tid CORR) in NQT. + rewrite id_union, !seq_union_l, !seq_union_r. + arewrite_false (⦗eq e⦘ ⨾ ext_sb ⨾ ⦗eq e⦘). + { clear. unfolder. ins. desf. + eapply ext_sb_irr; eauto. } + arewrite_false (⦗eq e⦘ ⨾ ext_sb ⨾ ⦗E_t ∪₁ eq a_t⦘). { admit. } - { constructor; vauto; simpl; try basic_solver 6. - { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. - { clear - SIMREL MAPEQ. - unfolder. ins. apply (seq_inj SIMREL); ins. - now rewrite <- !MAPEQ. } - { clear. basic_solver. } - rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). - admit. } - { intros ev INE' TIDCOND. - destruct classic with (ev = e) as [EQ | NEQ]. - { subst ev. unfold mapper'. rewrite upds; vauto. - unfold mapper' in TIDCOND. rewrite upds in TIDCOND; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_tid_1 SIMREL); vauto. - apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. - unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } - { intros ev INE' TIDCOND. - destruct classic with (ev = e) as [EQ | NEQ]; vauto. - { rewrite EQ; vauto. } - apply (seq_tid_2 SIMREL); vauto. - { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. - exfalso; basic_solver. } - unfold mapper' in TIDCOND. - rewrite updo in TIDCOND; vauto. } - { unfold compose. - - rewrite (WCore.add_event_acts ADD). - rewrite eq_dom_union; splits. - { destruct SIMREL. unfold mapper'. - intros x COND. unfold compose. - rewrite updo. - { apply seq_tid_4; auto. } - intros EQ. basic_solver. } - intros x COND. unfold compose. - unfold mapper'; subst. rewrite upds. - admit. } - { intros x COND. unfold compose. unfold mapper'. - destruct classic with (x = e) as [EQ | NEQ]. - { admit. } - admit. } - { admit. } - all : admit. } - constructor. - { unfold WCore.add_event. - exists (option_map mapper' r), (mapper' ↑₁ R1), - (option_map mapper' w), - (mapper' ↑₁ W1), - (mapper' ↑₁ W2). - apply add_event_to_wf; simpl; vauto. - { apply sico_init_acts_s with - (X_t := X_t) (mapper := mapper). - { constructor. all : admit. } - destruct ADD. apply add_event_init. } - { unfold mapper'. rewrite upds. admit. } - { unfold mapper'. rewrite upds; vauto. } - { unfold mapper'. rewrite upds. basic_solver. } - { clear - MAPER_E. admit. } - - { unfold mapper'. rewrite upds. - destruct ADD; vauto. } - all : admit. } - all : admit. } } - - set (mapper' := upd mapper e e). - - assert (ENOTIN : ~E_t e) by apply ADD. - assert (MAPEQ : eq_dom E_t mapper' mapper). - { subst mapper'. unfolder. intros x XINE. - clear - ENOTIN XINE. rewrite updo. - all: congruence. } - assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq e). - { subst mapper'. rewrite set_collect_eq. now rupd. } - assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). - { clear - MAPEQ. now apply set_collect_eq_dom. } - assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. - - assert (NEWE : - << NINIT : ~is_init e >> /\ - << NOTIN : ~E_s e >> /\ - << TID : tid e = t_1 >>). - { admit. } - unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). - - set (G_s' := {| - acts_set := mapper' ↑₁ E_t'; - threads_set := threads_set G_s; - lab := lab_t' ∘ mapper'; - rf := mapper' ↑ rf_t'; - co := mapper' ↑ co_t'; - rmw := mapper' ↑ rmw_t'; - rmw_dep := rmw_dep_t'; - ctrl := ctrl_t'; - data := data_t'; - addr := addr_t'; - |}). - set (X_s' := {| - WCore.sc := WCore.sc X_s; - WCore.G := G_s'; - |}). - - exists mapper', X_s'; splits. - { admit. } - { constructor; vauto; simpl; try basic_solver 6. } - - constructor. - { unfold WCore.add_event. - exists (option_map mapper' r), (mapper' ↑₁ R1), - (option_map mapper' w), - (mapper' ↑₁ W1), - (mapper' ↑₁ W2). - apply add_event_to_wf; simpl; vauto. } - all : admit. + rewrite id_union at 3. rewrite seq_union_l. + arewrite_false (⦗eq a_t⦘ ⨾ ext_sb ⨾ ⦗eq e⦘). + { clear - NQT CORR. unfolder. unfold ext_sb. + ins. desf; ins; [| desf]. + apply (rsr_at_ninit CORR). auto. } + rewrite sb_delta_union. + assert (SUB : WCore.sb_delta e (eq a_t) ⊆ WCore.sb_delta e E_t). + { clear - NQT. unfolder. ins. desf. auto. } + rewrite union_absorb_r with (r := WCore.sb_delta e (eq a_t)); auto. + rewrite !union_false_r. apply union_more; [reflexivity |]. + arewrite (⦗E_t⦘ ⨾ ext_sb ⨾ ⦗eq e⦘ ≡ ⦗E_t⦘ ⨾ sb_t' ⨾ ⦗eq e⦘). + { unfold sb. rewrite !seqA. seq_rewrite <- !id_inter. + rewrite EQACTS. clear - ENOTIN. basic_solver 11. } + rewrite (WCore.add_event_sb ADD), seq_union_l. + arewrite_false (sb_t ⨾ ⦗eq e⦘). + { clear - ENOTIN. rewrite wf_sbE. basic_solver. } + rewrite union_false_l. unfold WCore.sb_delta. + seq_rewrite <- cross_inter_l. + rewrite set_inter_union_r, 2!set_inter_absorb_l. + all: try now apply CORR. + all: basic_solver 11. } + rewrite !set_union_empty_r. + rewrite <- EQACTS. apply ADD. } *) + unfold NW in NEWE. + destruct NEWE as (NINIT & NOTIN & TID). + + set (G_s' := {| + acts_set := mapper' ↑₁ E_t'; + threads_set := threads_set G_s; + lab := lab_t' ∘ mapper_rev'; + rf := mapper' ↑ rf_t'; + co := mapper' ↑ co_t'; + rmw := mapper' ↑ rmw_t'; + rmw_dep := rmw_dep_t'; + ctrl := ctrl_t'; + data := data_t'; + addr := addr_t'; + |}). + set (X_s' := {| + WCore.sc := WCore.sc X_s; + WCore.G := G_s'; + |}). + + exists mapper', X_s'. + assert (MAPPINV' : eq_dom E_t' (mapper' ∘ mapper') id). + { unfold mapper'. unfold eq_dom. intros x XINE. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold compose. rewrite !upds; vauto. } + unfold compose. rewrite !updo; vauto. + assert (NINE : E_t x). + { apply EQACTS in XINE. + destruct XINE as [XINE | XINE]; vauto. } + { apply MAPINV; vauto. } + rewrite updo; vauto. + intros FALSE. + assert (INE : E_s (mapper x)). + { apply SIMREL. unfold set_collect. + exists x; split. + { apply EQACTS in XINE. + clear - XINE NEQ. destruct XINE; basic_solver. } + vauto. } + basic_solver. } + splits; vauto. + { constructor; vauto; simpl; try basic_solver 6. + { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. + { clear - SIMREL MAPEQ. + unfolder. ins. apply (seq_inj SIMREL); ins. + now rewrite <- !MAPEQ. } + { clear. basic_solver. } + rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). + clear - NOTIN. basic_solver. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]. + { subst ev. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_tid_1 SIMREL); vauto. + apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]; vauto. + apply (seq_tid_2 SIMREL); vauto. + { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. } + unfold mapper'. rewrite updo; vauto. } + { intros x COND. unfold compose. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper', mapper_rev'. + rewrite !upds; vauto. } + unfold mapper', mapper_rev'. + rewrite !updo; vauto. + { unfold compose in MAPREV. rewrite MAPREV. + admit. } + admit. } + { admit. (*TODO : po-work*) } + { rewrite (seq_threads SIMREL). + destruct ADD. rewrite add_event_threads; vauto. } + unfold mapper'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. + apply (seq_init SIMREL); vauto. } + constructor. + { unfold WCore.add_event. + exists (option_map mapper' r), (mapper' ↑₁ R1), + (option_map mapper' w), + (mapper' ↑₁ W1), + (mapper' ↑₁ W2). + apply add_event_to_wf; simpl; vauto. + { apply sico_init_acts_s with + (X_t := X_t) (mapper := mapper). + { constructor. all : apply SIMREL. } + destruct ADD. apply add_event_init. } + { unfold mapper'. rewrite upds. exact NOTIN. } + { unfold mapper'. rewrite upds; vauto. } + { unfold mapper'. rewrite upds. basic_solver. } + { rewrite EQACTS. rewrite set_collect_union. + rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). + unfold mapper'. rewrite upds. basic_solver. } + { unfold mapper'. + destruct ADD. rewrite add_event_lab. + unfold compose. rewrite upds. + admit. } + all : admit. } + all : admit. +Admitted. +Lemma simrel_step_e_t2 (n : nat) + (T1 : tid e = t_1) (IND: index e >= n) + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (T2NOTIN : ~ threads_set G_t t_2) + (THRDNEQ : t_1 <> t_2) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) + (STEP : WCore.exec_inst X_t X_t' e l) + (MAPINV : eq_dom E_t (mapper ∘ mapper) id) : + exists mapper' X_s', + << MAPINV' : eq_dom E_t' (mapper' ∘ mapper') id >> /\ + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ + << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. +Proof using. + destruct STEP as [ADD RFC CONS]. + destruct ADD as (r & R1 & w & W1 & W2 & ADD). + set (mapper' := upd mapper e (ThreadEvent t_2 (index e - n))). + assert (ENOTIN : ~E_t e) by apply ADD. + assert (MAPEQ : eq_dom E_t mapper' mapper). + { subst mapper'. unfolder. intros x XINE. + clear - ENOTIN XINE. rewrite updo. + all: congruence. } + assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq (ThreadEvent t_2 (index e - n))). + { subst mapper'. rewrite set_collect_eq. now rupd. } + assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). + { clear - MAPEQ. now apply set_collect_eq_dom. } + assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + assert (NEWE : + << NINIT : ~is_init e >> /\ + << NOTIN : ~E_s e >> /\ + << TID : tid e = t_1 >>). + { admit. } + unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). + + set (G_s' := {| + acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - n)); + threads_set := threads_set G_s; + lab := lab_t' ∘ mapper'; + rf := mapper' ↑ rf_t'; + co := mapper' ↑ co_t'; + rmw := mapper' ↑ rmw_t'; + rmw_dep := rmw_dep_t'; + ctrl := ctrl_t'; + data := data_t'; + addr := addr_t'; + |}). + set (X_s' := {| + WCore.sc := WCore.sc X_s; + WCore.G := G_s'; + |}). + + exists mapper', X_s'; splits. + { admit. } + { constructor; vauto; simpl; try basic_solver 6. + { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. + { clear - SIMREL MAPEQ. + unfolder. ins. apply (seq_inj SIMREL); ins. + now rewrite <- !MAPEQ. } + { clear. basic_solver. } + rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). + admit. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]. + { subst ev. unfold mapper'. rewrite upds; vauto. + unfold mapper' in TIDCOND. rewrite upds in TIDCOND; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_tid_1 SIMREL); vauto. + apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]; vauto. + { rewrite EQ; vauto. } + apply (seq_tid_2 SIMREL); vauto. + { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + exfalso; basic_solver. } + unfold mapper' in TIDCOND. + rewrite updo in TIDCOND; vauto. } + { unfold compose. + admit. } + { admit. } + { admit. } + all : admit. } + constructor. + { unfold WCore.add_event. + exists (option_map mapper' r), (mapper' ↑₁ R1), + (option_map mapper' w), + (mapper' ↑₁ W1), + (mapper' ↑₁ W2). + apply add_event_to_wf; simpl; vauto. + { apply sico_init_acts_s with + (X_t := X_t) (mapper := mapper). + { constructor. all : admit. } + destruct ADD. apply add_event_init. } + { unfold mapper'. rewrite upds. admit. } + { unfold mapper'. rewrite upds; vauto. } + { unfold mapper'. rewrite upds. basic_solver. } + { clear - MAPER_E. admit. } + { unfold mapper'. rewrite upds. + destruct ADD; vauto. } + all : admit. } + all : admit. +Admitted. + +Lemma simrel_step_e_else + (T1 : tid e <> t_1) + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (T2NOTIN : ~ threads_set G_t t_2) + (THRDNEQ : t_1 <> t_2) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) + (STEP : WCore.exec_inst X_t X_t' e l) + (MAPINV : eq_dom E_t (mapper ∘ mapper) id) : + exists mapper' X_s', + << MAPINV' : eq_dom E_t' (mapper' ∘ mapper') id >> /\ + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ + << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. +Proof using. + destruct STEP as [ADD RFC CONS]. + destruct ADD as (r & R1 & w & W1 & W2 & ADD). + set (mapper' := upd mapper e e). + assert (ENOTIN : ~E_t e) by apply ADD. + assert (MAPEQ : eq_dom E_t mapper' mapper). + { subst mapper'. unfolder. intros x XINE. + clear - ENOTIN XINE. rewrite updo. + all: congruence. } + assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq e). + { subst mapper'. rewrite set_collect_eq. now rupd. } + assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). + { clear - MAPEQ. now apply set_collect_eq_dom. } + assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + assert (NEWE : + << NINIT : ~is_init e >> /\ + << NOTIN : ~E_s e >> /\ + << TID : tid e = t_1 >>). + { admit. } + unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). + + set (G_s' := {| + acts_set := mapper' ↑₁ E_t'; + threads_set := threads_set G_s; + lab := lab_t' ∘ mapper'; + rf := mapper' ↑ rf_t'; + co := mapper' ↑ co_t'; + rmw := mapper' ↑ rmw_t'; + rmw_dep := rmw_dep_t'; + ctrl := ctrl_t'; + data := data_t'; + addr := addr_t'; + |}). + set (X_s' := {| + WCore.sc := WCore.sc X_s; + WCore.G := G_s'; + |}). + + exists mapper', X_s'; splits. + { admit. } + { constructor; vauto; simpl; try basic_solver 6. } + constructor. + { unfold WCore.add_event. + exists (option_map mapper' r), (mapper' ↑₁ R1), + (option_map mapper' w), + (mapper' ↑₁ W1), + (mapper' ↑₁ W2). + apply add_event_to_wf; simpl; vauto. } + all : admit. Admitted. Definition seq_graph_rex : execution := {| @@ -810,3 +832,49 @@ Proof using. Admitted. End SimrelMain. + +Section ProgMain. + +Variable X_t : WCore.t. +Variable t_1 t_2 : thread_id. +Variable threads : thread_id -> Prop. + +Variable p1 p2 : program. + +Definition X_t_init : WCore.t := WCore.Build_t (WCore.init_exec threads) ∅₂. +Definition X_s_init : WCore.t := WCore.Build_t (WCore.init_exec (threads ∪₁ eq t_2)) ∅₂. + +Hypothesis PROGSEQ : program_sequented p1 p2 t_1 t_2. + +Lemma prog_supp : + exists X_s mapper, + << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper >> /\ + << STEP : xmm_step* X_s_init X_s >> /\ + << BEHRS : same_behaviors (WCore.G X_s) (WCore.G X_t) >>. +Proof using. + admit. +Admitted. + +Lemma prog_helper X_s mapper : + seq_simrel X_s X_t t_1 t_2 mapper -> + exec_sequent X_s X_t p1 p2 t_1 t_2. +Proof using. + intros SIMREL. + constructor; vauto. + intros tr_1 tr2 TR1 TR2 CR1 CR2. + constructor. all : admit. +Admitted. + +Lemma prog_main : + exists X_s, + << SEQUED : exec_sequent X_s X_t p1 p2 t_1 t_2 >> /\ + << STEP : xmm_step* X_s_init X_s >> /\ + << BEHRS : same_behaviors (WCore.G X_s) (WCore.G X_t) >>. +Proof using. + destruct prog_supp as (X_s & mapper & SIMREL & STEP & BEHRS). + exists X_s; splits; auto. + apply prog_helper with (mapper := mapper). + vauto. +Qed. + +End ProgMain. From 750995b35d354030cb2b49d4ce9f25b651860879 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 12 Mar 2025 04:26:37 +0100 Subject: [PATCH 07/51] proof work --- src/sequentialization/Sequent.v | 414 ++++++++++++++++++++++++-------- 1 file changed, 310 insertions(+), 104 deletions(-) diff --git a/src/sequentialization/Sequent.v b/src/sequentialization/Sequent.v index ecda935..352fa62 100644 --- a/src/sequentialization/Sequent.v +++ b/src/sequentialization/Sequent.v @@ -228,10 +228,8 @@ Lemma simrel_step_e_t1 (n : nat) (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) - (STEP : WCore.exec_inst X_t X_t' e l) - (MAPINV : eq_dom E_t (mapper ∘ mapper) id) : + (STEP : WCore.exec_inst X_t X_t' e l) : exists mapper' X_s', - << MAPINV' : eq_dom E_t' (mapper' ∘ mapper') id >> /\ << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. @@ -249,6 +247,8 @@ Proof using. assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). { clear - MAPEQ. now apply set_collect_eq_dom. } assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + assert (MAPREVDOM : E_t ≡₁ mapper_rev ↑₁ E_s). + { admit. } assert (NEWE : << NINIT : ~is_init e >> /\ << NOTIN : ~E_s e >> /\ @@ -258,6 +258,10 @@ Proof using. sb_s ∪ WCore.sb_delta e E_s >>). *) { unfold NW; splits; vauto. { intro FALSO. unfold is_init in FALSO. desf. } + intro FALSO. destruct ADD. destruct SIMREL. + apply seq_acts0 in FALSO. destruct FALSO as [e' [C1 C2]]. + assert (EEQ : mapper_rev e = e'). + { rewrite <- C2. apply MAPREV; vauto. } admit. } (* { unfold sb. rewrite (rsr_actsE CORR SIMREL). @@ -320,25 +324,7 @@ Proof using. |}). exists mapper', X_s'. - assert (MAPPINV' : eq_dom E_t' (mapper' ∘ mapper') id). - { unfold mapper'. unfold eq_dom. intros x XINE. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold compose. rewrite !upds; vauto. } - unfold compose. rewrite !updo; vauto. - assert (NINE : E_t x). - { apply EQACTS in XINE. - destruct XINE as [XINE | XINE]; vauto. } - { apply MAPINV; vauto. } - rewrite updo; vauto. - intros FALSE. - assert (INE : E_s (mapper x)). - { apply SIMREL. unfold set_collect. - exists x; split. - { apply EQACTS in XINE. - clear - XINE NEQ. destruct XINE; basic_solver. } - vauto. } - basic_solver. } - splits; vauto. + assert (SIMRELQ : seq_simrel X_s' X_t' (tid e) t_2 mapper'). { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -366,8 +352,18 @@ Proof using. unfold mapper', mapper_rev'. rewrite !updo; vauto. { unfold compose in MAPREV. rewrite MAPREV. - admit. } - admit. } + { basic_solver. } + apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + rewrite updo; vauto. + assert (INE : E_t x). + { apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + intros FALSE. + assert (PROP : E_s e). + { rewrite <- FALSE. + apply (seq_codom SIMREL); vauto. } + desf. } { admit. (*TODO : po-work*) } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } @@ -376,6 +372,7 @@ Proof using. { subst x. rewrite upds; vauto. } rewrite updo; vauto. apply (seq_init SIMREL); vauto. } + splits; vauto. constructor. { unfold WCore.add_event. exists (option_map mapper' r), (mapper' ↑₁ R1), @@ -393,12 +390,68 @@ Proof using. { rewrite EQACTS. rewrite set_collect_union. rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). unfold mapper'. rewrite upds. basic_solver. } - { unfold mapper'. + { unfold mapper', mapper_rev'. destruct ADD. rewrite add_event_lab. - unfold compose. rewrite upds. + rewrite upds. admit. } + { admit. } + { assert (GCD : Wf G_t) by admit. + (* rewrite (co_deltaE1 GCD ADD), + (co_deltaE2 GCD ADD). + rewrite co_delta_union_W1, <- mapped_co_delta. + unfold WCore.co_delta. rewrite collect_rel_union. + rewrite <- !unionA. repeat apply union_more; ins. + destruct classic with (WCore.lab_is_w l ≡₁ ∅) as [EMP|NEMP]. + { now rewrite EMP, !set_inter_empty_r, add_max_empty_l, cross_false_r. } + clear - NEMP ENEXA. + unfold WCore.lab_is_w in *. desf. + rewrite !set_inter_full_r. ins. + unfold mapper'. rewrite upds, add_max_disjoint; ins. + basic_solver. *) admit. } + { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), + collect_rel_union. + arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rmwE). admit. } + now rewrite (seq_rmw SIMREL). } + { destruct ADD. rewrite add_event_data. + rewrite (seq_data SIMREL); vauto. } + { destruct ADD. rewrite add_event_addr. + rewrite (seq_addr SIMREL); vauto. } + { destruct ADD. rewrite add_event_ctrl. + rewrite (seq_ctrl SIMREL); vauto. } + { destruct ADD. rewrite add_event_rmw_dep. + rewrite (seq_rmw_dep SIMREL); vauto. } + { admit. (* po-work *) } all : admit. } - all : admit. + { unfold rf_complete. + rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). + unfold rf_complete in RFC. rewrite EQACTS. + rewrite !set_collect_union, MAPER_E, MAPSUB. + rewrite set_inter_union_l. + rewrite set_subset_union_l; split. + { unfold rf_complete in RFC. + rewrite <- set_collect_codom, <- RFC. + unfolder. intros x ((x' & INE & XEQ) & ISR). + exists x'. splits; try basic_solver. + { apply EQACTS; vauto. } + subst x. unfold is_r in *. + assert (CHNG : WCore.G X_s' = G_s') by vauto. + rewrite CHNG in ISR. unfold G_s' in ISR; ins. + unfold compose in ISR. + assert (NEQ : x' <> e). + { intros FALSE. subst x'. basic_solver 8. } + assert (NEQ' : mapper x' <> e). + { intros FALSE. destruct NOTIN. + rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } + assert (EQQ : mapper_rev' (mapper x') = x'). + { unfold eq_dom in MAPREV. specialize MAPREV with x'. + apply MAPREV in INE. unfold compose in INE. + unfold mapper_rev'. rewrite updo; vauto. } + rewrite EQQ in ISR; vauto. } + unfolder. intros rd (RD1 & RD2). + admit. } + admit. Admitted. Lemma simrel_step_e_t2 (n : nat) @@ -408,25 +461,32 @@ Lemma simrel_step_e_t2 (n : nat) (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) - (STEP : WCore.exec_inst X_t X_t' e l) - (MAPINV : eq_dom E_t (mapper ∘ mapper) id) : + (STEP : WCore.exec_inst X_t X_t' e l) : exists mapper' X_s', - << MAPINV' : eq_dom E_t' (mapper' ∘ mapper') id >> /\ << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. destruct STEP as [ADD RFC CONS]. destruct ADD as (r & R1 & w & W1 & W2 & ADD). set (mapper' := upd mapper e (ThreadEvent t_2 (index e - n))). + set (mapper_rev' := upd mapper_rev (ThreadEvent t_2 (index e - n)) e). assert (ENOTIN : ~E_t e) by apply ADD. + assert (EMAPNOTIN : ~E_s (ThreadEvent t_2 (index e - n))). + { admit. } assert (MAPEQ : eq_dom E_t mapper' mapper). { subst mapper'. unfolder. intros x XINE. - clear - ENOTIN XINE. rewrite updo. + clear - EMAPNOTIN ENOTIN XINE. rewrite updo; vauto. + all: congruence. } + assert (MAPREVEQ : eq_dom E_s mapper_rev' mapper_rev). + { subst mapper_rev'. unfolder. intros x XINE. + clear - EMAPNOTIN ENOTIN XINE. rewrite updo; vauto. all: congruence. } assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq (ThreadEvent t_2 (index e - n))). { subst mapper'. rewrite set_collect_eq. now rupd. } assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). { clear - MAPEQ. now apply set_collect_eq_dom. } + assert (MAPREVSUB : mapper_rev' ↑₁ E_s ≡₁ mapper_rev ↑₁ E_s). + { clear - MAPREVEQ. now apply set_collect_eq_dom. } assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. assert (NEWE : << NINIT : ~is_init e >> /\ @@ -438,7 +498,7 @@ Proof using. set (G_s' := {| acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - n)); threads_set := threads_set G_s; - lab := lab_t' ∘ mapper'; + lab := lab_t' ∘ mapper_rev'; rf := mapper' ↑ rf_t'; co := mapper' ↑ co_t'; rmw := mapper' ↑ rmw_t'; @@ -452,8 +512,8 @@ Proof using. WCore.G := G_s'; |}). - exists mapper', X_s'; splits. - { admit. } + exists mapper', X_s'. + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper'). { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -461,7 +521,17 @@ Proof using. now rewrite <- !MAPEQ. } { clear. basic_solver. } rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). - admit. } + unfold set_disjoint. intros x INE' INE. + assert (CC : E_t (mapper_rev' x)). + { rewrite <- INE. unfold mapper_rev'. + rewrite upds; vauto. } + destruct MAPREVSUB as [IN OUT]. + destruct IN with x. + { unfold set_collect. exists x; split; vauto. } + destruct H as [INEE MAPR]. + rewrite <- INE in CC. + unfold mapper_rev' in CC. + rewrite updo in CC; vauto. } { intros ev INE' TIDCOND. destruct classic with (ev = e) as [EQ | NEQ]. { subst ev. unfold mapper'. rewrite upds; vauto. @@ -470,19 +540,42 @@ Proof using. apply (seq_tid_1 SIMREL); vauto. apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } - { intros ev INE' TIDCOND. - destruct classic with (ev = e) as [EQ | NEQ]; vauto. - { rewrite EQ; vauto. } - apply (seq_tid_2 SIMREL); vauto. + { intros ev INE' TIDCOND. destruct SIMREL. + destruct classic with (ev = e) as [EQ | NEQ]. + { subst e; vauto. } + assert (EINN : E_t ev). { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. - exfalso; basic_solver. } - unfold mapper' in TIDCOND. - rewrite updo in TIDCOND; vauto. } - { unfold compose. - admit. } - { admit. } + clear - C2 NEQ. basic_solver. } + specialize seq_tid_4 with ev. + apply seq_tid_4 in EINN; vauto. + unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } + { intros x COND. unfold compose. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper', mapper_rev'. + rewrite !upds; vauto. } + unfold mapper', mapper_rev'. + rewrite !updo; vauto. + { unfold compose in MAPREV. rewrite MAPREV. + { basic_solver. } + apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + rewrite updo; vauto. + assert (INE : E_t x). + { apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + intros FALSE. + admit. } { admit. } - all : admit. } + { admit. (*TODO : po-work*) } + { rewrite (seq_threads SIMREL). + destruct ADD. rewrite add_event_threads; vauto. } + unfold mapper'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. + apply (seq_init SIMREL); vauto. + admit. } + splits; vauto. constructor. { unfold WCore.add_event. exists (option_map mapper' r), (mapper' ↑₁ R1), @@ -491,17 +584,63 @@ Proof using. (mapper' ↑₁ W2). apply add_event_to_wf; simpl; vauto. { apply sico_init_acts_s with - (X_t := X_t) (mapper := mapper). - { constructor. all : admit. } + (X_t := X_t) (mapper := mapper). + { constructor. all : apply SIMREL. } destruct ADD. apply add_event_init. } - { unfold mapper'. rewrite upds. admit. } { unfold mapper'. rewrite upds; vauto. } - { unfold mapper'. rewrite upds. basic_solver. } - { clear - MAPER_E. admit. } + { unfold mapper'. rewrite upds; vauto. } { unfold mapper'. rewrite upds. - destruct ADD; vauto. } - all : admit. } - all : admit. + clear - NINIT2. unfold tid; vauto. } + { unfold mapper'. rewrite upds. basic_solver. } + { unfold mapper', mapper_rev'. + destruct ADD. rewrite add_event_lab. + rewrite upds. admit. } + { admit. } + { admit. } + { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), + collect_rel_union. + arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rmwE). admit. } + now rewrite (seq_rmw SIMREL). } + { destruct ADD. rewrite add_event_data. + rewrite (seq_data SIMREL); vauto. } + { destruct ADD. rewrite add_event_addr. + rewrite (seq_addr SIMREL); vauto. } + { destruct ADD. rewrite add_event_ctrl. + rewrite (seq_ctrl SIMREL); vauto. } + { destruct ADD. rewrite add_event_rmw_dep. + rewrite (seq_rmw_dep SIMREL); vauto. } + { admit. (* po-work *) } + all : admit. } + { unfold rf_complete. + rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). + unfold rf_complete in RFC. rewrite EQACTS. + rewrite !set_collect_union, MAPER_E, MAPSUB. + rewrite set_inter_union_l. + rewrite set_subset_union_l; split. + { unfold rf_complete in RFC. + rewrite <- set_collect_codom, <- RFC. + unfolder. intros x ((x' & INE & XEQ) & ISR). + exists x'. splits; try basic_solver. + { apply EQACTS; vauto. } + subst x. unfold is_r in *. + assert (CHNG : WCore.G X_s' = G_s') by vauto. + rewrite CHNG in ISR. unfold G_s' in ISR; ins. + unfold compose in ISR. + assert (NEQ : x' <> e). + { intros FALSE. subst x'. basic_solver 8. } + assert (NEQ' : mapper x' <> e). + { intros FALSE. destruct NOTIN. + rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } + assert (EQQ : mapper_rev' (mapper x') = x'). + { unfold eq_dom in MAPREV. specialize MAPREV with x'. + apply MAPREV in INE. unfold compose in INE. + unfold mapper_rev'. rewrite updo; vauto. admit. } + rewrite EQQ in ISR; vauto. } + unfolder. intros rd (RD1 & RD2). + admit. } + admit. Admitted. Lemma simrel_step_e_else @@ -511,16 +650,15 @@ Lemma simrel_step_e_else (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) - (STEP : WCore.exec_inst X_t X_t' e l) - (MAPINV : eq_dom E_t (mapper ∘ mapper) id) : + (STEP : WCore.exec_inst X_t X_t' e l) : exists mapper' X_s', - << MAPINV' : eq_dom E_t' (mapper' ∘ mapper') id >> /\ << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. destruct STEP as [ADD RFC CONS]. destruct ADD as (r & R1 & w & W1 & W2 & ADD). set (mapper' := upd mapper e e). + set (mapper_rev' := upd mapper_rev e e). assert (ENOTIN : ~E_t e) by apply ADD. assert (MAPEQ : eq_dom E_t mapper' mapper). { subst mapper'. unfolder. intros x XINE. @@ -534,14 +672,14 @@ Proof using. assert (NEWE : << NINIT : ~is_init e >> /\ << NOTIN : ~E_s e >> /\ - << TID : tid e = t_1 >>). + << TID : tid e <> t_1 >>). { admit. } unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). set (G_s' := {| acts_set := mapper' ↑₁ E_t'; threads_set := threads_set G_s; - lab := lab_t' ∘ mapper'; + lab := lab_t' ∘ mapper_rev'; rf := mapper' ↑ rf_t'; co := mapper' ↑ co_t'; rmw := mapper' ↑ rmw_t'; @@ -555,58 +693,126 @@ Proof using. WCore.G := G_s'; |}). - exists mapper', X_s'; splits. - { admit. } - { constructor; vauto; simpl; try basic_solver 6. } - constructor. + exists mapper', X_s'. + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper'). + { constructor; vauto; simpl; try basic_solver 6. + { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. + { clear - SIMREL MAPEQ. + unfolder. ins. apply (seq_inj SIMREL); ins. + now rewrite <- !MAPEQ. } + { clear. basic_solver. } + rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). + clear - NOTIN. basic_solver. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]. + { subst ev. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_tid_1 SIMREL); vauto. + apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]. + { unfold mapper' in TIDCOND. + rewrite EQ in TIDCOND. admit. } + unfold mapper' in TIDCOND. rewrite updo in TIDCOND. + { admit. } + vauto. + (* TODO : fix *) } + { intros x COND. unfold compose. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper', mapper_rev'. + rewrite !upds; vauto. } + unfold mapper', mapper_rev'. + rewrite !updo; vauto. + { unfold compose in MAPREV. rewrite MAPREV. + { basic_solver. } + apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + rewrite updo; vauto. + assert (INE : E_t x). + { apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + intros FALSE. + assert (PROP : E_s e). + { rewrite <- FALSE. + apply (seq_codom SIMREL); vauto. } + desf. } + { admit. (*TODO : po-work*) } + { rewrite (seq_threads SIMREL). + destruct ADD. rewrite add_event_threads; vauto. } + unfold mapper'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. + apply (seq_init SIMREL); vauto. } + split; vauto. constructor. { unfold WCore.add_event. exists (option_map mapper' r), (mapper' ↑₁ R1), (option_map mapper' w), (mapper' ↑₁ W1), (mapper' ↑₁ W2). - apply add_event_to_wf; simpl; vauto. } - all : admit. + apply add_event_to_wf; simpl; vauto. + { apply sico_init_acts_s with + (X_t := X_t) (mapper := mapper). + { constructor. all : apply SIMREL. } + destruct ADD. apply add_event_init. } + { unfold mapper'. rewrite upds. exact NOTIN. } + { unfold mapper'. rewrite upds; vauto. } + { unfold mapper'. rewrite upds. admit. } + { rewrite EQACTS. rewrite set_collect_union. + rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). + unfold mapper'. rewrite upds. basic_solver. } + { unfold mapper', mapper_rev'. + destruct ADD. rewrite add_event_lab. + rewrite upds. admit. } + { admit. } + { admit. } + { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), + collect_rel_union. + arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rmwE). admit. } + now rewrite (seq_rmw SIMREL). } + { destruct ADD. rewrite add_event_data. + rewrite (seq_data SIMREL); vauto. } + { destruct ADD. rewrite add_event_addr. + rewrite (seq_addr SIMREL); vauto. } + { destruct ADD. rewrite add_event_ctrl. + rewrite (seq_ctrl SIMREL); vauto. } + { destruct ADD. rewrite add_event_rmw_dep. + rewrite (seq_rmw_dep SIMREL); vauto. } + { admit. (* po-work *) } + all : admit. } + { unfold rf_complete. + rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). + unfold rf_complete in RFC. rewrite EQACTS. + rewrite !set_collect_union, MAPER_E, MAPSUB. + rewrite set_inter_union_l. + rewrite set_subset_union_l; split. + { unfold rf_complete in RFC. + rewrite <- set_collect_codom, <- RFC. + unfolder. intros x ((x' & INE & XEQ) & ISR). + exists x'. splits; try basic_solver. + { apply EQACTS; vauto. } + subst x. unfold is_r in *. + assert (CHNG : WCore.G X_s' = G_s') by vauto. + rewrite CHNG in ISR. unfold G_s' in ISR; ins. + unfold compose in ISR. + assert (NEQ : x' <> e). + { intros FALSE. subst x'. basic_solver 8. } + assert (NEQ' : mapper x' <> e). + { intros FALSE. destruct NOTIN. + rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } + assert (EQQ : mapper_rev' (mapper x') = x'). + { unfold eq_dom in MAPREV. specialize MAPREV with x'. + apply MAPREV in INE. unfold compose in INE. + unfold mapper_rev'. rewrite updo; vauto. } + rewrite EQQ in ISR; vauto. } + unfolder. intros rd (RD1 & RD2). + admit. } + admit. Admitted. -Definition seq_graph_rex : execution := {| - acts_set := id ↑₁ E_t'; - threads_set := threads_set G_s; - lab := lab_t' ∘ id; - rf := id ↑ rf_t'; - co := id ↑ co_t'; - rmw := id ↑ rmw_t'; - rmw_dep := rmw_dep_t'; - ctrl := ctrl_t'; - data := data_t'; - addr := addr_t'; -|}. - -Definition seq_rex := {| - WCore.sc := WCore.sc X_t; - WCore.G := seq_graph_rex; -|}. - -Notation "'X_s''" := (seq_rex). -Notation "'G_s''" := (WCore.G X_s'). -Notation "'lab_s'" := (lab G_s). -Notation "'val_s'" := (val lab_s). -Notation "'loc_s'" := (loc lab_s). -Notation "'same_loc_s'" := (same_loc lab_s). -Notation "'E_s'" := (acts_set G_s). -Notation "'loc_s'" := (loc lab_s). -Notation "'sb_s'" := (sb G_s). -Notation "'rf_s'" := (rf G_s). -Notation "'co_s'" := (co G_s). -Notation "'rmw_s'" := (rmw G_s). -Notation "'rpo_s'" := (rpo G_s). -Notation "'rmw_dep_s'" := (rmw_dep G_s). -Notation "'data_s'" := (data G_s). -Notation "'ctrl_s'" := (ctrl G_s). -Notation "'addr_s'" := (addr G_s). -Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). -Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). -Notation "'F_s'" := (F G_s). - Definition cmt' := mapper ↑₁ cmt_t. Definition dtrmt' := mapper ↑₁ dtrmt_t. From ed828236e7d99e5e205d51e3eedf88c187bae0d2 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 18 Mar 2025 20:03:47 +0100 Subject: [PATCH 08/51] proof work --- src/sequentialization/Programs.v | 92 --- src/sequentialization/SequentBase.v | 139 ++++ .../{Sequent.v => SequentExec.v} | 718 +++++++----------- src/sequentialization/SequentProgs.v | 268 +++++++ src/sequentialization/SequentReexec.v | 117 +++ 5 files changed, 780 insertions(+), 554 deletions(-) create mode 100644 src/sequentialization/SequentBase.v rename src/sequentialization/{Sequent.v => SequentExec.v} (60%) create mode 100644 src/sequentialization/SequentProgs.v create mode 100644 src/sequentialization/SequentReexec.v diff --git a/src/sequentialization/Programs.v b/src/sequentialization/Programs.v index b3ecc69..10922ca 100644 --- a/src/sequentialization/Programs.v +++ b/src/sequentialization/Programs.v @@ -40,97 +40,5 @@ Record exec_sequent (ex1 ex2 : WCore.t) (p1 p2 : program) program_trace_sequented p_tr1 p_tr2 t1 t2; }. -(* Definition state : Set := location -> value. -Definition prog_threads : Set := nat. -Definition state_init := prog_threads -> state. - -Inductive labels_e : Set := - | L : label -> labels_e - | Epsilon : labels_e. - -Definition state_upd (s : state) (l : location) (v : value) : state := - upd s l v. - -Inductive transition : state -> (intr_info * labels_e) -> state -> Prop := - | trans_load : - forall s t i m l v, - s l = v -> - transition s (Build_intr_info i t, L (Aload true m l v)) s - | trans_store : - forall s t i xm m l v, - transition s (Build_intr_info i t, L (Astore xm m l v)) (state_upd s l v) - | trans_fence : - forall s t i m, - transition s (Build_intr_info i t, L (Afence m)) s - | trans_epsilon : - forall s t i, - transition s (Build_intr_info i t, Epsilon) s. - -Definition program : Set := list (intr_info * labels_e). - -Variable G : execution. -Notation "'sb'" := (sb G). - -Definition thread_events t : actid -> Prop := - fun x => exists n, ThreadEvent t n = x. - -Fixpoint thread_event_list (t : thread_id) (N : nat) : list actid := - match N with - | 0 => [] - | S n' => thread_event_list t n' ++ [ThreadEvent t n'] - end. - -(*TODO : N?*) - -Definition sb_cmp (x y : actid) : comparison := - if excluded_middle_informative (sb x y) then Lt - else if excluded_middle_informative (sb y x) then Gt - else Eq. - -(*TODO : sort*) - -Definition thread_events_labs (lst : list actid) : list label := - map (fun x => match x with - | ThreadEvent _ _ => (lab G) x - | InitEvent _ => Afence Orlx - end) lst. - -Definition extract_labels_from_program (prog : program) : list label := - map (fun '(_, lbl) => match lbl with - | L l => l - | Epsilon => Afence Orlx - end) prog. - -Definition same_label label1 label2 := - match label1, label2 with - | Aload r1 o1 l1 v1, Aload r2 o2 l2 v2 => r1 = r2 /\ o1 = o2 /\ l1 = l2 /\ v1 = v2 - | Astore s1 o1 l1 v1, Astore s2 o2 l2 v2 => s1 = s2 /\ o1 = o2 /\ l1 = l2 /\ v1 = v2 - | Afence o1, Afence o2 => o1 = o2 - | _,_ => False - end. - -Lemma same_label_dec : forall l1 l2, {same_label l1 l2} + {~ same_label l1 l2}. -Proof. - intros l1 l2. admit. -Admitted. - -Definition same_label_bool (l1 l2 : label) : bool := - if same_label_dec l1 l2 then true else false. - -Fixpoint is_subsequence (sub seq : list label) : bool := - match sub, seq with - | [], _ => true - | _, [] => false - | x :: xs, y :: ys => - if same_label_bool x y - then is_subsequence xs ys - else is_subsequence sub ys - end. - -Definition trace_conforming_thread (prog : program) (t : thread_id) (N : nat) : Prop := - is_subsequence (thread_events_labs (thread_event_list t N)) (extract_labels_from_program prog). - -Definition trace_conforming (prog : program) (N : nat) : Prop := - forall t, trace_conforming_thread prog t N. *) End Program. diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v new file mode 100644 index 0000000..b258b3a --- /dev/null +++ b/src/sequentialization/SequentBase.v @@ -0,0 +1,139 @@ +Require Import AuxDef. +Require Import Core. +Require Import AuxRel AuxRel2. +Require Import Srf Rhb. +Require Import SimrelCommon. +Require Import StepOps. +Require Import AuxInj. +Require Import xmm_s_hb. +Require Import Lia. +From xmm Require Import Reordering. +From xmm Require Import ThreadTrace. +From xmm Require Import Programs. + +From hahn Require Import Hahn. +From hahnExt Require Import HahnExt. +From imm Require Import Events Execution Execution_eco. +Require Import Setoid Morphisms Program.Basics. + +Open Scope program_scope. + +Set Implicit Arguments. + +Section SimRelSeq. + +Variable X_s X_t : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'lab_t'" := (lab G_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'val_t'" := (val lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rhb_t'" := (rhb G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rpo_imm_t'" := (rpo_imm G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). + +Notation "'G_s'" := (WCore.G X_s). +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rhb_s'" := (rhb G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rpo_imm_s'" := (rpo_imm G_s). +Notation "'vf_s'" := (vf G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Definition po_seq := (Tid_ t_1 ∩₁ E_s) × (Tid_ t_2 ∩₁ E_s). + +Record seq_simrel : Prop := { + seq_inj : inj_dom E_t mapper; + + seq_tid_1 : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> tid e = tid (mapper e); + seq_tid_2 : forall e : actid, E_t e -> tid (mapper e) = t_2 -> tid e = t_1; + + seq_lab : eq_dom E_t (lab_s ∘ mapper) lab_t; + seq_acts : E_s ≡₁ mapper ↑₁ E_t; + seq_sb : sb_s ∪ po_seq ≡ mapper ↑ sb_t; + seq_rf : rf_s ≡ mapper ↑ rf_t; + seq_co : co_s ≡ mapper ↑ co_t; + seq_rmw : rmw_s ≡ mapper ↑ rmw_t; + seq_threads : threads_set G_s ≡₁ threads_set G_t ∪₁ eq t_2; + + seq_ctrl : ctrl_s ≡ ctrl_t; + seq_data : data_s ≡ data_t; + seq_addr : addr_s ≡ addr_t; + seq_rmw_dep : rmw_dep_s ≡ rmw_dep_t; + + seq_init : fixset is_init mapper; + (* rsr_mid : eq_dom (E_t \₁ eq a_t \₁ eq b_t) mapper id; *) + seq_codom : mapper ↑₁ E_t ⊆₁ E_s; +}. + +End SimRelSeq. + +Section SeqSimrelInit. + +Variable X_t X_s : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'G_s'" := (WCore.G X_s). + +Lemma seq_simrel_init threads + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRD1 : threads t_1) + (THRDNEQ : t_1 <> t_2) + (INIT : threads tid_init) : + << SIMREL : seq_simrel + (WCore.Build_t (WCore.init_exec (threads ∪₁ eq t_2)) ∅₂) + (WCore.Build_t (WCore.init_exec threads) ∅₂) + t_1 t_2 + id >>. +Proof using. + assert (IWF : Wf (WCore.init_exec threads)). + { now apply WCore.wf_init_exec. } + split; vauto; ins. + { assert (FALSE : t_2 = tid_init). + { rewrite <- H0. unfold tid. desf. + unfold is_init in H. desf. } + desf. } + { clear; basic_solver. } + { rewrite collect_rel_id; split; vauto. + unfold po_seq; ins. + assert (EMP1 : (fun e : actid => tid e = t_1) + ∩₁ (fun a : actid => is_init a) ≡₁ ∅). + { split; [|basic_solver]. + intros x COND. destruct COND as [TID ISINIT]. + unfold is_init in ISINIT. desf. } + assert (EMP2 : (fun e : actid => tid e = t_2) + ∩₁ (fun a : actid => is_init a) ≡₁ ∅). + { split; [|basic_solver]. + intros x COND. destruct COND as [TID ISINIT]. + unfold is_init in ISINIT. desf. } + rewrite EMP1, EMP2. clear; basic_solver 8. } + all : clear; basic_solver. +Qed. + +End SeqSimrelInit. diff --git a/src/sequentialization/Sequent.v b/src/sequentialization/SequentExec.v similarity index 60% rename from src/sequentialization/Sequent.v rename to src/sequentialization/SequentExec.v index 352fa62..7ec452a 100644 --- a/src/sequentialization/Sequent.v +++ b/src/sequentialization/SequentExec.v @@ -10,6 +10,7 @@ Require Import Lia. From xmm Require Import Reordering. From xmm Require Import ThreadTrace. From xmm Require Import Programs. +From xmm Require Import SequentBase. From hahn Require Import Hahn. From hahnExt Require Import HahnExt. @@ -20,124 +21,6 @@ Open Scope program_scope. Set Implicit Arguments. -Section SimRelSeq. - -Variable X_s X_t : WCore.t. -Variable t_1 t_2 : thread_id. -Variable mapper : actid -> actid. - -Notation "'G_t'" := (WCore.G X_t). -Notation "'lab_t'" := (lab G_t). -Notation "'loc_t'" := (loc lab_t). -Notation "'val_t'" := (val lab_t). -Notation "'E_t'" := (acts_set G_t). -Notation "'sb_t'" := (sb G_t). -Notation "'rf_t'" := (rf G_t). -Notation "'co_t'" := (co G_t). -Notation "'rhb_t'" := (rhb G_t). -Notation "'rmw_t'" := (rmw G_t). -Notation "'rpo_t'" := (rpo G_t). -Notation "'rpo_imm_t'" := (rpo_imm G_t). -Notation "'rmw_dep_t'" := (rmw_dep G_t). -Notation "'data_t'" := (data G_t). -Notation "'ctrl_t'" := (ctrl G_t). -Notation "'addr_t'" := (addr G_t). - -Notation "'G_s'" := (WCore.G X_s). -Notation "'lab_s'" := (lab G_s). -Notation "'val_s'" := (val lab_s). -Notation "'loc_s'" := (loc lab_s). -Notation "'E_s'" := (acts_set G_s). -Notation "'sb_s'" := (sb G_s). -Notation "'rf_s'" := (rf G_s). -Notation "'co_s'" := (co G_s). -Notation "'rhb_s'" := (rhb G_s). -Notation "'rmw_s'" := (rmw G_s). -Notation "'rpo_s'" := (rpo G_s). -Notation "'rpo_imm_s'" := (rpo_imm G_s). -Notation "'vf_s'" := (vf G_s). -Notation "'rmw_dep_s'" := (rmw_dep G_s). -Notation "'data_s'" := (data G_s). -Notation "'ctrl_s'" := (ctrl G_s). -Notation "'addr_s'" := (addr G_s). - -Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). - -Definition po_seq := (Tid_ t_1 ∩₁ E_s) × (Tid_ t_2 ∩₁ E_s). - -Record seq_simrel : Prop := { - seq_inj : inj_dom E_t mapper; - - seq_tid_1 : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> tid e = tid (mapper e); - seq_tid_2 : forall e : actid, E_t e -> tid (mapper e) = t_2 -> tid e = t_1; - - seq_lab : eq_dom E_t (lab_s ∘ mapper) lab_t; - seq_acts : E_s ≡₁ mapper ↑₁ E_t; - seq_sb : sb_s ∪ po_seq ≡ mapper ↑ sb_t; - seq_rf : rf_s ≡ mapper ↑ rf_t; - seq_co : co_s ≡ mapper ↑ co_t; - seq_rmw : rmw_s ≡ mapper ↑ rmw_t; - seq_threads : threads_set G_s ≡₁ threads_set G_t ∪₁ eq t_2; - - seq_ctrl : ctrl_s ≡ ctrl_t; - seq_data : data_s ≡ data_t; - seq_addr : addr_s ≡ addr_t; - seq_rmw_dep : rmw_dep_s ≡ rmw_dep_t; - - seq_init : fixset is_init mapper; - (* rsr_mid : eq_dom (E_t \₁ eq a_t \₁ eq b_t) mapper id; *) - seq_codom : mapper ↑₁ E_t ⊆₁ E_s; -}. - -End SimRelSeq. - -Section SeqSimrelInit. - -Variable X_t X_s : WCore.t. -Variable t_1 t_2 : thread_id. -Variable mapper : actid -> actid. - -Notation "'G_t'" := (WCore.G X_t). -Notation "'G_s'" := (WCore.G X_s). - -Lemma seq_simrel_init threads - (NINIT1 : t_1 <> tid_init) - (NINIT2 : t_2 <> tid_init) - (THRD1 : threads t_1) - (THRDNEQ : t_1 <> t_2) - (INIT : threads tid_init) : - << SIMREL : seq_simrel - (WCore.Build_t (WCore.init_exec (threads ∪₁ eq t_2)) ∅₂) - (WCore.Build_t (WCore.init_exec threads) ∅₂) - t_1 t_2 - id >>. -Proof using. - assert (IWF : Wf (WCore.init_exec threads)). - { now apply WCore.wf_init_exec. } - split; vauto; ins. - { assert (FALSE : t_2 = tid_init). - { rewrite <- H0. unfold tid. desf. - unfold is_init in H. desf. } - desf. } - { clear; basic_solver. } - { rewrite collect_rel_id; split; vauto. - unfold po_seq; ins. - assert (EMP1 : (fun e : actid => tid e = t_1) - ∩₁ (fun a : actid => is_init a) ≡₁ ∅). - { split; [|basic_solver]. - intros x COND. destruct COND as [TID ISINIT]. - unfold is_init in ISINIT. desf. } - assert (EMP2 : (fun e : actid => tid e = t_2) - ∩₁ (fun a : actid => is_init a) ≡₁ ∅). - { split; [|basic_solver]. - intros x COND. destruct COND as [TID ISINIT]. - unfold is_init in ISINIT. desf. } - rewrite EMP1, EMP2. clear; basic_solver 8. } - all : clear; basic_solver. -Qed. - -End SeqSimrelInit. - Section SimrelStep. Variable X_t X_t' X_s : WCore.t. @@ -148,9 +31,10 @@ Variable mapper_rev : actid -> actid. Variable e : actid. Variable l : label. -Variable dtrmt_t cmt_t : actid -> Prop. Variable thrdle : relation thread_id. +Variable ptc_1 ptc_2 : program_trace. + Notation "'G_t'" := (WCore.G X_t). Notation "'G_t''" := (WCore.G X_t'). Notation "'G_s'" := (WCore.G X_s). @@ -220,9 +104,15 @@ Notation "'F_s'" := (F G_s). Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. +Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. + +Definition t_12_len := length (ptc_2 t_2). +Definition t_1_len := length (ptc_1 t_1). +Definition t_2_len := length (ptc_1 t_2). -Lemma simrel_step_e_t1 (n : nat) - (T1 : tid e = t_1) (IND: index e < n) +Lemma simrel_step_e_t1 + (T1 : tid e = t_1) + (IND: index e < t_1_len) (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) (T2NOTIN : ~ threads_set G_t t_2) @@ -248,7 +138,19 @@ Proof using. { clear - MAPEQ. now apply set_collect_eq_dom. } assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. assert (MAPREVDOM : E_t ≡₁ mapper_rev ↑₁ E_s). - { admit. } + { rewrite (seq_acts SIMREL). split. + { unfolder. intros x XINE. + exists (mapper x). splits; vauto. + apply MAPREV; vauto. } + unfolder. intros x (y & XINE & YEQ). + destruct XINE as (x0 & (INE & MAPPED)). + rewrite <- MAPPED in YEQ. rewrite <- YEQ. + assert (INE' : E_t x0) by vauto. + apply MAPREV in INE. clear - INE INE'. + unfold compose in INE. rewrite INE. + basic_solver. } + assert (MEPERREV_E : mapper_rev' ↑₁ eq e ≡₁ eq e). + { subst mapper_rev'. rewrite set_collect_eq. now rupd. } assert (NEWE : << NINIT : ~is_init e >> /\ << NOTIN : ~E_s e >> /\ @@ -257,11 +159,15 @@ Proof using. << NEWSB : ⦗E_s ∪₁ eq e⦘ ⨾ ext_sb ⨾ ⦗E_s ∪₁ eq e⦘ ≡ sb_s ∪ WCore.sb_delta e E_s >>). *) { unfold NW; splits; vauto. - { intro FALSO. unfold is_init in FALSO. desf. } - intro FALSO. destruct ADD. destruct SIMREL. - apply seq_acts0 in FALSO. destruct FALSO as [e' [C1 C2]]. - assert (EEQ : mapper_rev e = e'). - { rewrite <- C2. apply MAPREV; vauto. } + { intro FALSO. unfold is_init in FALSO. + unfold tid in T1. clear - T1 FALSO NINIT1. + basic_solver. } + intro FALSO. destruct ADD. + assert (CDD : e = mapper' e). + { unfold mapper'. rewrite upds; vauto. } + rewrite CDD in FALSO. + apply (seq_acts SIMREL) in FALSO. + destruct FALSO as [e' [C1 C2]]. admit. } (* { unfold sb. rewrite (rsr_actsE CORR SIMREL). @@ -342,7 +248,7 @@ Proof using. unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } { intros ev INE' TIDCOND. destruct classic with (ev = e) as [EQ | NEQ]; vauto. - apply (seq_tid_2 SIMREL); vauto. + rewrite TID. apply (seq_tid_2 SIMREL); vauto. { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. } unfold mapper'. rewrite updo; vauto. } { intros x COND. unfold compose. @@ -372,7 +278,8 @@ Proof using. { subst x. rewrite upds; vauto. } rewrite updo; vauto. apply (seq_init SIMREL); vauto. } - splits; vauto. + splits. + { rewrite <- TID; vauto. } constructor. { unfold WCore.add_event. exists (option_map mapper' r), (mapper' ↑₁ R1), @@ -386,33 +293,70 @@ Proof using. destruct ADD. apply add_event_init. } { unfold mapper'. rewrite upds. exact NOTIN. } { unfold mapper'. rewrite upds; vauto. } - { unfold mapper'. rewrite upds. basic_solver. } + { unfold mapper'. rewrite upds. + rewrite TID. basic_solver. } { rewrite EQACTS. rewrite set_collect_union. rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). unfold mapper'. rewrite upds. basic_solver. } { unfold mapper', mapper_rev'. destruct ADD. rewrite add_event_lab. - rewrite upds. admit. } - { admit. } - { assert (GCD : Wf G_t) by admit. - (* rewrite (co_deltaE1 GCD ADD), - (co_deltaE2 GCD ADD). - rewrite co_delta_union_W1, <- mapped_co_delta. - unfold WCore.co_delta. rewrite collect_rel_union. - rewrite <- !unionA. repeat apply union_more; ins. - destruct classic with (WCore.lab_is_w l ≡₁ ∅) as [EMP|NEMP]. - { now rewrite EMP, !set_inter_empty_r, add_max_empty_l, cross_false_r. } - clear - NEMP ENEXA. - unfold WCore.lab_is_w in *. desf. - rewrite !set_inter_full_r. ins. - unfold mapper'. rewrite upds, add_max_disjoint; ins. - basic_solver. *) + rewrite upds. destruct SIMREL. + apply functional_extensionality. + intros x. + destruct (classic (x = e)) as [EQ | NEQ]. + { subst x. rewrite upds. + unfold compose. rewrite !upds; vauto. } + rewrite updo; vauto. unfold compose. + rewrite updo at 1; vauto. + { rewrite updo; vauto. + admit. } + rewrite updo; vauto. admit. } + { destruct ADD. rewrite add_event_rf. + rewrite !collect_rel_union. + arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rfE). admit. (* TODO : add *) } + rewrite (seq_rf SIMREL). + arewrite (mapper' ↑ WCore.rf_delta_R e w + ≡ WCore.rf_delta_R (mapper' e) + (option_map mapper' w)). + { unfold WCore.rf_delta_R. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + arewrite (mapper' ↑ WCore.rf_delta_W e R1 + ≡ WCore.rf_delta_W (mapper' e) (mapper' ↑₁ R1)). + { unfold WCore.rf_delta_W. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + vauto. } + { destruct ADD. rewrite add_event_co. + rewrite !collect_rel_union. + arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_coE). admit. (* TODO : add *) } + rewrite (seq_co SIMREL). + arewrite (mapper' ↑ WCore.co_delta e W1 W2 + ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) + (mapper' ↑₁ W2)). + { unfold WCore.co_delta. rewrite collect_rel_union. + apply union_more. + { rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + vauto. } { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), collect_rel_union. arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rmwE). admit. } + apply (wf_rmwE). admit. (* TODO : add *) } now rewrite (seq_rmw SIMREL). } { destruct ADD. rewrite add_event_data. rewrite (seq_data SIMREL); vauto. } @@ -423,7 +367,8 @@ Proof using. { destruct ADD. rewrite add_event_rmw_dep. rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } - all : admit. } + { destruct ADD. vauto. } + admit. (* TODO : add *) } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -449,13 +394,23 @@ Proof using. apply MAPREV in INE. unfold compose in INE. unfold mapper_rev'. rewrite updo; vauto. } rewrite EQQ in ISR; vauto. } - unfolder. intros rd (RD1 & RD2). - admit. } + rewrite <- set_collect_codom. rewrite <- RFC. + intros x (EQ & RD). subst x. + unfold set_collect. exists e. splits; vauto. + { split. + { apply EQACTS. basic_solver. } + assert (FEQ : WCore.G X_s' = G_s') by vauto. + rewrite FEQ in RD. unfold G_s' in RD. + simpl in RD. clear - RD. unfold compose in RD. + unfold is_r in RD. unfold mapper_rev' in RD. + rewrite upds in RD; vauto. } + unfold mapper'. rewrite upds. vauto. } admit. Admitted. -Lemma simrel_step_e_t2 (n : nat) - (T1 : tid e = t_1) (IND: index e >= n) +Lemma simrel_step_e_t2 + (T1 : tid e = t_1) + (IND: index e >= t_1_len) (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) (T2NOTIN : ~ threads_set G_t t_2) @@ -468,10 +423,10 @@ Lemma simrel_step_e_t2 (n : nat) Proof using. destruct STEP as [ADD RFC CONS]. destruct ADD as (r & R1 & w & W1 & W2 & ADD). - set (mapper' := upd mapper e (ThreadEvent t_2 (index e - n))). - set (mapper_rev' := upd mapper_rev (ThreadEvent t_2 (index e - n)) e). + set (mapper' := upd mapper e (ThreadEvent t_2 (index e - t_1_len))). + set (mapper_rev' := upd mapper_rev (ThreadEvent t_2 (index e - t_1_len)) e). assert (ENOTIN : ~E_t e) by apply ADD. - assert (EMAPNOTIN : ~E_s (ThreadEvent t_2 (index e - n))). + assert (EMAPNOTIN : ~E_s (ThreadEvent t_2 (index e - t_1_len))). { admit. } assert (MAPEQ : eq_dom E_t mapper' mapper). { subst mapper'. unfolder. intros x XINE. @@ -481,7 +436,7 @@ Proof using. { subst mapper_rev'. unfolder. intros x XINE. clear - EMAPNOTIN ENOTIN XINE. rewrite updo; vauto. all: congruence. } - assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq (ThreadEvent t_2 (index e - n))). + assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq (ThreadEvent t_2 (index e - t_1_len))). { subst mapper'. rewrite set_collect_eq. now rupd. } assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). { clear - MAPEQ. now apply set_collect_eq_dom. } @@ -489,14 +444,14 @@ Proof using. { clear - MAPREVEQ. now apply set_collect_eq_dom. } assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. assert (NEWE : - << NINIT : ~is_init e >> /\ - << NOTIN : ~E_s e >> /\ - << TID : tid e = t_1 >>). - { admit. } + << NINIT : ~is_init (ThreadEvent t_2 (index e - t_1_len)) >> /\ + << NOTIN : ~E_s (ThreadEvent t_2 (index e - t_1_len)) >> /\ + << TID : tid (ThreadEvent t_2 (index e - t_1_len)) = t_2 >>). + { unfold NW; splits; vauto. } unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). set (G_s' := {| - acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - n)); + acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - t_1_len)); threads_set := threads_set G_s; lab := lab_t' ∘ mapper_rev'; rf := mapper' ↑ rf_t'; @@ -546,8 +501,8 @@ Proof using. assert (EINN : E_t ev). { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. clear - C2 NEQ. basic_solver. } - specialize seq_tid_4 with ev. - apply seq_tid_4 in EINN; vauto. + specialize seq_tid_2 with ev. + apply seq_tid_2 in EINN; vauto. unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } { intros x COND. unfold compose. destruct classic with (x = e) as [EQ | NEQ]. @@ -559,22 +514,29 @@ Proof using. { basic_solver. } apply EQACTS in COND. destruct COND as [C1 | C2]; vauto. } - rewrite updo; vauto. - assert (INE : E_t x). - { apply EQACTS in COND. - destruct COND as [C1 | C2]; vauto. } - intros FALSE. - admit. } - { admit. } + rewrite updo; vauto. + assert (INE : E_t x). + { apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + intros FALSE. + assert (PROP : E_s (ThreadEvent t_2 (index e - t_1_len))). + { rewrite <- FALSE. + apply (seq_codom SIMREL); vauto. } + desf. } + { rewrite EQACTS. rewrite set_collect_union. + rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } { admit. (*TODO : po-work*) } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } - unfold mapper'. intros x COND. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. rewrite upds; vauto. } - rewrite updo; vauto. - apply (seq_init SIMREL); vauto. - admit. } + { unfold mapper'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. clear - T1 COND NINIT1. + unfold tid in T1. unfold is_init in COND. + desf. basic_solver 8. } + rewrite updo; vauto. + apply (seq_init SIMREL); vauto. } + rewrite EQACTS. rewrite set_collect_union. + rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } splits; vauto. constructor. { unfold WCore.add_event. @@ -595,13 +557,51 @@ Proof using. { unfold mapper', mapper_rev'. destruct ADD. rewrite add_event_lab. rewrite upds. admit. } - { admit. } - { admit. } + { destruct ADD. rewrite add_event_rf. + rewrite !collect_rel_union. + arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rfE). admit. (* TODO : add *) } + rewrite (seq_rf SIMREL). + arewrite (mapper' ↑ WCore.rf_delta_R e w + ≡ WCore.rf_delta_R (mapper' e) + (option_map mapper' w)). + { unfold WCore.rf_delta_R. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + arewrite (mapper' ↑ WCore.rf_delta_W e R1 + ≡ WCore.rf_delta_W (mapper' e) (mapper' ↑₁ R1)). + { unfold WCore.rf_delta_W. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + vauto. } + { destruct ADD. rewrite add_event_co. + rewrite !collect_rel_union. + arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_coE). admit. (* TODO : add *) } + rewrite (seq_co SIMREL). + arewrite (mapper' ↑ WCore.co_delta e W1 W2 + ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) + (mapper' ↑₁ W2)). + { unfold WCore.co_delta. rewrite collect_rel_union. + apply union_more. + { rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + vauto. } { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), collect_rel_union. arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rmwE). admit. } + apply (wf_rmwE). admit. (* TODO : add *) } now rewrite (seq_rmw SIMREL). } { destruct ADD. rewrite add_event_data. rewrite (seq_data SIMREL); vauto. } @@ -612,7 +612,8 @@ Proof using. { destruct ADD. rewrite add_event_rmw_dep. rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } - all : admit. } + { destruct ADD. vauto. } + admit. (* TODO : add *) } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -630,13 +631,13 @@ Proof using. unfold compose in ISR. assert (NEQ : x' <> e). { intros FALSE. subst x'. basic_solver 8. } - assert (NEQ' : mapper x' <> e). + assert (NEQ' : mapper x' <> (ThreadEvent t_2 (index e - t_1_len))). { intros FALSE. destruct NOTIN. rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } assert (EQQ : mapper_rev' (mapper x') = x'). { unfold eq_dom in MAPREV. specialize MAPREV with x'. apply MAPREV in INE. unfold compose in INE. - unfold mapper_rev'. rewrite updo; vauto. admit. } + unfold mapper_rev'. rewrite updo; vauto. } rewrite EQQ in ISR; vauto. } unfolder. intros rd (RD1 & RD2). admit. } @@ -673,7 +674,16 @@ Proof using. << NINIT : ~is_init e >> /\ << NOTIN : ~E_s e >> /\ << TID : tid e <> t_1 >>). - { admit. } + { unfold NW; splits; vauto. + { intro FALSO. unfold is_init in FALSO. + destruct ADD; vauto. } + intro FALSO. destruct ADD. + assert (CDD : e = mapper' e). + { unfold mapper'. rewrite upds; vauto. } + rewrite CDD in FALSO. + apply (seq_acts SIMREL) in FALSO. + destruct FALSO as [e' [C1 C2]]. + admit. } unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). set (G_s' := {| @@ -713,11 +723,14 @@ Proof using. { intros ev INE' TIDCOND. destruct classic with (ev = e) as [EQ | NEQ]. { unfold mapper' in TIDCOND. - rewrite EQ in TIDCOND. admit. } - unfold mapper' in TIDCOND. rewrite updo in TIDCOND. - { admit. } - vauto. - (* TODO : fix *) } + rewrite EQ in TIDCOND. + rewrite upds in TIDCOND. admit. } + destruct SIMREL. + assert (NINE : E_t ev). + { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. } + specialize seq_tid_2 with ev. + apply seq_tid_2 in NINE; vauto. + unfold mapper'. rewrite updo; vauto. } { intros x COND. unfold compose. destruct classic with (x = e) as [EQ | NEQ]. { subst x. unfold mapper', mapper_rev'. @@ -758,20 +771,59 @@ Proof using. destruct ADD. apply add_event_init. } { unfold mapper'. rewrite upds. exact NOTIN. } { unfold mapper'. rewrite upds; vauto. } - { unfold mapper'. rewrite upds. admit. } + { unfold mapper'. rewrite upds. + destruct ADD; vauto. } { rewrite EQACTS. rewrite set_collect_union. rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). unfold mapper'. rewrite upds. basic_solver. } { unfold mapper', mapper_rev'. destruct ADD. rewrite add_event_lab. rewrite upds. admit. } - { admit. } - { admit. } + { destruct ADD. rewrite add_event_rf. + rewrite !collect_rel_union. + arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rfE). admit. (* TODO : add *) } + rewrite (seq_rf SIMREL). + arewrite (mapper' ↑ WCore.rf_delta_R e w + ≡ WCore.rf_delta_R (mapper' e) + (option_map mapper' w)). + { unfold WCore.rf_delta_R. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + arewrite (mapper' ↑ WCore.rf_delta_W e R1 + ≡ WCore.rf_delta_W (mapper' e) (mapper' ↑₁ R1)). + { unfold WCore.rf_delta_W. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + vauto. } + { destruct ADD. rewrite add_event_co. + rewrite !collect_rel_union. + arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_coE). admit. (* TODO : add *) } + rewrite (seq_co SIMREL). + arewrite (mapper' ↑ WCore.co_delta e W1 W2 + ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) + (mapper' ↑₁ W2)). + { unfold WCore.co_delta. rewrite collect_rel_union. + apply union_more. + { rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + vauto. } { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), collect_rel_union. arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rmwE). admit. } + apply (wf_rmwE). admit. (* TODO : add *) } now rewrite (seq_rmw SIMREL). } { destruct ADD. rewrite add_event_data. rewrite (seq_data SIMREL); vauto. } @@ -782,7 +834,8 @@ Proof using. { destruct ADD. rewrite add_event_rmw_dep. rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } - all : admit. } + { destruct ADD. vauto. } + admit. (* TODO : add *) } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -808,279 +861,20 @@ Proof using. apply MAPREV in INE. unfold compose in INE. unfold mapper_rev'. rewrite updo; vauto. } rewrite EQQ in ISR; vauto. } - unfolder. intros rd (RD1 & RD2). - admit. } + rewrite <- set_collect_codom. rewrite <- RFC. + intros x (EQ & RD). subst x. + unfold set_collect. exists e. splits; vauto. + { split. + { apply EQACTS. basic_solver. } + assert (FEQ : WCore.G X_s' = G_s') by vauto. + rewrite FEQ in RD. unfold G_s' in RD. + simpl in RD. clear - RD. unfold compose in RD. + unfold is_r in RD. unfold mapper_rev' in RD. + rewrite upds in RD; vauto. } + unfold mapper'. rewrite upds. vauto. } admit. Admitted. -Definition cmt' := mapper ↑₁ cmt_t. -Definition dtrmt' := mapper ↑₁ dtrmt_t. -Lemma simrel_step_reex - (NINIT1 : t_1 <> tid_init) - (NINIT2 : t_2 <> tid_init) - (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) - (STEP : WCore.reexec X_t X_t' mapper dtrmt_t cmt_t) : - seq_simrel X_s' X_t' t_1 t_2 id. -Proof using. - constructor; vauto. - all : admit. -Admitted. - -Lemma reex_step_reex - (NINIT1 : t_1 <> tid_init) - (NINIT2 : t_2 <> tid_init) - (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) - (STEP : WCore.reexec X_t X_t' mapper dtrmt_t cmt_t) : - WCore.reexec X_s X_s' id dtrmt' cmt'. -Proof using. - admit. -Admitted. End SimrelStep. - -Section SimrelGen. - -Variable X_t X_t' X_s : WCore.t. -Variable t_1 t_2 : thread_id. -Variable mapper : actid -> actid. - -Variable dtrmt_t cmt_t : actid -> Prop. -Variable thrdle : relation thread_id. - -Notation "'G_t'" := (WCore.G X_t). -Notation "'G_t''" := (WCore.G X_t'). -Notation "'G_s'" := (WCore.G X_s). - -Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). -Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). -Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). -Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). -Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). -Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). - -Notation "'lab_t'" := (lab G_t). -Notation "'val_t'" := (val lab_t). -Notation "'loc_t'" := (loc lab_t). -Notation "'same_loc_t'" := (same_loc lab_t). -Notation "'E_t'" := (acts_set G_t). -Notation "'sb_t'" := (sb G_t). -Notation "'rf_t'" := (rf G_t). -Notation "'co_t'" := (co G_t). -Notation "'rmw_t'" := (rmw G_t). -Notation "'rpo_t'" := (rpo G_t). -Notation "'rmw_dep_t'" := (rmw_dep G_t). -Notation "'data_t'" := (data G_t). -Notation "'ctrl_t'" := (ctrl G_t). -Notation "'addr_t'" := (addr G_t). -Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). -Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). -Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). - -Notation "'lab_t''" := (lab G_t'). -Notation "'val_t''" := (val lab_t'). -Notation "'loc_t''" := (loc lab_t'). -Notation "'same_loc_t''" := (same_loc lab_t'). -Notation "'E_t''" := (acts_set G_t'). -Notation "'sb_t''" := (sb G_t'). -Notation "'rf_t''" := (rf G_t'). -Notation "'co_t''" := (co G_t'). -Notation "'rmw_t''" := (rmw G_t'). -Notation "'rpo_t''" := (rpo G_t'). -Notation "'rmw_dep_t''" := (rmw_dep G_t'). -Notation "'data_t''" := (data G_t'). -Notation "'ctrl_t''" := (ctrl G_t'). -Notation "'addr_t''" := (addr G_t'). -Notation "'W_t''" := (fun x => is_true (is_w lab_t' x)). -Notation "'R_t''" := (fun x => is_true (is_r lab_t' x)). -Notation "'Loc_t_'' l" := (fun e => loc_t' e = l) (at level 1). - -Notation "'lab_s'" := (lab G_s). -Notation "'val_s'" := (val lab_s). -Notation "'loc_s'" := (loc lab_s). -Notation "'same_loc_s'" := (same_loc lab_s). -Notation "'E_s'" := (acts_set G_s). -Notation "'loc_s'" := (loc lab_s). -Notation "'sb_s'" := (sb G_s). -Notation "'rf_s'" := (rf G_s). -Notation "'co_s'" := (co G_s). -Notation "'rmw_s'" := (rmw G_s). -Notation "'rpo_s'" := (rpo G_s). -Notation "'rmw_dep_s'" := (rmw_dep G_s). -Notation "'data_s'" := (data G_s). -Notation "'ctrl_s'" := (ctrl G_s). -Notation "'addr_s'" := (addr G_s). -Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). -Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). -Notation "'F_s'" := (F G_s). - -Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). - -Lemma seq_step_gen - (NINIT1 : t_1 <> tid_init) - (NINIT2 : t_2 <> tid_init) - (THRDNEQ : t_1 <> t_2) - (STEP : xmm_step X_t X_t') - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) : - exists X_s' mapper', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ - << STEP : xmm_step⁺ X_s X_s' >>. -Proof using. - admit. -Admitted. - -End SimrelGen. - -Section BehaviorGraph. - -Variable G_1 G_2 : execution. - -Notation "'E_1'" := (acts_set G_1). - -Notation "'lab'" := (lab G_1). -Notation "'loc'" := (loc lab). -Notation "'val'" := (val lab). - -Definition graph_locations (G : execution) : Set := - { l : location | exists e, acts_set G e /\ loc e = Some l }. - -Definition same_behaviors (G_1 G_2 : execution) : Prop := - behavior_spec G_1 = behavior_spec G_2. - -End BehaviorGraph. - -Section SimrelMain. - -Variable X_t_init X_s_init X_t : WCore.t. -Variable t_1 t_2 : thread_id. - -Notation "'G_t_init'" := (WCore.G X_t_init). -Notation "'G_s_init'" := (WCore.G X_s_init). -Notation "'G_t'" := (WCore.G X_t). - -Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). -Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). -Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). -Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). -Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). -Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). - -Notation "'lab_t_init'" := (lab G_t_init). -Notation "'val_t_init'" := (val lab_t_init). -Notation "'loc_t_init'" := (loc lab_t_init). -Notation "'same_loc_t_init'" := (same_loc lab_t_init). -Notation "'E_t_init'" := (acts_set G_t_init). -Notation "'sb_t_init'" := (sb G_t_init). -Notation "'rf_t_init'" := (rf G_t_init). -Notation "'co_t_init'" := (co G_t_init). -Notation "'rmw_t_init'" := (rmw G_t_init). -Notation "'rpo_t_init'" := (rpo G_t_init). -Notation "'rmw_dep_t_init'" := (rmw_dep G_t_init). -Notation "'data_t_init'" := (data G_t_init). -Notation "'ctrl_t_init'" := (ctrl G_t_init). -Notation "'addr_t_init'" := (addr G_t_init). -Notation "'W_t_init'" := (fun x => is_true (is_w lab_t_init x)). -Notation "'R_t_init'" := (fun x => is_true (is_r lab_t_init x)). -Notation "'Loc_t_init_' l" := (fun e => loc_t_init e = l) (at level 1). - -Notation "'lab_s_init'" := (lab G_s_init). -Notation "'val_s_init'" := (val lab_s_init). -Notation "'loc_s_init'" := (loc lab_s_init). -Notation "'same_loc_s_init'" := (same_loc lab_s_init). -Notation "'E_s_init'" := (acts_set G_s_init). -Notation "'loc_s_init'" := (loc lab_s_init). -Notation "'sb_s_init'" := (sb G_s_init). -Notation "'rf_s_init'" := (rf G_s_init). -Notation "'co_s_init'" := (co G_s_init). -Notation "'rmw_s_init'" := (rmw G_s_init). -Notation "'rpo_s_init'" := (rpo G_s_init). -Notation "'rmw_dep_s_init'" := (rmw_dep G_s_init). -Notation "'data_s_init'" := (data G_s_init). -Notation "'ctrl_s_init'" := (ctrl G_s_init). -Notation "'addr_s_init'" := (addr G_s_init). -Notation "'W_s_init'" := (fun x => is_true (is_w lab_s_init x)). -Notation "'R_s_init'" := (fun x => is_true (is_r lab_s_init x)). -Notation "'Loc_s_init_' l" := (fun e => loc_s_init e = l) (at level 1). - -Notation "'lab_t'" := (lab G_t). -Notation "'val_t'" := (val lab_t). -Notation "'loc_t'" := (loc lab_t). -Notation "'same_loc_t'" := (same_loc lab_t). -Notation "'E_t'" := (acts_set G_t). -Notation "'sb_t'" := (sb G_t). -Notation "'rf_t'" := (rf G_t). -Notation "'co_t'" := (co G_t). -Notation "'rmw_t'" := (rmw G_t). -Notation "'rpo_t'" := (rpo G_t). -Notation "'rmw_dep_t'" := (rmw_dep G_t). -Notation "'data_t'" := (data G_t). -Notation "'ctrl_t'" := (ctrl G_t). -Notation "'addr_t'" := (addr G_t). -Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). -Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). -Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). - -Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). - -Lemma simrel_main - (NINIT1 : t_1 <> tid_init) - (NINIT2 : t_2 <> tid_init) - (THRDNEQ : t_1 <> t_2) - (TARGETPTH : xmm_step* X_t_init X_t) : - exists X_s mapper, - << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper >> /\ - << STEP : xmm_step* X_s_init X_s >> /\ - << BEHRS : same_behaviors (WCore.G X_s) G_t >>. -Proof using. - admit. -Admitted. - -End SimrelMain. - -Section ProgMain. - -Variable X_t : WCore.t. -Variable t_1 t_2 : thread_id. -Variable threads : thread_id -> Prop. - -Variable p1 p2 : program. - -Definition X_t_init : WCore.t := WCore.Build_t (WCore.init_exec threads) ∅₂. -Definition X_s_init : WCore.t := WCore.Build_t (WCore.init_exec (threads ∪₁ eq t_2)) ∅₂. - -Hypothesis PROGSEQ : program_sequented p1 p2 t_1 t_2. - -Lemma prog_supp : - exists X_s mapper, - << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper >> /\ - << STEP : xmm_step* X_s_init X_s >> /\ - << BEHRS : same_behaviors (WCore.G X_s) (WCore.G X_t) >>. -Proof using. - admit. -Admitted. - -Lemma prog_helper X_s mapper : - seq_simrel X_s X_t t_1 t_2 mapper -> - exec_sequent X_s X_t p1 p2 t_1 t_2. -Proof using. - intros SIMREL. - constructor; vauto. - intros tr_1 tr2 TR1 TR2 CR1 CR2. - constructor. all : admit. -Admitted. - -Lemma prog_main : - exists X_s, - << SEQUED : exec_sequent X_s X_t p1 p2 t_1 t_2 >> /\ - << STEP : xmm_step* X_s_init X_s >> /\ - << BEHRS : same_behaviors (WCore.G X_s) (WCore.G X_t) >>. -Proof using. - destruct prog_supp as (X_s & mapper & SIMREL & STEP & BEHRS). - exists X_s; splits; auto. - apply prog_helper with (mapper := mapper). - vauto. -Qed. - -End ProgMain. diff --git a/src/sequentialization/SequentProgs.v b/src/sequentialization/SequentProgs.v new file mode 100644 index 0000000..4183008 --- /dev/null +++ b/src/sequentialization/SequentProgs.v @@ -0,0 +1,268 @@ +Require Import AuxDef. +Require Import Core. +Require Import AuxRel AuxRel2. +Require Import Srf Rhb. +Require Import SimrelCommon. +Require Import StepOps. +Require Import AuxInj. +Require Import xmm_s_hb. +Require Import Lia. +From xmm Require Import Reordering. +From xmm Require Import ThreadTrace. +From xmm Require Import Programs. +From xmm Require Import SequentBase. +From xmm Require Import SequentExec. +From xmm Require Import SequentReexec. + +From hahn Require Import Hahn. +From hahnExt Require Import HahnExt. +From imm Require Import Events Execution Execution_eco. +Require Import Setoid Morphisms Program.Basics. + +Open Scope program_scope. + +Set Implicit Arguments. + +Section SimrelGen. + +Variable X_t X_t' X_s : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. + +Variable dtrmt_t cmt_t : actid -> Prop. +Variable thrdle : relation thread_id. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'G_t''" := (WCore.G X_t'). +Notation "'G_s'" := (WCore.G X_s). + +Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). +Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). +Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). +Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). +Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). +Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). + +Notation "'lab_t'" := (lab G_t). +Notation "'val_t'" := (val lab_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'same_loc_t'" := (same_loc lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). +Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). +Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). +Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). + +Notation "'lab_t''" := (lab G_t'). +Notation "'val_t''" := (val lab_t'). +Notation "'loc_t''" := (loc lab_t'). +Notation "'same_loc_t''" := (same_loc lab_t'). +Notation "'E_t''" := (acts_set G_t'). +Notation "'sb_t''" := (sb G_t'). +Notation "'rf_t''" := (rf G_t'). +Notation "'co_t''" := (co G_t'). +Notation "'rmw_t''" := (rmw G_t'). +Notation "'rpo_t''" := (rpo G_t'). +Notation "'rmw_dep_t''" := (rmw_dep G_t'). +Notation "'data_t''" := (data G_t'). +Notation "'ctrl_t''" := (ctrl G_t'). +Notation "'addr_t''" := (addr G_t'). +Notation "'W_t''" := (fun x => is_true (is_w lab_t' x)). +Notation "'R_t''" := (fun x => is_true (is_r lab_t' x)). +Notation "'Loc_t_'' l" := (fun e => loc_t' e = l) (at level 1). + +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'same_loc_s'" := (same_loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). +Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). +Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). +Notation "'F_s'" := (F G_s). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Lemma seq_step_gen + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRDNEQ : t_1 <> t_2) + (STEP : xmm_step X_t X_t') + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) : + exists X_s' mapper', + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ + << STEP : xmm_step⁺ X_s X_s' >>. +Proof using. + admit. +Admitted. + +End SimrelGen. + +Section BehaviorGraph. + +Variable G_1 G_2 : execution. + +Notation "'E_1'" := (acts_set G_1). + +Notation "'lab'" := (lab G_1). +Notation "'loc'" := (loc lab). +Notation "'val'" := (val lab). + +Definition graph_locations (G : execution) : Set := + { l : location | exists e, acts_set G e /\ loc e = Some l }. + +Definition same_behaviors (G_1 G_2 : execution) : Prop := + behavior_spec G_1 = behavior_spec G_2. + +End BehaviorGraph. + +Section SimrelMain. + +Variable X_t_init X_s_init X_t : WCore.t. +Variable t_1 t_2 : thread_id. + +Notation "'G_t_init'" := (WCore.G X_t_init). +Notation "'G_s_init'" := (WCore.G X_s_init). +Notation "'G_t'" := (WCore.G X_t). + +Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). +Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). +Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). +Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). +Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). +Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). + +Notation "'lab_t_init'" := (lab G_t_init). +Notation "'val_t_init'" := (val lab_t_init). +Notation "'loc_t_init'" := (loc lab_t_init). +Notation "'same_loc_t_init'" := (same_loc lab_t_init). +Notation "'E_t_init'" := (acts_set G_t_init). +Notation "'sb_t_init'" := (sb G_t_init). +Notation "'rf_t_init'" := (rf G_t_init). +Notation "'co_t_init'" := (co G_t_init). +Notation "'rmw_t_init'" := (rmw G_t_init). +Notation "'rpo_t_init'" := (rpo G_t_init). +Notation "'rmw_dep_t_init'" := (rmw_dep G_t_init). +Notation "'data_t_init'" := (data G_t_init). +Notation "'ctrl_t_init'" := (ctrl G_t_init). +Notation "'addr_t_init'" := (addr G_t_init). +Notation "'W_t_init'" := (fun x => is_true (is_w lab_t_init x)). +Notation "'R_t_init'" := (fun x => is_true (is_r lab_t_init x)). +Notation "'Loc_t_init_' l" := (fun e => loc_t_init e = l) (at level 1). + +Notation "'lab_s_init'" := (lab G_s_init). +Notation "'val_s_init'" := (val lab_s_init). +Notation "'loc_s_init'" := (loc lab_s_init). +Notation "'same_loc_s_init'" := (same_loc lab_s_init). +Notation "'E_s_init'" := (acts_set G_s_init). +Notation "'loc_s_init'" := (loc lab_s_init). +Notation "'sb_s_init'" := (sb G_s_init). +Notation "'rf_s_init'" := (rf G_s_init). +Notation "'co_s_init'" := (co G_s_init). +Notation "'rmw_s_init'" := (rmw G_s_init). +Notation "'rpo_s_init'" := (rpo G_s_init). +Notation "'rmw_dep_s_init'" := (rmw_dep G_s_init). +Notation "'data_s_init'" := (data G_s_init). +Notation "'ctrl_s_init'" := (ctrl G_s_init). +Notation "'addr_s_init'" := (addr G_s_init). +Notation "'W_s_init'" := (fun x => is_true (is_w lab_s_init x)). +Notation "'R_s_init'" := (fun x => is_true (is_r lab_s_init x)). +Notation "'Loc_s_init_' l" := (fun e => loc_s_init e = l) (at level 1). + +Notation "'lab_t'" := (lab G_t). +Notation "'val_t'" := (val lab_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'same_loc_t'" := (same_loc lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). +Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). +Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). +Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Lemma simrel_main + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRDNEQ : t_1 <> t_2) + (TARGETPTH : xmm_step* X_t_init X_t) : + exists X_s mapper, + << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper >> /\ + << STEP : xmm_step* X_s_init X_s >> /\ + << BEHRS : same_behaviors (WCore.G X_s) G_t >>. +Proof using. + admit. +Admitted. + +End SimrelMain. + +Section ProgMain. + +Variable X_t : WCore.t. +Variable t_1 t_2 : thread_id. +Variable threads : thread_id -> Prop. + +Variable p1 p2 : program. + +Definition X_t_init : WCore.t := WCore.Build_t (WCore.init_exec threads) ∅₂. +Definition X_s_init : WCore.t := WCore.Build_t (WCore.init_exec (threads ∪₁ eq t_2)) ∅₂. + +Hypothesis PROGSEQ : program_sequented p1 p2 t_1 t_2. + +Lemma prog_supp : + exists X_s mapper, + << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper >> /\ + << STEP : xmm_step* X_s_init X_s >> /\ + << BEHRS : same_behaviors (WCore.G X_s) (WCore.G X_t) >>. +Proof using. + admit. +Admitted. + +Lemma prog_helper X_s mapper : + seq_simrel X_s X_t t_1 t_2 mapper -> + exec_sequent X_s X_t p1 p2 t_1 t_2. +Proof using. + intros SIMREL. + constructor; vauto. + intros tr_1 tr2 TR1 TR2 CR1 CR2. + constructor. all : admit. +Admitted. + +Lemma prog_main : + exists X_s, + << SEQUED : exec_sequent X_s X_t p1 p2 t_1 t_2 >> /\ + << STEP : xmm_step* X_s_init X_s >> /\ + << BEHRS : same_behaviors (WCore.G X_s) (WCore.G X_t) >>. +Proof using. + destruct prog_supp as (X_s & mapper & SIMREL & STEP & BEHRS). + exists X_s; splits; auto. + apply prog_helper with (mapper := mapper). + vauto. +Qed. + +End ProgMain. diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v new file mode 100644 index 0000000..4675548 --- /dev/null +++ b/src/sequentialization/SequentReexec.v @@ -0,0 +1,117 @@ +Require Import AuxDef. +Require Import Core. +Require Import AuxRel AuxRel2. +Require Import Srf Rhb. +Require Import SimrelCommon. +Require Import StepOps. +Require Import AuxInj. +Require Import xmm_s_hb. +Require Import Lia. +From xmm Require Import Reordering. +From xmm Require Import ThreadTrace. +From xmm Require Import Programs. +From xmm Require Import SequentBase. + +From hahn Require Import Hahn. +From hahnExt Require Import HahnExt. +From imm Require Import Events Execution Execution_eco. +Require Import Setoid Morphisms Program.Basics. + +Open Scope program_scope. + +Set Implicit Arguments. + +Section SequentReexec. + +Variable X_t X_t' X_s : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. +Variable mapper_rev : actid -> actid. + +Variable e : actid. +Variable l : label. + +Variable dtrmt_t cmt_t : actid -> Prop. +Variable thrdle : relation thread_id. + +Variable ptc_1 ptc_2 : program_trace. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'G_t''" := (WCore.G X_t'). +Notation "'G_s'" := (WCore.G X_s). + +Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). +Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). +Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). +Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). +Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). +Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). + +Notation "'lab_t'" := (lab G_t). +Notation "'val_t'" := (val lab_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'same_loc_t'" := (same_loc lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). +Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). +Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). +Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). + +Notation "'lab_t''" := (lab G_t'). +Notation "'val_t''" := (val lab_t'). +Notation "'loc_t''" := (loc lab_t'). +Notation "'same_loc_t''" := (same_loc lab_t'). +Notation "'E_t''" := (acts_set G_t'). +Notation "'sb_t''" := (sb G_t'). +Notation "'rf_t''" := (rf G_t'). +Notation "'co_t''" := (co G_t'). +Notation "'rmw_t''" := (rmw G_t'). +Notation "'rpo_t''" := (rpo G_t'). +Notation "'rmw_dep_t''" := (rmw_dep G_t'). +Notation "'data_t''" := (data G_t'). +Notation "'ctrl_t''" := (ctrl G_t'). +Notation "'addr_t''" := (addr G_t'). +Notation "'W_t''" := (fun x => is_true (is_w lab_t' x)). +Notation "'R_t''" := (fun x => is_true (is_r lab_t' x)). +Notation "'Loc_t_'' l" := (fun e => loc_t' e = l) (at level 1). + +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'same_loc_s'" := (same_loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). +Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). +Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). +Notation "'F_s'" := (F G_s). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. +Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. + +Definition t_12_len := length (ptc_2 t_2). +Definition t_1_len := length (ptc_1 t_1). +Definition t_2_len := length (ptc_1 t_2). + +Definition cmt' := mapper ↑₁ cmt_t. +Definition dtrmt' := mapper ↑₁ dtrmt_t. + +End SequentReexec. \ No newline at end of file From 91e0b5aa2e17172d2ae09218571446a0ca8f9941 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 18 Mar 2025 20:14:34 +0100 Subject: [PATCH 09/51] wf condition added --- src/sequentialization/SequentExec.v | 38 +++++++++++++++-------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 7ec452a..5809124 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -105,6 +105,7 @@ Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. +Hypothesis WFT : Wf G_t. Definition t_12_len := length (ptc_2 t_2). Definition t_1_len := length (ptc_1 t_1). @@ -168,7 +169,7 @@ Proof using. rewrite CDD in FALSO. apply (seq_acts SIMREL) in FALSO. destruct FALSO as [e' [C1 C2]]. - admit. } + admit. (* TODO : Discuss *)} (* { unfold sb. rewrite (rsr_actsE CORR SIMREL). unfold extra_a; desf; [exfalso; now apply ETID|]. @@ -316,7 +317,7 @@ Proof using. rewrite !collect_rel_union. arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rfE). admit. (* TODO : add *) } + apply (wf_rfE); vauto. } rewrite (seq_rf SIMREL). arewrite (mapper' ↑ WCore.rf_delta_R e w ≡ WCore.rf_delta_R (mapper' e) @@ -338,7 +339,7 @@ Proof using. rewrite !collect_rel_union. arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_coE). admit. (* TODO : add *) } + apply (wf_coE); vauto. } rewrite (seq_co SIMREL). arewrite (mapper' ↑ WCore.co_delta e W1 W2 ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) @@ -356,7 +357,7 @@ Proof using. collect_rel_union. arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rmwE). admit. (* TODO : add *) } + apply (wf_rmwE); vauto. } now rewrite (seq_rmw SIMREL). } { destruct ADD. rewrite add_event_data. rewrite (seq_data SIMREL); vauto. } @@ -368,7 +369,7 @@ Proof using. rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } { destruct ADD. vauto. } - admit. (* TODO : add *) } + admit. (* TODO : add? *) } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -405,7 +406,7 @@ Proof using. unfold is_r in RD. unfold mapper_rev' in RD. rewrite upds in RD; vauto. } unfold mapper'. rewrite upds. vauto. } - admit. + admit. (* is_cons *) Admitted. Lemma simrel_step_e_t2 @@ -427,7 +428,7 @@ Proof using. set (mapper_rev' := upd mapper_rev (ThreadEvent t_2 (index e - t_1_len)) e). assert (ENOTIN : ~E_t e) by apply ADD. assert (EMAPNOTIN : ~E_s (ThreadEvent t_2 (index e - t_1_len))). - { admit. } + { admit. (* TODO : Discuss *) } assert (MAPEQ : eq_dom E_t mapper' mapper). { subst mapper'. unfolder. intros x XINE. clear - EMAPNOTIN ENOTIN XINE. rewrite updo; vauto. @@ -561,7 +562,7 @@ Proof using. rewrite !collect_rel_union. arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rfE). admit. (* TODO : add *) } + apply (wf_rfE); vauto. } rewrite (seq_rf SIMREL). arewrite (mapper' ↑ WCore.rf_delta_R e w ≡ WCore.rf_delta_R (mapper' e) @@ -583,7 +584,7 @@ Proof using. rewrite !collect_rel_union. arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_coE). admit. (* TODO : add *) } + apply (wf_coE); vauto. } rewrite (seq_co SIMREL). arewrite (mapper' ↑ WCore.co_delta e W1 W2 ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) @@ -601,7 +602,7 @@ Proof using. collect_rel_union. arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rmwE). admit. (* TODO : add *) } + apply (wf_rmwE); vauto. } now rewrite (seq_rmw SIMREL). } { destruct ADD. rewrite add_event_data. rewrite (seq_data SIMREL); vauto. } @@ -613,7 +614,7 @@ Proof using. rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } { destruct ADD. vauto. } - admit. (* TODO : add *) } + admit. (* TODO : add? *) } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -683,7 +684,7 @@ Proof using. rewrite CDD in FALSO. apply (seq_acts SIMREL) in FALSO. destruct FALSO as [e' [C1 C2]]. - admit. } + admit. (* TODO : Discuss *) } unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). set (G_s' := {| @@ -724,7 +725,8 @@ Proof using. destruct classic with (ev = e) as [EQ | NEQ]. { unfold mapper' in TIDCOND. rewrite EQ in TIDCOND. - rewrite upds in TIDCOND. admit. } + rewrite upds in TIDCOND. + admit. (* TODO : problem *) } destruct SIMREL. assert (NINE : E_t ev). { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. } @@ -783,7 +785,7 @@ Proof using. rewrite !collect_rel_union. arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rfE). admit. (* TODO : add *) } + apply (wf_rfE); vauto. } rewrite (seq_rf SIMREL). arewrite (mapper' ↑ WCore.rf_delta_R e w ≡ WCore.rf_delta_R (mapper' e) @@ -805,7 +807,7 @@ Proof using. rewrite !collect_rel_union. arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_coE). admit. (* TODO : add *) } + apply (wf_coE); vauto. } rewrite (seq_co SIMREL). arewrite (mapper' ↑ WCore.co_delta e W1 W2 ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) @@ -823,7 +825,7 @@ Proof using. collect_rel_union. arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rmwE). admit. (* TODO : add *) } + apply (wf_rmwE); vauto. } now rewrite (seq_rmw SIMREL). } { destruct ADD. rewrite add_event_data. rewrite (seq_data SIMREL); vauto. } @@ -835,7 +837,7 @@ Proof using. rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } { destruct ADD. vauto. } - admit. (* TODO : add *) } + admit. (* TODO : add? *) } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -872,7 +874,7 @@ Proof using. unfold is_r in RD. unfold mapper_rev' in RD. rewrite upds in RD; vauto. } unfold mapper'. rewrite upds. vauto. } - admit. + admit. (* is_cons *) Admitted. From 4a6297091209775cf3688fec3dba14b3ca104012 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 19 Mar 2025 03:36:29 +0100 Subject: [PATCH 10/51] reexec drafted --- src/sequentialization/SequentExec.v | 19 ++++- src/sequentialization/SequentReexec.v | 106 ++++++++++++++++++++++++-- 2 files changed, 117 insertions(+), 8 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 5809124..d96ee78 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -11,6 +11,7 @@ From xmm Require Import Reordering. From xmm Require Import ThreadTrace. From xmm Require Import Programs. From xmm Require Import SequentBase. +From xmm Require Import ConsistencyMonotonicity. From hahn Require Import Hahn. From hahnExt Require Import HahnExt. @@ -406,7 +407,11 @@ Proof using. unfold is_r in RD. unfold mapper_rev' in RD. rewrite upds in RD; vauto. } unfold mapper'. rewrite upds. vauto. } - admit. (* is_cons *) + apply XmmCons.monoton_cons with (G_t := G_t') + (m := mapper'); vauto; try apply SIMRELQ. + { admit. (* TODO : po-work? *) } + { admit. (* TODO : po-work? *) } + all : admit. (* TODO : add? *) Admitted. Lemma simrel_step_e_t2 @@ -642,7 +647,11 @@ Proof using. rewrite EQQ in ISR; vauto. } unfolder. intros rd (RD1 & RD2). admit. } - admit. + apply XmmCons.monoton_cons with (G_t := G_t') + (m := mapper'); vauto; try apply SIMRELQ. + { admit. (* TODO : po-work? *) } + { admit. (* TODO : po-work? *) } + all : admit. (* TODO : add? *) Admitted. Lemma simrel_step_e_else @@ -874,7 +883,11 @@ Proof using. unfold is_r in RD. unfold mapper_rev' in RD. rewrite upds in RD; vauto. } unfold mapper'. rewrite upds. vauto. } - admit. (* is_cons *) + apply XmmCons.monoton_cons with (G_t := G_t') + (m := mapper'); vauto; try apply SIMRELQ. + { admit. (* TODO : po-work? *) } + { admit. (* TODO : po-work? *) } + all : admit. (* TODO : add? *) Admitted. diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 4675548..76654e1 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -11,6 +11,7 @@ From xmm Require Import Reordering. From xmm Require Import ThreadTrace. From xmm Require Import Programs. From xmm Require Import SequentBase. +From xmm Require Import ConsistencyMonotonicity. From hahn Require Import Hahn. From hahnExt Require Import HahnExt. @@ -28,11 +29,9 @@ Variable t_1 t_2 : thread_id. Variable mapper : actid -> actid. Variable mapper_rev : actid -> actid. -Variable e : actid. -Variable l : label. - Variable dtrmt_t cmt_t : actid -> Prop. Variable thrdle : relation thread_id. +Variable f_t : actid -> actid. Variable ptc_1 ptc_2 : program_trace. @@ -106,12 +105,109 @@ Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. +Hypothesis STEP : WCore.reexec_gen X_t X_t' f_t dtrmt_t cmt_t thrdle. Definition t_12_len := length (ptc_2 t_2). Definition t_1_len := length (ptc_1 t_1). Definition t_2_len := length (ptc_1 t_2). -Definition cmt' := mapper ↑₁ cmt_t. -Definition dtrmt' := mapper ↑₁ dtrmt_t. +(* Definition cmt' := mapper ↑₁ cmt_t. +Definition dtrmt' := mapper ↑₁ dtrmt_t. *) + +Definition cmt' := id ↑₁ cmt_t. +Definition dtrmt' := id ↑₁ dtrmt_t. + +Definition thrdle' := eq t_2 × eq t_1 ∪ dom_rel (thrdle ⨾ ⦗eq t_1⦘) × eq t_2 + ∪ eq t_1 × codom_rel (⦗eq t_2⦘ ⨾ thrdle). + +Lemma simrel_step_reex + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (THRDNEQ : t_1 <> t_2) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) : + exists (X_s' : WCore.t), + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 id >> /\ + << REX : WCore.reexec X_s X_s' id dtrmt' cmt' >>. +Proof using. + set (G_s' := {| + acts_set := id ↑₁ E_t'; + threads_set := threads_set G_s; + lab := lab_t' ∘ id; + rf := id ↑ rf_t'; + co := id ↑ co_t'; + rmw := id ↑ rmw_t'; + rmw_dep := rmw_dep_t'; + ctrl := ctrl_t'; + data := data_t'; + addr := addr_t'; + |}). + set (X_s' := {| + WCore.sc := WCore.sc X_s; + WCore.G := G_s'; + |}). + + exists X_s'. split; red. + { constructor; vauto. + { intros e INE TIDE. + (* TODO : preserves threads? *) + admit. } + { admit. (* po-work *) } + arewrite (WCore.G X_s' = G_s'). + unfold G_s'. simpls. + rewrite (seq_threads SIMREL). + apply set_union_more; vauto. + (* TODO : preserves threads? *) + admit. } + unfold WCore.reexec. + exists thrdle'. + arewrite (cmt' = cmt_t). + { unfold cmt'. + rewrite set_collect_id; vauto. } + arewrite (dtrmt' = dtrmt_t). + { unfold dtrmt'. + rewrite set_collect_id; vauto. } + constructor; vauto. + { unfold dtrmt'. destruct STEP. + rewrite dtrmt_init; vauto. } + { exact (WCore.dtrmt_cmt STEP). } + { destruct STEP. + arewrite (WCore.G X_s' = G_s'). + unfold G_s'. simpls. unfold cmt'. + basic_solver 8. } + { constructor. + { destruct STEP. destruct reexec_sur. + unfold least_elt. intros trn INIT. + unfold thrdle'. (* transitive closure? *) + admit. } + all : admit. } + { admit. } + { admit. } + { admit. } + { destruct STEP. + destruct reexec_embd_corr. + constructor; vauto. + { intros e CMT. + arewrite (WCore.G X_s' = G_s'). + unfold G_s'. simpls. + unfold compose. + admit. (* ??? *) } + all : admit. } + { destruct STEP. unfold rf_complete. + arewrite (WCore.G X_s' = G_s'). + unfold G_s'. simpls. + rewrite collect_rel_id, set_collect_id, + Combinators.compose_id_right. + apply rexec_rfc. } + { admit. } + { apply XmmCons.monoton_cons with (G_t := G_t') + (m := id); vauto. + all : try arewrite (WCore.G X_s' = G_s'). + { admit. (* po-work? *) } + { admit. (* po-work? *) } + { admit. (* add *) } + { admit. (* add? *) } + destruct STEP; vauto. } + all : admit. +Admitted. End SequentReexec. \ No newline at end of file From e9dc8164a8dc2f4524070c156a01b4859cd9fd40 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 25 Mar 2025 00:13:08 +0100 Subject: [PATCH 11/51] acts_set proceedings --- src/sequentialization/SequentBase.v | 17 ++- src/sequentialization/SequentExec.v | 208 +++++++++++++++++++++++++--- 2 files changed, 200 insertions(+), 25 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index b258b3a..6ec1631 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -65,6 +65,12 @@ Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). Definition po_seq := (Tid_ t_1 ∩₁ E_s) × (Tid_ t_2 ∩₁ E_s). +Variable ptc_1 ptc_2 : program_trace. + +Definition t_12_len := length (ptc_2 t_1). +Definition t_1_len := length (ptc_1 t_1). +Definition t_2_len := length (ptc_1 t_2). + Record seq_simrel : Prop := { seq_inj : inj_dom E_t mapper; @@ -87,6 +93,10 @@ Record seq_simrel : Prop := { seq_init : fixset is_init mapper; (* rsr_mid : eq_dom (E_t \₁ eq a_t \₁ eq b_t) mapper id; *) seq_codom : mapper ↑₁ E_t ⊆₁ E_s; + + seq_mapeq : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> mapper e = e; + seq_mapto : forall e : actid, E_t e -> tid (mapper e) = t_2 -> mapper e = ThreadEvent t_2 (index e - t_1_len); + seq_index : forall e : actid, E_t e -> tid (mapper e) = t_2 -> index e = t_1_len + index (mapper e); }. End SimRelSeq. @@ -97,6 +107,8 @@ Variable X_t X_s : WCore.t. Variable t_1 t_2 : thread_id. Variable mapper : actid -> actid. +Variable ptc_1 ptc_2 : program_trace. + Notation "'G_t'" := (WCore.G X_t). Notation "'G_s'" := (WCore.G X_s). @@ -110,7 +122,7 @@ Lemma seq_simrel_init threads (WCore.Build_t (WCore.init_exec (threads ∪₁ eq t_2)) ∅₂) (WCore.Build_t (WCore.init_exec threads) ∅₂) t_1 t_2 - id >>. + id ptc_1 >>. Proof using. assert (IWF : Wf (WCore.init_exec threads)). { now apply WCore.wf_init_exec. } @@ -133,7 +145,8 @@ Proof using. intros x COND. destruct COND as [TID ISINIT]. unfold is_init in ISINIT. desf. } rewrite EMP1, EMP2. clear; basic_solver 8. } - all : clear; basic_solver. + all : try basic_solver. + all : unfold is_init in H; desf. Qed. End SeqSimrelInit. diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index d96ee78..827e77d 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -108,7 +108,7 @@ Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. Hypothesis WFT : Wf G_t. -Definition t_12_len := length (ptc_2 t_2). +Definition t_12_len := length (ptc_2 t_1). Definition t_1_len := length (ptc_1 t_1). Definition t_2_len := length (ptc_1 t_2). @@ -119,10 +119,10 @@ Lemma simrel_step_e_t1 (NINIT2 : t_2 <> tid_init) (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper ptc_1) (STEP : WCore.exec_inst X_t X_t' e l) : exists mapper' X_s', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1 >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. destruct STEP as [ADD RFC CONS]. @@ -170,7 +170,13 @@ Proof using. rewrite CDD in FALSO. apply (seq_acts SIMREL) in FALSO. destruct FALSO as [e' [C1 C2]]. - admit. (* TODO : Discuss *)} + assert (C1' : E_t e') by vauto. + apply (seq_mapeq SIMREL) in C1; vauto. + { assert (EQQ : e' = e). + { rewrite CDD. rewrite <- C2. vauto. } + subst e'; desf. } + rewrite C2; rewrite <- CDD. + clear - T1 THRDNEQ. intros FALSE; desf. } (* { unfold sb. rewrite (rsr_actsE CORR SIMREL). unfold extra_a; desf; [exfalso; now apply ETID|]. @@ -232,7 +238,7 @@ Proof using. |}). exists mapper', X_s'. - assert (SIMRELQ : seq_simrel X_s' X_t' (tid e) t_2 mapper'). + assert (SIMRELQ : seq_simrel X_s' X_t' (tid e) t_2 mapper' ptc_1). { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -278,8 +284,44 @@ Proof using. unfold mapper'. intros x COND. destruct classic with (x = e) as [EQ | NEQ]. { subst x. rewrite upds; vauto. } - rewrite updo; vauto. - apply (seq_init SIMREL); vauto. } + { rewrite updo; vauto. + apply (seq_init SIMREL); vauto. } + { intros e' INE TID2. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_mapeq SIMREL); vauto. + { apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + unfold mapper' in TID2. rewrite updo in TID2; vauto. } + { intros e' INE TID2. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper' in TID2. + rewrite upds in TID2. exfalso. + clear - TID TID2 THRDNEQ. desf. } + assert (INE' : E_t e'). + { apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + assert (MAPEQQ : mapper' e' = mapper e'). + { unfold mapper'. rewrite updo; vauto. } + rewrite MAPEQQ. + apply (seq_mapto SIMREL) in INE'. + { rewrite TID; vauto. } + rewrite <- MAPEQQ; vauto. } + intros e' INE TID2. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper' in TID2. + rewrite upds in TID2. exfalso. + clear - TID TID2 THRDNEQ. desf. } + assert (INE' : E_t e'). + { apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + assert (MAPEQQ : mapper' e' = mapper e'). + { unfold mapper'. rewrite updo; vauto. } + rewrite MAPEQQ. + apply (seq_index SIMREL) in INE'. + { rewrite TID; vauto. } + rewrite <- MAPEQQ; vauto. } splits. { rewrite <- TID; vauto. } constructor. @@ -421,10 +463,10 @@ Lemma simrel_step_e_t2 (NINIT2 : t_2 <> tid_init) (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper ptc_1) (STEP : WCore.exec_inst X_t X_t' e l) : exists mapper' X_s', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1 >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. destruct STEP as [ADD RFC CONS]. @@ -433,7 +475,34 @@ Proof using. set (mapper_rev' := upd mapper_rev (ThreadEvent t_2 (index e - t_1_len)) e). assert (ENOTIN : ~E_t e) by apply ADD. assert (EMAPNOTIN : ~E_s (ThreadEvent t_2 (index e - t_1_len))). - { admit. (* TODO : Discuss *) } + { intros FALSE. destruct ADD. + assert (CDD : (ThreadEvent t_2 (index e - t_1_len)) = mapper' e). + { unfold mapper'. rewrite upds; vauto. } + rewrite CDD in FALSE. + apply (seq_acts SIMREL) in FALSE. + destruct FALSE as [e' [C1 C2]]. + assert (C1' : E_t e') by vauto. + apply (seq_mapto SIMREL) in C1; vauto. + { assert (TID' : tid e' = t_1). + { apply (seq_tid_2 SIMREL) in C1'; vauto. + rewrite C1; vauto. } + rewrite <- CDD in C2. rewrite C1 in C2; vauto. + assert (INDEX : index e' = index e). + { unfold t_1_len in H0. + assert (index e' >= t_1_len). + { apply (seq_index SIMREL) in C1'. + { rewrite C1'. + unfold SequentBase.t_1_len, t_1_len. + clear. lia. } + rewrite C1; vauto. } + unfold SequentBase.t_1_len in H0. + clear - H0 H IND. unfold t_1_len in *. lia. } + assert (EQE : e' = e). + { clear - INDEX TID' T1 NINIT1. + destruct e', e; basic_solver 8. } + desf. } + rewrite C2; rewrite <- CDD. + vauto. } assert (MAPEQ : eq_dom E_t mapper' mapper). { subst mapper'. unfolder. intros x XINE. clear - EMAPNOTIN ENOTIN XINE. rewrite updo; vauto. @@ -474,7 +543,7 @@ Proof using. |}). exists mapper', X_s'. - assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper'). + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1). { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -541,8 +610,38 @@ Proof using. desf. basic_solver 8. } rewrite updo; vauto. apply (seq_init SIMREL); vauto. } - rewrite EQACTS. rewrite set_collect_union. - rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } + { rewrite EQACTS. rewrite set_collect_union. + rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } + { intros e' INE NTID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_mapeq SIMREL) in C1; vauto. + unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } + subst e'. unfold mapper'. rewrite upds; vauto. + unfold mapper' in NTID2. rewrite upds in NTID2; vauto. } + { intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_mapto SIMREL) in C1; vauto. + unfold mapper' in TID2. rewrite updo in TID2; vauto. } + subst e'. unfold mapper'. rewrite upds; vauto. } + intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_index SIMREL) in C1; vauto. + unfold mapper' in TID2. rewrite updo in TID2; vauto. } + subst e'. unfold mapper'. rewrite upds; vauto. + simpl. unfold SequentBase.t_1_len. + unfold t_1_len in *. clear - IND. lia. } splits; vauto. constructor. { unfold WCore.add_event. @@ -660,10 +759,10 @@ Lemma simrel_step_e_else (NINIT2 : t_2 <> tid_init) (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper ptc_1 ) (STEP : WCore.exec_inst X_t X_t' e l) : exists mapper' X_s', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1 >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. destruct STEP as [ADD RFC CONS]. @@ -693,7 +792,18 @@ Proof using. rewrite CDD in FALSO. apply (seq_acts SIMREL) in FALSO. destruct FALSO as [e' [C1 C2]]. - admit. (* TODO : Discuss *) } + assert (C1' : E_t e') by vauto. + apply (seq_mapeq SIMREL) in C1; vauto. + { assert (EQQ : e' = e). + { rewrite CDD. rewrite <- C2. vauto. } + subst e'; desf. } + rewrite C2; rewrite <- CDD. + symmetry in add_event_threads. + assert (T2NOTIN' : ~ threads_set G_t' t_2). + { intros FALSE. apply add_event_threads in FALSE; vauto. } + assert (INEN : E_t' e). + { apply EQACTS. basic_solver. } + intros FALSE; desf. } unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). set (G_s' := {| @@ -714,7 +824,7 @@ Proof using. |}). exists mapper', X_s'. - assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper'). + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1). { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -735,7 +845,16 @@ Proof using. { unfold mapper' in TIDCOND. rewrite EQ in TIDCOND. rewrite upds in TIDCOND. - admit. (* TODO : problem *) } + subst ev. apply EQACTS in INE'. + destruct INE' as [C1 | C2]. + { desf. } + assert (INEN : E_t' e). + { apply EQACTS. basic_solver. } + exfalso. + destruct ADD. symmetry in add_event_threads. + assert (T2NOTIN' : ~ threads_set G_t' t_2). + { intros FALSE. apply add_event_threads in FALSE; vauto. } + desf. } destruct SIMREL. assert (NINE : E_t ev). { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. } @@ -764,11 +883,54 @@ Proof using. { admit. (*TODO : po-work*) } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } - unfold mapper'. intros x COND. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. rewrite upds; vauto. } - rewrite updo; vauto. - apply (seq_init SIMREL); vauto. } + { unfold mapper'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. + apply (seq_init SIMREL); vauto. } + { intros e' INE NTID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_mapeq SIMREL) in C1; vauto. + unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } + subst e'. unfold mapper'. rewrite upds; vauto. } + { intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_mapto SIMREL) in C1; vauto. + unfold mapper'. rewrite updo; vauto. } + subst e'. unfold mapper' in TID2. + rewrite upds in TID2. + assert (INEN : E_t' e). + { apply EQACTS. basic_solver. } + exfalso. + destruct ADD. symmetry in add_event_threads. + assert (T2NOTIN' : ~ threads_set G_t' t_2). + { intros FALSE. apply add_event_threads in FALSE; vauto. } + desf. } + intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_index SIMREL) in C1; vauto. + unfold mapper'. rewrite updo; vauto. } + subst e'. unfold mapper' in TID2. + rewrite upds in TID2. + assert (INEN : E_t' e). + { apply EQACTS. basic_solver. } + exfalso. + destruct ADD. symmetry in add_event_threads. + assert (T2NOTIN' : ~ threads_set G_t' t_2). + { intros FALSE. apply add_event_threads in FALSE; vauto. } + desf. } split; vauto. constructor. { unfold WCore.add_event. exists (option_map mapper' r), (mapper' ↑₁ R1), From 8c1918170b5071bcb2f6c6e4e36698ece3d48e69 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 25 Mar 2025 21:43:43 +0100 Subject: [PATCH 12/51] questionable version of lab solution --- src/sequentialization/SequentBase.v | 7 +- src/sequentialization/SequentExec.v | 30 +++-- src/xmm/StepOps.v | 196 ++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+), 12 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index 6ec1631..7a2b206 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -25,6 +25,7 @@ Section SimRelSeq. Variable X_s X_t : WCore.t. Variable t_1 t_2 : thread_id. Variable mapper : actid -> actid. +Variable mappre_rev : actid -> actid. Notation "'G_t'" := (WCore.G X_t). Notation "'lab_t'" := (lab G_t). @@ -77,7 +78,8 @@ Record seq_simrel : Prop := { seq_tid_1 : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> tid e = tid (mapper e); seq_tid_2 : forall e : actid, E_t e -> tid (mapper e) = t_2 -> tid e = t_1; - seq_lab : eq_dom E_t (lab_s ∘ mapper) lab_t; + seq_lab : lab_t = lab_s ∘ mapper; + seq_lab_rev : lab_s = lab_t ∘ mappre_rev; seq_acts : E_s ≡₁ mapper ↑₁ E_t; seq_sb : sb_s ∪ po_seq ≡ mapper ↑ sb_t; seq_rf : rf_s ≡ mapper ↑ rf_t; @@ -106,6 +108,7 @@ Section SeqSimrelInit. Variable X_t X_s : WCore.t. Variable t_1 t_2 : thread_id. Variable mapper : actid -> actid. +Variable mappre_rev : actid -> actid. Variable ptc_1 ptc_2 : program_trace. @@ -122,7 +125,7 @@ Lemma seq_simrel_init threads (WCore.Build_t (WCore.init_exec (threads ∪₁ eq t_2)) ∅₂) (WCore.Build_t (WCore.init_exec threads) ∅₂) t_1 t_2 - id ptc_1 >>. + id id ptc_1 >>. Proof using. assert (IWF : Wf (WCore.init_exec threads)). { now apply WCore.wf_init_exec. } diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 827e77d..94e4898 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -119,10 +119,10 @@ Lemma simrel_step_e_t1 (NINIT2 : t_2 <> tid_init) (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper ptc_1) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) (STEP : WCore.exec_inst X_t X_t' e l) : - exists mapper' X_s', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1 >> /\ + exists mapper' mapper_rev' X_s', + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. destruct STEP as [ADD RFC CONS]. @@ -237,8 +237,8 @@ Proof using. WCore.G := G_s'; |}). - exists mapper', X_s'. - assert (SIMRELQ : seq_simrel X_s' X_t' (tid e) t_2 mapper' ptc_1). + exists mapper', mapper_rev', X_s'. + assert (SIMRELQ : seq_simrel X_s' X_t' (tid e) t_2 mapper' mapper_rev' ptc_1). { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -342,17 +342,27 @@ Proof using. { rewrite EQACTS. rewrite set_collect_union. rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). unfold mapper'. rewrite upds. basic_solver. } - { unfold mapper', mapper_rev'. - destruct ADD. rewrite add_event_lab. - rewrite upds. destruct SIMREL. + { destruct ADD. destruct SIMRELQ. + unfold mapper', mapper_rev'. + + + rewrite add_event_lab. + destruct SIMREL. + unfold compose. + unfold upd. + rewrite <- seq_lab_rev. + destruct SIMREL. + unfold compose. + rewrite seq_lab. apply functional_extensionality. intros x. destruct (classic (x = e)) as [EQ | NEQ]. { subst x. rewrite upds. unfold compose. rewrite !upds; vauto. } rewrite updo; vauto. unfold compose. - rewrite updo at 1; vauto. - { rewrite updo; vauto. + rewrite updo at 1; vauto. + { + admit. } rewrite updo; vauto. admit. } diff --git a/src/xmm/StepOps.v b/src/xmm/StepOps.v index 343d08f..7f30ac4 100644 --- a/src/xmm/StepOps.v +++ b/src/xmm/StepOps.v @@ -485,6 +485,202 @@ Proof using. clear - NW. basic_solver. Qed. +Lemma add_event_to_wf_fixed r R1 w W1 W2 + (ININ : is_init ⊆₁ E) + (NEW : ~E e) + (NINIT : ~is_init e) + (NTID : tid e <> tid_init) + (ACTS : E' ≡₁ E ∪₁ eq e) + (THREADS : threads_set' ≡₁ threads_set) + (LAB : eq_dom E' lab' (upd lab e l)) + (RF : rf' ≡ rf ∪ WCore.rf_delta_R e w ∪ WCore.rf_delta_W e R1) + (CO : co' ≡ co ∪ WCore.co_delta e W1 W2) + (RMW : rmw' ≡ rmw ∪ WCore.rmw_delta e r) + (DATA : data' ≡ data) + (ADDR : addr' ≡ addr) + (CTRL : ctrl' ≡ ctrl) + (RMWDEP : rmw_dep' ≡ rmw_dep) + (SB : sb' ≡ sb ∪ WCore.sb_delta e E) + (NCTRL : ctrl' ⊆ ∅₂) + (WF : Wf G') : + WCore.add_event_gen X X' e l r R1 w W1 W2. +Proof using. + assert (WNE : ~ eq_opt w e). + { destruct w as [w|]; ins. + intro FALSO; desf. + apply (rf_irr WF) with e, RF. + clear. basic_solver. } + assert (RNE : ~ eq_opt r e). + { destruct r as [r|]; ins. + intro FALSO; desf. + apply (rmw_irr WF) with e, RMW. + clear. basic_solver. } + assert (W1NE : ~W1 e). + { intros FALSO. + apply (co_irr WF) with e, CO. + clear - FALSO. basic_solver. } + assert (W2NE : ~W2 e). + { intros FALSO. + apply (co_irr WF) with e, CO. + clear - FALSO. basic_solver. } + assert (R1NE : ~R1 e). + { intros FALSO. + apply (rf_irr WF) with e, RF. + clear - FALSO. basic_solver. } + (**) + assert (RF1' : eq_opt w ⊆₁ dom_rel (rf' ⨾ ⦗eq e⦘)). + { rewrite RF. clear. basic_solver 7. } + assert (RF2' : R1 ⊆₁ codom_rel (⦗eq e⦘ ⨾ rf')). + { rewrite RF. clear. basic_solver 7. } + assert (RMW' : eq_opt r ⊆₁ dom_rel (rmw' ⨾ ⦗eq e⦘)). + { rewrite RMW. clear. basic_solver 7. } + assert (CO1' : W1 ⊆₁ codom_rel (⦗eq e⦘ ⨾ co')). + { rewrite CO. clear. basic_solver 7. } + assert (CO2' : W2 ⊆₁ dom_rel (co' ⨾ ⦗eq e⦘)). + { rewrite CO. clear. basic_solver 7. } + (**) + assert (WE' : eq_opt w ⊆₁ E'). + { rewrite RF1', (wf_rfE WF). clear. basic_solver. } + assert (R1E' : R1 ⊆₁ E'). + { rewrite RF2', (wf_rfE WF). clear. basic_solver. } + assert (RE' : eq_opt r ⊆₁ E'). + { rewrite RMW', (wf_rmwE WF). clear. basic_solver. } + assert (W1E' : W1 ⊆₁ E'). + { rewrite CO1', (wf_coE WF). clear. basic_solver. } + assert (W2E' : W2 ⊆₁ E'). + { rewrite CO2', (wf_coE WF). clear. basic_solver. } + (**) + assert (WE : eq_opt w ⊆₁ E). + { rewrite ACTS in WE'. + clear - WNE WE'. unfolder in *. + intros x XEQ. desf. + destruct WE' with x; congruence. } + assert (R1E : R1 ⊆₁ E). + { rewrite ACTS in R1E'. + clear - R1NE R1E'. unfolder in *. + intros x XEQ. + destruct R1E' with x; congruence. } + assert (RE : eq_opt r ⊆₁ E). + { rewrite ACTS in RE'. + clear - RNE RE'. unfolder in *. + intros x XEQ. desf. + destruct RE' with x; congruence. } + assert (W1E : W1 ⊆₁ E). + { rewrite ACTS in W1E'. + clear - W1NE W1E'. unfolder in *. + intros x XEQ. + destruct W1E' with x; congruence. } + assert (W2E : W2 ⊆₁ E). + { rewrite ACTS in W2E'. + clear - W2NE W2E'. unfolder in *. + intros x XEQ. + destruct W2E' with x; congruence. } + clear WE' R1E' RE' W1E' W2E'. + (**) + assert (SUBW : E ∩₁ W' ⊆₁ W). + { clear - LAB NEW ACTS. unfolder. + ins. desf. unfold is_w in *. rewrite LAB in H0. + { rewrite updo in *; congruence. } + apply ACTS. basic_solver 8. } + assert (SUBR : E ∩₁ R' ⊆₁ R). + { clear - LAB NEW ACTS. unfolder. + ins. desf. unfold is_r in *. rewrite LAB in H0. + { rewrite updo in *; congruence. } + apply ACTS. basic_solver 8. } + assert (LOCSET' : (fun x => same_loc' x e) ⊆₁ (fun x => same_loc' e x)). + { clear. unfold same_loc; basic_solver. } + assert (LOCSET : (fun x => same_loc x e) ⊆₁ (fun x => same_loc e x)). + { clear. unfold same_loc; basic_solver. } + assert (SUBLOC : E ∩₁ (fun x => same_loc' e x) ⊆₁ Loc_ (WCore.lab_loc l)). + { clear - NEW LAB ACTS. unfolder. unfold same_loc, loc, WCore.lab_loc. + rewrite LAB. + { intros x (XINE & LOC). + rewrite LAB in LOC. + { rewrite upds, updo in LOC. + { congruence. } + intros FALSE. desf. } + apply ACTS. basic_solver 8. } + apply ACTS. basic_solver 8. } + assert (SUBVAL : E ∩₁ (fun x => same_val' e x) ⊆₁ Val_ (WCore.lab_val l)). + { clear - NEW LAB ACTS. unfolder. unfold same_val, val, WCore.lab_val. + rewrite LAB. + { intros x (XINE & VAL). + rewrite LAB in VAL. + { rewrite upds, updo in VAL. + { congruence. } + intros FALSE. desf. } + apply ACTS. basic_solver 8. } + apply ACTS. basic_solver 8. } + assert (VALSET' : (fun x => same_val' x e) ⊆₁ (fun x => same_val' e x)). + { clear. unfolder. ins. unfold same_val in *. congruence. } + (**) + constructor; ins. + { transitivity (E ∩₁ W'); [| apply SUBW]. + apply set_subset_inter_r. split; [apply WE |]. + rewrite RF1', (wf_rfD WF). clear. basic_solver. } + { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. + apply set_subset_inter_r. split; [apply WE |]. + rewrite RF1', (wf_rfl WF), <- LOCSET'. + clear. basic_solver. } + { transitivity (E ∩₁ (fun x => same_val' e x)); [| apply SUBVAL]. + apply set_subset_inter_r. split; [apply WE |]. + rewrite RF1', <- VALSET'. clear - WF. unfolder. + ins. desf. now apply (wf_rfv WF). } + { transitivity (E ∩₁ R'); [| apply SUBR]. + apply set_subset_inter_r. split; [apply RE |]. + rewrite RMW', (wf_rmwD WF). clear. basic_solver. } + { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. + apply set_subset_inter_r. split; [apply RE |]. + rewrite RMW', (wf_rmwl WF), <- LOCSET'. + clear. basic_solver. } + { transitivity rmw'; [| apply WF]. + rewrite RMW. clear. basic_solver. } + { transitivity (E ∩₁ W'); [| apply SUBW]. + apply set_subset_inter_r. split; [apply W1E |]. + rewrite CO1', (wf_coD WF). clear. basic_solver. } + { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. + apply set_subset_inter_r. split; [apply W1E |]. + rewrite CO1', (wf_col WF), <- LOCSET'. + clear. basic_solver. } + { transitivity (E ∩₁ W'); [| apply SUBW]. + apply set_subset_inter_r. split; [apply W2E |]. + rewrite CO2', (wf_coD WF). clear. basic_solver. } + { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. + apply set_subset_inter_r. split; [apply W2E |]. + rewrite CO2', (wf_col WF), <- LOCSET'. + clear. basic_solver. } + { transitivity (E ∩₁ R'); [| apply SUBR]. + apply set_subset_inter_r. split; [apply R1E |]. + rewrite RF2', (wf_rfD WF). clear. basic_solver. } + { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. + apply set_subset_inter_r. split; [apply R1E |]. + rewrite RF2', (wf_rfl WF), <- LOCSET'. + clear. basic_solver. } + { transitivity (E ∩₁ (fun x => same_val' e x)); [| apply SUBVAL]. + apply set_subset_inter_r. split; [apply R1E |]. + rewrite RF2', <- VALSET'. clear - WF. unfolder. + ins. desf. symmetry. now apply (wf_rfv WF). } + all: try now apply WF. + { apply THREADS, WF, ACTS. now right. } + { enough (EMP : eq_opt w ≡₁ ∅). + { clear - EMP. unfolder in *. desf. + exfalso. eauto. } + split; [| basic_solver]. rewrite RF1', (wf_rfD WF). + clear - NR. basic_solver. } + { split; [| basic_solver]. rewrite RF2', (wf_rfD WF). + clear - NW. basic_solver. } + { enough (EMP : eq_opt r ≡₁ ∅). + { clear - EMP. unfolder in *. desf. + exfalso. eauto. } + split; [| basic_solver]. rewrite RMW', (wf_rmwD WF). + clear - NW. basic_solver. } + { split; [| basic_solver]. rewrite CO1', (wf_coD WF). + clear - NW. basic_solver. } + split; [| basic_solver]. rewrite CO2', (wf_coD WF). + clear - NW. basic_solver. + admit. +Admitted. + Lemma dom_sb_delta s : dom_rel (WCore.sb_delta e s) ≡₁ is_init ∪₁ s ∩₁ same_tid e. From 75ac22b11151bc0b809cafacf311acf7340306d9 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 26 Mar 2025 02:12:00 +0100 Subject: [PATCH 13/51] reexec problem --- src/sequentialization/SequentBase.v | 5 +- src/sequentialization/SequentExec.v | 68 ++++----- src/sequentialization/SequentReexec.v | 197 ++++++++++++++++++++++++-- 3 files changed, 222 insertions(+), 48 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index 7a2b206..ffb169b 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -78,8 +78,8 @@ Record seq_simrel : Prop := { seq_tid_1 : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> tid e = tid (mapper e); seq_tid_2 : forall e : actid, E_t e -> tid (mapper e) = t_2 -> tid e = t_1; - seq_lab : lab_t = lab_s ∘ mapper; - seq_lab_rev : lab_s = lab_t ∘ mappre_rev; + seq_lab : eq_dom E_t lab_t (lab_s ∘ mapper); + seq_lab_rev : eq_dom E_t lab_s (lab_t ∘ mappre_rev); seq_acts : E_s ≡₁ mapper ↑₁ E_t; seq_sb : sb_s ∪ po_seq ≡ mapper ↑ sb_t; seq_rf : rf_s ≡ mapper ↑ rf_t; @@ -93,7 +93,6 @@ Record seq_simrel : Prop := { seq_rmw_dep : rmw_dep_s ≡ rmw_dep_t; seq_init : fixset is_init mapper; - (* rsr_mid : eq_dom (E_t \₁ eq a_t \₁ eq b_t) mapper id; *) seq_codom : mapper ↑₁ E_t ⊆₁ E_s; seq_mapeq : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> mapper e = e; diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 94e4898..d566a9a 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -333,7 +333,8 @@ Proof using. apply add_event_to_wf; simpl; vauto. { apply sico_init_acts_s with (X_t := X_t) (mapper := mapper). - { constructor. all : apply SIMREL. } + { constructor. all : try apply SIMREL. + rewrite (seq_lab SIMREL); vauto. } destruct ADD. apply add_event_init. } { unfold mapper'. rewrite upds. exact NOTIN. } { unfold mapper'. rewrite upds; vauto. } @@ -344,28 +345,7 @@ Proof using. unfold mapper'. rewrite upds. basic_solver. } { destruct ADD. destruct SIMRELQ. unfold mapper', mapper_rev'. - - - rewrite add_event_lab. - destruct SIMREL. - unfold compose. - unfold upd. - rewrite <- seq_lab_rev. - destruct SIMREL. - unfold compose. - rewrite seq_lab. - apply functional_extensionality. - intros x. - destruct (classic (x = e)) as [EQ | NEQ]. - { subst x. rewrite upds. - unfold compose. rewrite !upds; vauto. } - rewrite updo; vauto. unfold compose. - rewrite updo at 1; vauto. - { - - admit. } - rewrite updo; vauto. - admit. } + admit. (* TODO : discuss *) } { destruct ADD. rewrite add_event_rf. rewrite !collect_rel_union. arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). @@ -462,6 +442,7 @@ Proof using. apply XmmCons.monoton_cons with (G_t := G_t') (m := mapper'); vauto; try apply SIMRELQ. { admit. (* TODO : po-work? *) } + { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } all : admit. (* TODO : add? *) Admitted. @@ -473,10 +454,10 @@ Lemma simrel_step_e_t2 (NINIT2 : t_2 <> tid_init) (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper ptc_1) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) (STEP : WCore.exec_inst X_t X_t' e l) : - exists mapper' X_s', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1 >> /\ + exists mapper' mapper_rev' X_s', + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. destruct STEP as [ADD RFC CONS]. @@ -552,8 +533,8 @@ Proof using. WCore.G := G_s'; |}). - exists mapper', X_s'. - assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1). + exists mapper', mapper_rev', X_s'. + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1). { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -662,7 +643,8 @@ Proof using. apply add_event_to_wf; simpl; vauto. { apply sico_init_acts_s with (X_t := X_t) (mapper := mapper). - { constructor. all : apply SIMREL. } + { constructor. all : try apply SIMREL. + rewrite (seq_lab SIMREL); vauto. } destruct ADD. apply add_event_init. } { unfold mapper'. rewrite upds; vauto. } { unfold mapper'. rewrite upds; vauto. } @@ -754,11 +736,21 @@ Proof using. apply MAPREV in INE. unfold compose in INE. unfold mapper_rev'. rewrite updo; vauto. } rewrite EQQ in ISR; vauto. } - unfolder. intros rd (RD1 & RD2). - admit. } + rewrite <- set_collect_codom. rewrite <- RFC. + intros x (EQ & RD). subst x. + unfold set_collect. exists e. splits; vauto. + { split. + { apply EQACTS. basic_solver. } + assert (FEQ : WCore.G X_s' = G_s') by vauto. + rewrite FEQ in RD. unfold G_s' in RD. + simpl in RD. clear - RD. unfold compose in RD. + unfold is_r in RD. unfold mapper_rev' in RD. + rewrite upds in RD; vauto. } + unfold mapper'. rewrite upds. vauto. } apply XmmCons.monoton_cons with (G_t := G_t') (m := mapper'); vauto; try apply SIMRELQ. { admit. (* TODO : po-work? *) } + { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } all : admit. (* TODO : add? *) Admitted. @@ -769,10 +761,10 @@ Lemma simrel_step_e_else (NINIT2 : t_2 <> tid_init) (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper ptc_1 ) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1 ) (STEP : WCore.exec_inst X_t X_t' e l) : - exists mapper' X_s', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1 >> /\ + exists mapper' mapper_rev' X_s', + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. Proof using. destruct STEP as [ADD RFC CONS]. @@ -833,8 +825,8 @@ Proof using. WCore.G := G_s'; |}). - exists mapper', X_s'. - assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' ptc_1). + exists mapper', mapper_rev', X_s'. + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1). { constructor; vauto; simpl; try basic_solver 6. { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. { clear - SIMREL MAPEQ. @@ -950,7 +942,8 @@ Proof using. apply add_event_to_wf; simpl; vauto. { apply sico_init_acts_s with (X_t := X_t) (mapper := mapper). - { constructor. all : apply SIMREL. } + { constructor. all : try apply SIMREL. + rewrite (seq_lab SIMREL); vauto. } destruct ADD. apply add_event_init. } { unfold mapper'. rewrite upds. exact NOTIN. } { unfold mapper'. rewrite upds; vauto. } @@ -1058,6 +1051,7 @@ Proof using. apply XmmCons.monoton_cons with (G_t := G_t') (m := mapper'); vauto; try apply SIMRELQ. { admit. (* TODO : po-work? *) } + { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } all : admit. (* TODO : add? *) Admitted. diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 76654e1..cd00a19 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -117,16 +117,57 @@ Definition dtrmt' := mapper ↑₁ dtrmt_t. *) Definition cmt' := id ↑₁ cmt_t. Definition dtrmt' := id ↑₁ dtrmt_t. -Definition thrdle' := eq t_2 × eq t_1 ∪ dom_rel (thrdle ⨾ ⦗eq t_1⦘) × eq t_2 - ∪ eq t_1 × codom_rel (⦗eq t_2⦘ ⨾ thrdle). +Definition relation_lowering (A : Type) (r : relation A) (P : A -> Prop) : relation A := + fun x y => r x y /\ P x /\ P y. + +Lemma codom_ct_union (A : Type) (r r' : relation A) : + codom_rel ((r ∪ r')⁺) ≡₁ codom_rel r ∪₁ codom_rel r'. +Proof using. + rewrite codom_ct. + unfold codom_rel; basic_solver. +Qed. + +Lemma rel_low (A : Type) (r : relation A) (P : A -> Prop) : + relation_lowering r P ≡ r ∩ (P × P). +Proof using. + unfold relation_lowering. basic_solver. +Qed. + +Lemma codom_crossed (A : Type) (P P' : A -> Prop) : + codom_rel (P × P') ⊆₁ P'. +Proof using. + unfold codom_rel. basic_solver. +Qed. + +Lemma codom_rel_low (A : Type) (r : relation A) (P : A -> Prop) : + codom_rel (relation_lowering r P) ⊆₁ codom_rel r ∩₁ P. +Proof using. + rewrite rel_low. basic_solver. +Qed. + +Definition thrdle' := (eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_2 + ∪ eq t_1 × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) + ∪ eq tid_init × codom_rel (thrdle)). + (* ∪ relation_lowering thrdle (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) + ∪ relation_lowering thrdle (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) + (* \ (fun x y => x = y). *) + ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) + ∪ eq t_2 × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) + ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_1). *) + +(* Definition thrdle_ohne' := (eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_2 + ∪ eq t_1 × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) + ∪ eq tid_init × codom_rel (thrdle) + ∪ relation_lowering thrdle (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) + ∪ relation_lowering thrdle (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1))⁺. *) Lemma simrel_step_reex (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) : + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) : exists (X_s' : WCore.t), - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 id >> /\ + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 id id ptc_1 >> /\ << REX : WCore.reexec X_s X_s' id dtrmt' cmt' >>. Proof using. set (G_s' := {| @@ -157,7 +198,7 @@ Proof using. rewrite (seq_threads SIMREL). apply set_union_more; vauto. (* TODO : preserves threads? *) - admit. } + all : admit. } unfold WCore.reexec. exists thrdle'. arewrite (cmt' = cmt_t). @@ -177,9 +218,149 @@ Proof using. { constructor. { destruct STEP. destruct reexec_sur. unfold least_elt. intros trn INIT. - unfold thrdle'. (* transitive closure? *) - admit. } - all : admit. } + unfold thrdle'. + right. + split; vauto. + unfold least_elt in surg_init_least. + specialize (surg_init_least trn INIT). + clear - surg_init_least. + basic_solver. } + { unfold min_elt. intros trn INIT. + assert (FLS : codom_rel thrdle' tid_init). + { clear - INIT. basic_solver. } + unfold thrdle' in INIT. + apply codom_union in FLS. + destruct FLS as [FLS | FLS1]. + { apply codom_union in FLS. + destruct FLS as [FLS | FLS2]. + { apply codom_union in FLS. + destruct FLS as [FLS | FLS3]. + (* { apply codom_union in FLS. + destruct FLS as [FLS | FLS4]. + { apply codom_union in FLS. + destruct FLS as [FLS | FLS5]. + { apply codom_union in FLS. + destruct FLS as [FLS | FLS6]. + { apply codom_union in FLS. + destruct FLS as [FLS | FLS7]. + { apply codom_union in FLS. + destruct FLS as [FLS | FLS8]. *) + { clear - NINIT1 FLS. + apply codom_crossed in FLS. + desf. } + clear - NINIT2 FLS3. + apply codom_crossed in FLS3. + desf. } + apply codom_crossed in FLS2. + unfold set_minus in FLS2. + destruct FLS2 as [FLS2 _]. + destruct STEP. destruct reexec_sur. + clear - FLS2 surg_init_min. + unfold min_elt in surg_init_min. + destruct FLS2 as [x FLS2]. + specialize (surg_init_min x). + apply surg_init_min. + destruct FLS2 as [x0 [EQ FLS2]]. + destruct EQ. desf. } + apply codom_crossed in FLS1. + destruct STEP. destruct reexec_sur. + clear - FLS1 surg_init_min. + unfold min_elt in surg_init_min. + destruct FLS1 as [x FLS1]. + specialize (surg_init_min x). + desf. } + (* apply codom_rel_low in FLS5. + destruct FLS5 as [FLS5 _]. + destruct STEP. destruct reexec_sur. + clear - FLS5 surg_init_min. + unfold min_elt in surg_init_min. + destruct FLS5 as [x FLS5]. + specialize (surg_init_min x). + desf. } + apply codom_rel_low in FLS4. + destruct FLS4 as [FLS4 _]. + destruct STEP. destruct reexec_sur. + clear - FLS4 surg_init_min. + unfold min_elt in surg_init_min. + destruct FLS4 as [x FLS4]. + specialize (surg_init_min x). + desf. } + apply codom_crossed in FLS3. + unfold set_minus in FLS3. + destruct FLS3 as [FLS3 _]. + destruct STEP. destruct reexec_sur. + clear - FLS3 surg_init_min. + unfold min_elt in surg_init_min. + destruct FLS3 as [x FLS3]. + specialize (surg_init_min x). + destruct FLS3 as [x0 [EQ FLS3]]. + destruct EQ. desf. } + apply codom_crossed in FLS2. + destruct STEP. destruct reexec_sur. + clear - FLS2 surg_init_min. + unfold min_elt in surg_init_min. + destruct FLS2 as [FLS2 _]. + destruct FLS2 as [x FLS2]. + specialize (surg_init_min x). + destruct FLS2 as [x0 [EQ FLS2]]. + destruct EQ. desf. } + apply codom_crossed in FLS1. + desf. } *) + { constructor. + { unfold thrdle'. + apply irreflexive_union; split. + { apply irreflexive_union; split. + { apply irreflexive_union; split. + (* { apply irreflexive_union; split. + { apply irreflexive_union; split. + { apply irreflexive_union; split. + { apply irreflexive_union; split. + { apply irreflexive_union; split. *) + { clear - THRDNEQ. basic_solver. } + clear. basic_solver. } + clear. basic_solver. } + destruct STEP. destruct reexec_sur. + unfold min_elt in surg_init_min. + clear - surg_init_min. + intros x [EQ [y FLS]]. + specialize (surg_init_min y). + basic_solver 4. } + unfold thrdle'. + unfold transitive. + (* TODO : discuss *) + + admit. } + admit. } + (* unfold irreflexive. intros x [CD FLS]. + destruct FLS as [FLS _]. + destruct STEP. destruct reexec_sur. + clear - CD FLS surg_order. + unfold strict_partial_order in surg_order. + destruct surg_order as [IRR _]. + destruct IRR with x; vauto. } + unfold irreflexive. intros x [CD FLS]. + destruct FLS as [FLS _]. + destruct STEP. destruct reexec_sur. + clear - CD FLS surg_order. + unfold strict_partial_order in surg_order. + destruct surg_order as [IRR _]. + destruct IRR with x; vauto. } + unfold irreflexive. intros x [CD1 CD2]. + + { unfold thrdle'. + set (tlo := (eq t_2 × eq t_1 + ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_2 + ∪ eq t_1 × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) + ∪ eq tid_init × codom_rel thrdle + ∪ relation_lowering thrdle + (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) + ∪ relation_lowering thrdle + (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1))). + clear. unfold transitive. + intros x y z XY YZ. + unfold minus_rel in *. + admit. } *) + { admit. } { admit. } { admit. } From 2c1469d9a3b453987ff4066614c11ce391b1b644 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 26 Mar 2025 02:55:20 +0100 Subject: [PATCH 14/51] probable solution --- src/sequentialization/SequentReexec.v | 117 +++++++++----------------- 1 file changed, 40 insertions(+), 77 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index cd00a19..14c17ce 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -145,9 +145,9 @@ Proof using. rewrite rel_low. basic_solver. Qed. -Definition thrdle' := (eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_2 - ∪ eq t_1 × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) - ∪ eq tid_init × codom_rel (thrdle)). +Definition thrdle' := thrdle ∪ eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_2 + ∪ eq t_2 × (codom_rel (⦗eq t_1⦘ ⨾ thrdle) \₁ eq t_2) + ∪ eq tid_init × codom_rel (thrdle). (* ∪ relation_lowering thrdle (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) ∪ relation_lowering thrdle (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) (* \ (fun x y => x = y). *) @@ -235,102 +235,65 @@ Proof using. destruct FLS as [FLS | FLS2]. { apply codom_union in FLS. destruct FLS as [FLS | FLS3]. - (* { apply codom_union in FLS. + { apply codom_union in FLS. destruct FLS as [FLS | FLS4]. - { apply codom_union in FLS. - destruct FLS as [FLS | FLS5]. - { apply codom_union in FLS. - destruct FLS as [FLS | FLS6]. - { apply codom_union in FLS. - destruct FLS as [FLS | FLS7]. - { apply codom_union in FLS. - destruct FLS as [FLS | FLS8]. *) - { clear - NINIT1 FLS. - apply codom_crossed in FLS. - desf. } - clear - NINIT2 FLS3. - apply codom_crossed in FLS3. - desf. } - apply codom_crossed in FLS2. - unfold set_minus in FLS2. - destruct FLS2 as [FLS2 _]. - destruct STEP. destruct reexec_sur. - clear - FLS2 surg_init_min. - unfold min_elt in surg_init_min. - destruct FLS2 as [x FLS2]. - specialize (surg_init_min x). - apply surg_init_min. - destruct FLS2 as [x0 [EQ FLS2]]. - destruct EQ. desf. } - apply codom_crossed in FLS1. - destruct STEP. destruct reexec_sur. - clear - FLS1 surg_init_min. - unfold min_elt in surg_init_min. - destruct FLS1 as [x FLS1]. - specialize (surg_init_min x). - desf. } - (* apply codom_rel_low in FLS5. - destruct FLS5 as [FLS5 _]. - destruct STEP. destruct reexec_sur. - clear - FLS5 surg_init_min. + { destruct STEP. destruct reexec_sur. unfold min_elt in surg_init_min. - destruct FLS5 as [x FLS5]. + destruct FLS as [x FLS]. specialize (surg_init_min x). - desf. } - apply codom_rel_low in FLS4. - destruct FLS4 as [FLS4 _]. - destruct STEP. destruct reexec_sur. - clear - FLS4 surg_init_min. - unfold min_elt in surg_init_min. - destruct FLS4 as [x FLS4]. - specialize (surg_init_min x). + apply surg_init_min. + vauto. } + clear - NINIT1 FLS4. + apply codom_crossed in FLS4. desf. } + clear - NINIT2 FLS3. apply codom_crossed in FLS3. - unfold set_minus in FLS3. - destruct FLS3 as [FLS3 _]. - destruct STEP. destruct reexec_sur. - clear - FLS3 surg_init_min. - unfold min_elt in surg_init_min. - destruct FLS3 as [x FLS3]. - specialize (surg_init_min x). - destruct FLS3 as [x0 [EQ FLS3]]. - destruct EQ. desf. } + desf. } apply codom_crossed in FLS2. + unfold set_minus in FLS2. + destruct FLS2 as [FLS2 _]. destruct STEP. destruct reexec_sur. clear - FLS2 surg_init_min. unfold min_elt in surg_init_min. - destruct FLS2 as [FLS2 _]. destruct FLS2 as [x FLS2]. specialize (surg_init_min x). + apply surg_init_min. destruct FLS2 as [x0 [EQ FLS2]]. destruct EQ. desf. } apply codom_crossed in FLS1. - desf. } *) + destruct STEP. destruct reexec_sur. + clear - FLS1 surg_init_min. + unfold min_elt in surg_init_min. + destruct FLS1 as [x FLS1]. + specialize (surg_init_min x). + desf. } { constructor. { unfold thrdle'. apply irreflexive_union; split. { apply irreflexive_union; split. { apply irreflexive_union; split. - (* { apply irreflexive_union; split. - { apply irreflexive_union; split. - { apply irreflexive_union; split. - { apply irreflexive_union; split. - { apply irreflexive_union; split. *) - { clear - THRDNEQ. basic_solver. } - clear. basic_solver. } - clear. basic_solver. } - destruct STEP. destruct reexec_sur. - unfold min_elt in surg_init_min. - clear - surg_init_min. - intros x [EQ [y FLS]]. - specialize (surg_init_min y). - basic_solver 4. } - unfold thrdle'. - unfold transitive. + { apply irreflexive_union; split. + { destruct STEP. destruct reexec_sur. + unfold strict_partial_order in surg_order. + destruct surg_order as [IRR _]; vauto. } + clear - THRDNEQ. basic_solver. } + clear. basic_solver. } + clear. basic_solver. } + destruct STEP. destruct reexec_sur. + unfold min_elt in surg_init_min. + clear - surg_init_min. + intros x [EQ [y FLS]]. + specialize (surg_init_min y). + basic_solver 4. } + unfold thrdle'. unfold transitive. + intros x y z XY YZ. + Search (relation _ -> (_ -> Prop)). + Print Proper. + destruct classic (y = eq t_2). (* TODO : discuss *) + admit. } admit. } - admit. } (* unfold irreflexive. intros x [CD FLS]. destruct FLS as [FLS _]. destruct STEP. destruct reexec_sur. From 9f3bdb4a1a1869c078ac39ba34fca20c6955c601 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 26 Mar 2025 03:00:39 +0100 Subject: [PATCH 15/51] minor fix --- src/sequentialization/SequentReexec.v | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 14c17ce..a09b3b9 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -198,7 +198,7 @@ Proof using. rewrite (seq_threads SIMREL). apply set_union_more; vauto. (* TODO : preserves threads? *) - all : admit. } + all : admit. } unfold WCore.reexec. exists thrdle'. arewrite (cmt' = cmt_t). @@ -287,10 +287,8 @@ Proof using. basic_solver 4. } unfold thrdle'. unfold transitive. intros x y z XY YZ. - Search (relation _ -> (_ -> Prop)). - Print Proper. - destruct classic (y = eq t_2). - (* TODO : discuss *) + + (* TODO : discuss *) admit. } admit. } From a19cd0cf2897f3c52b42a85be9c0ad2ef4cbc0c4 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 26 Mar 2025 07:12:45 +0100 Subject: [PATCH 16/51] checking out po --- src/sequentialization/SequentExec.v | 245 ++++++++++++++++++++------ src/sequentialization/SequentReexec.v | 4 + 2 files changed, 191 insertions(+), 58 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index d566a9a..fb4890d 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -156,69 +156,30 @@ Proof using. assert (NEWE : << NINIT : ~is_init e >> /\ << NOTIN : ~E_s e >> /\ - << TID : tid e = t_1 >>). - (* /\ + << TID : tid e = t_1 >> /\ << NEWSB : ⦗E_s ∪₁ eq e⦘ ⨾ ext_sb ⨾ ⦗E_s ∪₁ eq e⦘ ≡ - sb_s ∪ WCore.sb_delta e E_s >>). *) + sb_s ∪ WCore.sb_delta e E_s >>). { unfold NW; splits; vauto. { intro FALSO. unfold is_init in FALSO. unfold tid in T1. clear - T1 FALSO NINIT1. basic_solver. } - intro FALSO. destruct ADD. - assert (CDD : e = mapper' e). - { unfold mapper'. rewrite upds; vauto. } - rewrite CDD in FALSO. - apply (seq_acts SIMREL) in FALSO. - destruct FALSO as [e' [C1 C2]]. - assert (C1' : E_t e') by vauto. - apply (seq_mapeq SIMREL) in C1; vauto. - { assert (EQQ : e' = e). - { rewrite CDD. rewrite <- C2. vauto. } - subst e'; desf. } - rewrite C2; rewrite <- CDD. - clear - T1 THRDNEQ. intros FALSE; desf. } - (* { unfold sb. - rewrite (rsr_actsE CORR SIMREL). - unfold extra_a; desf; [exfalso; now apply ETID|]. - rewrite set_union_empty_r. - rewrite <- EQACTS. apply ADD. } - unfold sb. - rewrite rsr_actsE - with (X_s := X_s) (X_t := X_t) - (a_t := a_t) (b_t := b_t); eauto. - unfold extra_a; desf. - { rewrite <- (rsr_at_bt_tid CORR) in NQT. - rewrite id_union, !seq_union_l, !seq_union_r. - arewrite_false (⦗eq e⦘ ⨾ ext_sb ⨾ ⦗eq e⦘). - { clear. unfolder. ins. desf. - eapply ext_sb_irr; eauto. } - arewrite_false (⦗eq e⦘ ⨾ ext_sb ⨾ ⦗E_t ∪₁ eq a_t⦘). - { admit. } - rewrite id_union at 3. rewrite seq_union_l. - arewrite_false (⦗eq a_t⦘ ⨾ ext_sb ⨾ ⦗eq e⦘). - { clear - NQT CORR. unfolder. unfold ext_sb. - ins. desf; ins; [| desf]. - apply (rsr_at_ninit CORR). auto. } - rewrite sb_delta_union. - assert (SUB : WCore.sb_delta e (eq a_t) ⊆ WCore.sb_delta e E_t). - { clear - NQT. unfolder. ins. desf. auto. } - rewrite union_absorb_r with (r := WCore.sb_delta e (eq a_t)); auto. - rewrite !union_false_r. apply union_more; [reflexivity |]. - arewrite (⦗E_t⦘ ⨾ ext_sb ⨾ ⦗eq e⦘ ≡ ⦗E_t⦘ ⨾ sb_t' ⨾ ⦗eq e⦘). - { unfold sb. rewrite !seqA. seq_rewrite <- !id_inter. - rewrite EQACTS. clear - ENOTIN. basic_solver 11. } - rewrite (WCore.add_event_sb ADD), seq_union_l. - arewrite_false (sb_t ⨾ ⦗eq e⦘). - { clear - ENOTIN. rewrite wf_sbE. basic_solver. } - rewrite union_false_l. unfold WCore.sb_delta. - seq_rewrite <- cross_inter_l. - rewrite set_inter_union_r, 2!set_inter_absorb_l. - all: try now apply CORR. - all: basic_solver 11. } - rewrite !set_union_empty_r. - rewrite <- EQACTS. apply ADD. } *) + { intro FALSO. destruct ADD. + assert (CDD : e = mapper' e). + { unfold mapper'. rewrite upds; vauto. } + rewrite CDD in FALSO. + apply (seq_acts SIMREL) in FALSO. + destruct FALSO as [e' [C1 C2]]. + assert (C1' : E_t e') by vauto. + apply (seq_mapeq SIMREL) in C1; vauto. + { assert (EQQ : e' = e). + { rewrite CDD. rewrite <- C2. vauto. } + subst e'; desf. } + rewrite C2; rewrite <- CDD. + clear - T1 THRDNEQ. intros FALSE; desf. } + admit. } + unfold NW in NEWE. - destruct NEWE as (NINIT & NOTIN & TID). + destruct NEWE as (NINIT & NOTIN & TID & SBEXT). set (G_s' := {| acts_set := mapper' ↑₁ E_t'; @@ -278,7 +239,175 @@ Proof using. { rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } desf. } - { admit. (*TODO : po-work*) } + { unfold sb. unfold G_s'; ins. + split; intros x y COND. + { destruct COND as [CD1 | CD2]. + { destruct CD1 as [x0 [[EQ1 [x' [INE1 M1]]] + [x1 [EXT [EQ2 [y' [INE2 M2]]]]]]]; subst. + unfold collect_rel. exists x', y'; splits; vauto. + unfold seq. exists x'; splits; vauto. + exists y'; splits; vauto. + unfold ext_sb in EXT. + destruct classic with (x' = e) as [EQ | NEQ]. + { subst. destruct e. + { clear - NINIT. desf. } + destruct classic with (thread = t_2) as [EQ | NEQ]. + { subst. clear - TID THRDNEQ. desf. } + unfold mapper' in EXT. rewrite upds in EXT. + destruct y'. + { destruct SIMREL. + clear - EXT seq_init. + unfold upd in EXT. desf. + rewrite seq_init in Heq; desf. } + destruct classic with (thread0 = t_2) as [EQ' | NEQ']. + { subst. destruct ADD. + exfalso. apply T2NOTIN. + apply add_event_threads; vauto. + apply wf_threads with (G := G_t') + (e := (ThreadEvent t_2 index0)); vauto. + admit. (* ??? *) } + desf. unfold upd in Heq. desf. + assert (MIND : index0 = index1). + { rewrite (seq_mapeq SIMREL) in Heq; vauto. + { apply EQACTS in INE2. + clear - INE2 n. + destruct INE2 as [C1 | C2]; vauto. } + intros FALSE. + rewrite <- (seq_tid_1 SIMREL) in FALSE; vauto. + { apply EQACTS in INE2. + clear - INE2 n. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq in NEQ. desf. } + assert (MTID : thread0 = thread1). + { rewrite (seq_mapeq SIMREL) in Heq; vauto. + { apply EQACTS in INE2. + clear - INE2 n. + destruct INE2 as [C1 | C2]; vauto. } + intros FALSE. + rewrite <- (seq_tid_1 SIMREL) in FALSE; vauto. + { apply EQACTS in INE2. + clear - INE2 n. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq in NEQ. desf. } + basic_solver 21. } + unfold mapper' in EXT. rewrite updo in EXT; vauto. + destruct x'. + { destruct SIMREL. + clear - seq_init EXT. + unfold upd in EXT. desf. + { destruct y'. + { rewrite seq_init in Heq0; desf. } + unfold ext_sb; basic_solver. } + destruct y'. + { rewrite seq_init in Heq0; desf. } + unfold ext_sb; basic_solver. } + destruct classic with (thread = t_2) as [EQ' | NEQ']. + { subst. destruct ADD. + exfalso. apply T2NOTIN. + apply add_event_threads; vauto. + apply wf_threads with (G := G_t') + (e := (ThreadEvent t_2 index)); vauto. + admit. (* ??? *) } + destruct classic with (y' = e) as [EQY | NEQY]. + { subst. unfold mapper' in EXT. rewrite upds in EXT. + desf. + { rewrite (seq_mapeq SIMREL) in Heq; vauto. + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + intros FALSE. + rewrite <- (seq_tid_1 SIMREL) in FALSE; vauto. + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq in NEQ'. + unfold tid in NEQ'. destruct SIMREL. + clear - INE1 NEQ' Heq. + admit. (* ?????????????? *) } + destruct classic with (thread0 = t_2) as [EQT | NEQT]. + { subst. destruct ADD. + exfalso. apply T2NOTIN. + apply add_event_threads; vauto. + apply wf_threads with (G := G_t') + (e := (ThreadEvent t_2 index1)); vauto. + { admit. (* ??? *) } + destruct EXT; vauto. } + rewrite (seq_mapeq SIMREL) in Heq; vauto. + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq. basic_solver. } + unfold mapper' in EXT. rewrite updo in EXT; vauto. + destruct y'. + { desf. + { destruct SIMREL. + clear - seq_init Heq0. + rewrite seq_init in Heq0; desf. } + destruct SIMREL. + clear - seq_init Heq0. + rewrite seq_init in Heq0; desf. } + desf. + { (* nothing should map into init *) admit. } + destruct EXT; subst. + destruct classic with (thread2 = t_2) as [EQT | NEQT]. + { subst. + assert (MIND1 : thread = t_1). + { rewrite <- (seq_tid_2 SIMREL) + with (e := (ThreadEvent thread index)); vauto. + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq; vauto. } + assert (MIND2 : thread0 = t_1). + { rewrite <- (seq_tid_2 SIMREL) + with (e := (ThreadEvent thread0 index0)); vauto. + { apply EQACTS in INE2. + clear - INE2 NEQY. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq0; vauto. } + assert (INDLESS : Events.index (ThreadEvent thread index) + < Events.index (ThreadEvent thread0 index0)). + { rewrite (seq_index SIMREL) + with (e := (ThreadEvent thread0 index0)). + { rewrite (seq_index SIMREL) + with (e := (ThreadEvent thread index)). + { rewrite Heq, Heq0. ins. + lia. } + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq; vauto. } + { apply EQACTS in INE2. + clear - INE2 NEQY. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq0; vauto. } + clear - MIND1 MIND2 INDLESS. + unfold ext_sb. basic_solver 21. } + rewrite (seq_mapeq SIMREL) in Heq; vauto. + { rewrite (seq_mapeq SIMREL) in Heq0; vauto. + { apply EQACTS in INE2. + clear - INE2 NEQY. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq0; vauto. } + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq; vauto. } + unfold po_seq in CD2. + change (WCore.G X_s') with G_s' in CD2. + unfold G_s' in CD2. ins. + destruct CD2 as [C1 C2]. + destruct C1 as [TR1 [x0 [IN1 MAP1]]]. + destruct C2 as [TR2 [y0 [IN2 MAP2]]]. + unfold collect_rel. exists x0, y0; splits; vauto. + unfold seq. exists x0; splits; vauto. + exists y0; splits; vauto. + assert (TIDD : tid y0 = t_1). + { admit. } + + + admit. } + admit. } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } unfold mapper'. intros x COND. diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index a09b3b9..65d8b54 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -3,6 +3,7 @@ Require Import Core. Require Import AuxRel AuxRel2. Require Import Srf Rhb. Require Import SimrelCommon. +Require Import SubToFullExec. Require Import StepOps. Require Import AuxInj. Require Import xmm_s_hb. @@ -349,6 +350,9 @@ Proof using. { admit. (* add *) } { admit. (* add? *) } destruct STEP; vauto. } + { admit. } + apply sub_to_full_exec_listless + with (thrdle := thrdle'). all : admit. Admitted. From 3c677cfc77e234d0d6218f4e7a8e2780190064ac Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Thu, 27 Mar 2025 20:29:39 +0100 Subject: [PATCH 17/51] reexec threads_set preservation --- src/xmm/StepOps.v | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/xmm/StepOps.v b/src/xmm/StepOps.v index 7f30ac4..aa919ee 100644 --- a/src/xmm/StepOps.v +++ b/src/xmm/StepOps.v @@ -1001,6 +1001,69 @@ Proof using. eapply xmm_rexec_gen_correct; eauto. Qed. +Lemma guided_thrd_preserve cmt dtrmt + (STEP : WCore.guided_step cmt X (WCore.X_start X dtrmt) X') : + threads_set' ≡₁ threads_set. +Proof using. + unfold WCore.guided_step in STEP. + destruct STEP as (e0 & l0 & COND). + destruct COND. + unfold WCore.add_event in gsg_add_step. + destruct gsg_add_step + as (r & R1 & w & W1 & W2 & gsg_add_step). + destruct gsg_add_step. + rewrite add_event_threads. + reflexivity. +Qed. + +Lemma reex_thrd_preserve f dtrmt cmt thrdle + (STEP : WCore.reexec_gen X X' f dtrmt cmt thrdle) : + threads_set' ≡₁ threads_set. +Proof using. + destruct STEP. + assert (RT : ((WCore.guided_step cmt X')* ≡ (WCore.guided_step cmt X')⁺ ∪ eq)). + { split; intros x y COND. + { assert (RTH : (WCore.guided_step cmt X')* x y <-> x = y \/ (WCore.guided_step cmt X')⁺ x y). + { clear; split; ins; desf; vauto; + induction H; desf; vauto. } + apply RTH in COND. + desf; vauto. } + assert (RTH : (WCore.guided_step cmt X')* x y <-> (WCore.guided_step cmt X')⁺ x y \/ x = y). + { clear; split; ins; desf; vauto; + induction H; desf; vauto. } + unfold union in COND. + apply RTH in COND; vauto. } + apply RT in reexec_steps. + unfold union in reexec_steps. + destruct reexec_steps + as [reexec_steps | reexec_steps]. + { assert (TST : threads_set ≡₁ + Execution.threads_set (WCore.G (WCore.X_start X dtrmt))). + { reflexivity. } + rewrite TST. + apply clos_trans_ind with + (R := WCore.guided_step cmt X') + (a := X') (x := (WCore.X_start X dtrmt)). + { intros x y COND. + unfold WCore.guided_step in COND. + destruct COND as (e0 & l0 & COND). + destruct COND. + unfold WCore.add_event in gsg_add_step. + destruct gsg_add_step + as (r & R1 & w & W1 & W2 & gsg_add_step). + destruct gsg_add_step. + rewrite add_event_threads. + reflexivity. } + { intros x y z COND1 IH1 COND2 IH2. + rewrite IH2; vauto. } + vauto. } + assert (TST : threads_set ≡₁ + Execution.threads_set (WCore.G (WCore.X_start X dtrmt))). + { reflexivity. } + rewrite TST. + rewrite reexec_steps; vauto. +Qed. + End OtherStepInvariants. Lemma xmm_step_correct_ind X1 X2 From fbe59535015400343fe814e3925df650515fc7e5 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:06:01 +0100 Subject: [PATCH 18/51] reexec simrel only wf left --- src/sequentialization/SequentReexec.v | 45 +++++++++++++++++++++------ 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 65d8b54..8474654 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -165,6 +165,7 @@ Definition thrdle' := thrdle ∪ eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq Lemma simrel_step_reex (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) + (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) : exists (X_s' : WCore.t), @@ -189,17 +190,41 @@ Proof using. |}). exists X_s'. split; red. - { constructor; vauto. + { assert (threads_set G_t ≡₁ threads_set G_t') as TSET. + { symmetry. apply reex_thrd_preserve with (f := f_t) + (dtrmt := dtrmt_t) (cmt := cmt_t) + (thrdle := thrdle); vauto. } + constructor; vauto. { intros e INE TIDE. - (* TODO : preserves threads? *) - admit. } - { admit. (* po-work *) } - arewrite (WCore.G X_s' = G_s'). - unfold G_s'. simpls. - rewrite (seq_threads SIMREL). - apply set_union_more; vauto. - (* TODO : preserves threads? *) - all : admit. } + unfold id in TIDE. exfalso. + apply wf_threads in INE; vauto. + { apply TSET in INE; desf. } + admit. (* TODO : add? *) } + { unfold po_seq. + arewrite (WCore.G X_s' = G_s'). + unfold G_s' at 2. simpls. + rewrite collect_rel_id. + rewrite set_collect_id. + arewrite (Tid_ t_2 ∩₁ E_t' ≡₁ ∅). + { split; [|basic_solver]. + intros x [TIDx INE]. + exfalso. + apply wf_threads in INE; vauto. + { apply TSET in INE; desf. } + admit. (* TODO : add? *) } + rewrite cross_false_r. + rewrite union_false_r. + unfold sb. unfold G_s'; ins. + rewrite set_collect_id; vauto. } + { arewrite (WCore.G X_s' = G_s'). + unfold G_s'. simpls. + rewrite (seq_threads SIMREL). + apply set_union_more; vauto. } + all : intros e0 INE TID2. + all : unfold id in TID2; exfalso. + all : apply wf_threads in INE; vauto. + all : try apply TSET in INE; desf. + all : admit. (* TODO : add? *) } unfold WCore.reexec. exists thrdle'. arewrite (cmt' = cmt_t). From fdb930fc6c95b8028b74aef8c3898bb444bc913c Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Thu, 27 Mar 2025 22:09:30 +0100 Subject: [PATCH 19/51] new conditions, simrel for reexec done --- src/sequentialization/SequentBase.v | 19 ++- src/sequentialization/SequentExec.v | 165 ++++++++++++++------------ src/sequentialization/SequentReexec.v | 21 ++-- 3 files changed, 117 insertions(+), 88 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index ffb169b..7994069 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -87,12 +87,13 @@ Record seq_simrel : Prop := { seq_rmw : rmw_s ≡ mapper ↑ rmw_t; seq_threads : threads_set G_s ≡₁ threads_set G_t ∪₁ eq t_2; - seq_ctrl : ctrl_s ≡ ctrl_t; - seq_data : data_s ≡ data_t; - seq_addr : addr_s ≡ addr_t; - seq_rmw_dep : rmw_dep_s ≡ rmw_dep_t; + seq_ctrl : ctrl_s ≡ ∅₂; + seq_data : data_s ≡ ∅₂; + seq_addr : addr_s ≡ ∅₂; + seq_rmw_dep : rmw_dep_s ≡ ∅₂; seq_init : fixset is_init mapper; + seq_init_rev : fixset is_init mappre_rev; seq_codom : mapper ↑₁ E_t ⊆₁ E_s; seq_mapeq : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> mapper e = e; @@ -100,6 +101,14 @@ Record seq_simrel : Prop := { seq_index : forall e : actid, E_t e -> tid (mapper e) = t_2 -> index e = t_1_len + index (mapper e); }. +Record seq_simrel_inv : Prop := { + rsr_Gt_wf : Wf G_t; + rsr_nctrl : ctrl_t ≡ ∅₂; + rsr_ndata : data_t ≡ ∅₂; + rsr_naddr : addr_t ≡ ∅₂; + rsr_nrmw_dep : rmw_dep_t ≡ ∅₂; +}. + End SimRelSeq. Section SeqSimrelInit. @@ -114,6 +123,8 @@ Variable ptc_1 ptc_2 : program_trace. Notation "'G_t'" := (WCore.G X_t). Notation "'G_s'" := (WCore.G X_s). +Hypothesis INV : seq_simrel_inv X_t. + Lemma seq_simrel_init threads (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index fb4890d..e81c627 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -112,6 +112,9 @@ Definition t_12_len := length (ptc_2 t_1). Definition t_1_len := length (ptc_1 t_1). Definition t_2_len := length (ptc_1 t_2). +Hypothesis INV : seq_simrel_inv X_t. +Hypothesis INV' : seq_simrel_inv X_t'. + Lemma simrel_step_e_t1 (T1 : tid e = t_1) (IND: index e < t_1_len) @@ -156,30 +159,27 @@ Proof using. assert (NEWE : << NINIT : ~is_init e >> /\ << NOTIN : ~E_s e >> /\ - << TID : tid e = t_1 >> /\ - << NEWSB : ⦗E_s ∪₁ eq e⦘ ⨾ ext_sb ⨾ ⦗E_s ∪₁ eq e⦘ ≡ - sb_s ∪ WCore.sb_delta e E_s >>). + << TID : tid e = t_1 >>). { unfold NW; splits; vauto. { intro FALSO. unfold is_init in FALSO. unfold tid in T1. clear - T1 FALSO NINIT1. basic_solver. } - { intro FALSO. destruct ADD. - assert (CDD : e = mapper' e). - { unfold mapper'. rewrite upds; vauto. } - rewrite CDD in FALSO. - apply (seq_acts SIMREL) in FALSO. - destruct FALSO as [e' [C1 C2]]. - assert (C1' : E_t e') by vauto. - apply (seq_mapeq SIMREL) in C1; vauto. - { assert (EQQ : e' = e). - { rewrite CDD. rewrite <- C2. vauto. } - subst e'; desf. } - rewrite C2; rewrite <- CDD. - clear - T1 THRDNEQ. intros FALSE; desf. } - admit. } + intro FALSO. destruct ADD. + assert (CDD : e = mapper' e). + { unfold mapper'. rewrite upds; vauto. } + rewrite CDD in FALSO. + apply (seq_acts SIMREL) in FALSO. + destruct FALSO as [e' [C1 C2]]. + assert (C1' : E_t e') by vauto. + apply (seq_mapeq SIMREL) in C1; vauto. + { assert (EQQ : e' = e). + { rewrite CDD. rewrite <- C2. vauto. } + subst e'; desf. } + rewrite C2; rewrite <- CDD. + clear - T1 THRDNEQ. intros FALSE; desf. } unfold NW in NEWE. - destruct NEWE as (NINIT & NOTIN & TID & SBEXT). + destruct NEWE as (NINIT & NOTIN & TID). set (G_s' := {| acts_set := mapper' ↑₁ E_t'; @@ -188,10 +188,10 @@ Proof using. rf := mapper' ↑ rf_t'; co := mapper' ↑ co_t'; rmw := mapper' ↑ rmw_t'; - rmw_dep := rmw_dep_t'; - ctrl := ctrl_t'; - data := data_t'; - addr := addr_t'; + rmw_dep := ∅₂; + ctrl := ∅₂; + data := ∅₂; + addr := ∅₂; |}). set (X_s' := {| WCore.sc := WCore.sc X_s; @@ -265,7 +265,7 @@ Proof using. apply add_event_threads; vauto. apply wf_threads with (G := G_t') (e := (ThreadEvent t_2 index0)); vauto. - admit. (* ??? *) } + apply INV'. } desf. unfold upd in Heq. desf. assert (MIND : index0 = index1). { rewrite (seq_mapeq SIMREL) in Heq; vauto. @@ -307,7 +307,7 @@ Proof using. apply add_event_threads; vauto. apply wf_threads with (G := G_t') (e := (ThreadEvent t_2 index)); vauto. - admit. (* ??? *) } + apply INV'. } destruct classic with (y' = e) as [EQY | NEQY]. { subst. unfold mapper' in EXT. rewrite upds in EXT. desf. @@ -322,15 +322,19 @@ Proof using. destruct INE1 as [C1 | C2]; vauto. } rewrite Heq in NEQ'. unfold tid in NEQ'. destruct SIMREL. - clear - INE1 NEQ' Heq. - admit. (* ?????????????? *) } + assert (HLP : mapper_rev (InitEvent l0) = ThreadEvent thread index). + { rewrite <- Heq. apply MAPREV. + apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite seq_init_rev in HLP; vauto. } destruct classic with (thread0 = t_2) as [EQT | NEQT]. { subst. destruct ADD. exfalso. apply T2NOTIN. apply add_event_threads; vauto. apply wf_threads with (G := G_t') (e := (ThreadEvent t_2 index1)); vauto. - { admit. (* ??? *) } + { apply INV'. } destruct EXT; vauto. } rewrite (seq_mapeq SIMREL) in Heq; vauto. { apply EQACTS in INE1. @@ -347,7 +351,12 @@ Proof using. clear - seq_init Heq0. rewrite seq_init in Heq0; desf. } desf. - { (* nothing should map into init *) admit. } + { assert (HLP : mapper_rev (InitEvent l0) = ThreadEvent thread index). + { rewrite <- Heq. apply MAPREV. + apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite seq_init_rev in HLP; vauto. } destruct EXT; subst. destruct classic with (thread2 = t_2) as [EQT | NEQT]. { subst. @@ -404,17 +413,20 @@ Proof using. exists y0; splits; vauto. assert (TIDD : tid y0 = t_1). { admit. } - - admit. } admit. } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } - unfold mapper'. intros x COND. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. rewrite upds; vauto. } - { rewrite updo; vauto. + { unfold mapper'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. apply (seq_init SIMREL); vauto. } + { unfold mapper_rev'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. + apply (seq_init_rev SIMREL); vauto. } { intros e' INE TID2. destruct classic with (e' = e) as [EQ | NEQ]. { subst e'. unfold mapper'. rewrite upds; vauto. } @@ -521,17 +533,12 @@ Proof using. { apply collect_rel_eq_dom' with (s := E_t); ins. apply (wf_rmwE); vauto. } now rewrite (seq_rmw SIMREL). } - { destruct ADD. rewrite add_event_data. - rewrite (seq_data SIMREL); vauto. } - { destruct ADD. rewrite add_event_addr. - rewrite (seq_addr SIMREL); vauto. } - { destruct ADD. rewrite add_event_ctrl. - rewrite (seq_ctrl SIMREL); vauto. } - { destruct ADD. rewrite add_event_rmw_dep. - rewrite (seq_rmw_dep SIMREL); vauto. } + { rewrite (seq_data SIMREL); vauto. } + { rewrite (seq_addr SIMREL); vauto. } + { rewrite (seq_ctrl SIMREL); vauto. } + { rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } - { destruct ADD. vauto. } - admit. (* TODO : add? *) } + admit. (* wf_s' *) } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -573,7 +580,9 @@ Proof using. { admit. (* TODO : po-work? *) } { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } - all : admit. (* TODO : add? *) + { apply INV'. } + constructor. (* wf_s' *) + all : admit. Admitted. Lemma simrel_step_e_t2 @@ -652,10 +661,10 @@ Proof using. rf := mapper' ↑ rf_t'; co := mapper' ↑ co_t'; rmw := mapper' ↑ rmw_t'; - rmw_dep := rmw_dep_t'; - ctrl := ctrl_t'; - data := data_t'; - addr := addr_t'; + rmw_dep := ∅₂; + ctrl := ∅₂; + data := ∅₂; + addr := ∅₂; |}). set (X_s' := {| WCore.sc := WCore.sc X_s; @@ -730,6 +739,13 @@ Proof using. desf. basic_solver 8. } rewrite updo; vauto. apply (seq_init SIMREL); vauto. } + { unfold mapper_rev'. intros x COND. + destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst x. clear - T1 COND NINIT1. + unfold tid in T1. unfold is_init in COND. + desf. } + rewrite updo; vauto. + apply (seq_init_rev SIMREL); vauto. } { rewrite EQACTS. rewrite set_collect_union. rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } { intros e' INE NTID2. @@ -829,17 +845,12 @@ Proof using. { apply collect_rel_eq_dom' with (s := E_t); ins. apply (wf_rmwE); vauto. } now rewrite (seq_rmw SIMREL). } - { destruct ADD. rewrite add_event_data. - rewrite (seq_data SIMREL); vauto. } - { destruct ADD. rewrite add_event_addr. - rewrite (seq_addr SIMREL); vauto. } - { destruct ADD. rewrite add_event_ctrl. - rewrite (seq_ctrl SIMREL); vauto. } - { destruct ADD. rewrite add_event_rmw_dep. - rewrite (seq_rmw_dep SIMREL); vauto. } + { rewrite (seq_data SIMREL); vauto. } + { rewrite (seq_addr SIMREL); vauto. } + { rewrite (seq_ctrl SIMREL); vauto. } + { rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } - { destruct ADD. vauto. } - admit. (* TODO : add? *) } + admit. (* wf_s' *) } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -881,7 +892,9 @@ Proof using. { admit. (* TODO : po-work? *) } { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } - all : admit. (* TODO : add? *) + { apply INV'. } + constructor. (* wf_s' *) + all : admit. Admitted. Lemma simrel_step_e_else @@ -944,10 +957,10 @@ Proof using. rf := mapper' ↑ rf_t'; co := mapper' ↑ co_t'; rmw := mapper' ↑ rmw_t'; - rmw_dep := rmw_dep_t'; - ctrl := ctrl_t'; - data := data_t'; - addr := addr_t'; + rmw_dep := ∅₂; + ctrl := ∅₂; + data := ∅₂; + addr := ∅₂; |}). set (X_s' := {| WCore.sc := WCore.sc X_s; @@ -1019,6 +1032,11 @@ Proof using. { subst x. rewrite upds; vauto. } rewrite updo; vauto. apply (seq_init SIMREL); vauto. } + { unfold mapper_rev'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. + apply (seq_init_rev SIMREL); vauto. } { intros e' INE NTID2. apply EQACTS in INE. destruct INE as [C1 | C2]. @@ -1130,17 +1148,12 @@ Proof using. { apply collect_rel_eq_dom' with (s := E_t); ins. apply (wf_rmwE); vauto. } now rewrite (seq_rmw SIMREL). } - { destruct ADD. rewrite add_event_data. - rewrite (seq_data SIMREL); vauto. } - { destruct ADD. rewrite add_event_addr. - rewrite (seq_addr SIMREL); vauto. } - { destruct ADD. rewrite add_event_ctrl. - rewrite (seq_ctrl SIMREL); vauto. } - { destruct ADD. rewrite add_event_rmw_dep. - rewrite (seq_rmw_dep SIMREL); vauto. } + { rewrite (seq_data SIMREL); vauto. } + { rewrite (seq_addr SIMREL); vauto. } + { rewrite (seq_ctrl SIMREL); vauto. } + { rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } - { destruct ADD. vauto. } - admit. (* TODO : add? *) } + admit. (* wf_s' *) } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -1182,7 +1195,9 @@ Proof using. { admit. (* TODO : po-work? *) } { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } - all : admit. (* TODO : add? *) + { apply INV'. } + constructor. (* wf_s' *) + all : admit. Admitted. diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 8474654..3fff63c 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -162,6 +162,9 @@ Definition thrdle' := thrdle ∪ eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq ∪ relation_lowering thrdle (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) ∪ relation_lowering thrdle (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1))⁺. *) +Hypothesis INV : seq_simrel_inv X_t. +Hypothesis INV' : seq_simrel_inv X_t'. + Lemma simrel_step_reex (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) @@ -179,10 +182,10 @@ Proof using. rf := id ↑ rf_t'; co := id ↑ co_t'; rmw := id ↑ rmw_t'; - rmw_dep := rmw_dep_t'; - ctrl := ctrl_t'; - data := data_t'; - addr := addr_t'; + rmw_dep := ∅₂; + ctrl := ∅₂; + data := ∅₂; + addr := ∅₂; |}). set (X_s' := {| WCore.sc := WCore.sc X_s; @@ -199,7 +202,7 @@ Proof using. unfold id in TIDE. exfalso. apply wf_threads in INE; vauto. { apply TSET in INE; desf. } - admit. (* TODO : add? *) } + apply INV'. } { unfold po_seq. arewrite (WCore.G X_s' = G_s'). unfold G_s' at 2. simpls. @@ -211,7 +214,7 @@ Proof using. exfalso. apply wf_threads in INE; vauto. { apply TSET in INE; desf. } - admit. (* TODO : add? *) } + apply INV'. } rewrite cross_false_r. rewrite union_false_r. unfold sb. unfold G_s'; ins. @@ -224,7 +227,7 @@ Proof using. all : unfold id in TID2; exfalso. all : apply wf_threads in INE; vauto. all : try apply TSET in INE; desf. - all : admit. (* TODO : add? *) } + all : apply INV'. } unfold WCore.reexec. exists thrdle'. arewrite (cmt' = cmt_t). @@ -372,8 +375,8 @@ Proof using. all : try arewrite (WCore.G X_s' = G_s'). { admit. (* po-work? *) } { admit. (* po-work? *) } - { admit. (* add *) } - { admit. (* add? *) } + { apply INV'. } + { admit. (* wf_s' *) } destruct STEP; vauto. } { admit. } apply sub_to_full_exec_listless From 2e93573bc1803ba87a68c25a1b7f8441d0877340 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 2 Apr 2025 01:28:19 +0200 Subject: [PATCH 20/51] reexec proof drafting --- src/sequentialization/SequentExec.v | 2 -- src/sequentialization/SequentReexec.v | 49 +++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index e81c627..cfa2d01 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -1200,6 +1200,4 @@ Proof using. all : admit. Admitted. - - End SimrelStep. diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 3fff63c..3dab8bc 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -16,7 +16,7 @@ From xmm Require Import ConsistencyMonotonicity. From hahn Require Import Hahn. From hahnExt Require Import HahnExt. -From imm Require Import Events Execution Execution_eco. +From imm Require Import Events Execution Execution_eco SubExecution. Require Import Setoid Morphisms Program.Basics. Open Scope program_scope. @@ -369,18 +369,55 @@ Proof using. rewrite collect_rel_id, set_collect_id, Combinators.compose_id_right. apply rexec_rfc. } - { admit. } - { apply XmmCons.monoton_cons with (G_t := G_t') + { constructor; ins. + { apply sub_WF with (G := G_s) (sc := ∅₂) (sc' := ∅₂). + { ins. + assert (INITDER : (fun a : actid => is_init a) ⊆₁ dtrmt_t). + { admit. } + rewrite INITDER; vauto. } + { admit. (* TODO : Wf G_s *) } + apply restrict_sub; [basic_solver |]. + admit. } + { ins. rewrite set_interA, set_inter_absorb_r. + { constructor; ins. + all : admit. } + admit. + (* assert (REXPFX : SubToFullExec.prefix + (WCore.X_start X_s dtrmt') X_s'). + { constructor; ins. + { arewrite (dtrmt' = dtrmt_t). + { unfold dtrmt'. + rewrite set_collect_id; vauto. } + rewrite set_inter_absorb_r. + { destruct STEP. rewrite dtrmt_init; vauto. } + destruct STEP. rewrite dtrmt_cmt, reexec_embd_dom. + admit. } + all : admit. } *) } + all : admit. } + { assert (SBEQ : sb G_s' ≡ sb_t'). + { unfold sb. unfold G_s'; ins. + clear; basic_solver 8. } + apply XmmCons.monoton_cons with (G_t := G_t') (m := id); vauto. all : try arewrite (WCore.G X_s' = G_s'). - { admit. (* po-work? *) } - { admit. (* po-work? *) } + { unfold rpo. unfold rpo_imm. + arewrite (R G_s' ≡₁ R_t'). + arewrite (F G_s' ≡₁ F G_t'). + arewrite (W G_s' ≡₁ W G_t'). + arewrite (Acq G_s' ≡₁ Acq G_t'). + arewrite (Rlx G_s' ≡₁ Rlx G_t'). + arewrite (Rel G_s' ≡₁ Rel G_t'). + rewrite collect_rel_id. + apply inclusion_t_t. + rewrite SBEQ; vauto. } + { rewrite SBEQ. rewrite collect_rel_id. + unfold same_loc. unfold G_s'; ins. } { apply INV'. } { admit. (* wf_s' *) } destruct STEP; vauto. } { admit. } apply sub_to_full_exec_listless - with (thrdle := thrdle'). + with (thrdle := thrdle'); vauto. all : admit. Admitted. From f22eb8721b8c73ce4dafcf120040522b1d1819bf Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 9 Apr 2025 02:57:41 +0200 Subject: [PATCH 21/51] some problems --- src/sequentialization/SequentBase.v | 5 ++ src/sequentialization/SequentExec.v | 95 +++++++++++++++++++++++---- src/sequentialization/SequentReexec.v | 53 ++++++++++++++- 3 files changed, 137 insertions(+), 16 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index 7994069..f1af1e3 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -99,6 +99,11 @@ Record seq_simrel : Prop := { seq_mapeq : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> mapper e = e; seq_mapto : forall e : actid, E_t e -> tid (mapper e) = t_2 -> mapper e = ThreadEvent t_2 (index e - t_1_len); seq_index : forall e : actid, E_t e -> tid (mapper e) = t_2 -> index e = t_1_len + index (mapper e); + + seq_rest : forall e : actid, ~ E_t e -> mapper e = e; + seq_rest_rev : forall e : actid, ~ E_t e -> mappre_rev e = e; + seq_rlab : forall e : actid, ~ E_t e -> lab_s e = lab_t (mappre_rev e); + seq_rlab_rev : forall e : actid, ~ E_t e -> lab_t e = lab_s (mapper e); }. Record seq_simrel_inv : Prop := { diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index cfa2d01..6cb78ea 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -105,6 +105,7 @@ Notation "'F_s'" := (F G_s). Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. +Hypothesis MAPREVR : eq_dom E_t (mapper ∘ mapper_rev) id. Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. Hypothesis WFT : Wf G_t. @@ -449,20 +450,58 @@ Proof using. apply (seq_mapto SIMREL) in INE'. { rewrite TID; vauto. } rewrite <- MAPEQQ; vauto. } - intros e' INE TID2. + { intros e' INE TID2. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper' in TID2. + rewrite upds in TID2. exfalso. + clear - TID TID2 THRDNEQ. desf. } + assert (INE' : E_t e'). + { apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + assert (MAPEQQ : mapper' e' = mapper e'). + { unfold mapper'. rewrite updo; vauto. } + rewrite MAPEQQ. + apply (seq_index SIMREL) in INE'. + { rewrite TID; vauto. } + rewrite <- MAPEQQ; vauto. } + { intros e' NINE. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_rest SIMREL); vauto. + intros FALSE. apply NINE. + apply EQACTS. unfold set_union. + left; vauto. } + { intros e' NINE. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper_rev'. rewrite upds; vauto. } + unfold mapper_rev'. rewrite updo; vauto. + apply (seq_rest_rev SIMREL); vauto. + intros FALSE. apply NINE. + apply EQACTS. unfold set_union. + left; vauto. } + intros e' NINE. destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper' in TID2. - rewrite upds in TID2. exfalso. - clear - TID TID2 THRDNEQ. desf. } - assert (INE' : E_t e'). - { apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. } - assert (MAPEQQ : mapper' e' = mapper e'). - { unfold mapper'. rewrite updo; vauto. } - rewrite MAPEQQ. - apply (seq_index SIMREL) in INE'. - { rewrite TID; vauto. } - rewrite <- MAPEQQ; vauto. } + { subst e'. unfold mapper_rev'. + unfold compose. unfold mapper'. + rewrite upds; vauto. + rewrite upds; vauto. } + unfold mapper_rev'. unfold compose. + unfold mapper'. rewrite updo; vauto. + { rewrite updo; vauto. + rewrite (seq_rest SIMREL); vauto. + { rewrite (seq_rest_rev SIMREL); vauto. + intros FALSE. apply NINE. + apply EQACTS. unfold set_union. + left; vauto. } + intros FALSE. apply NINE. + apply EQACTS. unfold set_union. + left; vauto. } + rewrite updo; vauto. + rewrite (seq_rest SIMREL); vauto. + intros FALSE. apply NINE. + apply EQACTS. unfold set_union. + left; vauto. } splits. { rewrite <- TID; vauto. } constructor. @@ -486,7 +525,35 @@ Proof using. unfold mapper'. rewrite upds. basic_solver. } { destruct ADD. destruct SIMRELQ. unfold mapper', mapper_rev'. - admit. (* TODO : discuss *) } + apply functional_extensionality; ins. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite !upds. vauto. + rewrite add_event_lab. + unfold compose. rewrite upds. + rewrite upds; vauto. } + rewrite !updo; vauto. + { rewrite add_event_lab. + unfold compose. rewrite updo; vauto. + { destruct SIMREL. + destruct classic with (E_t x) as [INN | NINN]. + { rewrite updo; vauto. + rewrite seq_lab_rev0; vauto. } + rewrite updo; vauto. + rewrite seq_rlab0; vauto. } + rewrite updo; vauto. + destruct classic with (E_t x) as [INN | NINN]. + { destruct SIMREL. + intros FALSE. + assert (STT : mapper (mapper_rev x) = mapper e) + by vauto. + unfold compose in MAPREVR. + rewrite MAPREVR in STT. + { unfold id in STT. + rewrite seq_rest0 in STT; vauto. } + vauto. } + destruct SIMREL. + rewrite seq_rest_rev0; vauto. } + rewrite upds; vauto. } { destruct ADD. rewrite add_event_rf. rewrite !collect_rel_union. arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 3dab8bc..7e06377 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -351,8 +351,57 @@ Proof using. unfold minus_rel in *. admit. } *) - { admit. } - { admit. } + { unfold sb. rewrite !seqA. + rewrite <- !id_inter. + rewrite <- seqA with (r1 := ⦗dtrmt_t⦘). + rewrite <- id_inter. + assert (IND : dtrmt_t ⊆₁ E_t). + { destruct STEP. + rewrite rexec_acts; vauto. } + assert (DDT : E_s ∩₁ dtrmt_t ≡₁ E_t ∩₁ dtrmt_t). + { arewrite (dtrmt_t ≡₁ dtrmt_t ∩₁ E_t). + { basic_solver 8. } + split; [basic_solver 8 |]. + assert (HIN : dtrmt_t ⊆₁ E_s). + { admit. (* TODO : discuss *)} + basic_solver 8. } + rewrite DDT. + arewrite (dtrmt_t ∩₁ E_s ≡₁ dtrmt_t ∩₁ E_t). + { clear - DDT. + rewrite set_interC, DDT. + basic_solver. } + destruct STEP. + intros x y PTH. + destruct PTH as [x0 [[EQ1 INE1] + [x1 [PTH [EQ2 INE2]]]]]. + subst. unfold ext_sb in PTH. + desf. + { destruct SIMREL. + unfold fixset in seq_init_rev. + + transitivity (ext_sb ⨾ ⦗E_t ∩₁ dtrmt_t⦘); + [basic_solver 8|]. + + + basic_solver 8. } + + + + intros x y PTH. + unfold sb in PTH. + rewrite + subst x0. destruct STEP. + assert (YIN : E_t y). + { apply rexec_acts; vauto. } + unfold sb in PTH1. unfold sb. + unfold sb in reexec_dtrmt_sb_closed. + specialize (reexec_dtrmt_sb_closed x y). + + + admit. } + { + + admit. } { admit. } { destruct STEP. destruct reexec_embd_corr. From 8924fa63e4e8e1712b806a55f0946ee0e4a3aa51 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:40:48 +0200 Subject: [PATCH 22/51] reex work --- src/sequentialization/SequentBase.v | 3 + src/sequentialization/SequentReexec.v | 113 +++++---------- src/xmm/StepOps.v | 196 -------------------------- 3 files changed, 35 insertions(+), 277 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index f1af1e3..bb67912 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -81,6 +81,7 @@ Record seq_simrel : Prop := { seq_lab : eq_dom E_t lab_t (lab_s ∘ mapper); seq_lab_rev : eq_dom E_t lab_s (lab_t ∘ mappre_rev); seq_acts : E_s ≡₁ mapper ↑₁ E_t; + seq_acts_rev : E_t ≡₁ mappre_rev ↑₁ E_s; seq_sb : sb_s ∪ po_seq ≡ mapper ↑ sb_t; seq_rf : rf_s ≡ mapper ↑ rf_t; seq_co : co_s ≡ mapper ↑ co_t; @@ -97,6 +98,7 @@ Record seq_simrel : Prop := { seq_codom : mapper ↑₁ E_t ⊆₁ E_s; seq_mapeq : forall e : actid, E_t e -> tid (mapper e) <> t_2 -> mapper e = e; + seq_mapeq_rev : forall e : actid, E_s e -> tid e <> t_2 -> mappre_rev e = e; seq_mapto : forall e : actid, E_t e -> tid (mapper e) = t_2 -> mapper e = ThreadEvent t_2 (index e - t_1_len); seq_index : forall e : actid, E_t e -> tid (mapper e) = t_2 -> index e = t_1_len + index (mapper e); @@ -150,6 +152,7 @@ Proof using. unfold is_init in H. desf. } desf. } { clear; basic_solver. } + { clear; basic_solver. } { rewrite collect_rel_id; split; vauto. unfold po_seq; ins. assert (EMP1 : (fun e : actid => tid e = t_1) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 7e06377..b44a2df 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -149,18 +149,6 @@ Qed. Definition thrdle' := thrdle ∪ eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_2 ∪ eq t_2 × (codom_rel (⦗eq t_1⦘ ⨾ thrdle) \₁ eq t_2) ∪ eq tid_init × codom_rel (thrdle). - (* ∪ relation_lowering thrdle (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) - ∪ relation_lowering thrdle (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) - (* \ (fun x y => x = y). *) - ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) - ∪ eq t_2 × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) - ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_1). *) - -(* Definition thrdle_ohne' := (eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_2 - ∪ eq t_1 × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) - ∪ eq tid_init × codom_rel (thrdle) - ∪ relation_lowering thrdle (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) - ∪ relation_lowering thrdle (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1))⁺. *) Hypothesis INV : seq_simrel_inv X_t. Hypothesis INV' : seq_simrel_inv X_t'. @@ -203,6 +191,7 @@ Proof using. apply wf_threads in INE; vauto. { apply TSET in INE; desf. } apply INV'. } + { unfold X_s'; ins. basic_solver 8. } { unfold po_seq. arewrite (WCore.G X_s' = G_s'). unfold G_s' at 2. simpls. @@ -316,41 +305,9 @@ Proof using. basic_solver 4. } unfold thrdle'. unfold transitive. intros x y z XY YZ. - (* TODO : discuss *) - admit. } admit. } - (* unfold irreflexive. intros x [CD FLS]. - destruct FLS as [FLS _]. - destruct STEP. destruct reexec_sur. - clear - CD FLS surg_order. - unfold strict_partial_order in surg_order. - destruct surg_order as [IRR _]. - destruct IRR with x; vauto. } - unfold irreflexive. intros x [CD FLS]. - destruct FLS as [FLS _]. - destruct STEP. destruct reexec_sur. - clear - CD FLS surg_order. - unfold strict_partial_order in surg_order. - destruct surg_order as [IRR _]. - destruct IRR with x; vauto. } - unfold irreflexive. intros x [CD1 CD2]. - - { unfold thrdle'. - set (tlo := (eq t_2 × eq t_1 - ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_2 - ∪ eq t_1 × (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1) - ∪ eq tid_init × codom_rel thrdle - ∪ relation_lowering thrdle - (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) - ∪ relation_lowering thrdle - (codom_rel (⦗eq t_2⦘ ⨾ thrdle) \₁ eq t_1))). - clear. unfold transitive. - intros x y z XY YZ. - unfold minus_rel in *. - admit. } *) - { unfold sb. rewrite !seqA. rewrite <- !id_inter. rewrite <- seqA with (r1 := ⦗dtrmt_t⦘). @@ -378,30 +335,35 @@ Proof using. desf. { destruct SIMREL. unfold fixset in seq_init_rev. - - transitivity (ext_sb ⨾ ⦗E_t ∩₁ dtrmt_t⦘); - [basic_solver 8|]. - - - basic_solver 8. } - - - - intros x y PTH. - unfold sb in PTH. - rewrite - subst x0. destruct STEP. - assert (YIN : E_t y). - { apply rexec_acts; vauto. } - unfold sb in PTH1. unfold sb. - unfold sb in reexec_dtrmt_sb_closed. - specialize (reexec_dtrmt_sb_closed x y). - - - admit. } - { - - admit. } + assert (TRF : E_t (mapper_rev (InitEvent l))). + { apply seq_acts_rev. + unfold set_collect. + exists (InitEvent l); split; vauto. } + rewrite seq_init_rev in TRF; vauto. + clear - dtrmt_init TRF INE2. + split with (InitEvent l); vauto; split. + { basic_solver 21. } + split with (ThreadEvent thread index); vauto. } + destruct PTH as [EQ IDX]; subst. + assert (TNEQ : thread0 <> t_2). + { intros FALSE. + destruct INE2 as [TID2 _]. + apply wf_threads in TID2; vauto. + admit. (* TODO : add *) } + destruct SIMREL. + destruct INE2 as [TID2 DT2]. + assert (INET : E_t (ThreadEvent thread0 index)). + { apply seq_acts_rev. + unfold set_collect. + exists (ThreadEvent thread0 index); split; vauto. + apply seq_mapeq_rev; vauto. } + destruct reexec_dtrmt_sb_closed with + (ThreadEvent thread0 index) + (ThreadEvent thread0 index0). + { unfold sb. basic_solver 42. } + destruct H as [[EQ CD] PTH]; subst. + basic_solver 42. } + { admit. } { admit. } { destruct STEP. destruct reexec_embd_corr. @@ -422,7 +384,7 @@ Proof using. { apply sub_WF with (G := G_s) (sc := ∅₂) (sc' := ∅₂). { ins. assert (INITDER : (fun a : actid => is_init a) ⊆₁ dtrmt_t). - { admit. } + { destruct STEP; vauto. } rewrite INITDER; vauto. } { admit. (* TODO : Wf G_s *) } apply restrict_sub; [basic_solver |]. @@ -430,18 +392,7 @@ Proof using. { ins. rewrite set_interA, set_inter_absorb_r. { constructor; ins. all : admit. } - admit. - (* assert (REXPFX : SubToFullExec.prefix - (WCore.X_start X_s dtrmt') X_s'). - { constructor; ins. - { arewrite (dtrmt' = dtrmt_t). - { unfold dtrmt'. - rewrite set_collect_id; vauto. } - rewrite set_inter_absorb_r. - { destruct STEP. rewrite dtrmt_init; vauto. } - destruct STEP. rewrite dtrmt_cmt, reexec_embd_dom. - admit. } - all : admit. } *) } + admit. } all : admit. } { assert (SBEQ : sb G_s' ≡ sb_t'). { unfold sb. unfold G_s'; ins. diff --git a/src/xmm/StepOps.v b/src/xmm/StepOps.v index aa919ee..57bfb27 100644 --- a/src/xmm/StepOps.v +++ b/src/xmm/StepOps.v @@ -485,202 +485,6 @@ Proof using. clear - NW. basic_solver. Qed. -Lemma add_event_to_wf_fixed r R1 w W1 W2 - (ININ : is_init ⊆₁ E) - (NEW : ~E e) - (NINIT : ~is_init e) - (NTID : tid e <> tid_init) - (ACTS : E' ≡₁ E ∪₁ eq e) - (THREADS : threads_set' ≡₁ threads_set) - (LAB : eq_dom E' lab' (upd lab e l)) - (RF : rf' ≡ rf ∪ WCore.rf_delta_R e w ∪ WCore.rf_delta_W e R1) - (CO : co' ≡ co ∪ WCore.co_delta e W1 W2) - (RMW : rmw' ≡ rmw ∪ WCore.rmw_delta e r) - (DATA : data' ≡ data) - (ADDR : addr' ≡ addr) - (CTRL : ctrl' ≡ ctrl) - (RMWDEP : rmw_dep' ≡ rmw_dep) - (SB : sb' ≡ sb ∪ WCore.sb_delta e E) - (NCTRL : ctrl' ⊆ ∅₂) - (WF : Wf G') : - WCore.add_event_gen X X' e l r R1 w W1 W2. -Proof using. - assert (WNE : ~ eq_opt w e). - { destruct w as [w|]; ins. - intro FALSO; desf. - apply (rf_irr WF) with e, RF. - clear. basic_solver. } - assert (RNE : ~ eq_opt r e). - { destruct r as [r|]; ins. - intro FALSO; desf. - apply (rmw_irr WF) with e, RMW. - clear. basic_solver. } - assert (W1NE : ~W1 e). - { intros FALSO. - apply (co_irr WF) with e, CO. - clear - FALSO. basic_solver. } - assert (W2NE : ~W2 e). - { intros FALSO. - apply (co_irr WF) with e, CO. - clear - FALSO. basic_solver. } - assert (R1NE : ~R1 e). - { intros FALSO. - apply (rf_irr WF) with e, RF. - clear - FALSO. basic_solver. } - (**) - assert (RF1' : eq_opt w ⊆₁ dom_rel (rf' ⨾ ⦗eq e⦘)). - { rewrite RF. clear. basic_solver 7. } - assert (RF2' : R1 ⊆₁ codom_rel (⦗eq e⦘ ⨾ rf')). - { rewrite RF. clear. basic_solver 7. } - assert (RMW' : eq_opt r ⊆₁ dom_rel (rmw' ⨾ ⦗eq e⦘)). - { rewrite RMW. clear. basic_solver 7. } - assert (CO1' : W1 ⊆₁ codom_rel (⦗eq e⦘ ⨾ co')). - { rewrite CO. clear. basic_solver 7. } - assert (CO2' : W2 ⊆₁ dom_rel (co' ⨾ ⦗eq e⦘)). - { rewrite CO. clear. basic_solver 7. } - (**) - assert (WE' : eq_opt w ⊆₁ E'). - { rewrite RF1', (wf_rfE WF). clear. basic_solver. } - assert (R1E' : R1 ⊆₁ E'). - { rewrite RF2', (wf_rfE WF). clear. basic_solver. } - assert (RE' : eq_opt r ⊆₁ E'). - { rewrite RMW', (wf_rmwE WF). clear. basic_solver. } - assert (W1E' : W1 ⊆₁ E'). - { rewrite CO1', (wf_coE WF). clear. basic_solver. } - assert (W2E' : W2 ⊆₁ E'). - { rewrite CO2', (wf_coE WF). clear. basic_solver. } - (**) - assert (WE : eq_opt w ⊆₁ E). - { rewrite ACTS in WE'. - clear - WNE WE'. unfolder in *. - intros x XEQ. desf. - destruct WE' with x; congruence. } - assert (R1E : R1 ⊆₁ E). - { rewrite ACTS in R1E'. - clear - R1NE R1E'. unfolder in *. - intros x XEQ. - destruct R1E' with x; congruence. } - assert (RE : eq_opt r ⊆₁ E). - { rewrite ACTS in RE'. - clear - RNE RE'. unfolder in *. - intros x XEQ. desf. - destruct RE' with x; congruence. } - assert (W1E : W1 ⊆₁ E). - { rewrite ACTS in W1E'. - clear - W1NE W1E'. unfolder in *. - intros x XEQ. - destruct W1E' with x; congruence. } - assert (W2E : W2 ⊆₁ E). - { rewrite ACTS in W2E'. - clear - W2NE W2E'. unfolder in *. - intros x XEQ. - destruct W2E' with x; congruence. } - clear WE' R1E' RE' W1E' W2E'. - (**) - assert (SUBW : E ∩₁ W' ⊆₁ W). - { clear - LAB NEW ACTS. unfolder. - ins. desf. unfold is_w in *. rewrite LAB in H0. - { rewrite updo in *; congruence. } - apply ACTS. basic_solver 8. } - assert (SUBR : E ∩₁ R' ⊆₁ R). - { clear - LAB NEW ACTS. unfolder. - ins. desf. unfold is_r in *. rewrite LAB in H0. - { rewrite updo in *; congruence. } - apply ACTS. basic_solver 8. } - assert (LOCSET' : (fun x => same_loc' x e) ⊆₁ (fun x => same_loc' e x)). - { clear. unfold same_loc; basic_solver. } - assert (LOCSET : (fun x => same_loc x e) ⊆₁ (fun x => same_loc e x)). - { clear. unfold same_loc; basic_solver. } - assert (SUBLOC : E ∩₁ (fun x => same_loc' e x) ⊆₁ Loc_ (WCore.lab_loc l)). - { clear - NEW LAB ACTS. unfolder. unfold same_loc, loc, WCore.lab_loc. - rewrite LAB. - { intros x (XINE & LOC). - rewrite LAB in LOC. - { rewrite upds, updo in LOC. - { congruence. } - intros FALSE. desf. } - apply ACTS. basic_solver 8. } - apply ACTS. basic_solver 8. } - assert (SUBVAL : E ∩₁ (fun x => same_val' e x) ⊆₁ Val_ (WCore.lab_val l)). - { clear - NEW LAB ACTS. unfolder. unfold same_val, val, WCore.lab_val. - rewrite LAB. - { intros x (XINE & VAL). - rewrite LAB in VAL. - { rewrite upds, updo in VAL. - { congruence. } - intros FALSE. desf. } - apply ACTS. basic_solver 8. } - apply ACTS. basic_solver 8. } - assert (VALSET' : (fun x => same_val' x e) ⊆₁ (fun x => same_val' e x)). - { clear. unfolder. ins. unfold same_val in *. congruence. } - (**) - constructor; ins. - { transitivity (E ∩₁ W'); [| apply SUBW]. - apply set_subset_inter_r. split; [apply WE |]. - rewrite RF1', (wf_rfD WF). clear. basic_solver. } - { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. - apply set_subset_inter_r. split; [apply WE |]. - rewrite RF1', (wf_rfl WF), <- LOCSET'. - clear. basic_solver. } - { transitivity (E ∩₁ (fun x => same_val' e x)); [| apply SUBVAL]. - apply set_subset_inter_r. split; [apply WE |]. - rewrite RF1', <- VALSET'. clear - WF. unfolder. - ins. desf. now apply (wf_rfv WF). } - { transitivity (E ∩₁ R'); [| apply SUBR]. - apply set_subset_inter_r. split; [apply RE |]. - rewrite RMW', (wf_rmwD WF). clear. basic_solver. } - { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. - apply set_subset_inter_r. split; [apply RE |]. - rewrite RMW', (wf_rmwl WF), <- LOCSET'. - clear. basic_solver. } - { transitivity rmw'; [| apply WF]. - rewrite RMW. clear. basic_solver. } - { transitivity (E ∩₁ W'); [| apply SUBW]. - apply set_subset_inter_r. split; [apply W1E |]. - rewrite CO1', (wf_coD WF). clear. basic_solver. } - { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. - apply set_subset_inter_r. split; [apply W1E |]. - rewrite CO1', (wf_col WF), <- LOCSET'. - clear. basic_solver. } - { transitivity (E ∩₁ W'); [| apply SUBW]. - apply set_subset_inter_r. split; [apply W2E |]. - rewrite CO2', (wf_coD WF). clear. basic_solver. } - { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. - apply set_subset_inter_r. split; [apply W2E |]. - rewrite CO2', (wf_col WF), <- LOCSET'. - clear. basic_solver. } - { transitivity (E ∩₁ R'); [| apply SUBR]. - apply set_subset_inter_r. split; [apply R1E |]. - rewrite RF2', (wf_rfD WF). clear. basic_solver. } - { transitivity (E ∩₁ (fun x => same_loc' e x)); [| apply SUBLOC]. - apply set_subset_inter_r. split; [apply R1E |]. - rewrite RF2', (wf_rfl WF), <- LOCSET'. - clear. basic_solver. } - { transitivity (E ∩₁ (fun x => same_val' e x)); [| apply SUBVAL]. - apply set_subset_inter_r. split; [apply R1E |]. - rewrite RF2', <- VALSET'. clear - WF. unfolder. - ins. desf. symmetry. now apply (wf_rfv WF). } - all: try now apply WF. - { apply THREADS, WF, ACTS. now right. } - { enough (EMP : eq_opt w ≡₁ ∅). - { clear - EMP. unfolder in *. desf. - exfalso. eauto. } - split; [| basic_solver]. rewrite RF1', (wf_rfD WF). - clear - NR. basic_solver. } - { split; [| basic_solver]. rewrite RF2', (wf_rfD WF). - clear - NW. basic_solver. } - { enough (EMP : eq_opt r ≡₁ ∅). - { clear - EMP. unfolder in *. desf. - exfalso. eauto. } - split; [| basic_solver]. rewrite RMW', (wf_rmwD WF). - clear - NW. basic_solver. } - { split; [| basic_solver]. rewrite CO1', (wf_coD WF). - clear - NW. basic_solver. } - split; [| basic_solver]. rewrite CO2', (wf_coD WF). - clear - NW. basic_solver. - admit. -Admitted. - Lemma dom_sb_delta s : dom_rel (WCore.sb_delta e s) ≡₁ is_init ∪₁ s ∩₁ same_tid e. From 90941a460a6bf7d6bddda53851e336aef5653fd3 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 16 Apr 2025 03:49:16 +0200 Subject: [PATCH 23/51] reexec simrel almost done --- src/sequentialization/SequentReexec.v | 535 ++++++++++++++++++++++++-- 1 file changed, 502 insertions(+), 33 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index b44a2df..d96ec90 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -159,17 +159,24 @@ Lemma simrel_step_reex (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) : - exists (X_s' : WCore.t), - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 id id ptc_1 >> /\ + exists (X_s' : WCore.t) (mapper' : actid -> actid) (mapper_rev' : actid -> actid), + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ << REX : WCore.reexec X_s X_s' id dtrmt' cmt' >>. Proof using. + + set (mapper' := fun x => if (negb (BinPos.Pos.eqb (tid x) t_1)) then x + else (if Nat.ltb (index x) t_1_len then x + else ThreadEvent t_2 (index x - t_1_len))). + set (mapper_rev' := fun x => if (negb (BinPos.Pos.eqb (tid x) t_2)) then x + else ThreadEvent t_1 (t_1_len + index x)). + set (G_s' := {| - acts_set := id ↑₁ E_t'; + acts_set := mapper' ↑₁ E_t'; threads_set := threads_set G_s; - lab := lab_t' ∘ id; - rf := id ↑ rf_t'; - co := id ↑ co_t'; - rmw := id ↑ rmw_t'; + lab := lab_t' ∘ mapper_rev'; + rf := mapper' ↑ rf_t'; + co := mapper' ↑ co_t'; + rmw := mapper' ↑ rmw_t'; rmw_dep := ∅₂; ctrl := ∅₂; data := ∅₂; @@ -180,43 +187,505 @@ Proof using. WCore.G := G_s'; |}). - exists X_s'. split; red. + exists X_s', mapper', mapper_rev'. split; red. { assert (threads_set G_t ≡₁ threads_set G_t') as TSET. { symmetry. apply reex_thrd_preserve with (f := f_t) (dtrmt := dtrmt_t) (cmt := cmt_t) (thrdle := thrdle); vauto. } + assert (MAPCOMP : eq_dom E_t' (mapper_rev' ∘ mapper') id). + { unfold mapper', mapper_rev'. + unfold eq_dom. intros x INE. + unfold compose. desf; vauto. + { clear - Heq. exfalso. + rewrite Bool.negb_true_iff in *. + apply BinPos.Pos.eqb_neq in Heq; vauto. } + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + clear - Heq INE TSET T2NOTIN INV'. + apply wf_threads in INE; vauto. + { exfalso. apply TSET in INE. + desf. } + apply INV'. } + { clear - Heq Heq0 THRDNEQ. + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq, Heq0. + exfalso. basic_solver. } + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq, Heq0. + clear - Heq Heq0 Heq1 THRDNEQ NINIT1. + destruct x. + { clear - Heq0 NINIT1. + exfalso; desf. } + unfold Events.index in *. + unfold tid in Heq0. subst. + unfold id. + assert (HLP : (t_1_len + (index - t_1_len)) = index). + { lia. } + basic_solver. } constructor; vauto. + { unfold inj_dom. intros x y INX INY MAP. + unfold mapper' in MAP. desf; vauto. + { apply wf_threads in INX. + { unfold tid in INX. + apply TSET in INX. + exfalso. desf. } + apply INV'. } + { apply wf_threads in INX. + { unfold tid in INX. + apply TSET in INX. + exfalso. desf. } + apply INV'. } + { apply wf_threads in INY. + { unfold tid in INY. + apply TSET in INY. + exfalso. desf. } + apply INV'. } + { apply wf_threads in INY. + { unfold tid in INY. + apply TSET in INY. + exfalso. desf. } + apply INV'. } + destruct x, y. + { clear - Heq Heq1 NINIT1. + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq, Heq1. + desf. } + { clear - Heq Heq1 NINIT1. + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq, Heq1. + desf. } + { clear - Heq Heq1 NINIT1. + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq, Heq1. + destruct Heq1. desf. } + clear - Heq Heq1 Heq0 Heq2 H0. + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq, Heq1. + unfold tid in Heq, Heq1. + apply Compare_dec.not_le in Heq0, Heq2. + subst. + assert (INDEQ : index = index0). + { unfold Events.index in *. lia. } + basic_solver. } + { intros e INE TIDE. + unfold mapper' in TIDE. + desf. + { unfold mapper'. desf. } + { unfold mapper'. desf; vauto. } + unfold mapper'. desf. } { intros e INE TIDE. - unfold id in TIDE. exfalso. - apply wf_threads in INE; vauto. - { apply TSET in INE; desf. } - apply INV'. } - { unfold X_s'; ins. basic_solver 8. } + unfold mapper' in TIDE. + desf. + { assert (FLSTID : threads_set G_t' (tid e)). + { apply wf_threads in INE; vauto. + apply INV'. } + clear - FLSTID TSET T2NOTIN. + exfalso. apply TSET in FLSTID. + basic_solver. } + { assert (FLSTID : threads_set G_t' (tid e)). + { apply wf_threads in INE; vauto. + apply INV'. } + rewrite TIDE in FLSTID. + apply TSET in FLSTID. + clear - FLSTID T2NOTIN. + exfalso. desf. } + clear - Heq. + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq; vauto. } + { unfold X_s'; ins. + clear - MAPCOMP. + unfold eq_dom in *. + intros x INE. unfold compose. + apply MAPCOMP in INE. + unfold compose in INE. + rewrite INE. basic_solver. } + { unfold X_s'; ins. + clear - MAPCOMP. + unfold eq_dom in *. + split. + { intros x INE. unfold set_collect. + exists (mapper' x); split; vauto. + apply MAPCOMP in INE. + basic_solver 8. } + intros x INE. unfold set_collect in INE. + destruct INE as [x0 [EQ MAP1]]. + destruct EQ as [x1 [EQ MAP2]]. + subst. + assert (EQ' : E_t' x1) by vauto. + apply MAPCOMP in EQ. + unfold compose in EQ. + rewrite EQ. basic_solver. } { unfold po_seq. arewrite (WCore.G X_s' = G_s'). unfold G_s' at 2. simpls. - rewrite collect_rel_id. - rewrite set_collect_id. - arewrite (Tid_ t_2 ∩₁ E_t' ≡₁ ∅). - { split; [|basic_solver]. - intros x [TIDx INE]. - exfalso. - apply wf_threads in INE; vauto. - { apply TSET in INE; desf. } - apply INV'. } - rewrite cross_false_r. - rewrite union_false_r. + split. + { apply inclusion_union_l. + { unfold sb. unfold G_s'; ins. + rewrite <- collect_rel_eqv. + intros x y PTH. + destruct PTH as [x0 [E1 [xm [PTH E2]]]]. + destruct E1 as [x2 [x3 [[EQ1 INE1] [M1 M2]]]]; subst. + destruct E2 as [x4 [x5 [[EQ2 INE2] [M3 M4]]]]; subst. + unfold collect_rel. + exists x3, x5; split; vauto. + unfold seq. exists x3; split; vauto. + exists x5; split; vauto. + unfold mapper' in PTH. desf; vauto. + { rewrite Bool.negb_false_iff in *. + rewrite Bool.negb_true_iff in *. + apply BinPos.Peqb_true_eq in Heq0. + apply BinPos.Pos.eqb_neq in Heq. + unfold ext_sb in PTH. desf. + { basic_solver. } + unfold ext_sb. desf. + { clear - Heq0 NINIT1. + desf. } + split. + { apply wf_threads in INE1. + { unfold tid in INE1. + apply TSET in INE1. + exfalso. desf. } + apply INV'. } + unfold Events.index in *. + lia. } + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Peqb_true_eq in Heq1. + unfold ext_sb. desf. + { clear - Heq1 NINIT1. + desf. } + split. + { unfold tid in Heq1, Heq; vauto. } + unfold Events.index in *. + lia. } + { rewrite Bool.negb_false_iff in *. + rewrite Bool.negb_true_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Pos.eqb_neq in Heq1. + unfold ext_sb. desf. + unfold ext_sb in PTH. desf. + exfalso. unfold Events.index in *. + apply wf_threads in INE2. + { unfold tid in INE2. + apply TSET in INE2. + exfalso. desf. } + apply INV'. } + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Peqb_true_eq in Heq1. + unfold ext_sb. desf. + unfold tid in *. + unfold Events.index in *. + split; vauto. + unfold ext_sb in PTH. + destruct PTH as [EQ IND]. + desf. } + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Peqb_true_eq in Heq1. + unfold ext_sb. desf. + { unfold tid in *. + clear - Heq NINIT1. desf. } + { unfold tid in *. + clear - Heq1 NINIT1. desf. } + unfold tid in *. + unfold Events.index in *. + split; vauto. + unfold ext_sb in PTH. + destruct PTH as [EQ IND]. + lia. } + intros x y PTH. + destruct PTH as [[T1 [x0 [EQ1 M1]]] + [T2 [x1 [EQ2 M2]]]]. + unfold collect_rel. + exists x0, x1; split; vauto. + unfold sb. unfold seq. + exists x0; split; vauto. + exists x1; split; vauto. + unfold ext_sb. desf. + { unfold mapper' in M2. desf. + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + unfold tid in *. desf. } + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + unfold tid in *. + clear - Heq NINIT1. desf. } + { unfold mapper' in M2. desf. + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + unfold tid in *. desf. } + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + unfold tid in *. + clear - Heq NINIT1. desf. } + unfold mapper' in M2. desf. + { unfold mapper' in T1. desf. + { rewrite Bool.negb_true_iff in *. + apply BinPos.Pos.eqb_neq in Heq. + apply BinPos.Pos.eqb_neq in Heq0. + exfalso; desf. } + { rewrite Bool.negb_false_iff in *. + rewrite Bool.negb_true_iff in *. + apply BinPos.Peqb_true_eq in Heq0. + apply BinPos.Pos.eqb_neq in Heq. + unfold tid in *. + apply wf_threads in EQ2; vauto. + { apply TSET in EQ2. + unfold tid in EQ2. + desf. } + apply INV'. } + rewrite Bool.negb_false_iff in *. + rewrite Bool.negb_true_iff in *. + apply BinPos.Peqb_true_eq in Heq0. + apply BinPos.Pos.eqb_neq in Heq. + unfold tid in *. + desf. } + { unfold mapper' in T1. desf. + { rewrite Bool.negb_true_iff in *. + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Pos.eqb_neq in Heq1. + unfold tid in *. desf. } + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Peqb_true_eq in Heq1. + unfold tid in *. + apply wf_threads in EQ2; vauto. } + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Peqb_true_eq in Heq1. + unfold tid in *. desf. } + unfold mapper' in T1. desf. + { rewrite Bool.negb_false_iff in *. + rewrite Bool.negb_true_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Pos.eqb_neq in Heq1. + unfold tid in *. desf. } + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Peqb_true_eq in Heq1. + unfold tid in *. desf; split; vauto. + unfold Events.index in *. lia. } + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + apply BinPos.Peqb_true_eq in Heq1. + unfold tid in *. split; vauto. + desf. } + intros x y PTH. + destruct PTH as [x0 [x1 [SB [M1 M2]]]]. + unfold sb in SB. + destruct SB as [x2 [[EQ1 INE1] + [x3 [PTH [EQ2 INE2]]]]]; subst. + destruct x2. + { unfold mapper' at 3. + assert (HEQ : negb (BinPos.Pos.eqb (tid (InitEvent l)) t_1) = true). + { rewrite Bool.negb_true_iff. + apply BinPos.Pos.eqb_neq. + unfold tid. clear - NINIT1. + basic_solver. } + rewrite HEQ. left. + unfold sb. unfold G_s'; simpl. + unfold seq. exists (InitEvent l); split; vauto. + { apply collect_rel_eqv. + unfold collect_rel. + exists (InitEvent l ), (InitEvent l); split; vauto. + unfold mapper'. rewrite HEQ; vauto. } + exists (mapper' x1); split; vauto. + unfold mapper'. desf; basic_solver. } + destruct x1. + { unfold ext_sb in PTH; vauto. } + unfold ext_sb in PTH. + destruct PTH as [THRD IND]; subst. + destruct classic with (thread0 = t_1) as [THRD1 | THRD1]. + { destruct classic with (index < t_1_len) as [IND1 | IND1]. + { destruct classic with (index0 < t_1_len) as [IND2 | IND2]. + { unfold mapper'. subst; ins. + left. + assert (HP1 : negb (BinPos.Pos.eqb t_1 t_1) = false). + { rewrite Bool.negb_false_iff. + clear. apply BinPos.Pos.eqb_refl. } + rewrite HP1. + assert (HP2 : Nat.ltb index t_1_len = true). + { apply Compare_dec.leb_correct; lia. } + assert (HP3 : Nat.ltb index0 t_1_len = true). + { apply Compare_dec.leb_correct; lia. } + rewrite HP2, HP3. + unfold sb. unfold G_s'; ins. + unfold seq. exists (ThreadEvent t_1 index); split; vauto. + { apply collect_rel_eqv. + unfold collect_rel. + exists (ThreadEvent t_1 index), + (ThreadEvent t_1 index); splits; vauto. + { unfold mapper'; ins. + rewrite HP1, HP2; vauto. } + unfold mapper'; ins. + rewrite HP1, HP2; vauto. } + exists (ThreadEvent t_1 index0); split; vauto. + apply collect_rel_eqv. + unfold collect_rel. + exists (ThreadEvent t_1 index0), + (ThreadEvent t_1 index0); splits; vauto. + { unfold mapper'; ins. + rewrite HP1, HP3; vauto. } + unfold mapper'; ins. + rewrite HP1, HP3; vauto. } + subst. right. unfold mapper' at 3 4. + unfold tid, Events.index. + unfold tid in *. + assert (HP1 : negb (BinPos.Pos.eqb t_1 t_1) = false). + { rewrite Bool.negb_false_iff. + clear. apply BinPos.Pos.eqb_refl. } + assert (HP2 : Nat.ltb index t_1_len = true). + { apply Compare_dec.leb_correct; lia. } + assert (HP3 : Nat.ltb index0 t_1_len = false). + { apply Compare_dec.leb_correct_conv. lia. } + split; split. + { unfold mapper'. + rewrite HP1, HP2; vauto. } + { unfold set_collect. + exists (ThreadEvent t_1 index); splits; vauto. + unfold mapper'; basic_solver 8. } + { rewrite HP1, HP3; vauto. } + unfold set_collect. exists (ThreadEvent t_1 index0); split; vauto. + unfold mapper'. rewrite HP1. + unfold Events.index. + rewrite HP3; vauto. } + destruct classic with (index0 < t_1_len) as [IND2 | IND2]. + { exfalso. clear - IND IND1 IND2. + apply IND1. lia. } + left. + assert (HP1 : negb (BinPos.Pos.eqb t_1 t_1) = false). + { rewrite Bool.negb_false_iff. + clear. apply BinPos.Pos.eqb_refl. } + assert (HP2 : Nat.ltb index t_1_len = false). + { apply Compare_dec.leb_correct_conv; lia. } + assert (HP3 : Nat.ltb index0 t_1_len = false). + { apply Compare_dec.leb_correct_conv. lia. } + unfold sb. unfold G_s'; ins. + unfold seq. + exists (ThreadEvent t_2 (index - t_1_len)); split. + { apply collect_rel_eqv. + unfold collect_rel. + exists (ThreadEvent thread0 index), + (ThreadEvent thread0 index); splits; vauto. + unfold mapper'. + unfold tid. rewrite HP1. + unfold Events.index. rewrite HP2; vauto. } + exists (ThreadEvent t_2 (index0 - t_1_len)); split. + { clear - IND IND1 IND2. + unfold ext_sb; splits; vauto. + lia. } + apply collect_rel_eqv. + unfold collect_rel. + exists (ThreadEvent thread0 index0), + (ThreadEvent thread0 index0); splits; vauto. + unfold mapper'. unfold tid. + rewrite HP1. unfold Events.index. + rewrite HP3; vauto. } + left. unfold sb. unfold G_s'; ins. - rewrite set_collect_id; vauto. } + unfold seq. exists (ThreadEvent thread0 index); splits; vauto. + { apply collect_rel_eqv. + unfold collect_rel. + exists (ThreadEvent thread0 index), + (ThreadEvent thread0 index); splits; vauto. + unfold mapper'. + assert (HP1 : negb (BinPos.Pos.eqb thread0 t_1) = true). + { rewrite Bool.negb_true_iff. + clear - THRD1. apply BinPos.Pos.eqb_neq; vauto. } + unfold tid. rewrite HP1; vauto. } + exists (ThreadEvent thread0 index0); splits; vauto. + apply collect_rel_eqv. + unfold collect_rel. + exists (ThreadEvent thread0 index0), + (ThreadEvent thread0 index0); splits; vauto. + unfold mapper'. + assert (HP1 : negb (BinPos.Pos.eqb thread0 t_1) = true). + { rewrite Bool.negb_true_iff. + clear - THRD1. apply BinPos.Pos.eqb_neq; vauto. } + unfold tid. rewrite HP1; vauto. } { arewrite (WCore.G X_s' = G_s'). - unfold G_s'. simpls. - rewrite (seq_threads SIMREL). - apply set_union_more; vauto. } - all : intros e0 INE TID2. - all : unfold id in TID2; exfalso. - all : apply wf_threads in INE; vauto. - all : try apply TSET in INE; desf. - all : apply INV'. } + unfold G_s'; ins. rewrite <- TSET. + apply SIMREL. } + { unfold fixset. intros e INIT. + unfold mapper'. + assert (HP : negb (BinPos.Pos.eqb (tid e) t_1) = true). + { rewrite Bool.negb_true_iff. + apply BinPos.Pos.eqb_neq. + unfold tid. unfold is_init in INIT. + clear - INIT NINIT1. basic_solver 8. } + rewrite HP; vauto. } + { unfold fixset. intros e INIT. + unfold mapper_rev'. + assert (HP : negb (BinPos.Pos.eqb (tid e) t_2) = true). + { rewrite Bool.negb_true_iff. + apply BinPos.Pos.eqb_neq. + unfold tid. unfold is_init in INIT. + clear - INIT NINIT2. basic_solver 8. } + rewrite HP; vauto. } + { intros e INE TID2. + unfold mapper'. + desf; vauto. + unfold mapper' in TID2. + rewrite Heq in TID2. + assert (HP1 : Nat.ltb (index e) t_1_len = false). + { apply Compare_dec.not_lt in Heq0. + apply Compare_dec.leb_correct_conv. lia. } + rewrite HP1 in TID2. + exfalso. desf. } + { arewrite (WCore.G X_s' = G_s'). + intros e INE TID2. + unfold mapper_rev'. + desf; vauto. + unfold mapper_rev' in TID2. + rewrite Bool.negb_false_iff in *. + clear - Heq TID2. + exfalso. + apply BinPos.Peqb_true_eq in Heq. + desf. } + { intros e INE TID2. + unfold mapper'. desf. + { unfold mapper' in TID2. + rewrite Heq in TID2. + apply wf_threads in INE. + { rewrite TID2 in INE. + exfalso. apply TSET in INE. desf. } + apply INV'. } + { unfold mapper' in TID2. + rewrite Heq in TID2. + assert (HP : Nat.ltb (index e) t_1_len = true). + { clear - Heq0. + apply Compare_dec.leb_correct; vauto. } + rewrite HP in TID2. + apply wf_threads in INE. + { rewrite TID2 in INE. + exfalso. apply TSET in INE. desf. } + apply INV'. } + basic_solver. } + { intros e INE TID2. + unfold mapper'. desf. + { unfold mapper' in TID2. + rewrite Heq in TID2. + apply wf_threads in INE. + { rewrite TID2 in INE. + exfalso. apply TSET in INE. desf. } + apply INV'. } + { unfold mapper' in TID2. + rewrite Heq in TID2. + assert (HP : Nat.ltb (index e) t_1_len = true). + { clear - Heq0. + apply Compare_dec.leb_correct; vauto. } + rewrite HP in TID2. + apply wf_threads in INE. + { rewrite TID2 in INE. + exfalso. apply TSET in INE. desf. } + apply INV'. } + arewrite (SequentBase.t_1_len t_1 ptc_1 = t_1_len). + arewrite (index (ThreadEvent t_2 (index e - t_1_len)) = index e - t_1_len). + lia. } + all : admit. + (* TODO : discuss *) } unfold WCore.reexec. exists thrdle'. arewrite (cmt' = cmt_t). From 901134854f4c2f4427ddff54ae155b9315eee52b Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 22 Apr 2025 23:20:03 +0200 Subject: [PATCH 24/51] fixes & reexec simrel done --- src/sequentialization/SequentBase.v | 7 +- src/sequentialization/SequentExec.v | 56 +++++++++++----- src/sequentialization/SequentReexec.v | 95 +++++++++++++++++++-------- 3 files changed, 110 insertions(+), 48 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index bb67912..bfd3188 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -79,7 +79,7 @@ Record seq_simrel : Prop := { seq_tid_2 : forall e : actid, E_t e -> tid (mapper e) = t_2 -> tid e = t_1; seq_lab : eq_dom E_t lab_t (lab_s ∘ mapper); - seq_lab_rev : eq_dom E_t lab_s (lab_t ∘ mappre_rev); + seq_lab_rev : eq_dom E_s lab_s (lab_t ∘ mappre_rev); seq_acts : E_s ≡₁ mapper ↑₁ E_t; seq_acts_rev : E_t ≡₁ mappre_rev ↑₁ E_s; seq_sb : sb_s ∪ po_seq ≡ mapper ↑ sb_t; @@ -103,9 +103,8 @@ Record seq_simrel : Prop := { seq_index : forall e : actid, E_t e -> tid (mapper e) = t_2 -> index e = t_1_len + index (mapper e); seq_rest : forall e : actid, ~ E_t e -> mapper e = e; - seq_rest_rev : forall e : actid, ~ E_t e -> mappre_rev e = e; - seq_rlab : forall e : actid, ~ E_t e -> lab_s e = lab_t (mappre_rev e); - seq_rlab_rev : forall e : actid, ~ E_t e -> lab_t e = lab_s (mapper e); + seq_rest_rev : forall e : actid, ~ E_s e -> mappre_rev e = e; + seq_rlab : forall e : actid, ~ E_s e -> lab_s e = lab_t (mappre_rev e); }. Record seq_simrel_inv : Prop := { diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 6cb78ea..7637f60 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -105,7 +105,7 @@ Notation "'F_s'" := (F G_s). Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. -Hypothesis MAPREVR : eq_dom E_t (mapper ∘ mapper_rev) id. +Hypothesis MAPREVR : eq_dom E_s (mapper ∘ mapper_rev) id. Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. Hypothesis WFT : Wf G_t. @@ -240,6 +240,7 @@ Proof using. { rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } desf. } + { admit. } { unfold sb. unfold G_s'; ins. split; intros x y COND. { destruct COND as [CD1 | CD2]. @@ -436,6 +437,7 @@ Proof using. { apply EQACTS in INE. destruct INE as [C1 | C2]; vauto. } unfold mapper' in TID2. rewrite updo in TID2; vauto. } + { admit. } { intros e' INE TID2. destruct classic with (e' = e) as [EQ | NEQ]. { subst e'. unfold mapper' in TID2. @@ -472,28 +474,52 @@ Proof using. intros FALSE. apply NINE. apply EQACTS. unfold set_union. left; vauto. } - { intros e' NINE. - destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper_rev'. rewrite upds; vauto. } - unfold mapper_rev'. rewrite updo; vauto. - apply (seq_rest_rev SIMREL); vauto. - intros FALSE. apply NINE. - apply EQACTS. unfold set_union. - left; vauto. } intros e' NINE. destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper_rev'. rewrite upds; vauto. } + unfold mapper_rev'. rewrite updo; vauto. + apply (seq_rest_rev SIMREL); vauto. + intros FALSE. apply NINE. unfold set_collect. + exists (mapper_rev e'). split. + { apply EQACTS. left. apply MAPREVDOM. + basic_solver. } + unfold mapper'. rewrite updo; vauto. + { apply MAPREVR; vauto. } + intros FLS. + assert (WRG : E_t e). + { apply MAPREVDOM. basic_solver 4. } + desf. } + (* intros e' NINE. + destruct classic with (e' = e) as [EQ | NEQ]. { subst e'. unfold mapper_rev'. unfold compose. unfold mapper'. - rewrite upds; vauto. rewrite upds; vauto. } unfold mapper_rev'. unfold compose. unfold mapper'. rewrite updo; vauto. - { rewrite updo; vauto. + rewrite (seq_rest_rev SIMREL); vauto. + destruct SIMREL. intros FLS. + apply seq_acts in FLS. + destruct FLS as [e'' [C1 C2]]. + admit. } *) + (* { rewrite updo; vauto. rewrite (seq_rest SIMREL); vauto. - { rewrite (seq_rest_rev SIMREL); vauto. + { destruct ADD. rewrite (seq_rest_rev SIMREL); vauto. intros FALSE. apply NINE. apply EQACTS. unfold set_union. left; vauto. } + rewrite add_event_lab. + rewrite updo; vauto. + rewrite updo. + rewrite (seq_rest_rev SIMREL); vauto. + rewrite (seq_rest_rev SIMREL); vauto. + intros FALSE. apply NINE. + apply EQACTS. unfold set_union. + left; vauto. + apply MAPREVDOM. unfold set_collect. + exists (mapper e'). split. + { + + } intros FALSE. apply NINE. apply EQACTS. unfold set_union. left; vauto. } @@ -501,7 +527,7 @@ Proof using. rewrite (seq_rest SIMREL); vauto. intros FALSE. apply NINE. apply EQACTS. unfold set_union. - left; vauto. } + left; vauto. } *) splits. { rewrite <- TID; vauto. } constructor. @@ -535,13 +561,13 @@ Proof using. { rewrite add_event_lab. unfold compose. rewrite updo; vauto. { destruct SIMREL. - destruct classic with (E_t x) as [INN | NINN]. + destruct classic with (E_s x) as [INN | NINN]. { rewrite updo; vauto. rewrite seq_lab_rev0; vauto. } rewrite updo; vauto. rewrite seq_rlab0; vauto. } rewrite updo; vauto. - destruct classic with (E_t x) as [INN | NINN]. + destruct classic with (E_s x) as [INN | NINN]. { destruct SIMREL. intros FALSE. assert (STT : mapper (mapper_rev x) = mapper e) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index d96ec90..241a267 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -164,16 +164,17 @@ Lemma simrel_step_reex << REX : WCore.reexec X_s X_s' id dtrmt' cmt' >>. Proof using. - set (mapper' := fun x => if (negb (BinPos.Pos.eqb (tid x) t_1)) then x + set (mapper' := fun x => ifP (~ E_t' x) then x else + (if (negb (BinPos.Pos.eqb (tid x) t_1)) then x else (if Nat.ltb (index x) t_1_len then x - else ThreadEvent t_2 (index x - t_1_len))). - set (mapper_rev' := fun x => if (negb (BinPos.Pos.eqb (tid x) t_2)) then x - else ThreadEvent t_1 (t_1_len + index x)). + else ThreadEvent t_2 (index x - t_1_len)))). set (G_s' := {| acts_set := mapper' ↑₁ E_t'; threads_set := threads_set G_s; - lab := lab_t' ∘ mapper_rev'; + lab := lab_t' ∘ (fun x => ifP (~ (mapper' ↑₁ E_t') x) then x else + ( if (negb (BinPos.Pos.eqb (tid x) t_2)) then x + else ThreadEvent t_1 (t_1_len + index x))); rf := mapper' ↑ rf_t'; co := mapper' ↑ co_t'; rmw := mapper' ↑ rmw_t'; @@ -187,6 +188,10 @@ Proof using. WCore.G := G_s'; |}). + set (mapper_rev' := fun x => ifP (~ (acts_set G_s') x) then x else + ( if (negb (BinPos.Pos.eqb (tid x) t_2)) then x + else ThreadEvent t_1 (t_1_len + index x))). + exists X_s', mapper', mapper_rev'. split; red. { assert (threads_set G_t ≡₁ threads_set G_t') as TSET. { symmetry. apply reex_thrd_preserve with (f := f_t) @@ -196,9 +201,22 @@ Proof using. { unfold mapper', mapper_rev'. unfold eq_dom. intros x INE. unfold compose. desf; vauto. - { clear - Heq. exfalso. - rewrite Bool.negb_true_iff in *. - apply BinPos.Pos.eqb_neq in Heq; vauto. } + { unfold G_s' in Heq; ins. exfalso. + apply n. unfold set_collect. + exists x; split; vauto. + unfold mapper'. desf; vauto. } + { unfold G_s' in Heq; ins. + apply Bool.negb_true_iff in Heq. + clear - Heq. + apply BinPos.Pos.eqb_neq in Heq. + desf. } + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + unfold tid in *. + apply wf_threads in INE; vauto. + { apply TSET in INE. + exfalso. desf. } + apply INV'. } { rewrite Bool.negb_false_iff in *. apply BinPos.Peqb_true_eq in Heq. clear - Heq INE TSET T2NOTIN INV'. @@ -206,10 +224,6 @@ Proof using. { exfalso. apply TSET in INE. desf. } apply INV'. } - { clear - Heq Heq0 THRDNEQ. - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq, Heq0. - exfalso. basic_solver. } rewrite Bool.negb_false_iff in *. apply BinPos.Peqb_true_eq in Heq, Heq0. clear - Heq Heq0 Heq1 THRDNEQ NINIT1. @@ -293,6 +307,10 @@ Proof using. rewrite Bool.negb_false_iff in *. apply BinPos.Peqb_true_eq in Heq; vauto. } { unfold X_s'; ins. + arewrite ((fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (if negb (BinPos.Pos.eqb (tid x) t_2) + then x else ThreadEvent t_1 (t_1_len + index x))) = mapper_rev'). clear - MAPCOMP. unfold eq_dom in *. intros x INE. unfold compose. @@ -490,7 +508,8 @@ Proof using. { apply collect_rel_eqv. unfold collect_rel. exists (InitEvent l ), (InitEvent l); split; vauto. - unfold mapper'. rewrite HEQ; vauto. } + unfold mapper'. rewrite HEQ; vauto. + split; vauto. clear; basic_solver. } exists (mapper' x1); split; vauto. unfold mapper'. desf; basic_solver. } destruct x1. @@ -520,14 +539,16 @@ Proof using. { unfold mapper'; ins. rewrite HP1, HP2; vauto. } unfold mapper'; ins. - rewrite HP1, HP2; vauto. } + rewrite HP1, HP2; vauto. + clear; basic_solver. } exists (ThreadEvent t_1 index0); split; vauto. apply collect_rel_eqv. unfold collect_rel. exists (ThreadEvent t_1 index0), (ThreadEvent t_1 index0); splits; vauto. { unfold mapper'; ins. - rewrite HP1, HP3; vauto. } + rewrite HP1, HP3; vauto. + clear; basic_solver. } unfold mapper'; ins. rewrite HP1, HP3; vauto. } subst. right. unfold mapper' at 3 4. @@ -542,11 +563,13 @@ Proof using. { apply Compare_dec.leb_correct_conv. lia. } split; split. { unfold mapper'. - rewrite HP1, HP2; vauto. } + rewrite HP1, HP2; vauto. + clear; basic_solver. } { unfold set_collect. exists (ThreadEvent t_1 index); splits; vauto. unfold mapper'; basic_solver 8. } - { rewrite HP1, HP3; vauto. } + { rewrite HP1, HP3; vauto. + desf. } unfold set_collect. exists (ThreadEvent t_1 index0); split; vauto. unfold mapper'. rewrite HP1. unfold Events.index. @@ -571,7 +594,8 @@ Proof using. (ThreadEvent thread0 index); splits; vauto. unfold mapper'. unfold tid. rewrite HP1. - unfold Events.index. rewrite HP2; vauto. } + unfold Events.index. rewrite HP2; vauto. + desf. } exists (ThreadEvent t_2 (index0 - t_1_len)); split. { clear - IND IND1 IND2. unfold ext_sb; splits; vauto. @@ -582,7 +606,8 @@ Proof using. (ThreadEvent thread0 index0); splits; vauto. unfold mapper'. unfold tid. rewrite HP1. unfold Events.index. - rewrite HP3; vauto. } + rewrite HP3; vauto. + desf. } left. unfold sb. unfold G_s'; ins. unfold seq. exists (ThreadEvent thread0 index); splits; vauto. @@ -594,7 +619,8 @@ Proof using. assert (HP1 : negb (BinPos.Pos.eqb thread0 t_1) = true). { rewrite Bool.negb_true_iff. clear - THRD1. apply BinPos.Pos.eqb_neq; vauto. } - unfold tid. rewrite HP1; vauto. } + unfold tid. rewrite HP1; vauto. + desf. } exists (ThreadEvent thread0 index0); splits; vauto. apply collect_rel_eqv. unfold collect_rel. @@ -604,7 +630,8 @@ Proof using. assert (HP1 : negb (BinPos.Pos.eqb thread0 t_1) = true). { rewrite Bool.negb_true_iff. clear - THRD1. apply BinPos.Pos.eqb_neq; vauto. } - unfold tid. rewrite HP1; vauto. } + unfold tid. rewrite HP1; vauto. + desf. } { arewrite (WCore.G X_s' = G_s'). unfold G_s'; ins. rewrite <- TSET. apply SIMREL. } @@ -615,7 +642,7 @@ Proof using. apply BinPos.Pos.eqb_neq. unfold tid. unfold is_init in INIT. clear - INIT NINIT1. basic_solver 8. } - rewrite HP; vauto. } + rewrite HP; vauto; desf. } { unfold fixset. intros e INIT. unfold mapper_rev'. assert (HP : negb (BinPos.Pos.eqb (tid e) t_2) = true). @@ -623,7 +650,8 @@ Proof using. apply BinPos.Pos.eqb_neq. unfold tid. unfold is_init in INIT. clear - INIT NINIT2. basic_solver 8. } - rewrite HP; vauto. } + rewrite HP; vauto. + clear; basic_solver. } { intros e INE TID2. unfold mapper'. desf; vauto. @@ -649,7 +677,9 @@ Proof using. { unfold mapper' in TID2. rewrite Heq in TID2. apply wf_threads in INE. - { rewrite TID2 in INE. + { assert (TID2' : tid e = t_2). + { clear - TID2. basic_solver. } + rewrite <- TID2'. rewrite TID2' in INE. exfalso. apply TSET in INE. desf. } apply INV'. } { unfold mapper' in TID2. @@ -659,7 +689,8 @@ Proof using. apply Compare_dec.leb_correct; vauto. } rewrite HP in TID2. apply wf_threads in INE. - { rewrite TID2 in INE. + { assert (TID2' : tid e = t_2). + { clear - TID2. basic_solver. } exfalso. apply TSET in INE. desf. } apply INV'. } basic_solver. } @@ -668,7 +699,9 @@ Proof using. { unfold mapper' in TID2. rewrite Heq in TID2. apply wf_threads in INE. - { rewrite TID2 in INE. + { assert (TID2' : tid e = t_2). + { clear - TID2. basic_solver. } + rewrite TID2' in INE. exfalso. apply TSET in INE. desf. } apply INV'. } { unfold mapper' in TID2. @@ -678,14 +711,18 @@ Proof using. apply Compare_dec.leb_correct; vauto. } rewrite HP in TID2. apply wf_threads in INE. - { rewrite TID2 in INE. + { assert (TID2' : tid e = t_2). + { clear - TID2. basic_solver. } + rewrite TID2' in INE. exfalso. apply TSET in INE. desf. } apply INV'. } arewrite (SequentBase.t_1_len t_1 ptc_1 = t_1_len). arewrite (index (ThreadEvent t_2 (index e - t_1_len)) = index e - t_1_len). lia. } - all : admit. - (* TODO : discuss *) } + { intros e NINE. + unfold mapper'; desf. } + intros e NINE. + unfold mapper_rev'; desf. } unfold WCore.reexec. exists thrdle'. arewrite (cmt' = cmt_t). From da63c2a1b505d1f676c50bff9126d80c1e53fe2d Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 23 Apr 2025 03:24:05 +0200 Subject: [PATCH 25/51] reexec step work --- src/sequentialization/SequentBase.v | 1 + src/sequentialization/SequentReexec.v | 340 +++++++++++++++++--------- 2 files changed, 226 insertions(+), 115 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index bfd3188..67706dc 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -101,6 +101,7 @@ Record seq_simrel : Prop := { seq_mapeq_rev : forall e : actid, E_s e -> tid e <> t_2 -> mappre_rev e = e; seq_mapto : forall e : actid, E_t e -> tid (mapper e) = t_2 -> mapper e = ThreadEvent t_2 (index e - t_1_len); seq_index : forall e : actid, E_t e -> tid (mapper e) = t_2 -> index e = t_1_len + index (mapper e); + seq_thrd : forall e : actid, E_t e -> tid (mapper e) = t_2 -> tid e = t_1; seq_rest : forall e : actid, ~ E_t e -> mapper e = e; seq_rest_rev : forall e : actid, ~ E_s e -> mappre_rev e = e; diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 241a267..77d3e44 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -115,9 +115,6 @@ Definition t_2_len := length (ptc_1 t_2). (* Definition cmt' := mapper ↑₁ cmt_t. Definition dtrmt' := mapper ↑₁ dtrmt_t. *) -Definition cmt' := id ↑₁ cmt_t. -Definition dtrmt' := id ↑₁ dtrmt_t. - Definition relation_lowering (A : Type) (r : relation A) (P : A -> Prop) : relation A := fun x y => r x y /\ P x /\ P y. @@ -159,7 +156,8 @@ Lemma simrel_step_reex (T2NOTIN : ~ threads_set G_t t_2) (THRDNEQ : t_1 <> t_2) (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) : - exists (X_s' : WCore.t) (mapper' : actid -> actid) (mapper_rev' : actid -> actid), + exists (X_s' : WCore.t) (mapper' : actid -> actid) (mapper_rev' : actid -> actid) + (dtrmt' : actid -> Prop) (cmt' : actid -> Prop), << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ << REX : WCore.reexec X_s X_s' id dtrmt' cmt' >>. Proof using. @@ -192,51 +190,56 @@ Proof using. ( if (negb (BinPos.Pos.eqb (tid x) t_2)) then x else ThreadEvent t_1 (t_1_len + index x))). - exists X_s', mapper', mapper_rev'. split; red. - { assert (threads_set G_t ≡₁ threads_set G_t') as TSET. - { symmetry. apply reex_thrd_preserve with (f := f_t) - (dtrmt := dtrmt_t) (cmt := cmt_t) - (thrdle := thrdle); vauto. } - assert (MAPCOMP : eq_dom E_t' (mapper_rev' ∘ mapper') id). - { unfold mapper', mapper_rev'. - unfold eq_dom. intros x INE. - unfold compose. desf; vauto. - { unfold G_s' in Heq; ins. exfalso. - apply n. unfold set_collect. - exists x; split; vauto. - unfold mapper'. desf; vauto. } - { unfold G_s' in Heq; ins. - apply Bool.negb_true_iff in Heq. - clear - Heq. - apply BinPos.Pos.eqb_neq in Heq. + set (dtrmt' := mapper' ↑₁ dtrmt_t). + set (cmt' := mapper' ↑₁ cmt_t). + + exists X_s', mapper', mapper_rev', dtrmt', cmt'. + assert (threads_set G_t ≡₁ threads_set G_t') as TSET. + { symmetry. apply reex_thrd_preserve with (f := f_t) + (dtrmt := dtrmt_t) (cmt := cmt_t) + (thrdle := thrdle); vauto. } + assert (MAPCOMP : eq_dom E_t' (mapper_rev' ∘ mapper') id). + { unfold mapper', mapper_rev'. + unfold eq_dom. intros x INE. + unfold compose. desf; vauto. + { unfold G_s' in Heq; ins. exfalso. + apply n. unfold set_collect. + exists x; split; vauto. + unfold mapper'. desf; vauto. } + { unfold G_s' in Heq; ins. + apply Bool.negb_true_iff in Heq. + clear - Heq. + apply BinPos.Pos.eqb_neq in Heq. + desf. } + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + unfold tid in *. + apply wf_threads in INE; vauto. + { apply TSET in INE. + exfalso. desf. } + apply INV'. } + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq. + clear - Heq INE TSET T2NOTIN INV'. + apply wf_threads in INE; vauto. + { exfalso. apply TSET in INE. desf. } - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - unfold tid in *. - apply wf_threads in INE; vauto. - { apply TSET in INE. - exfalso. desf. } - apply INV'. } - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - clear - Heq INE TSET T2NOTIN INV'. - apply wf_threads in INE; vauto. - { exfalso. apply TSET in INE. - desf. } - apply INV'. } - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq, Heq0. - clear - Heq Heq0 Heq1 THRDNEQ NINIT1. - destruct x. - { clear - Heq0 NINIT1. - exfalso; desf. } - unfold Events.index in *. - unfold tid in Heq0. subst. - unfold id. - assert (HLP : (t_1_len + (index - t_1_len)) = index). - { lia. } - basic_solver. } - constructor; vauto. + apply INV'. } + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq, Heq0. + clear - Heq Heq0 Heq1 THRDNEQ NINIT1. + destruct x. + { clear - Heq0 NINIT1. + exfalso; desf. } + unfold Events.index in *. + unfold tid in Heq0. subst. + unfold id. + assert (HLP : (t_1_len + (index - t_1_len)) = index). + { lia. } + basic_solver. } + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 + mapper' mapper_rev' ptc_1). + { constructor; vauto. { unfold inj_dom. intros x y INX INY MAP. unfold mapper' in MAP. desf; vauto. { apply wf_threads in INX. @@ -535,7 +538,7 @@ Proof using. { apply collect_rel_eqv. unfold collect_rel. exists (ThreadEvent t_1 index), - (ThreadEvent t_1 index); splits; vauto. + (ThreadEvent t_1 index); splits; vauto. { unfold mapper'; ins. rewrite HP1, HP2; vauto. } unfold mapper'; ins. @@ -545,7 +548,7 @@ Proof using. apply collect_rel_eqv. unfold collect_rel. exists (ThreadEvent t_1 index0), - (ThreadEvent t_1 index0); splits; vauto. + (ThreadEvent t_1 index0); splits; vauto. { unfold mapper'; ins. rewrite HP1, HP3; vauto. clear; basic_solver. } @@ -591,7 +594,7 @@ Proof using. { apply collect_rel_eqv. unfold collect_rel. exists (ThreadEvent thread0 index), - (ThreadEvent thread0 index); splits; vauto. + (ThreadEvent thread0 index); splits; vauto. unfold mapper'. unfold tid. rewrite HP1. unfold Events.index. rewrite HP2; vauto. @@ -603,7 +606,7 @@ Proof using. apply collect_rel_eqv. unfold collect_rel. exists (ThreadEvent thread0 index0), - (ThreadEvent thread0 index0); splits; vauto. + (ThreadEvent thread0 index0); splits; vauto. unfold mapper'. unfold tid. rewrite HP1. unfold Events.index. rewrite HP3; vauto. @@ -614,7 +617,7 @@ Proof using. { apply collect_rel_eqv. unfold collect_rel. exists (ThreadEvent thread0 index), - (ThreadEvent thread0 index); splits; vauto. + (ThreadEvent thread0 index); splits; vauto. unfold mapper'. assert (HP1 : negb (BinPos.Pos.eqb thread0 t_1) = true). { rewrite Bool.negb_true_iff. @@ -625,7 +628,7 @@ Proof using. apply collect_rel_eqv. unfold collect_rel. exists (ThreadEvent thread0 index0), - (ThreadEvent thread0 index0); splits; vauto. + (ThreadEvent thread0 index0); splits; vauto. unfold mapper'. assert (HP1 : negb (BinPos.Pos.eqb thread0 t_1) = true). { rewrite Bool.negb_true_iff. @@ -679,7 +682,7 @@ Proof using. apply wf_threads in INE. { assert (TID2' : tid e = t_2). { clear - TID2. basic_solver. } - rewrite <- TID2'. rewrite TID2' in INE. + rewrite <- TID2'. rewrite TID2' in INE. exfalso. apply TSET in INE. desf. } apply INV'. } { unfold mapper' in TID2. @@ -719,25 +722,73 @@ Proof using. arewrite (SequentBase.t_1_len t_1 ptc_1 = t_1_len). arewrite (index (ThreadEvent t_2 (index e - t_1_len)) = index e - t_1_len). lia. } + { intros e INE COND. + unfold mapper' in COND. desf. + { apply wf_threads in INE. + { exfalso. apply TSET in INE. desf. } + apply INV'. } + { rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq; vauto. } + rewrite Bool.negb_false_iff in *. + apply BinPos.Peqb_true_eq in Heq; vauto. } { intros e NINE. unfold mapper'; desf. } intros e NINE. unfold mapper_rev'; desf. } + split; red. + { apply SIMRELQ. } + + assert (MAPS : forall x y, E_t' x -> E_t y -> + mapper' x = mapper y -> x = y). + { intros x y INX INY MAP. + destruct x. + { destruct y. + { rewrite (seq_init SIMREL) in MAP; vauto. + rewrite (seq_init SIMRELQ) in MAP; vauto. } + rewrite (seq_init SIMRELQ) in MAP; vauto. + assert (FLS : mapper_rev (InitEvent l) = + mapper_rev (mapper (ThreadEvent thread index))). + { rewrite MAP; vauto. } + unfold compose in MAPREV. + rewrite MAPREV in FLS; vauto. + unfold id in FLS. + rewrite (seq_init_rev SIMREL) in FLS; vauto. } + destruct y. + { rewrite (seq_init SIMREL) in MAP; vauto. + assert (FLS : mapper_rev' (mapper' (ThreadEvent thread index)) = + mapper_rev' (InitEvent l)). + { rewrite MAP; vauto. } + unfold compose in MAPCOMP. + rewrite MAPCOMP in FLS; vauto. + unfold id in FLS. + rewrite (seq_init_rev SIMRELQ) in FLS; vauto. } + destruct classic with (tid (mapper (ThreadEvent thread0 index0)) = t_2) + as [TID2 | TID2]. + { unfold mapper' in MAP. + destruct classic with (~ E_t' (ThreadEvent thread index)) as [CND1 | CND1]. + { desf. } + destruct classic with (negb (BinPos.Pos.eqb (tid + (ThreadEvent thread index)) t_1)) as [CND2 | CND2]. + { admit. } + admit. } + admit. } + unfold WCore.reexec. exists thrdle'. - arewrite (cmt' = cmt_t). - { unfold cmt'. - rewrite set_collect_id; vauto. } - arewrite (dtrmt' = dtrmt_t). - { unfold dtrmt'. - rewrite set_collect_id; vauto. } constructor; vauto. - { unfold dtrmt'. destruct STEP. + { unfold dtrmt'. destruct SIMRELQ. + arewrite ((fun a : actid => is_init a) ⊆₁ + mapper' ↑₁ (fun a : actid => is_init a)). + { clear- seq_init. + unfold fixset in seq_init. + basic_solver. } + destruct STEP. rewrite dtrmt_init; vauto. } - { exact (WCore.dtrmt_cmt STEP). } - { destruct STEP. + { unfold dtrmt', cmt'. + rewrite (WCore.dtrmt_cmt STEP); vauto. } + { destruct STEP. unfold cmt'. arewrite (WCore.G X_s' = G_s'). - unfold G_s'. simpls. unfold cmt'. + unfold G_s'. simpls. basic_solver 8. } { constructor. { destruct STEP. destruct reexec_sur. @@ -816,59 +867,109 @@ Proof using. admit. } { unfold sb. rewrite !seqA. rewrite <- !id_inter. - rewrite <- seqA with (r1 := ⦗dtrmt_t⦘). + rewrite <- seqA with (r1 := ⦗dtrmt'⦘). rewrite <- id_inter. - assert (IND : dtrmt_t ⊆₁ E_t). - { destruct STEP. - rewrite rexec_acts; vauto. } - assert (DDT : E_s ∩₁ dtrmt_t ≡₁ E_t ∩₁ dtrmt_t). - { arewrite (dtrmt_t ≡₁ dtrmt_t ∩₁ E_t). - { basic_solver 8. } - split; [basic_solver 8 |]. - assert (HIN : dtrmt_t ⊆₁ E_s). - { admit. (* TODO : discuss *)} - basic_solver 8. } - rewrite DDT. - arewrite (dtrmt_t ∩₁ E_s ≡₁ dtrmt_t ∩₁ E_t). - { clear - DDT. - rewrite set_interC, DDT. - basic_solver. } - destruct STEP. + unfold dtrmt'. destruct SIMREL. + rewrite seq_acts. intros x y PTH. - destruct PTH as [x0 [[EQ1 INE1] - [x1 [PTH [EQ2 INE2]]]]]. - subst. unfold ext_sb in PTH. - desf. - { destruct SIMREL. - unfold fixset in seq_init_rev. - assert (TRF : E_t (mapper_rev (InitEvent l))). - { apply seq_acts_rev. - unfold set_collect. - exists (InitEvent l); split; vauto. } - rewrite seq_init_rev in TRF; vauto. - clear - dtrmt_init TRF INE2. - split with (InitEvent l); vauto; split. - { basic_solver 21. } - split with (ThreadEvent thread index); vauto. } - destruct PTH as [EQ IDX]; subst. - assert (TNEQ : thread0 <> t_2). - { intros FALSE. - destruct INE2 as [TID2 _]. - apply wf_threads in TID2; vauto. - admit. (* TODO : add *) } - destruct SIMREL. - destruct INE2 as [TID2 DT2]. - assert (INET : E_t (ThreadEvent thread0 index)). - { apply seq_acts_rev. + destruct PTH as [x0 [[EQ1 IN1] + [x1 [PTH [EQ2 [IN2 IN3]]]]]]. + destruct IN1 as [x2 [IN1 M1]]. + destruct IN2 as [x3 [IN2 M2]]. + subst. + unfold seq. exists (mapper x2); split. + { red; split; vauto. + split; [| basic_solver]. + destruct STEP. + destruct reexec_dtrmt_sb_closed with + (x := x2) (y := x3). + { unfold seq. exists x3; split. + { destruct x2. + { unfold sb. + unfold seq; exists (InitEvent l); split; vauto. + exists x3; split; vauto. + unfold ext_sb. desf. + rewrite !seq_init in PTH; vauto. } + destruct classic with (tid (mapper + (ThreadEvent thread index)) = t_2) as [TID2 | TID2]. + { rewrite seq_mapto in PTH. + { destruct x3. + { rewrite !seq_init in PTH; vauto. } + destruct classic with (tid (mapper + (ThreadEvent thread0 index0)) = t_2) as [TID2' | TID2']. + { rewrite seq_mapto in PTH. + { assert (TD1 : thread = t_1). + { apply seq_thrd in TID2; vauto. } + assert (TD2 : thread0 = t_1). + { apply seq_thrd in TID2'; vauto. } + clear - PTH IN1 IN2 TID2 TID2' TD1 TD2. + unfold sb. unfold seq. + exists (ThreadEvent thread index); split; vauto. + exists (ThreadEvent t_1 index0); split; vauto. + unfold ext_sb. desf; split; vauto. + unfold ext_sb in PTH. desf. + unfold Events.index in *. lia. } + all : vauto. } + clear - TID2 TID2' PTH IN1 IN2. + unfold sb. unfold seq. + exists (ThreadEvent thread index); split; vauto. + exists (ThreadEvent thread0 index0); split; vauto. + unfold ext_sb in *. + unfold tid in *. + desf; desf. } + all : vauto. } + destruct x3. + { exfalso. + assert (HLP : mapper (InitEvent l) + = InitEvent l). + { rewrite seq_init; vauto. } + rewrite HLP in PTH. + clear - PTH. + unfold ext_sb in PTH. + desf. } + destruct classic with (tid (mapper + (ThreadEvent thread0 index0)) = t_2) as [TID2' | TID2']. + { clear - TID2 TID2' PTH IN1 IN2 seq_init seq_init_rev MAPREV. + unfold sb. unfold seq. + exists (ThreadEvent thread index); split; vauto. + exists (ThreadEvent thread0 index0); split; vauto. + exfalso. unfold ext_sb in *. + unfolder. desf. + { assert (Heqq : mapper_rev (mapper (ThreadEvent thread index)) = + mapper_rev (InitEvent l)). + { rewrite Heq; vauto. } + unfold compose in MAPREV. + rewrite MAPREV in Heqq; vauto. + unfold id in Heqq. + rewrite seq_init_rev in Heqq; vauto. } + unfold tid in *. desf. } + assert (EQQ1 : mapper (ThreadEvent thread index) = + ThreadEvent thread index). + { rewrite seq_mapeq; vauto. } + assert (EQQ2 : mapper (ThreadEvent thread0 index0) = + ThreadEvent thread0 index0). + { rewrite seq_mapeq; vauto. } + rewrite EQQ1, EQQ2 in PTH. + unfold sb. unfold seq. + exists (ThreadEvent thread index); split; vauto. } + red; split; vauto. + unfold set_collect in IN3. + destruct IN3 as [x4 [IN3 EQ]]. + assert (IN4 : E_t' x4). + { apply dtrmt_cmt, reexec_embd_dom in IN3; vauto. } + unfold mapper' in EQ. + apply MAPS in EQ; vauto. } unfold set_collect. - exists (ThreadEvent thread0 index); split; vauto. - apply seq_mapeq_rev; vauto. } - destruct reexec_dtrmt_sb_closed with - (ThreadEvent thread0 index) - (ThreadEvent thread0 index0). - { unfold sb. basic_solver 42. } - destruct H as [[EQ CD] PTH]; subst. - basic_solver 42. } + exists x2; split. + { destruct H as [DT _]. + red in DT. basic_solver 4. } + destruct x2. + { rewrite seq_init; vauto. + destruct SIMRELQ. + rewrite seq_init0; vauto. } + admit. } + exists (mapper x3); split; vauto. + red; split; vauto. } { admit. } { admit. } { destruct STEP. @@ -883,6 +984,15 @@ Proof using. { destruct STEP. unfold rf_complete. arewrite (WCore.G X_s' = G_s'). unfold G_s'. simpls. + arewrite ((fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (if + negb + (BinPos.Pos.eqb (tid x) t_2) + then x + else + ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev'). rewrite collect_rel_id, set_collect_id, Combinators.compose_id_right. apply rexec_rfc. } From 6228c3a3ac24f7e7ecfa570d2defc311ea3a3695 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 29 Apr 2025 02:56:30 +0200 Subject: [PATCH 26/51] new def rework --- src/sequentialization/SequentReexec.v | 520 ++++++++++---------------- 1 file changed, 207 insertions(+), 313 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 77d3e44..9001456 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -163,15 +163,15 @@ Lemma simrel_step_reex Proof using. set (mapper' := fun x => ifP (~ E_t' x) then x else - (if (negb (BinPos.Pos.eqb (tid x) t_1)) then x - else (if Nat.ltb (index x) t_1_len then x + (ifP ((tid x) <> t_1) then x + else (ifP index x < t_1_len then x else ThreadEvent t_2 (index x - t_1_len)))). set (G_s' := {| acts_set := mapper' ↑₁ E_t'; threads_set := threads_set G_s; lab := lab_t' ∘ (fun x => ifP (~ (mapper' ↑₁ E_t') x) then x else - ( if (negb (BinPos.Pos.eqb (tid x) t_2)) then x + ( ifP ((tid x) <> t_2) then x else ThreadEvent t_1 (t_1_len + index x))); rf := mapper' ↑ rf_t'; co := mapper' ↑ co_t'; @@ -187,7 +187,7 @@ Proof using. |}). set (mapper_rev' := fun x => ifP (~ (acts_set G_s') x) then x else - ( if (negb (BinPos.Pos.eqb (tid x) t_2)) then x + ( ifP ((tid x) <> t_2) then x else ThreadEvent t_1 (t_1_len + index x))). set (dtrmt' := mapper' ↑₁ dtrmt_t). @@ -202,37 +202,29 @@ Proof using. { unfold mapper', mapper_rev'. unfold eq_dom. intros x INE. unfold compose. desf; vauto. - { unfold G_s' in Heq; ins. exfalso. + { exfalso. apply n. unfold set_collect. exists x; split; vauto. unfold mapper'. desf; vauto. } - { unfold G_s' in Heq; ins. - apply Bool.negb_true_iff in Heq. - clear - Heq. - apply BinPos.Pos.eqb_neq in Heq. - desf. } - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. + { unfold not in n0. apply NNPP in n0. unfold tid in *. apply wf_threads in INE; vauto. { apply TSET in INE. exfalso. desf. } apply INV'. } - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - clear - Heq INE TSET T2NOTIN INV'. + { unfold not in n0. apply NNPP in n0. + clear - n0 INE TSET T2NOTIN INV'. apply wf_threads in INE; vauto. { exfalso. apply TSET in INE. desf. } apply INV'. } - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq, Heq0. - clear - Heq Heq0 Heq1 THRDNEQ NINIT1. + unfold not in n0, n2. apply NNPP in n0, n2. + clear - n0 n2 n3 THRDNEQ NINIT1. destruct x. - { clear - Heq0 NINIT1. + { clear - n2 NINIT1. exfalso; desf. } unfold Events.index in *. - unfold tid in Heq0. subst. + unfold tid in n0. subst. unfold id. assert (HLP : (t_1_len + (index - t_1_len)) = index). { lia. } @@ -263,24 +255,19 @@ Proof using. exfalso. desf. } apply INV'. } destruct x, y. - { clear - Heq Heq1 NINIT1. - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq, Heq1. + { clear - n0 n3 NINIT1. + unfold not in n0, n3. apply NNPP in n0, n3. desf. } - { clear - Heq Heq1 NINIT1. - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq, Heq1. + { clear - n0 n3 NINIT1. + unfold not in n0, n3. apply NNPP in n0, n3. desf. } - { clear - Heq Heq1 NINIT1. - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq, Heq1. - destruct Heq1. desf. } - clear - Heq Heq1 Heq0 Heq2 H0. - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq, Heq1. - unfold tid in Heq, Heq1. - apply Compare_dec.not_le in Heq0, Heq2. - subst. + { clear - n0 n3 NINIT1. + unfold not in n0, n3. apply NNPP in n0, n3. + destruct n3. desf. } + clear - n0 n3 n1 n4 H0. + unfold not in n0, n3. + apply NNPP in n0, n3. + unfold tid in n0, n3. assert (INDEQ : index = index0). { unfold Events.index in *. lia. } basic_solver. } @@ -288,8 +275,7 @@ Proof using. unfold mapper' in TIDE. desf. { unfold mapper'. desf. } - { unfold mapper'. desf; vauto. } - unfold mapper'. desf. } + unfold mapper'. desf; vauto. } { intros e INE TIDE. unfold mapper' in TIDE. desf. @@ -302,18 +288,23 @@ Proof using. { assert (FLSTID : threads_set G_t' (tid e)). { apply wf_threads in INE; vauto. apply INV'. } - rewrite TIDE in FLSTID. + unfold not in n0. + apply NNPP in n0. + rewrite n0 in FLSTID. apply TSET in FLSTID. - clear - FLSTID T2NOTIN. + clear - FLSTID T2NOTIN n0. exfalso. desf. } - clear - Heq. - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq; vauto. } + clear - n0. + unfold not in n0. + apply NNPP in n0. + desf. } { unfold X_s'; ins. arewrite ((fun x : actid => - ifP ~ (mapper' ↑₁ E_t') x then x - else (if negb (BinPos.Pos.eqb (tid x) t_2) - then x else ThreadEvent t_1 (t_1_len + index x))) = mapper_rev'). + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else + ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev'). clear - MAPCOMP. unfold eq_dom in *. intros x INE. unfold compose. @@ -352,14 +343,12 @@ Proof using. unfold seq. exists x3; split; vauto. exists x5; split; vauto. unfold mapper' in PTH. desf; vauto. - { rewrite Bool.negb_false_iff in *. - rewrite Bool.negb_true_iff in *. - apply BinPos.Peqb_true_eq in Heq0. - apply BinPos.Pos.eqb_neq in Heq. + { unfold not in n2. + apply NNPP in n2. unfold ext_sb in PTH. desf. { basic_solver. } unfold ext_sb. desf. - { clear - Heq0 NINIT1. + { clear - n2 NINIT1. desf. } split. { apply wf_threads in INE1. @@ -369,20 +358,17 @@ Proof using. apply INV'. } unfold Events.index in *. lia. } - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Peqb_true_eq in Heq1. + { unfold not in n2, n0. + apply NNPP in n2, n0. unfold ext_sb. desf. - { clear - Heq1 NINIT1. + { clear - n2 NINIT1. desf. } split. - { unfold tid in Heq1, Heq; vauto. } + { unfold tid in n2, n0; vauto. } unfold Events.index in *. lia. } - { rewrite Bool.negb_false_iff in *. - rewrite Bool.negb_true_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Pos.eqb_neq in Heq1. + { unfold not in n0. + apply NNPP in n0. unfold ext_sb. desf. unfold ext_sb in PTH. desf. exfalso. unfold Events.index in *. @@ -391,9 +377,8 @@ Proof using. apply TSET in INE2. exfalso. desf. } apply INV'. } - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Peqb_true_eq in Heq1. + { unfold not in n0, n3. + apply NNPP in n0, n3. unfold ext_sb. desf. unfold tid in *. unfold Events.index in *. @@ -401,14 +386,13 @@ Proof using. unfold ext_sb in PTH. destruct PTH as [EQ IND]. desf. } - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Peqb_true_eq in Heq1. + unfold not in n0, n3. + apply NNPP in n0, n3. unfold ext_sb. desf. { unfold tid in *. - clear - Heq NINIT1. desf. } + clear - n0 NINIT1. desf. } { unfold tid in *. - clear - Heq1 NINIT1. desf. } + clear - n3 NINIT1. desf. } unfold tid in *. unfold Events.index in *. split; vauto. @@ -425,74 +409,41 @@ Proof using. exists x1; split; vauto. unfold ext_sb. desf. { unfold mapper' in M2. desf. - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - unfold tid in *. desf. } - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. + unfold not in n0. + apply NNPP in n0. unfold tid in *. - clear - Heq NINIT1. desf. } + clear - n0 NINIT1. desf. } { unfold mapper' in M2. desf. - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - unfold tid in *. desf. } - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. + unfold not in n0. + apply NNPP in n0. unfold tid in *. - clear - Heq NINIT1. desf. } + clear - n0 NINIT1. desf. } unfold mapper' in M2. desf. { unfold mapper' in T1. desf. - { rewrite Bool.negb_true_iff in *. - apply BinPos.Pos.eqb_neq in Heq. - apply BinPos.Pos.eqb_neq in Heq0. - exfalso; desf. } - { rewrite Bool.negb_false_iff in *. - rewrite Bool.negb_true_iff in *. - apply BinPos.Peqb_true_eq in Heq0. - apply BinPos.Pos.eqb_neq in Heq. - unfold tid in *. - apply wf_threads in EQ2; vauto. - { apply TSET in EQ2. - unfold tid in EQ2. - desf. } - apply INV'. } - rewrite Bool.negb_false_iff in *. - rewrite Bool.negb_true_iff in *. - apply BinPos.Peqb_true_eq in Heq0. - apply BinPos.Pos.eqb_neq in Heq. + unfold not in n2. + apply NNPP in n2. unfold tid in *. - desf. } + apply wf_threads in EQ2; vauto. + { apply TSET in EQ2. + unfold tid in EQ2. + desf. } + apply INV'. } { unfold mapper' in T1. desf. - { rewrite Bool.negb_true_iff in *. - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Pos.eqb_neq in Heq1. + { unfold not in n0, n2. + apply NNPP in n0, n2. unfold tid in *. desf. } - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Peqb_true_eq in Heq1. - unfold tid in *. - apply wf_threads in EQ2; vauto. } - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Peqb_true_eq in Heq1. + unfold not in n0, n2. + apply NNPP in n0, n2. unfold tid in *. desf. } unfold mapper' in T1. desf. - { rewrite Bool.negb_false_iff in *. - rewrite Bool.negb_true_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Pos.eqb_neq in Heq1. - unfold tid in *. desf. } - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Peqb_true_eq in Heq1. - unfold tid in *. desf; split; vauto. - unfold Events.index in *. lia. } - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq. - apply BinPos.Peqb_true_eq in Heq1. - unfold tid in *. split; vauto. - desf. } + { unfold not in n0, n2. + apply NNPP in n0, n2. + unfold tid in *. desf. + split; vauto. unfold Events.index in *. + lia. } + unfold not in n0, n2. + apply NNPP in n0, n2. + unfold tid in *. desf. } intros x y PTH. destruct PTH as [x0 [x1 [SB [M1 M2]]]]. unfold sb in SB. @@ -500,21 +451,30 @@ Proof using. [x3 [PTH [EQ2 INE2]]]]]; subst. destruct x2. { unfold mapper' at 3. - assert (HEQ : negb (BinPos.Pos.eqb (tid (InitEvent l)) t_1) = true). - { rewrite Bool.negb_true_iff. - apply BinPos.Pos.eqb_neq. - unfold tid. clear - NINIT1. - basic_solver. } - rewrite HEQ. left. - unfold sb. unfold G_s'; simpl. - unfold seq. exists (InitEvent l); split; vauto. - { apply collect_rel_eqv. - unfold collect_rel. - exists (InitEvent l ), (InitEvent l); split; vauto. - unfold mapper'. rewrite HEQ; vauto. - split; vauto. clear; basic_solver. } - exists (mapper' x1); split; vauto. - unfold mapper'. desf; basic_solver. } + desf. all : left. + { unfold sb, G_s'; simpl. + unfold seq; exists (InitEvent l); split; vauto. + { red; split; vauto. + unfold set_collect. + exists (InitEvent l); split; vauto. + unfold mapper'. desf; vauto. } + exists (mapper' x1); split; vauto. + unfold ext_sb. desf. + unfold mapper' in Heq. desf. } + { unfold sb, G_s'; simpl. + unfold seq; exists (InitEvent l); split; vauto. + { red; split; vauto. + unfold set_collect. + exists (InitEvent l); split; vauto. + unfold mapper'. desf; vauto. } + exists (mapper' x1); split; vauto. + unfold ext_sb. desf. + unfold mapper' in Heq. desf. } + unfold not in n0. + apply NNPP in n0. + unfold tid in *. + clear - n0 NINIT1. + symmetry in n0. desf. } destruct x1. { unfold ext_sb in PTH; vauto. } unfold ext_sb in PTH. @@ -523,93 +483,49 @@ Proof using. { destruct classic with (index < t_1_len) as [IND1 | IND1]. { destruct classic with (index0 < t_1_len) as [IND2 | IND2]. { unfold mapper'. subst; ins. - left. - assert (HP1 : negb (BinPos.Pos.eqb t_1 t_1) = false). - { rewrite Bool.negb_false_iff. - clear. apply BinPos.Pos.eqb_refl. } - rewrite HP1. - assert (HP2 : Nat.ltb index t_1_len = true). - { apply Compare_dec.leb_correct; lia. } - assert (HP3 : Nat.ltb index0 t_1_len = true). - { apply Compare_dec.leb_correct; lia. } - rewrite HP2, HP3. - unfold sb. unfold G_s'; ins. + left. desf. + unfold sb. + unfold G_s'; ins. unfold seq. exists (ThreadEvent t_1 index); split; vauto. - { apply collect_rel_eqv. - unfold collect_rel. - exists (ThreadEvent t_1 index), - (ThreadEvent t_1 index); splits; vauto. - { unfold mapper'; ins. - rewrite HP1, HP2; vauto. } - unfold mapper'; ins. - rewrite HP1, HP2; vauto. - clear; basic_solver. } + { red. split; vauto. + unfold set_collect. + exists (ThreadEvent t_1 index); split; vauto. + unfold mapper'. desf; vauto. } exists (ThreadEvent t_1 index0); split; vauto. - apply collect_rel_eqv. - unfold collect_rel. - exists (ThreadEvent t_1 index0), - (ThreadEvent t_1 index0); splits; vauto. - { unfold mapper'; ins. - rewrite HP1, HP3; vauto. - clear; basic_solver. } - unfold mapper'; ins. - rewrite HP1, HP3; vauto. } + red. split; vauto. + unfold set_collect. + exists (ThreadEvent t_1 index0); split; vauto. + unfold mapper'. desf; vauto. } subst. right. unfold mapper' at 3 4. unfold tid, Events.index. unfold tid in *. - assert (HP1 : negb (BinPos.Pos.eqb t_1 t_1) = false). - { rewrite Bool.negb_false_iff. - clear. apply BinPos.Pos.eqb_refl. } - assert (HP2 : Nat.ltb index t_1_len = true). - { apply Compare_dec.leb_correct; lia. } - assert (HP3 : Nat.ltb index0 t_1_len = false). - { apply Compare_dec.leb_correct_conv. lia. } - split; split. - { unfold mapper'. - rewrite HP1, HP2; vauto. - clear; basic_solver. } + desf. split; split; vauto. { unfold set_collect. - exists (ThreadEvent t_1 index); splits; vauto. - unfold mapper'; basic_solver 8. } - { rewrite HP1, HP3; vauto. - desf. } - unfold set_collect. exists (ThreadEvent t_1 index0); split; vauto. - unfold mapper'. rewrite HP1. - unfold Events.index. - rewrite HP3; vauto. } + exists (ThreadEvent t_1 index); split; vauto. + unfold mapper'. desf; vauto. } + unfold set_collect. + exists (ThreadEvent t_1 index0); split; vauto. + unfold mapper'. desf; vauto. } destruct classic with (index0 < t_1_len) as [IND2 | IND2]. { exfalso. clear - IND IND1 IND2. apply IND1. lia. } - left. - assert (HP1 : negb (BinPos.Pos.eqb t_1 t_1) = false). - { rewrite Bool.negb_false_iff. - clear. apply BinPos.Pos.eqb_refl. } - assert (HP2 : Nat.ltb index t_1_len = false). - { apply Compare_dec.leb_correct_conv; lia. } - assert (HP3 : Nat.ltb index0 t_1_len = false). - { apply Compare_dec.leb_correct_conv. lia. } + left. desf. unfold sb. unfold G_s'; ins. - unfold seq. - exists (ThreadEvent t_2 (index - t_1_len)); split. + unfold seq. exists (ThreadEvent t_2 (index - t_1_len)); split. { apply collect_rel_eqv. unfold collect_rel. - exists (ThreadEvent thread0 index), - (ThreadEvent thread0 index); splits; vauto. - unfold mapper'. - unfold tid. rewrite HP1. - unfold Events.index. rewrite HP2; vauto. - desf. } + exists (ThreadEvent t_1 index), + (ThreadEvent t_1 index); splits; vauto. + unfold mapper'. desf. } exists (ThreadEvent t_2 (index0 - t_1_len)); split. { clear - IND IND1 IND2. unfold ext_sb; splits; vauto. lia. } apply collect_rel_eqv. unfold collect_rel. - exists (ThreadEvent thread0 index0), - (ThreadEvent thread0 index0); splits; vauto. + exists (ThreadEvent t_1 index0), + (ThreadEvent t_1 index0); splits; vauto. unfold mapper'. unfold tid. - rewrite HP1. unfold Events.index. - rewrite HP3; vauto. desf. } left. unfold sb. unfold G_s'; ins. @@ -619,10 +535,6 @@ Proof using. exists (ThreadEvent thread0 index), (ThreadEvent thread0 index); splits; vauto. unfold mapper'. - assert (HP1 : negb (BinPos.Pos.eqb thread0 t_1) = true). - { rewrite Bool.negb_true_iff. - clear - THRD1. apply BinPos.Pos.eqb_neq; vauto. } - unfold tid. rewrite HP1; vauto. desf. } exists (ThreadEvent thread0 index0); splits; vauto. apply collect_rel_eqv. @@ -630,149 +542,131 @@ Proof using. exists (ThreadEvent thread0 index0), (ThreadEvent thread0 index0); splits; vauto. unfold mapper'. - assert (HP1 : negb (BinPos.Pos.eqb thread0 t_1) = true). - { rewrite Bool.negb_true_iff. - clear - THRD1. apply BinPos.Pos.eqb_neq; vauto. } - unfold tid. rewrite HP1; vauto. desf. } { arewrite (WCore.G X_s' = G_s'). unfold G_s'; ins. rewrite <- TSET. apply SIMREL. } { unfold fixset. intros e INIT. unfold mapper'. - assert (HP : negb (BinPos.Pos.eqb (tid e) t_1) = true). - { rewrite Bool.negb_true_iff. - apply BinPos.Pos.eqb_neq. - unfold tid. unfold is_init in INIT. - clear - INIT NINIT1. basic_solver 8. } - rewrite HP; vauto; desf. } + desf. + unfold not in n0. + apply NNPP in n0. + clear - n0 NINIT1 INIT. + unfold is_init in INIT. + exfalso. desf. } { unfold fixset. intros e INIT. unfold mapper_rev'. - assert (HP : negb (BinPos.Pos.eqb (tid e) t_2) = true). - { rewrite Bool.negb_true_iff. - apply BinPos.Pos.eqb_neq. - unfold tid. unfold is_init in INIT. - clear - INIT NINIT2. basic_solver 8. } - rewrite HP; vauto. - clear; basic_solver. } + desf. + unfold not in n0. + apply NNPP in n0. + clear - n0 NINIT2 INIT. + unfold is_init in INIT. + exfalso. desf. } { intros e INE TID2. unfold mapper'. desf; vauto. unfold mapper' in TID2. - rewrite Heq in TID2. - assert (HP1 : Nat.ltb (index e) t_1_len = false). - { apply Compare_dec.not_lt in Heq0. - apply Compare_dec.leb_correct_conv. lia. } - rewrite HP1 in TID2. - exfalso. desf. } + unfold not in n0. + apply NNPP in n0. + desf. } { arewrite (WCore.G X_s' = G_s'). intros e INE TID2. unfold mapper_rev'. - desf; vauto. - unfold mapper_rev' in TID2. - rewrite Bool.negb_false_iff in *. - clear - Heq TID2. - exfalso. - apply BinPos.Peqb_true_eq in Heq. - desf. } + desf; vauto. } { intros e INE TID2. unfold mapper'. desf. { unfold mapper' in TID2. - rewrite Heq in TID2. + desf. apply wf_threads in INE. - { assert (TID2' : tid e = t_2). - { clear - TID2. basic_solver. } - rewrite <- TID2'. rewrite TID2' in INE. - exfalso. apply TSET in INE. desf. } - apply INV'. } - { unfold mapper' in TID2. - rewrite Heq in TID2. - assert (HP : Nat.ltb (index e) t_1_len = true). - { clear - Heq0. - apply Compare_dec.leb_correct; vauto. } - rewrite HP in TID2. - apply wf_threads in INE. - { assert (TID2' : tid e = t_2). - { clear - TID2. basic_solver. } - exfalso. apply TSET in INE. desf. } + { clear - INE T2NOTIN TSET. + apply TSET in INE. + exfalso. desf. } apply INV'. } - basic_solver. } + unfold mapper' in TID2. + desf. + unfold not in n0, n2. + apply NNPP in n0, n2. + apply wf_threads in INE. + { clear - INE T2NOTIN TSET. + apply TSET in INE. + exfalso. desf. } + apply INV'. } { intros e INE TID2. unfold mapper'. desf. { unfold mapper' in TID2. - rewrite Heq in TID2. + desf. apply wf_threads in INE. - { assert (TID2' : tid e = t_2). - { clear - TID2. basic_solver. } - rewrite TID2' in INE. - exfalso. apply TSET in INE. desf. } + { clear - INE T2NOTIN TSET. + apply TSET in INE. + exfalso. desf. } apply INV'. } { unfold mapper' in TID2. - rewrite Heq in TID2. - assert (HP : Nat.ltb (index e) t_1_len = true). - { clear - Heq0. - apply Compare_dec.leb_correct; vauto. } - rewrite HP in TID2. + desf. + unfold not in n0, n2. + apply NNPP in n0, n2. apply wf_threads in INE. - { assert (TID2' : tid e = t_2). - { clear - TID2. basic_solver. } - rewrite TID2' in INE. - exfalso. apply TSET in INE. desf. } + { clear - INE T2NOTIN TSET. + apply TSET in INE. + exfalso. desf. } apply INV'. } - arewrite (SequentBase.t_1_len t_1 ptc_1 = t_1_len). - arewrite (index (ThreadEvent t_2 (index e - t_1_len)) = index e - t_1_len). + unfold mapper' in TID2. + desf. + unfold not in n0, n3. + apply NNPP in n0, n3. + unfold index in *. + unfold t_1_len in *. unfold SequentBase.t_1_len. + desf. unfold tid in *. lia. } { intros e INE COND. unfold mapper' in COND. desf. { apply wf_threads in INE. { exfalso. apply TSET in INE. desf. } apply INV'. } - { rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq; vauto. } - rewrite Bool.negb_false_iff in *. - apply BinPos.Peqb_true_eq in Heq; vauto. } + { unfold not in n0. + apply NNPP in n0; vauto. } + unfold not in n0. + apply NNPP in n0; vauto. } { intros e NINE. unfold mapper'; desf. } intros e NINE. unfold mapper_rev'; desf. } split; red. { apply SIMRELQ. } + + assert (INDLEMMA : forall x y (NNIT : tid x <> tid_init) (EQT : tid x = tid y) (EQI : index x = index y), + x = y). + { clear. intros x y NNIT EQT EQI. + destruct x; destruct y; desf; ins. + desf. } assert (MAPS : forall x y, E_t' x -> E_t y -> mapper' x = mapper y -> x = y). - { intros x y INX INY MAP. - destruct x. - { destruct y. - { rewrite (seq_init SIMREL) in MAP; vauto. - rewrite (seq_init SIMRELQ) in MAP; vauto. } - rewrite (seq_init SIMRELQ) in MAP; vauto. - assert (FLS : mapper_rev (InitEvent l) = - mapper_rev (mapper (ThreadEvent thread index))). - { rewrite MAP; vauto. } - unfold compose in MAPREV. - rewrite MAPREV in FLS; vauto. - unfold id in FLS. - rewrite (seq_init_rev SIMREL) in FLS; vauto. } - destruct y. - { rewrite (seq_init SIMREL) in MAP; vauto. - assert (FLS : mapper_rev' (mapper' (ThreadEvent thread index)) = - mapper_rev' (InitEvent l)). - { rewrite MAP; vauto. } - unfold compose in MAPCOMP. - rewrite MAPCOMP in FLS; vauto. - unfold id in FLS. - rewrite (seq_init_rev SIMRELQ) in FLS; vauto. } - destruct classic with (tid (mapper (ThreadEvent thread0 index0)) = t_2) - as [TID2 | TID2]. - { unfold mapper' in MAP. - destruct classic with (~ E_t' (ThreadEvent thread index)) as [CND1 | CND1]. - { desf. } - destruct classic with (negb (BinPos.Pos.eqb (tid - (ThreadEvent thread index)) t_1)) as [CND2 | CND2]. - { admit. } - admit. } - admit. } - + { unfold mapper'. ins; desf. + { destruct classic with (tid (mapper y) = t_2) as [TID2 | TID2]. + 2: { apply (seq_mapeq SIMREL) in TID2; vauto. } + apply wf_threads in H. + { rewrite TID2 in H. + apply TSET in H. + exfalso. desf. } + apply INV'. } + { apply (seq_mapeq SIMREL); vauto. + clear - n0 THRDNEQ. + intros FLS. unfold not in n0. + apply n0. desf. intros FLS'. + desf. } + destruct classic with (tid (mapper y) = t_2) as [TID2 | TID2]. + 2: { rewrite <- H1 in TID2. desf. } + apply NNPP in n0. + apply INDLEMMA. + { rewrite n0; vauto. } + { apply (seq_thrd SIMREL) in TID2; vauto. + rewrite TID2; vauto. } + apply (seq_index SIMREL) in TID2; vauto. + rewrite <- H1 in TID2. + simpl in *. unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + unfold WCore.reexec. exists thrdle'. constructor; vauto. From d6d1a90e83445d3364392ef9ac00417d6cf2f22c Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 29 Apr 2025 05:36:01 +0200 Subject: [PATCH 27/51] proceedings in reexec step --- src/sequentialization/SequentBase.v | 4 + src/sequentialization/SequentExec.v | 2 +- src/sequentialization/SequentReexec.v | 137 +++++++++++++++++++++++++- 3 files changed, 140 insertions(+), 3 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index 67706dc..29cfdd2 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -103,6 +103,10 @@ Record seq_simrel : Prop := { seq_index : forall e : actid, E_t e -> tid (mapper e) = t_2 -> index e = t_1_len + index (mapper e); seq_thrd : forall e : actid, E_t e -> tid (mapper e) = t_2 -> tid e = t_1; + seq_out : forall e : actid, E_t e -> tid e <> t_1 -> mapper e = e; + seq_out_snd : forall e : actid, E_t e -> tid e = t_1 -> index e < t_1_len -> mapper e = e; + seq_out_move : forall e : actid, E_t e -> tid e = t_1 -> index e >= t_1_len -> mapper e = ThreadEvent t_2 (index e - t_1_len); + seq_rest : forall e : actid, ~ E_t e -> mapper e = e; seq_rest_rev : forall e : actid, ~ E_s e -> mappre_rev e = e; seq_rlab : forall e : actid, ~ E_s e -> lab_s e = lab_t (mappre_rev e); diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 7637f60..1955499 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -240,7 +240,7 @@ Proof using. { rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } desf. } - { admit. } + { admit. (*?????????*) } { unfold sb. unfold G_s'; ins. split; intros x y COND. { destruct COND as [CD1 | CD2]. diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 9001456..31dfdb8 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -628,6 +628,16 @@ Proof using. apply NNPP in n0; vauto. } { intros e NINE. unfold mapper'; desf. } + { intros e INE TID. + unfold mapper'. + desf; vauto. } + { intros e INE TID IND. + unfold mapper'. + desf; vauto. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. lia. } + { intros e NINE. + unfold mapper'; desf. } intros e NINE. unfold mapper_rev'; desf. } split; red. @@ -861,11 +871,134 @@ Proof using. { rewrite seq_init; vauto. destruct SIMRELQ. rewrite seq_init0; vauto. } - admit. } + destruct H as [DT SB]. + destruct classic with (tid (mapper + (ThreadEvent thread index)) = t_2) as [TID2 | TID2]. + { assert (TID2' : tid (mapper (ThreadEvent thread index)) = t_2) by vauto. + assert (TID2S : tid (mapper (ThreadEvent thread index)) = t_2) by vauto. + apply seq_index in TID2. + apply seq_thrd in TID2'. + { apply INDLEMMA. + { unfold mapper'. desf. + { rewrite TID2'; vauto. } + unfold not in n0. + apply NNPP in n0. + rewrite n0; vauto. } + { unfold mapper'. + rewrite TID2S. clear TID2S. + desf. + { red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } + symmetry in TID2. + rewrite <- TID2 in l. + exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold mapper'. + rewrite TID2. clear TID2. + desf. + { red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } + { exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + { red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } + red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } + assert (TID2' : tid (mapper (ThreadEvent thread index)) <> t_2) by vauto. + assert (TID2S : tid (mapper (ThreadEvent thread index)) <> t_2) by vauto. + apply seq_mapeq in TID2. + { rewrite TID2. clear TID2. + unfold mapper'. desf. + apply INDLEMMA. + { unfold tid; vauto. } + { unfold tid. + unfold not in n0. + apply NNPP in n0. + apply seq_out_move in n0; vauto. + { apply seq_mapeq in TID2S; vauto. + rewrite TID2S in n0. + desf. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + unfold Events.index in *. + unfold not in n0. + apply NNPP in n0. + apply seq_out_move in n0; vauto. + { apply seq_mapeq in TID2S; vauto. + rewrite TID2S in n0. + desf. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } exists (mapper x3); split; vauto. red; split; vauto. } { admit. } - { admit. } + { arewrite (WCore.G X_s' = G_s'). + unfold G_s' at 1; ins. + intros x COND. + destruct COND as (INE & NDT). + unfold set_compl. intros FLS. + destruct INE as [x0 [INE M1]]; subst. + unfold dtrmt' in NDT. + assert (DTRM : ~ dtrmt_t x0). + { intros FLSS. + apply NDT. unfold set_collect. + exists x0; split; vauto. } + destruct FLS as [FL1 | FL2]. + { assert (FLS : (Rel G_t') x0). + { assert (SUBST : (fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev') by vauto. + rewrite SUBST in FL1. + unfold compose in FL1. + unfold is_rel, mod in *. + assert (HLP : mapper_rev' (mapper' x0) = x0). + { unfold compose in MAPCOMP. + apply MAPCOMP in INE. + unfold id in INE; vauto. } + rewrite HLP in FL1; vauto. } + destruct STEP. + clear - reexec_dtrmt_rpo FLS DTRM INE. + unfold set_compl in reexec_dtrmt_rpo. + destruct reexec_dtrmt_rpo with x0; vauto. } + assert (FLS : (Acq G_t') x0). + { assert (SUBST : (fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev') by vauto. + rewrite SUBST in FL2. + unfold compose in FL2. + unfold is_acq, mod in *. + assert (HLP : mapper_rev' (mapper' x0) = x0). + { unfold compose in MAPCOMP. + apply MAPCOMP in INE. + unfold id in INE; vauto. } + rewrite HLP in FL2; vauto. } + destruct STEP. + clear - reexec_dtrmt_rpo FLS DTRM INE. + unfold set_compl in reexec_dtrmt_rpo. + destruct reexec_dtrmt_rpo with x0; vauto. } { destruct STEP. destruct reexec_embd_corr. constructor; vauto. From 077c7135f8b9e497152e0d3498bb201b454bdfb5 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Tue, 29 Apr 2025 20:46:51 +0200 Subject: [PATCH 28/51] reexec step work --- src/sequentialization/SequentReexec.v | 338 +++++++++++++++++++------- 1 file changed, 244 insertions(+), 94 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 31dfdb8..95a31bb 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -159,7 +159,7 @@ Lemma simrel_step_reex exists (X_s' : WCore.t) (mapper' : actid -> actid) (mapper_rev' : actid -> actid) (dtrmt' : actid -> Prop) (cmt' : actid -> Prop), << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ - << REX : WCore.reexec X_s X_s' id dtrmt' cmt' >>. + << REX : WCore.reexec X_s X_s' f_t dtrmt' cmt' >>. Proof using. set (mapper' := fun x => ifP (~ E_t' x) then x else @@ -198,6 +198,69 @@ Proof using. { symmetry. apply reex_thrd_preserve with (f := f_t) (dtrmt := dtrmt_t) (cmt := cmt_t) (thrdle := thrdle); vauto. } + + assert (EXTSBL : forall x y, E_t' x -> E_t' y -> + ext_sb (mapper' x) (mapper' y) -> + ext_sb x y). + { intros x y INE1 INE2 PTH. + unfold mapper' in PTH. desf; vauto. + { unfold not in n2. + apply NNPP in n2. + unfold ext_sb in PTH. desf. + { basic_solver. } + unfold ext_sb. desf. + { clear - n2 NINIT1. + desf. } + split. + { apply wf_threads in INE1. + { unfold tid in INE1. + apply TSET in INE1. + exfalso. desf. } + apply INV'. } + unfold Events.index in *. + lia. } + { unfold not in n2, n0. + apply NNPP in n2, n0. + unfold ext_sb. desf. + { clear - n2 NINIT1. + desf. } + split. + { unfold tid in n2, n0; vauto. } + unfold Events.index in *. + lia. } + { unfold not in n0. + apply NNPP in n0. + unfold ext_sb. desf. + unfold ext_sb in PTH. desf. + exfalso. unfold Events.index in *. + apply wf_threads in INE2. + { unfold tid in INE2. + apply TSET in INE2. + exfalso. desf. } + apply INV'. } + { unfold not in n0, n3. + apply NNPP in n0, n3. + unfold ext_sb. desf. + unfold tid in *. + unfold Events.index in *. + split; vauto. + unfold ext_sb in PTH. + destruct PTH as [EQ IND]. + desf. } + unfold not in n0, n3. + apply NNPP in n0, n3. + unfold ext_sb. desf. + { unfold tid in *. + clear - n0 NINIT1. desf. } + { unfold tid in *. + clear - n3 NINIT1. desf. } + unfold tid in *. + unfold Events.index in *. + split; vauto. + unfold ext_sb in PTH. + destruct PTH as [EQ IND]. + lia. } + assert (MAPCOMP : eq_dom E_t' (mapper_rev' ∘ mapper') id). { unfold mapper', mapper_rev'. unfold eq_dom. intros x INE. @@ -231,6 +294,7 @@ Proof using. basic_solver. } assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1). + { constructor; vauto. { unfold inj_dom. intros x y INX INY MAP. unfold mapper' in MAP. desf; vauto. @@ -342,63 +406,7 @@ Proof using. exists x3, x5; split; vauto. unfold seq. exists x3; split; vauto. exists x5; split; vauto. - unfold mapper' in PTH. desf; vauto. - { unfold not in n2. - apply NNPP in n2. - unfold ext_sb in PTH. desf. - { basic_solver. } - unfold ext_sb. desf. - { clear - n2 NINIT1. - desf. } - split. - { apply wf_threads in INE1. - { unfold tid in INE1. - apply TSET in INE1. - exfalso. desf. } - apply INV'. } - unfold Events.index in *. - lia. } - { unfold not in n2, n0. - apply NNPP in n2, n0. - unfold ext_sb. desf. - { clear - n2 NINIT1. - desf. } - split. - { unfold tid in n2, n0; vauto. } - unfold Events.index in *. - lia. } - { unfold not in n0. - apply NNPP in n0. - unfold ext_sb. desf. - unfold ext_sb in PTH. desf. - exfalso. unfold Events.index in *. - apply wf_threads in INE2. - { unfold tid in INE2. - apply TSET in INE2. - exfalso. desf. } - apply INV'. } - { unfold not in n0, n3. - apply NNPP in n0, n3. - unfold ext_sb. desf. - unfold tid in *. - unfold Events.index in *. - split; vauto. - unfold ext_sb in PTH. - destruct PTH as [EQ IND]. - desf. } - unfold not in n0, n3. - apply NNPP in n0, n3. - unfold ext_sb. desf. - { unfold tid in *. - clear - n0 NINIT1. desf. } - { unfold tid in *. - clear - n3 NINIT1. desf. } - unfold tid in *. - unfold Events.index in *. - split; vauto. - unfold ext_sb in PTH. - destruct PTH as [EQ IND]. - lia. } + apply EXTSBL; vauto. } intros x y PTH. destruct PTH as [[T1 [x0 [EQ1 M1]]] [T2 [x1 [EQ2 M2]]]]. @@ -690,6 +698,7 @@ Proof using. rewrite dtrmt_init; vauto. } { unfold dtrmt', cmt'. rewrite (WCore.dtrmt_cmt STEP); vauto. } + { admit. } { destruct STEP. unfold cmt'. arewrite (WCore.G X_s' = G_s'). unfold G_s'. simpls. @@ -1002,59 +1011,200 @@ Proof using. { destruct STEP. destruct reexec_embd_corr. constructor; vauto. + { admit. } + { admit. } { intros e CMT. - arewrite (WCore.G X_s' = G_s'). - unfold G_s'. simpls. - unfold compose. + unfold cmt' in CMT. + unfold set_collect in CMT. + destruct CMT as [x [CMT EQ]]. + specialize (reexec_embd_lab x). + assert (INE : E_t' x). + { apply reexec_embd_dom in CMT; vauto. } + assert (CMT' : cmt_t x) by vauto. + apply reexec_embd_lab in CMT. + destruct SIMRELQ. + apply seq_lab in INE. + unfold compose in INE. + rewrite EQ in INE. + rewrite <- INE. + destruct SIMREL. + rewrite CMT. + rewrite seq_lab0. + { unfold compose. + rewrite <- EQ. + admit. } admit. (* ??? *) } all : admit. } { destruct STEP. unfold rf_complete. arewrite (WCore.G X_s' = G_s'). unfold G_s'. simpls. arewrite ((fun x : actid => - ifP ~ (mapper' ↑₁ E_t') x then x - else (if - negb - (BinPos.Pos.eqb (tid x) t_2) - then x - else - ThreadEvent t_1 - (t_1_len + index x))) = mapper_rev'). - rewrite collect_rel_id, set_collect_id, - Combinators.compose_id_right. - apply rexec_rfc. } + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev'). + unfold is_r. unfold compose. + intros x COND. + destruct COND as [MAP RD]. + destruct MAP as [x0 [MAP M1]]; subst. + unfold rf_complete in rexec_rfc. + destruct rexec_rfc with x0; vauto. + { split; vauto. + unfold compose in MAPCOMP. + apply MAPCOMP in MAP. + unfold id in MAP. + rewrite MAP in RD. + unfold is_r; vauto. } + unfold codom_rel. + exists (mapper' x). + unfold collect_rel. + exists x, x0; split; vauto. } { constructor; ins. { apply sub_WF with (G := G_s) (sc := ∅₂) (sc' := ∅₂). { ins. assert (INITDER : (fun a : actid => is_init a) ⊆₁ dtrmt_t). { destruct STEP; vauto. } - rewrite INITDER; vauto. } + arewrite ((fun a : actid => is_init a) ⊆₁ mapper' ↑₁ + (fun a : actid => is_init a)). + { destruct SIMRELQ. clear- seq_init. + unfold fixset in seq_init. + basic_solver. } + rewrite INITDER. + unfold dtrmt'; vauto. } { admit. (* TODO : Wf G_s *) } apply restrict_sub; [basic_solver |]. - admit. } - { ins. rewrite set_interA, set_inter_absorb_r. - { constructor; ins. - all : admit. } - admit. } + unfold dtrmt'. + destruct SIMREL. + rewrite seq_acts. + intros x COND. + unfold set_collect in COND. + destruct COND as [x0 [COND EQ]]. + unfold set_collect. + exists x0; split; vauto. + { destruct STEP. + apply rexec_acts; vauto. } + destruct classic with (tid (mapper + x0) = t_2) as [TID2 | TID2]. + { assert (TID2' : tid (mapper x0) = t_2) by vauto. + assert (TID2S : tid (mapper x0) = t_2) by vauto. + apply seq_index in TID2. + apply seq_thrd in TID2'. + { apply INDLEMMA. + { unfold mapper'. desf. } + { unfold mapper'. + rewrite TID2S. clear TID2S. + desf. + { destruct STEP. + apply dtrmt_cmt in COND. + apply reexec_embd_dom in COND; vauto. } + symmetry in TID2. + rewrite <- TID2 in l. + exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold mapper'. + rewrite TID2. clear TID2. + desf. + { destruct STEP. + apply dtrmt_cmt in COND. + apply reexec_embd_dom in COND; vauto. } + { exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + { destruct STEP. apply rexec_acts; vauto. } + destruct STEP. apply rexec_acts; vauto. } + assert (TID2' : tid (mapper x0) <> t_2) by vauto. + assert (TID2S : tid (mapper x0) <> t_2) by vauto. + apply seq_mapeq in TID2. + { rewrite TID2. clear TID2. + unfold mapper'. desf. + apply INDLEMMA. + { unfold not in n0. + apply NNPP in n0. + rewrite n0; vauto. } + { unfold tid. + unfold not in n0. + apply NNPP in n0. + apply seq_out_move in n0; vauto. + { apply seq_mapeq in TID2S; vauto. + rewrite TID2S in n0. + desf. + destruct STEP. apply rexec_acts; vauto. } + { destruct STEP. apply rexec_acts; vauto. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + unfold Events.index in *. + unfold not in n0. + apply NNPP in n0. + apply seq_out_move in n0; vauto. + { apply seq_mapeq in TID2S; vauto. + { rewrite TID2S in n0. + desf. } + destruct STEP. apply rexec_acts; vauto. } + { destruct STEP. apply rexec_acts; vauto. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + destruct STEP. apply rexec_acts; vauto. } all : admit. } - { assert (SBEQ : sb G_s' ≡ sb_t'). - { unfold sb. unfold G_s'; ins. - clear; basic_solver 8. } - apply XmmCons.monoton_cons with (G_t := G_t') - (m := id); vauto. + { apply XmmCons.monoton_cons with (G_t := G_t') + (m := mapper'); vauto. all : try arewrite (WCore.G X_s' = G_s'). + { apply SIMRELQ. } { unfold rpo. unfold rpo_imm. - arewrite (R G_s' ≡₁ R_t'). - arewrite (F G_s' ≡₁ F G_t'). - arewrite (W G_s' ≡₁ W G_t'). - arewrite (Acq G_s' ≡₁ Acq G_t'). - arewrite (Rlx G_s' ≡₁ Rlx G_t'). - arewrite (Rel G_s' ≡₁ Rel G_t'). - rewrite collect_rel_id. - apply inclusion_t_t. - rewrite SBEQ; vauto. } - { rewrite SBEQ. rewrite collect_rel_id. - unfold same_loc. unfold G_s'; ins. } + admit. } + { unfold G_s'; ins. + arewrite ((fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev'). + unfold compose. unfold eq_dom. + intros x COND. + unfold compose in MAPCOMP. + apply MAPCOMP in COND. + rewrite COND. + unfold id; vauto. } + { intros x y PTH. + destruct PTH as [SBP SL]. + unfold sb in SBP. + unfold G_s' in SBP; ins. + destruct SBP as [x0 [[EQ1 INE1] + [x1 [PTH [EQ2 INE2]]]]]; subst. + unfold collect_rel. + destruct INE1 as [x2 [INE1 M1]]. + destruct INE2 as [x3 [INE2 M2]]. + exists x2, x3; splits; vauto. + split. + { unfold sb. + unfold seq. exists x2; split; vauto. + exists x3; split; vauto. + apply EXTSBL; vauto. } + assert (MAPP : (fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev') by vauto. + rewrite MAPP in SL. + unfold same_loc in SL. + unfold loc in SL. + unfold compose in SL. + unfold compose in MAPCOMP. + apply MAPCOMP in INE1. + unfold id in INE1. + apply MAPCOMP in INE2. + unfold id in INE2. + rewrite INE1, INE2 in SL. + unfold same_loc, loc; vauto. } { apply INV'. } { admit. (* wf_s' *) } destruct STEP; vauto. } From d4d31c9c8bc93ba9068e79dd5fca39ec3e71c4d9 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Wed, 30 Apr 2025 05:10:30 +0200 Subject: [PATCH 29/51] reexec step work --- src/sequentialization/SequentReexec.v | 134 ++++++++++++++++++++++++-- 1 file changed, 127 insertions(+), 7 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 95a31bb..476c0cc 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -198,6 +198,89 @@ Proof using. { symmetry. apply reex_thrd_preserve with (f := f_t) (dtrmt := dtrmt_t) (cmt := cmt_t) (thrdle := thrdle); vauto. } + + assert (INDLEMMA : forall x y (NNIT : tid x <> tid_init) (EQT : tid x = tid y) (EQI : index x = index y), + x = y). + { clear. intros x y NNIT EQT EQI. + destruct x; destruct y; desf; ins. + desf. } + + assert (DTRSAME : forall x, dtrmt_t x -> + mapper x = mapper' x). + { intros x COND. + destruct classic with (tid (mapper + x) = t_2) as [TID2 | TID2]. + { assert (TID2' : tid (mapper x) = t_2) by vauto. + assert (TID2S : tid (mapper x) = t_2) by vauto. + destruct SIMREL. + apply seq_index in TID2. + apply seq_thrd in TID2'. + { apply INDLEMMA. + { unfold mapper'. desf. } + { unfold mapper'. + rewrite TID2S. clear TID2S. + desf. + { destruct STEP. + apply dtrmt_cmt in COND. + apply reexec_embd_dom in COND; vauto. } + symmetry in TID2. + rewrite <- TID2 in l. + exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold mapper'. + rewrite TID2. clear TID2. + desf. + { destruct STEP. + apply dtrmt_cmt in COND. + apply reexec_embd_dom in COND; vauto. } + { exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + { destruct STEP. apply rexec_acts; vauto. } + destruct STEP. apply rexec_acts; vauto. } + assert (TID2' : tid (mapper x) <> t_2) by vauto. + assert (TID2S : tid (mapper x) <> t_2) by vauto. + apply (seq_mapeq SIMREL) in TID2. + { rewrite TID2. clear TID2. + unfold mapper'. desf. + apply INDLEMMA. + { unfold not in n0. + apply NNPP in n0. + rewrite n0; vauto. } + { unfold tid. + unfold not in n0. + apply NNPP in n0. + apply (seq_out_move SIMREL) in n0; vauto. + { apply (seq_mapeq SIMREL) in TID2S; vauto. + rewrite TID2S in n0. + desf. + destruct STEP. apply rexec_acts; vauto. } + { destruct STEP. apply rexec_acts; vauto. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + unfold Events.index in *. + unfold not in n0. + apply NNPP in n0. + apply (seq_out_move SIMREL) in n0; vauto. + { apply (seq_mapeq SIMREL) in TID2S; vauto. + { rewrite TID2S in n0. + desf. } + destruct STEP. apply rexec_acts; vauto. } + { destruct STEP. apply rexec_acts; vauto. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + destruct STEP. apply rexec_acts; vauto. } assert (EXTSBL : forall x y, E_t' x -> E_t' y -> ext_sb (mapper' x) (mapper' y) -> @@ -650,12 +733,6 @@ Proof using. unfold mapper_rev'; desf. } split; red. { apply SIMRELQ. } - - assert (INDLEMMA : forall x y (NNIT : tid x <> tid_init) (EQT : tid x = tid y) (EQI : index x = index y), - x = y). - { clear. intros x y NNIT EQT EQI. - destruct x; destruct y; desf; ins. - desf. } assert (MAPS : forall x y, E_t' x -> E_t y -> mapper' x = mapper y -> x = y). @@ -1208,7 +1285,50 @@ Proof using. { apply INV'. } { admit. (* wf_s' *) } destruct STEP; vauto. } - { admit. } + { destruct SIMREL. + unfold dtrmt'. unfold WCore.reexec_thread. + arewrite ((WCore.G X_s') = G_s'). + unfold G_s'; ins. + rewrite <- set_collect_minus. + { rewrite seq_acts. + destruct STEP. + rewrite rexec_acts at 1. + rewrite set_collect_union. + apply set_union_more. + { split. + { intros x COND. + destruct COND as [x0 [COND EQ]]. + unfold set_collect. + exists x0; split; vauto. + symmetry. + apply DTRSAME; vauto. } + intros x COND. + destruct COND as [x0 [COND EQ]]. + unfold set_collect. + exists x0; split; vauto. + apply DTRSAME; vauto. } + unfold WCore.reexec_thread. + split. + { intros x COND. + destruct COND as [x0 [COND EQ]]. + split. + { unfold set_collect. + exists x0; split; vauto. + apply COND; vauto. } + destruct COND as [CD1 CD2]. + unfold set_collect in CD2. + unfold set_collect. + unfold set_map in CD2. + unfold set_map. + destruct CD2 as [x1 [INE TIDS]]. + exists (mapper' x1); split; vauto. + admit. (* ?????? *) } + admit. } + destruct STEP. rewrite dtrmt_cmt. + rewrite reexec_embd_dom. + destruct SIMRELQ. + clear - seq_inj0. + basic_solver. } apply sub_to_full_exec_listless with (thrdle := thrdle'); vauto. all : admit. From 09e54d0fcc097a131bae0a0586431e55432e2b5d Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Thu, 1 May 2025 03:05:40 +0200 Subject: [PATCH 30/51] exec fixes, reexec problem --- src/sequentialization/SequentExec.v | 172 +++++++++++++++++++------- src/sequentialization/SequentReexec.v | 72 +++++++++-- 2 files changed, 192 insertions(+), 52 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 1955499..eceaa14 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -240,7 +240,54 @@ Proof using. { rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } desf. } - { admit. (*?????????*) } + { rewrite EQACTS. + rewrite set_collect_union. + rewrite set_collect_union. + apply set_union_more. + { split. + { intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + desf. } + unfold set_collect. + exists (mapper' x). splits; vauto. + unfold mapper'. + rewrite updo; vauto. + unfold mapper_rev'. + rewrite updo; vauto. + { apply MAPREV; vauto. } + intros FALSE. + assert (INE : E_s e). + { destruct SIMREL. + apply seq_acts. + red; vauto. } + desf. } + intros x COND. + destruct COND as [x0 [[x1 [INE MAP1]] MAP2]]. + apply MAPREVDOM. + unfold set_collect. + exists x0; splits; vauto. + { destruct classic with (x1 = e) as [EQ | NEQ]. + { subst x1. unfold mapper'. + desf. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + apply seq_acts. + red; vauto. } + unfold mapper'. + rewrite updo. + { unfold mapper_rev'. + rewrite updo; vauto. + intros FALSE. + assert (INES : E_s e). + { destruct SIMREL. + apply seq_acts. + red; vauto. } + desf. } + intros FALSE. desf. } + rewrite MAPER_E. + rewrite MEPERREV_E; vauto. } { unfold sb. unfold G_s'; ins. split; intros x y COND. { destruct COND as [CD1 | CD2]. @@ -413,8 +460,6 @@ Proof using. unfold collect_rel. exists x0, y0; splits; vauto. unfold seq. exists x0; splits; vauto. exists y0; splits; vauto. - assert (TIDD : tid y0 = t_1). - { admit. } admit. } admit. } { rewrite (seq_threads SIMREL). @@ -437,7 +482,35 @@ Proof using. { apply EQACTS in INE. destruct INE as [C1 | C2]; vauto. } unfold mapper' in TID2. rewrite updo in TID2; vauto. } - { admit. } + { intros x MAP TIDS. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper_rev'. rewrite upds; vauto. } + destruct MAP as [x0 [INE MAP]]. + unfold mapper_rev'. + rewrite updo; vauto. + unfold mapper'. + rewrite updo; vauto. + { unfold mapper' in TIDS. + rewrite updo in TIDS; vauto. + { destruct SIMREL. + apply seq_mapeq_rev in TIDS; vauto. + apply seq_acts. + red; exists x0; splits; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. + apply seq_mapeq in TIDS; vauto. + { unfold mapper' in NEQ. + rewrite upds in NEQ. + desf. } + unfold mapper' in NEQ. + rewrite upds in NEQ. + desf. } + intros FLS. subst. + unfold mapper' in NEQ. + rewrite upds in NEQ. desf. } + intros FLS. subst. + unfold mapper' in NEQ. + rewrite upds in NEQ. desf. } { intros e' INE TID2. destruct classic with (e' = e) as [EQ | NEQ]. { subst e'. unfold mapper' in TID2. @@ -466,6 +539,58 @@ Proof using. apply (seq_index SIMREL) in INE'. { rewrite TID; vauto. } rewrite <- MAPEQQ; vauto. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper' in TID2. + rewrite upds in TID2. exfalso. + clear - TID TID2 THRDNEQ. desf. } + unfold mapper' in TID2. + rewrite updo in TID2. + { destruct SIMREL. + apply seq_thrd in TID2. + { rewrite TID2; vauto. } + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + vauto. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + rewrite upds. exfalso. desf. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out; vauto. + { apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + rewrite <- TID; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + rewrite upds. desf. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out_snd; vauto. + { apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { rewrite <- TID; vauto. } + rewrite <- TID; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { subst. clear - IDXS IND TID. + exfalso. unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + rewrite TID in IDXS. + lia. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out_move. + { rewrite <- TID; vauto. } + { apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { rewrite <- TID; vauto. } + rewrite <- TID; vauto. } { intros e' NINE. destruct classic with (e' = e) as [EQ | NEQ]. { subst e'. unfold mapper'. rewrite upds; vauto. } @@ -489,45 +614,6 @@ Proof using. assert (WRG : E_t e). { apply MAPREVDOM. basic_solver 4. } desf. } - (* intros e' NINE. - destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper_rev'. - unfold compose. unfold mapper'. - rewrite upds; vauto. } - unfold mapper_rev'. unfold compose. - unfold mapper'. rewrite updo; vauto. - rewrite (seq_rest_rev SIMREL); vauto. - destruct SIMREL. intros FLS. - apply seq_acts in FLS. - destruct FLS as [e'' [C1 C2]]. - admit. } *) - (* { rewrite updo; vauto. - rewrite (seq_rest SIMREL); vauto. - { destruct ADD. rewrite (seq_rest_rev SIMREL); vauto. - intros FALSE. apply NINE. - apply EQACTS. unfold set_union. - left; vauto. } - rewrite add_event_lab. - rewrite updo; vauto. - rewrite updo. - rewrite (seq_rest_rev SIMREL); vauto. - rewrite (seq_rest_rev SIMREL); vauto. - intros FALSE. apply NINE. - apply EQACTS. unfold set_union. - left; vauto. - apply MAPREVDOM. unfold set_collect. - exists (mapper e'). split. - { - - } - intros FALSE. apply NINE. - apply EQACTS. unfold set_union. - left; vauto. } - rewrite updo; vauto. - rewrite (seq_rest SIMREL); vauto. - intros FALSE. apply NINE. - apply EQACTS. unfold set_union. - left; vauto. } *) splits. { rewrite <- TID; vauto. } constructor. diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 476c0cc..8010f8f 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -159,7 +159,7 @@ Lemma simrel_step_reex exists (X_s' : WCore.t) (mapper' : actid -> actid) (mapper_rev' : actid -> actid) (dtrmt' : actid -> Prop) (cmt' : actid -> Prop), << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ - << REX : WCore.reexec X_s X_s' f_t dtrmt' cmt' >>. + << REX : WCore.reexec X_s X_s' (mapper ∘ f_t ∘ mapper_rev') dtrmt' cmt' >>. Proof using. set (mapper' := fun x => ifP (~ E_t' x) then x else @@ -775,7 +775,20 @@ Proof using. rewrite dtrmt_init; vauto. } { unfold dtrmt', cmt'. rewrite (WCore.dtrmt_cmt STEP); vauto. } - { admit. } + { unfold dtrmt'. + unfold fixset. + intros x DTT. + destruct DTT as [x0 [INX DTT]]. + subst. unfold compose. + assert (HLP : mapper_rev' (mapper' x0) = x0). + { unfold compose in MAPCOMP. + apply MAPCOMP. destruct STEP. + apply dtrmt_cmt, reexec_embd_dom in INX; vauto. } + rewrite HLP. + arewrite (f_t x0 = x0). + { destruct STEP. + apply dtrmt_fixed; vauto. } + apply DTRSAME; vauto. } { destruct STEP. unfold cmt'. arewrite (WCore.G X_s' = G_s'). unfold G_s'. simpls. @@ -1088,8 +1101,46 @@ Proof using. { destruct STEP. destruct reexec_embd_corr. constructor; vauto. - { admit. } - { admit. } + + { unfold cmt'. + unfold inj_dom. + intros x y CD1 CD2 EQQ. + destruct CD1 as [x0 [CD1 M1]]. + destruct CD2 as [x1 [CD2 M2]]. + subst. + unfold compose in EQQ. + unfold compose in MAPCOMP. + assert (HLP1 : mapper_rev' (mapper' x0) = x0). + { unfold compose in MAPCOMP. + apply MAPCOMP. + apply reexec_embd_dom in CD1; vauto. } + assert (HLP2 : mapper_rev' (mapper' x1) = x1). + { unfold compose in MAPCOMP. + apply MAPCOMP. + apply reexec_embd_dom in CD2; vauto. } + rewrite HLP1, HLP2 in EQQ. + destruct SIMREL. + apply seq_inj in EQQ. + { apply reexec_embd_inj in EQQ; vauto. } + { apply reexec_embd_acts; red. + exists x0; vauto. } + apply reexec_embd_acts; red. + exists x1; vauto. } + { intros e CMT. + unfold cmt' in CMT. + unfold set_collect in CMT. + destruct CMT as [x [CMT EQ]]. + specialize (reexec_embd_lab x). + assert (INE : E_t' x). + { apply reexec_embd_dom in CMT; vauto. } + subst. + unfold compose. + assert (HLP : mapper_rev' (mapper' x) = x). + { unfold compose in MAPCOMP. + apply MAPCOMP. + apply reexec_embd_dom in CMT; vauto. } + rewrite HLP. + admit. } { intros e CMT. unfold cmt' in CMT. unfold set_collect in CMT. @@ -1106,11 +1157,14 @@ Proof using. rewrite <- INE. destruct SIMREL. rewrite CMT. - rewrite seq_lab0. - { unfold compose. - rewrite <- EQ. - admit. } - admit. (* ??? *) } + subst. + unfold compose. + unfold compose in MAPCOMP. + rewrite MAPCOMP. + { unfold id. + apply seq_lab0. + apply reexec_embd_acts; red; vauto. } + apply reexec_embd_dom; vauto. } all : admit. } { destruct STEP. unfold rf_complete. arewrite (WCore.G X_s' = G_s'). From cb92fd4e1ba302b001772556b47cb1c44e6e8200 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Mon, 5 May 2025 23:00:22 +0200 Subject: [PATCH 31/51] wf for s and s' proven --- src/sequentialization/SequentBase.v | 1 + src/sequentialization/SequentReexec.v | 629 +++++++++++++++++++++++++- 2 files changed, 628 insertions(+), 2 deletions(-) diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index 29cfdd2..3fd5bbc 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -118,6 +118,7 @@ Record seq_simrel_inv : Prop := { rsr_ndata : data_t ≡ ∅₂; rsr_naddr : addr_t ≡ ∅₂; rsr_nrmw_dep : rmw_dep_t ≡ ∅₂; + rsr_init_acts : is_init ⊆₁ E_t; }. End SimRelSeq. diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 8010f8f..505df3e 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -150,6 +150,327 @@ Definition thrdle' := thrdle ∪ eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq Hypothesis INV : seq_simrel_inv X_t. Hypothesis INV' : seq_simrel_inv X_t'. +Lemma wf_transition + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) : + Wf G_s. +Proof using. + assert (INDLEMMA : forall x y (NNIT : tid x <> tid_init) (EQT : tid x = tid y) (EQI : index x = index y), + x = y). + { clear. intros x y NNIT EQT EQI. + destruct x; destruct y; desf; ins. + desf. } + constructor. + { intros a b COND. + destruct COND as [INA [INB [NEQ [TIDS NINIT]]]]. + intros FLS. + specialize INDLEMMA with a b. + apply NEQ; apply INDLEMMA; vauto. + unfold is_init in NINIT. + clear - NINIT. unfold not in NINIT. + unfold not. intros FLS. + unfold tid in FLS. + destruct a. + { apply NINIT; vauto. } + admit. (* ??? *) } + { rewrite (seq_data SIMREL); vauto. } + { rewrite (seq_data SIMREL); clear; [ basic_solver 4 ]. } + { rewrite (seq_addr SIMREL); vauto. } + { rewrite (seq_addr SIMREL); clear; [ basic_solver 4 ]. } + { rewrite (seq_ctrl SIMREL); vauto. } + { rewrite (seq_ctrl SIMREL); clear; [ basic_solver 4 ]. } + { rewrite (seq_ctrl SIMREL); clear; [ basic_solver 4 ]. } + { split; [| basic_solver 9 ]. + rewrite (seq_rmw SIMREL); vauto. + intros x y COND. destruct COND as [x0 [y0 [RMW [M1 M2]]]]. + apply wf_rmwE in RMW. + { destruct RMW as [x1 [[EQ1 INE1] [x2 [PTH [EQ2 INE2]]]]]. + subst. destruct SIMREL. + apply seq_lab in INE1, INE2. + apply wf_rmwD in PTH. + { destruct PTH as [x2 [[EQ1 RD] [x3 [PTH [EQ2 WT]]]]]. + subst. unfold seq. exists (mapper x2); splits. + { red; splits; vauto. + unfold compose in INE1. + unfold is_r in *. + rewrite <- INE1; vauto. } + exists (mapper y0); splits; vauto. + red; splits; vauto. unfold is_w in *. + unfold compose in INE2. + rewrite <- INE2; vauto. } + apply INV. } + apply INV. } + { rewrite (seq_rmw SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rmwE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rmwl in PTH; [| apply INV]. + unfold same_loc in *. + apply (seq_lab SIMREL) in INE1, INE2. + unfold compose in *. + unfold loc in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_rmw SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rmwE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. apply wf_rmwi in PTH; [| apply INV]. + admit. (* false *) } + { split; [| basic_solver 4]. + rewrite (seq_rf SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + unfold seq. + exists (mapper x2); split. + { red; split; vauto. + destruct SIMREL. apply seq_codom. + red; exists x2; vauto. } + exists (mapper y0); split; vauto. + red; split; vauto. + destruct SIMREL. apply seq_codom. + red; exists y0; vauto. } + { split; [| basic_solver 4]. + rewrite (seq_rf SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rfD in PTH; [| apply INV]. + destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. + subst. + destruct SIMREL. + apply seq_lab in INE1, INE2. + unfold compose in *. + unfold seq. exists (mapper x3); splits. + { red; splits; vauto. + unfold compose in INE1. + unfold is_w in *. + rewrite <- INE1; vauto. } + exists (mapper y0); splits; vauto. + red; splits; vauto. unfold is_r in *. + unfold compose in INE2. + rewrite <- INE2; vauto. } + { rewrite (seq_rf SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rfl in PTH; [| apply INV]. + unfold same_loc in *. + apply (seq_lab SIMREL) in INE1, INE2. + unfold compose in *. + unfold loc in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_rf SIMREL). + unfold funeq. intros a b MAP. + destruct MAP as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rfv in PTH; [| apply INV]. + apply (seq_lab SIMREL) in INE1. + apply (seq_lab SIMREL) in INE2. + unfold compose in *. + unfold val in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_rf SIMREL). + unfold functional. + intros x y z M M'. + destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. + destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. + destruct SIMREL. + assert (EQQ : y1 = y0). + { apply seq_inj; vauto. + { apply wf_rfE in PTH2; [| apply INV]. + destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + apply wf_rfE in PTH1; [| apply INV]. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + subst. + assert (EQQ' : x0 = x1). + { destruct wf_rff with (G := G_t) (x := y0) + (y := x0) (z := x1); vauto. + apply INV. } + basic_solver. } + { split; [| basic_solver]. + rewrite (seq_co SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_coE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + unfold seq. + exists (mapper x2); split. + { red; split; vauto. + destruct SIMREL. apply seq_codom. + red; exists x2; vauto. } + exists (mapper y0); split; vauto. + red; split; vauto. + destruct SIMREL. apply seq_codom. + red; exists y0; vauto. } + { split; [| basic_solver 4]. + rewrite (seq_co SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_coE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_coD in PTH; [| apply INV]. + destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. + subst. + destruct SIMREL. + apply seq_lab in INE1, INE2. + unfold compose in *. + unfold seq. exists (mapper x3); splits. + { red; splits; vauto. + unfold compose in INE1. + unfold is_w in *. + rewrite <- INE1; vauto. } + exists (mapper y0); splits; vauto. + red; splits; vauto. unfold is_w in *. + unfold compose in INE2. + rewrite <- INE2; vauto. } + { rewrite (seq_co SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_coE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_col in PTH; [| apply INV]. + unfold same_loc in *. + apply (seq_lab SIMREL) in INE1, INE2. + unfold compose in *. + unfold loc in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_co SIMREL). + unfold transitive. + intros x y z M M'. + destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. + destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. + destruct SIMREL. + red; exists x0, y1; splits; vauto. + assert (EQQ : x1 = y0). + { apply seq_inj; vauto. + { apply wf_coE in PTH2; [| apply INV]. + destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + apply wf_coE in PTH1; [| apply INV]. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + subst. + apply co_trans with (x := x0) (y := y0) (z := y1); vauto. + apply INV. } + { intros ol. + rewrite (seq_co SIMREL). + unfold is_total. + intros a COND1 b COND2 NEQ. + unfold collect_rel. + destruct COND1 as [[INE1 ISW1] LOC1]. + destruct COND2 as [[INE2 ISW2] LOC2]. + destruct SIMREL. + apply seq_acts in INE1, INE2. + destruct INE1 as [a0 [INE1 MAP1]]. + destruct INE2 as [b0 [INE2 MAP2]]. + destruct wf_co_total with (G := G_t) (ol := ol) + (a := a0) (b := b0). + { apply INV. } + { split. + { split; vauto. + apply seq_lab in INE1. + unfold compose in *. + unfold is_w in *. + rewrite INE1; vauto. } + unfold loc in *. + apply seq_lab in INE1. + unfold compose in *. + rewrite INE1; vauto. } + { split. + { split; vauto. + apply seq_lab in INE2. + unfold compose in *. + unfold is_w in *. + rewrite INE2; vauto. } + unfold loc in *. + apply seq_lab in INE2. + unfold compose in *. + rewrite INE2; vauto. } + { intros FALSE. + apply NEQ. subst; vauto. } + { left. exists a0, b0; splits; vauto. } + right. exists b0, a0; splits; vauto. } + { rewrite (seq_co SIMREL). + unfold irreflexive. + intros x COND. + destruct COND as [x0 [y0 [PTH1 [M1 M2]]]]; subst. + destruct co_irr with (G := G_t) (x := x0); [apply INV|]. + assert (EQQ : y0 = x0). + { apply (seq_inj SIMREL); vauto. + { apply wf_coE in PTH1; [| apply INV]. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + apply wf_coE in PTH1; [| apply INV]. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + subst; vauto. } + { intros l COND. + destruct COND. + destruct H as [INE LOC]. + apply (seq_acts SIMREL) in INE. + destruct INE as [x0 [INE MAP]]. + apply (seq_acts SIMREL). + unfold set_collect. exists (InitEvent l); split; vauto. + { apply wf_init; [apply INV |]. + exists x0; split; vauto. + unfold loc in *. apply (seq_lab SIMREL) in INE. + unfold compose in *. + rewrite INE; vauto. } + rewrite (seq_init SIMREL); vauto. } + { intros l. + assert (INE1 : E_s (InitEvent l)). + { apply (seq_acts SIMREL). + exists (InitEvent l). + split; [now apply (rsr_init_acts INV) |]. + destruct SIMREL. + rewrite seq_init; vauto. } + destruct SIMREL. + apply seq_lab_rev in INE1. + rewrite INE1. + unfold compose. + rewrite seq_init_rev; vauto. + apply wf_init_lab; apply INV. } + { rewrite (seq_rmw_dep SIMREL); vauto. } + { rewrite (seq_rmw_dep SIMREL); basic_solver 4. } + intros e INE. + assert (INE' : E_s e) by vauto. + destruct SIMREL. + apply seq_acts in INE. + destruct INE as [e0 [INE MAP]]. + assert (INE2 : E_t e0) by vauto. + apply wf_threads in INE; [| apply INV]. + rewrite <- MAP. + apply seq_threads. + destruct classic with (tid (mapper e0) = t_2). + { right; vauto. } + left. apply seq_mapeq in H. + { rewrite H; vauto. } + vauto. +Admitted. + Lemma simrel_step_reex (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) @@ -1202,7 +1523,7 @@ Proof using. basic_solver. } rewrite INITDER. unfold dtrmt'; vauto. } - { admit. (* TODO : Wf G_s *) } + { apply wf_transition; vauto. } apply restrict_sub; [basic_solver |]. unfold dtrmt'. destruct SIMREL. @@ -1337,7 +1658,311 @@ Proof using. rewrite INE1, INE2 in SL. unfold same_loc, loc; vauto. } { apply INV'. } - { admit. (* wf_s' *) } + { arewrite (G_s' = (WCore.G X_s')). + constructor. + { intros a b COND. + destruct COND as [INA [INB [NEQ [TIDS NINIT]]]]. + intros FLS. + specialize INDLEMMA with a b. + apply NEQ; apply INDLEMMA; vauto. + unfold is_init in NINIT. + clear - NINIT. unfold not in NINIT. + unfold not. intros FLS. + unfold tid in FLS. + destruct a. + { apply NINIT; vauto. } + admit. (* ??? *) } + { rewrite (seq_data SIMRELQ); vauto. } + { rewrite (seq_data SIMRELQ); clear; [ basic_solver 4 ]. } + { rewrite (seq_addr SIMRELQ); vauto. } + { rewrite (seq_addr SIMRELQ); clear; [ basic_solver 4 ]. } + { rewrite (seq_ctrl SIMRELQ); vauto. } + { rewrite (seq_ctrl SIMRELQ); clear; [ basic_solver 4 ]. } + { rewrite (seq_ctrl SIMRELQ); clear; [ basic_solver 4 ]. } + { split; [| basic_solver 9 ]. + rewrite (seq_rmw SIMRELQ); vauto. + intros x y COND. destruct COND as [x0 [y0 [RMW [M1 M2]]]]. + apply wf_rmwE in RMW. + { destruct RMW as [x1 [[EQ1 INE1] [x2 [PTH [EQ2 INE2]]]]]. + subst. destruct SIMRELQ. + apply seq_lab in INE1, INE2. + apply wf_rmwD in PTH. + { destruct PTH as [x2 [[EQ1 RD] [x3 [PTH [EQ2 WT]]]]]. + subst. unfold seq. exists (mapper' x2); splits. + { red; splits; vauto. + unfold compose in INE1. + unfold is_r in *. + rewrite <- INE1; vauto. } + exists (mapper' y0); splits; vauto. + red; splits; vauto. unfold is_w in *. + unfold compose in INE2. + rewrite <- INE2; vauto. } + apply INV'. } + apply INV'. } + { rewrite (seq_rmw SIMRELQ). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rmwE in PTH; [| apply INV']. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rmwl in PTH; [| apply INV']. + unfold same_loc in *. + apply (seq_lab SIMRELQ) in INE1, INE2. + unfold compose in *. + unfold loc in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_rmw SIMRELQ). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rmwE in PTH; [| apply INV']. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. apply wf_rmwi in PTH; [| apply INV']. + admit. (* false *) } + { split; [| basic_solver 4]. + rewrite (seq_rf SIMRELQ). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV']. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + unfold seq. + exists (mapper' x2); split. + { red; split; vauto. + destruct SIMRELQ. apply seq_codom. + red; exists x2; vauto. } + exists (mapper' y0); split; vauto. } + { split; [| basic_solver 4]. + rewrite (seq_rf SIMRELQ). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV']. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rfD in PTH; [| apply INV']. + destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. + subst. + destruct SIMRELQ. + apply seq_lab in INE1, INE2. + unfold compose in *. + unfold seq. exists (mapper' x3); splits. + { red; splits; vauto. + unfold compose in INE1. + unfold is_w in *. + rewrite <- INE1; vauto. } + exists (mapper' y0); splits; vauto. + red; splits; vauto. unfold is_r in *. + unfold compose in INE2. + rewrite <- INE2; vauto. } + { rewrite (seq_rf SIMRELQ). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV']. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rfl in PTH; [| apply INV']. + unfold same_loc in *. + apply (seq_lab SIMRELQ) in INE1, INE2. + unfold compose in *. + unfold loc in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_rf SIMRELQ). + unfold funeq. intros a b MAP. + destruct MAP as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV']. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rfv in PTH; [| apply INV']. + apply (seq_lab SIMRELQ) in INE1. + apply (seq_lab SIMRELQ) in INE2. + unfold compose in *. + unfold val in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_rf SIMRELQ). + unfold functional. + intros x y z M M'. + destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. + destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. + destruct SIMRELQ. + assert (EQQ : y1 = y0). + { apply seq_inj; vauto. + { apply wf_rfE in PTH2; [| apply INV']. + destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + apply wf_rfE in PTH1; [| apply INV']. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + subst. + assert (EQQ' : x0 = x1). + { destruct wf_rff with (G := G_t') (x := y0) + (y := x0) (z := x1); vauto. + apply INV'. } + basic_solver. } + { split; [| basic_solver]. + rewrite (seq_co SIMRELQ). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_coE in PTH; [| apply INV']. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + unfold seq. + exists (mapper' x2); split. + { red; split; vauto. + destruct SIMRELQ. apply seq_codom. + red; exists x2; vauto. } + exists (mapper' y0); split; vauto. } + { split; [| basic_solver 4]. + rewrite (seq_co SIMRELQ). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_coE in PTH; [| apply INV']. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_coD in PTH; [| apply INV']. + destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. + subst. + destruct SIMRELQ. + apply seq_lab in INE1, INE2. + unfold compose in *. + unfold seq. exists (mapper' x3); splits. + { red; splits; vauto. + unfold compose in INE1. + unfold is_w in *. + rewrite <- INE1; vauto. } + exists (mapper' y0); splits; vauto. + red; splits; vauto. unfold is_w in *. + unfold compose in INE2. + rewrite <- INE2; vauto. } + { rewrite (seq_co SIMRELQ). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_coE in PTH; [| apply INV']. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_col in PTH; [| apply INV']. + unfold same_loc in *. + apply (seq_lab SIMRELQ) in INE1, INE2. + unfold compose in *. + unfold loc in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_co SIMRELQ). + unfold transitive. + intros x y z M M'. + destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. + destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. + destruct SIMRELQ. + red; exists x0, y1; splits; vauto. + assert (EQQ : x1 = y0). + { apply seq_inj; vauto. + { apply wf_coE in PTH2; [| apply INV']. + destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + apply wf_coE in PTH1; [| apply INV']. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + subst. + apply co_trans with (x := x0) (y := y0) (z := y1); vauto. + apply INV'. } + { intros ol. + rewrite (seq_co SIMRELQ). + unfold is_total. + intros a COND1 b COND2 NEQ. + unfold collect_rel. + destruct COND1 as [[INE1 ISW1] LOC1]. + destruct COND2 as [[INE2 ISW2] LOC2]. + destruct SIMRELQ. + apply seq_acts in INE1, INE2. + destruct INE1 as [a0 [INE1 MAP1]]. + destruct INE2 as [b0 [INE2 MAP2]]. + destruct wf_co_total with (G := G_t') (ol := ol) + (a := a0) (b := b0). + { apply INV'. } + { split. + { split; vauto. + apply seq_lab in INE1. + unfold compose in *. + unfold is_w in *. + rewrite INE1; vauto. } + unfold loc in *. + apply seq_lab in INE1. + unfold compose in *. + rewrite INE1; vauto. } + { split. + { split; vauto. + apply seq_lab in INE2. + unfold compose in *. + unfold is_w in *. + rewrite INE2; vauto. } + unfold loc in *. + apply seq_lab in INE2. + unfold compose in *. + rewrite INE2; vauto. } + { intros FALSE. + apply NEQ. subst; vauto. } + { left. exists a0, b0; splits; vauto. } + right. exists b0, a0; splits; vauto. } + { rewrite (seq_co SIMRELQ). + unfold irreflexive. + intros x COND. + destruct COND as [x0 [y0 [PTH1 [M1 M2]]]]; subst. + destruct co_irr with (G := G_t') (x := x0); [apply INV'|]. + assert (EQQ : y0 = x0). + { apply (seq_inj SIMRELQ); vauto. + { apply wf_coE in PTH1; [| apply INV']. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + apply wf_coE in PTH1; [| apply INV']. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + subst; vauto. } + { intros l COND. + destruct COND. + destruct H as [INE LOC]. + apply (seq_acts SIMRELQ) in INE. + destruct INE as [x0 [INE MAP]]. + apply (seq_acts SIMRELQ). + unfold set_collect. exists (InitEvent l); split; vauto. + { apply wf_init; [apply INV' |]. + exists x0; split; vauto. + unfold loc in *. apply (seq_lab SIMRELQ) in INE. + unfold compose in *. + rewrite INE; vauto. } + rewrite (seq_init SIMRELQ); vauto. } + { intros l. + assert (INE1 : acts_set (WCore.G X_s') (InitEvent l)). + { apply (seq_acts SIMRELQ). + exists (InitEvent l). + split; [now apply (rsr_init_acts INV') |]. + destruct SIMRELQ. + rewrite seq_init; vauto. } + destruct SIMRELQ. + apply seq_lab_rev in INE1. + rewrite INE1. + unfold compose. + rewrite seq_init_rev; vauto. + apply wf_init_lab; apply INV'. } + { rewrite (seq_rmw_dep SIMRELQ); vauto. } + { rewrite (seq_rmw_dep SIMRELQ); basic_solver 4. } + intros e INE. + assert (INE' : acts_set (WCore.G X_s') e) by vauto. + destruct SIMRELQ. + apply seq_acts in INE. + destruct INE as [e0 [INE MAP]]. + assert (INE2 : E_t' e0) by vauto. + apply wf_threads in INE; [| apply INV']. + rewrite <- MAP. + apply seq_threads. + destruct classic with (tid (mapper' e0) = t_2). + { right; vauto. } + left. apply seq_mapeq in H. + { rewrite H; vauto. } + vauto. } destruct STEP; vauto. } { destruct SIMREL. unfold dtrmt'. unfold WCore.reexec_thread. From 7282dace2c0dd088b0de1068682193adee9b8141 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Sun, 11 May 2025 01:13:18 +0200 Subject: [PATCH 32/51] plenty of work --- src/reordering/ReorderingExecA.v | 1 - src/sequentialization/SequentBase.v | 1 + src/sequentialization/SequentExec.v | 29 + src/sequentialization/SequentReexec.v | 1333 +++++++++++++------------ src/sequentialization/SequentWf.v | 418 ++++++++ src/xmm/Core.v | 2 +- 6 files changed, 1138 insertions(+), 646 deletions(-) create mode 100644 src/sequentialization/SequentWf.v diff --git a/src/reordering/ReorderingExecA.v b/src/reordering/ReorderingExecA.v index b089fdc..6d0593c 100644 --- a/src/reordering/ReorderingExecA.v +++ b/src/reordering/ReorderingExecA.v @@ -679,7 +679,6 @@ Proof using ADD SIMREL INV INV'. all: unfold f. all: rewrite ?collect_rel_id, ?set_collect_id. { basic_solver. } - { basic_solver. } { intros e EIN. unfold id. now apply rsr_a_labeq. } { apply rsr_rpo_emb. } diff --git a/src/sequentialization/SequentBase.v b/src/sequentialization/SequentBase.v index 3fd5bbc..455e900 100644 --- a/src/sequentialization/SequentBase.v +++ b/src/sequentialization/SequentBase.v @@ -102,6 +102,7 @@ Record seq_simrel : Prop := { seq_mapto : forall e : actid, E_t e -> tid (mapper e) = t_2 -> mapper e = ThreadEvent t_2 (index e - t_1_len); seq_index : forall e : actid, E_t e -> tid (mapper e) = t_2 -> index e = t_1_len + index (mapper e); seq_thrd : forall e : actid, E_t e -> tid (mapper e) = t_2 -> tid e = t_1; + seq_maprev : forall e : actid, E_s e -> tid e = t_2 -> mappre_rev e = ThreadEvent t_1 (index e + t_1_len); seq_out : forall e : actid, E_t e -> tid e <> t_1 -> mapper e = e; seq_out_snd : forall e : actid, E_t e -> tid e = t_1 -> index e < t_1_len -> mapper e = e; diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index eceaa14..391e376 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -11,6 +11,7 @@ From xmm Require Import Reordering. From xmm Require Import ThreadTrace. From xmm Require Import Programs. From xmm Require Import SequentBase. +From xmm Require Import SequentWf. From xmm Require Import ConsistencyMonotonicity. From hahn Require Import Hahn. @@ -179,6 +180,12 @@ Proof using. rewrite C2; rewrite <- CDD. clear - T1 THRDNEQ. intros FALSE; desf. } + assert (INDLEMMA : forall x y (NNIT : tid x <> tid_init) (EQT : tid x = tid y) (EQI : index x = index y), + x = y). + { clear. intros x y NNIT EQT EQI. + destruct x; destruct y; desf; ins. + desf. } + unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). @@ -552,6 +559,27 @@ Proof using. apply EQACTS in INE. destruct INE as [C1 | C2]; vauto. } vauto. } + { intros x INE TID2. + unfold mapper_rev'. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. exfalso. + clear - TID TID2 THRDNEQ. desf. } + rewrite updo; vauto. + rewrite (seq_maprev SIMREL); vauto. + { apply INDLEMMA; vauto. + unfold index. rewrite TID; lia. } + apply (seq_acts SIMREL). + apply MAPSUB. + unfold set_collect in INE. + destruct INE as [x0 [INE MAP]]. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { vauto. } + rewrite <- C2 in MAP. + assert (MAPNORM : mapper' e = e). + { rewrite set_collect_eq in MAPER_E. + apply MAPER_E; vauto. } + desf. } { intros x INE TID2. destruct classic with (x = e) as [EQ | NEQ]. { subst x. unfold mapper'. @@ -908,6 +936,7 @@ Proof using. desf. } { rewrite EQACTS. rewrite set_collect_union. rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } + { admit. } { admit. (*TODO : po-work*) } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 505df3e..a36ae51 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -12,6 +12,7 @@ From xmm Require Import Reordering. From xmm Require Import ThreadTrace. From xmm Require Import Programs. From xmm Require Import SequentBase. +From xmm Require Import SequentWf. From xmm Require Import ConsistencyMonotonicity. From hahn Require Import Hahn. @@ -150,327 +151,6 @@ Definition thrdle' := thrdle ∪ eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq Hypothesis INV : seq_simrel_inv X_t. Hypothesis INV' : seq_simrel_inv X_t'. -Lemma wf_transition - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) : - Wf G_s. -Proof using. - assert (INDLEMMA : forall x y (NNIT : tid x <> tid_init) (EQT : tid x = tid y) (EQI : index x = index y), - x = y). - { clear. intros x y NNIT EQT EQI. - destruct x; destruct y; desf; ins. - desf. } - constructor. - { intros a b COND. - destruct COND as [INA [INB [NEQ [TIDS NINIT]]]]. - intros FLS. - specialize INDLEMMA with a b. - apply NEQ; apply INDLEMMA; vauto. - unfold is_init in NINIT. - clear - NINIT. unfold not in NINIT. - unfold not. intros FLS. - unfold tid in FLS. - destruct a. - { apply NINIT; vauto. } - admit. (* ??? *) } - { rewrite (seq_data SIMREL); vauto. } - { rewrite (seq_data SIMREL); clear; [ basic_solver 4 ]. } - { rewrite (seq_addr SIMREL); vauto. } - { rewrite (seq_addr SIMREL); clear; [ basic_solver 4 ]. } - { rewrite (seq_ctrl SIMREL); vauto. } - { rewrite (seq_ctrl SIMREL); clear; [ basic_solver 4 ]. } - { rewrite (seq_ctrl SIMREL); clear; [ basic_solver 4 ]. } - { split; [| basic_solver 9 ]. - rewrite (seq_rmw SIMREL); vauto. - intros x y COND. destruct COND as [x0 [y0 [RMW [M1 M2]]]]. - apply wf_rmwE in RMW. - { destruct RMW as [x1 [[EQ1 INE1] [x2 [PTH [EQ2 INE2]]]]]. - subst. destruct SIMREL. - apply seq_lab in INE1, INE2. - apply wf_rmwD in PTH. - { destruct PTH as [x2 [[EQ1 RD] [x3 [PTH [EQ2 WT]]]]]. - subst. unfold seq. exists (mapper x2); splits. - { red; splits; vauto. - unfold compose in INE1. - unfold is_r in *. - rewrite <- INE1; vauto. } - exists (mapper y0); splits; vauto. - red; splits; vauto. unfold is_w in *. - unfold compose in INE2. - rewrite <- INE2; vauto. } - apply INV. } - apply INV. } - { rewrite (seq_rmw SIMREL). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rmwE in PTH; [| apply INV]. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_rmwl in PTH; [| apply INV]. - unfold same_loc in *. - apply (seq_lab SIMREL) in INE1, INE2. - unfold compose in *. - unfold loc in *. - rewrite <- INE1. - rewrite <- INE2; vauto. } - { rewrite (seq_rmw SIMREL). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rmwE in PTH; [| apply INV]. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. apply wf_rmwi in PTH; [| apply INV]. - admit. (* false *) } - { split; [| basic_solver 4]. - rewrite (seq_rf SIMREL). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rfE in PTH; [| apply INV]. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - unfold seq. - exists (mapper x2); split. - { red; split; vauto. - destruct SIMREL. apply seq_codom. - red; exists x2; vauto. } - exists (mapper y0); split; vauto. - red; split; vauto. - destruct SIMREL. apply seq_codom. - red; exists y0; vauto. } - { split; [| basic_solver 4]. - rewrite (seq_rf SIMREL). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rfE in PTH; [| apply INV]. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_rfD in PTH; [| apply INV]. - destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. - subst. - destruct SIMREL. - apply seq_lab in INE1, INE2. - unfold compose in *. - unfold seq. exists (mapper x3); splits. - { red; splits; vauto. - unfold compose in INE1. - unfold is_w in *. - rewrite <- INE1; vauto. } - exists (mapper y0); splits; vauto. - red; splits; vauto. unfold is_r in *. - unfold compose in INE2. - rewrite <- INE2; vauto. } - { rewrite (seq_rf SIMREL). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rfE in PTH; [| apply INV]. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_rfl in PTH; [| apply INV]. - unfold same_loc in *. - apply (seq_lab SIMREL) in INE1, INE2. - unfold compose in *. - unfold loc in *. - rewrite <- INE1. - rewrite <- INE2; vauto. } - { rewrite (seq_rf SIMREL). - unfold funeq. intros a b MAP. - destruct MAP as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rfE in PTH; [| apply INV]. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_rfv in PTH; [| apply INV]. - apply (seq_lab SIMREL) in INE1. - apply (seq_lab SIMREL) in INE2. - unfold compose in *. - unfold val in *. - rewrite <- INE1. - rewrite <- INE2; vauto. } - { rewrite (seq_rf SIMREL). - unfold functional. - intros x y z M M'. - destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. - destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. - destruct SIMREL. - assert (EQQ : y1 = y0). - { apply seq_inj; vauto. - { apply wf_rfE in PTH2; [| apply INV]. - destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - apply wf_rfE in PTH1; [| apply INV]. - destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - subst. - assert (EQQ' : x0 = x1). - { destruct wf_rff with (G := G_t) (x := y0) - (y := x0) (z := x1); vauto. - apply INV. } - basic_solver. } - { split; [| basic_solver]. - rewrite (seq_co SIMREL). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_coE in PTH; [| apply INV]. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - unfold seq. - exists (mapper x2); split. - { red; split; vauto. - destruct SIMREL. apply seq_codom. - red; exists x2; vauto. } - exists (mapper y0); split; vauto. - red; split; vauto. - destruct SIMREL. apply seq_codom. - red; exists y0; vauto. } - { split; [| basic_solver 4]. - rewrite (seq_co SIMREL). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_coE in PTH; [| apply INV]. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_coD in PTH; [| apply INV]. - destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. - subst. - destruct SIMREL. - apply seq_lab in INE1, INE2. - unfold compose in *. - unfold seq. exists (mapper x3); splits. - { red; splits; vauto. - unfold compose in INE1. - unfold is_w in *. - rewrite <- INE1; vauto. } - exists (mapper y0); splits; vauto. - red; splits; vauto. unfold is_w in *. - unfold compose in INE2. - rewrite <- INE2; vauto. } - { rewrite (seq_co SIMREL). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_coE in PTH; [| apply INV]. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_col in PTH; [| apply INV]. - unfold same_loc in *. - apply (seq_lab SIMREL) in INE1, INE2. - unfold compose in *. - unfold loc in *. - rewrite <- INE1. - rewrite <- INE2; vauto. } - { rewrite (seq_co SIMREL). - unfold transitive. - intros x y z M M'. - destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. - destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. - destruct SIMREL. - red; exists x0, y1; splits; vauto. - assert (EQQ : x1 = y0). - { apply seq_inj; vauto. - { apply wf_coE in PTH2; [| apply INV]. - destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - apply wf_coE in PTH1; [| apply INV]. - destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - subst. - apply co_trans with (x := x0) (y := y0) (z := y1); vauto. - apply INV. } - { intros ol. - rewrite (seq_co SIMREL). - unfold is_total. - intros a COND1 b COND2 NEQ. - unfold collect_rel. - destruct COND1 as [[INE1 ISW1] LOC1]. - destruct COND2 as [[INE2 ISW2] LOC2]. - destruct SIMREL. - apply seq_acts in INE1, INE2. - destruct INE1 as [a0 [INE1 MAP1]]. - destruct INE2 as [b0 [INE2 MAP2]]. - destruct wf_co_total with (G := G_t) (ol := ol) - (a := a0) (b := b0). - { apply INV. } - { split. - { split; vauto. - apply seq_lab in INE1. - unfold compose in *. - unfold is_w in *. - rewrite INE1; vauto. } - unfold loc in *. - apply seq_lab in INE1. - unfold compose in *. - rewrite INE1; vauto. } - { split. - { split; vauto. - apply seq_lab in INE2. - unfold compose in *. - unfold is_w in *. - rewrite INE2; vauto. } - unfold loc in *. - apply seq_lab in INE2. - unfold compose in *. - rewrite INE2; vauto. } - { intros FALSE. - apply NEQ. subst; vauto. } - { left. exists a0, b0; splits; vauto. } - right. exists b0, a0; splits; vauto. } - { rewrite (seq_co SIMREL). - unfold irreflexive. - intros x COND. - destruct COND as [x0 [y0 [PTH1 [M1 M2]]]]; subst. - destruct co_irr with (G := G_t) (x := x0); [apply INV|]. - assert (EQQ : y0 = x0). - { apply (seq_inj SIMREL); vauto. - { apply wf_coE in PTH1; [| apply INV]. - destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - apply wf_coE in PTH1; [| apply INV]. - destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - subst; vauto. } - { intros l COND. - destruct COND. - destruct H as [INE LOC]. - apply (seq_acts SIMREL) in INE. - destruct INE as [x0 [INE MAP]]. - apply (seq_acts SIMREL). - unfold set_collect. exists (InitEvent l); split; vauto. - { apply wf_init; [apply INV |]. - exists x0; split; vauto. - unfold loc in *. apply (seq_lab SIMREL) in INE. - unfold compose in *. - rewrite INE; vauto. } - rewrite (seq_init SIMREL); vauto. } - { intros l. - assert (INE1 : E_s (InitEvent l)). - { apply (seq_acts SIMREL). - exists (InitEvent l). - split; [now apply (rsr_init_acts INV) |]. - destruct SIMREL. - rewrite seq_init; vauto. } - destruct SIMREL. - apply seq_lab_rev in INE1. - rewrite INE1. - unfold compose. - rewrite seq_init_rev; vauto. - apply wf_init_lab; apply INV. } - { rewrite (seq_rmw_dep SIMREL); vauto. } - { rewrite (seq_rmw_dep SIMREL); basic_solver 4. } - intros e INE. - assert (INE' : E_s e) by vauto. - destruct SIMREL. - apply seq_acts in INE. - destruct INE as [e0 [INE MAP]]. - assert (INE2 : E_t e0) by vauto. - apply wf_threads in INE; [| apply INV]. - rewrite <- MAP. - apply seq_threads. - destruct classic with (tid (mapper e0) = t_2). - { right; vauto. } - left. apply seq_mapeq in H. - { rewrite H; vauto. } - vauto. -Admitted. - Lemma simrel_step_reex (NINIT1 : t_1 <> tid_init) (NINIT2 : t_2 <> tid_init) @@ -1038,6 +718,12 @@ Proof using. apply NNPP in n0; vauto. } unfold not in n0. apply NNPP in n0; vauto. } + { intros e INE COND. + unfold mapper_rev'. desf. + unfold t_1_len, SequentBase.t_1_len. + apply INDLEMMA; vauto. + unfold index. desf. + lia. } { intros e NINE. unfold mapper'; desf. } { intros e INE TID. @@ -1370,7 +1056,7 @@ Proof using. apply reexec_embd_dom in DT; vauto. } exists (mapper x3); split; vauto. red; split; vauto. } - { admit. } + { admit. (* ugh *)} { arewrite (WCore.G X_s' = G_s'). unfold G_s' at 1; ins. intros x COND. @@ -1422,7 +1108,6 @@ Proof using. { destruct STEP. destruct reexec_embd_corr. constructor; vauto. - { unfold cmt'. unfold inj_dom. intros x y CD1 CD2 EQQ. @@ -1447,21 +1132,6 @@ Proof using. exists x0; vauto. } apply reexec_embd_acts; red. exists x1; vauto. } - { intros e CMT. - unfold cmt' in CMT. - unfold set_collect in CMT. - destruct CMT as [x [CMT EQ]]. - specialize (reexec_embd_lab x). - assert (INE : E_t' x). - { apply reexec_embd_dom in CMT; vauto. } - subst. - unfold compose. - assert (HLP : mapper_rev' (mapper' x) = x). - { unfold compose in MAPCOMP. - apply MAPCOMP. - apply reexec_embd_dom in CMT; vauto. } - rewrite HLP. - admit. } { intros e CMT. unfold cmt' in CMT. unfold set_collect in CMT. @@ -1486,7 +1156,134 @@ Proof using. apply seq_lab0. apply reexec_embd_acts; red; vauto. } apply reexec_embd_dom; vauto. } - all : admit. } + { admit. (* ugh *) } + { unfold cmt'. + rewrite (seq_rf SIMRELQ). + rewrite (seq_rf SIMREL). + destruct STEP. + destruct reexec_embd_corr. + rewrite <- reexec_embd_rf0. + rewrite collect_rel_restr. + { intros x y COND. + unfold compose in COND. + unfold collect_rel in COND. + destruct COND as [x0 [x1 [COND [EQ1 EQ2]]]]. + destruct COND as [x2 [x3 [COND [EQ3 EQ4]]]]. + unfold collect_rel. + exists (f_t (mapper_rev' x0)), (f_t (mapper_rev' x1)); splits. + { exists x2, x3; splits; vauto. + { unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [RF CDS]. + apply wf_rfE in RF; [|apply INV']. + destruct RF as [x0 [[INE EQQ] RF2]]; vauto. } + unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [RF CDS]. + apply wf_rfE in RF; [|apply INV']. + destruct RF as [x0 [RF1 [RF2 [RF3 [INE EQQ]]]]]; vauto. } + all : vauto. } + rewrite reexec_embd_dom0. + rewrite wf_rfE; [| apply INV']. + rewrite dom_eqv1. + rewrite <- seqA. + rewrite codom_seq_eqv_r. + arewrite (E_t' ∩₁ dom_rel (rf_t' ⨾ ⦗E_t'⦘) ⊆₁ E_t'). + { basic_solver. } + destruct SIMRELQ. + clear - seq_inj. + basic_solver 8. } + { unfold cmt'. + rewrite (seq_co SIMRELQ). + rewrite (seq_co SIMREL). + destruct STEP. + destruct reexec_embd_corr. + rewrite <- reexec_embd_co0. + rewrite collect_rel_restr. + { intros x y COND. + unfold compose in COND. + unfold collect_rel in COND. + destruct COND as [x0 [x1 [COND [EQ1 EQ2]]]]. + destruct COND as [x2 [x3 [COND [EQ3 EQ4]]]]. + unfold collect_rel. + exists (f_t (mapper_rev' x0)), (f_t (mapper_rev' x1)); splits. + { exists x2, x3; splits; vauto. + { unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [CO CDS]. + apply wf_coE in CO; [|apply INV']. + destruct CO as [x0 [[INE EQQ] CO2]]; vauto. } + unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [CO CDS]. + apply wf_coE in CO; [|apply INV']. + destruct CO as [x0 [CO1 [CO2 [CO3 [INE EQQ]]]]]; vauto. } + all : vauto. } + rewrite reexec_embd_dom0. + rewrite wf_coE; [| apply INV']. + rewrite dom_eqv1. + rewrite <- seqA. + rewrite codom_seq_eqv_r. + arewrite (E_t' ∩₁ dom_rel (co_t' ⨾ ⦗E_t'⦘) ⊆₁ E_t'). + { basic_solver. } + destruct SIMRELQ. + clear - seq_inj. + basic_solver 8. } + { unfold cmt'. + rewrite (seq_rmw SIMRELQ). + rewrite (seq_rmw SIMREL). + destruct STEP. + destruct reexec_embd_corr. + rewrite <- reexec_embd_rmw0. + rewrite collect_rel_restr. + { intros x y COND. + unfold compose in COND. + unfold collect_rel in COND. + destruct COND as [x0 [x1 [COND [EQ1 EQ2]]]]. + destruct COND as [x2 [x3 [COND [EQ3 EQ4]]]]. + unfold collect_rel. + exists (f_t (mapper_rev' x0)), (f_t (mapper_rev' x1)); splits. + { exists x2, x3; splits; vauto. + { unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [RM CDS]. + apply wf_rmwE in RM; [|apply INV']. + destruct RM as [x0 [[INE EQQ] RM2]]; vauto. } + unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [RM CDS]. + apply wf_rmwE in RM; [|apply INV']. + destruct RM as [x0 [RM1 [RM2 [RM3 [INE EQQ]]]]]; vauto. } + all : vauto. } + rewrite reexec_embd_dom0. + rewrite wf_rmwE; [| apply INV']. + rewrite dom_eqv1. + rewrite <- seqA. + rewrite codom_seq_eqv_r. + arewrite (E_t' ∩₁ dom_rel (rmw_t' ⨾ ⦗E_t'⦘) ⊆₁ E_t'). + { basic_solver. } + destruct SIMRELQ. + clear - seq_inj. + basic_solver 8. } + unfold cmt'. + intros x COND. + unfold set_collect in COND. + destruct COND as [x0 [COND EQ]]. + destruct COND as [x1 [COND EQ1]]. + rewrite <- EQ1 in EQ. + unfold compose in EQ. + unfold compose in MAPCOMP. + rewrite MAPCOMP in EQ. + { unfold id in EQ. + rewrite <- EQ. + destruct SIMREL. + apply seq_acts. + unfold set_collect. + exists (f_t x1); split; vauto. + apply reexec_embd_acts. + clear - COND. + basic_solver. } + apply reexec_embd_dom; vauto. } { destruct STEP. unfold rf_complete. arewrite (WCore.G X_s' = G_s'). unfold G_s'. simpls. @@ -1523,7 +1320,10 @@ Proof using. basic_solver. } rewrite INITDER. unfold dtrmt'; vauto. } - { apply wf_transition; vauto. } + { apply wf_transition with (X_t := X_t) + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper) (mapper_rev := mapper_rev) + (ptc_1 := ptc_1); vauto. } apply restrict_sub; [basic_solver |]. unfold dtrmt'. destruct SIMREL. @@ -1607,6 +1407,551 @@ Proof using. unfold SequentBase.t_1_len in *. lia. } destruct STEP. apply rexec_acts; vauto. } + { constructor. + { unfold WCore.X_start; ins. + destruct SIMRELQ. + unfold dtrmt'. + unfold cmt'. + rewrite <- !set_interA. + split. + { arewrite (mapper' ↑₁ dtrmt_t ⊆₁ mapper' ↑₁ E_t'). + apply set_subset_collect. + { destruct STEP. + rewrite dtrmt_cmt. + rewrite reexec_embd_dom; vauto. } + clear. basic_solver 8. } + clear. basic_solver 8. } + { unfold WCore.X_start; ins. } + { unfold WCore.X_start; ins. + arewrite ((fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev'). + unfold eq_dom. intros x COND. + destruct SIMREL. + rewrite seq_lab_rev. + { destruct STEP. + destruct reexec_start_wf. + destruct wf_ereq. + unfold compose. + rewrite <- ereq_lab. + { unfold WCore.X_start; ins. + assert (EQQ: mapper_rev x = mapper_rev' x). + { unfold mapper_rev'. desf. + { apply seq_rest_rev. + clear - n COND reexec_embd_dom. + destruct n. + unfold cmt' in COND. + destruct COND as [CND [x0 [IN1 IN2]]]. + unfold set_collect. + exists x0; split; vauto. + apply reexec_embd_dom; vauto. } + { apply NNPP in n. + apply seq_mapeq_rev; vauto. + clear - COND. + destruct COND as [[DTT ES] RST]; vauto. } + unfold not in n0. + apply NNPP in n0. + rewrite seq_maprev; vauto. + { apply INDLEMMA; vauto. + unfold index. + unfold SequentBase.t_1_len, t_1_len. + lia. } + destruct COND as [[DTT ES] RST]; vauto. } + rewrite EQQ; vauto. } + unfold WCore.X_start; ins. + destruct COND as [[DTT ES] RST]. + apply seq_acts in ES. + unfold dtrmt', cmt' in *. + split. + { split. + { destruct DTT as [x0 [DTT M1]]. + rewrite <- M1. + unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + apply dtrmt_cmt in DTT. + apply reexec_embd_dom in DTT; vauto. } + destruct DTT as [x1 [DTT M1]]. + rewrite <- M1. + unfold compose in MAPCOMP. + rewrite MAPCOMP. + { apply rexec_acts; vauto. } + apply dtrmt_cmt in DTT. + apply reexec_embd_dom in DTT; vauto. } + destruct RST as [x1 [RST M1]]. + rewrite <- M1. + unfold compose in MAPCOMP. + rewrite MAPCOMP. + { unfold id; vauto. } + apply reexec_embd_dom in RST; vauto. } + destruct COND as [[DTT ES] RST]; vauto. } + { unfold WCore.X_start; ins. + destruct STEP. + destruct reexec_start_wf. + destruct wf_ereq. + split. + { intros x y COND. + unfold restr_rel in *. + destruct COND as [CD1 [CD2 CD3]]. + split; vauto. + destruct CD1 as [x0 [[EQ1 DT1] + [x1 [RF [EQ2 DT2]]]]]; subst. + destruct ereq_rf as [IN OUT]. + destruct DT1 as [x2 [DT1 M1]]. + destruct DT2 as [x3 [DT2 M2]]. + destruct IN with x2 x3. + { unfold WCore.X_start; ins. + apply (seq_rf SIMREL) in RF. + unfold collect_rel in RF. + destruct RF as [x5 [x6 [RF [EQ3 EQ4]]]]. + splits. + { unfold seq. + exists x2; split; vauto. + exists x3; split; vauto. + assert (EQQ1 : x5 = x2). + { assert (MEQ : mapper' x2 = mapper x2). + { apply DTRSAME in DT1; vauto. } + rewrite MEQ in EQ3. + apply (seq_inj SIMREL) in EQ3; vauto. + { apply wf_rfE in RF; [|apply INV]. + destruct RF as [x4 [[INE EQQ] RF2]]; vauto. } + apply rexec_acts; vauto. } + assert (EQQ2 : x6 = x3). + { assert (MEQ : mapper' x3 = mapper x3). + { apply DTRSAME in DT2; vauto. } + rewrite MEQ in M2. + apply (seq_inj SIMREL) in M2; vauto. + { apply rexec_acts; vauto. } + apply wf_rfE in RF; [|apply INV]. + destruct RF as [x4 [[INE EQQ] + [x7 [RF [EQR INER]]]]]; vauto. } + subst; vauto. } + { split. + { split; vauto. + apply rexec_acts; vauto. } + apply dtrmt_cmt in DT1; vauto. } + split. + { split; vauto. + apply rexec_acts; vauto. } + apply dtrmt_cmt in DT2; vauto. } + unfold collect_rel. + exists x2, x3; splits; vauto. } + intros x y COND. + unfold restr_rel in *. + destruct COND as [CD1 [CD2 CD3]]. + destruct CD1 as [x0 [x1 [CDD [M1 M2]]]]. + splits. + { unfold seq. exists x; split. + { red; split; vauto. + destruct CD2 as [[CD1 CD2] CD4]; vauto. } + exists y; split. + { apply (seq_rf SIMREL). + destruct ereq_rf as [IN OUT]. + unfold collect_rel. + exists x0, x1; splits; vauto. + { destruct OUT with x0 x1. + { split; vauto. + unfold WCore.X_start; ins. split. + { split. + { split. + { destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rfE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] RF2]]; vauto. } + destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { apply rexec_acts. + subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rfE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] RF2]]; vauto. } + destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. + apply dtrmt_cmt in DTT1; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rfE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] RF2]]; vauto. } + split. + { split. + { destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rfE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { apply rexec_acts. + subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rfE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. + apply dtrmt_cmt in DTT1; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rfE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + unfold WCore.X_start in H; ins. + destruct H as [x2 [[EQ1 DT1] [x3 [RF [EQ2 DT2]]]]]. + subst; vauto. } + { destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst. + apply DTRSAME; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rfE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst. + apply DTRSAME; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rfE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + red; split; vauto. + destruct CD3 as [[CD1 CD3] CD4]; vauto. } + all : vauto. } + { unfold WCore.X_start; ins. + destruct STEP. + destruct reexec_start_wf. + destruct wf_ereq. + split. + { intros x y COND. + unfold restr_rel in *. + destruct COND as [CD1 [CD2 CD3]]. + split; vauto. + destruct CD1 as [x0 [[EQ1 DT1] + [x1 [RF [EQ2 DT2]]]]]; subst. + destruct ereq_co as [IN OUT]. + destruct DT1 as [x2 [DT1 M1]]. + destruct DT2 as [x3 [DT2 M2]]. + destruct IN with x2 x3. + { unfold WCore.X_start; ins. + apply (seq_co SIMREL) in RF. + unfold collect_rel in RF. + destruct RF as [x5 [x6 [RF [EQ3 EQ4]]]]. + splits. + { unfold seq. + exists x2; split; vauto. + exists x3; split; vauto. + assert (EQQ1 : x5 = x2). + { assert (MEQ : mapper' x2 = mapper x2). + { apply DTRSAME in DT1; vauto. } + rewrite MEQ in EQ3. + apply (seq_inj SIMREL) in EQ3; vauto. + { apply wf_coE in RF; [|apply INV]. + destruct RF as [x4 [[INE EQQ] RF2]]; vauto. } + apply rexec_acts; vauto. } + assert (EQQ2 : x6 = x3). + { assert (MEQ : mapper' x3 = mapper x3). + { apply DTRSAME in DT2; vauto. } + rewrite MEQ in M2. + apply (seq_inj SIMREL) in M2; vauto. + { apply rexec_acts; vauto. } + apply wf_coE in RF; [|apply INV]. + destruct RF as [x4 [[INE EQQ] + [x7 [RF [EQR INER]]]]]; vauto. } + subst; vauto. } + { split. + { split; vauto. + apply rexec_acts; vauto. } + apply dtrmt_cmt in DT1; vauto. } + split. + { split; vauto. + apply rexec_acts; vauto. } + apply dtrmt_cmt in DT2; vauto. } + unfold collect_rel. + exists x2, x3; splits; vauto. } + intros x y COND. + unfold restr_rel in *. + destruct COND as [CD1 [CD2 CD3]]. + destruct CD1 as [x0 [x1 [CDD [M1 M2]]]]. + splits. + { unfold seq. exists x; split. + { red; split; vauto. + destruct CD2 as [[CD1 CD2] CD4]; vauto. } + exists y; split. + { apply (seq_co SIMREL). + destruct ereq_co as [IN OUT]. + unfold collect_rel. + exists x0, x1; splits; vauto. + { destruct OUT with x0 x1. + { split; vauto. + unfold WCore.X_start; ins. split. + { split. + { split. + { destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_coE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] RF2]]; vauto. } + destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { apply rexec_acts. + subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_coE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] RF2]]; vauto. } + destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. + apply dtrmt_cmt in DTT1; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_coE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] RF2]]; vauto. } + split. + { split. + { destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_coE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { apply rexec_acts. + subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_coE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. + apply dtrmt_cmt in DTT1; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_coE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + unfold WCore.X_start in H; ins. + destruct H as [x2 [[EQ1 DT1] [x3 [RF [EQ2 DT2]]]]]. + subst; vauto. } + { destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst. + apply DTRSAME; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_coE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst. + apply DTRSAME; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_coE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + red; split; vauto. + destruct CD3 as [[CD1 CD3] CD4]; vauto. } + all : vauto. } + { unfold WCore.X_start; ins. + destruct STEP. + destruct reexec_start_wf. + destruct wf_ereq. + split. + { intros x y COND. + unfold restr_rel in *. + destruct COND as [CD1 [CD2 CD3]]. + split; vauto. + destruct CD1 as [x0 [[EQ1 DT1] + [x1 [RF [EQ2 DT2]]]]]; subst. + destruct ereq_rmw as [IN OUT]. + destruct DT1 as [x2 [DT1 M1]]. + destruct DT2 as [x3 [DT2 M2]]. + destruct IN with x2 x3. + { unfold WCore.X_start; ins. + apply (seq_rmw SIMREL) in RF. + unfold collect_rel in RF. + destruct RF as [x5 [x6 [RF [EQ3 EQ4]]]]. + splits. + { unfold seq. + exists x2; split; vauto. + exists x3; split; vauto. + assert (EQQ1 : x5 = x2). + { assert (MEQ : mapper' x2 = mapper x2). + { apply DTRSAME in DT1; vauto. } + rewrite MEQ in EQ3. + apply (seq_inj SIMREL) in EQ3; vauto. + { apply wf_rmwE in RF; [|apply INV]. + destruct RF as [x4 [[INE EQQ] RF2]]; vauto. } + apply rexec_acts; vauto. } + assert (EQQ2 : x6 = x3). + { assert (MEQ : mapper' x3 = mapper x3). + { apply DTRSAME in DT2; vauto. } + rewrite MEQ in M2. + apply (seq_inj SIMREL) in M2; vauto. + { apply rexec_acts; vauto. } + apply wf_rmwE in RF; [|apply INV]. + destruct RF as [x4 [[INE EQQ] + [x7 [RF [EQR INER]]]]]; vauto. } + subst; vauto. } + { split. + { split; vauto. + apply rexec_acts; vauto. } + apply dtrmt_cmt in DT1; vauto. } + split. + { split; vauto. + apply rexec_acts; vauto. } + apply dtrmt_cmt in DT2; vauto. } + unfold collect_rel. + exists x2, x3; splits; vauto. } + intros x y COND. + unfold restr_rel in *. + destruct COND as [CD1 [CD2 CD3]]. + destruct CD1 as [x0 [x1 [CDD [M1 M2]]]]. + splits. + { unfold seq. exists x; split. + { red; split; vauto. + destruct CD2 as [[CD1 CD2] CD4]; vauto. } + exists y; split. + { apply (seq_rmw SIMREL). + destruct ereq_rmw as [IN OUT]. + unfold collect_rel. + exists x0, x1; splits; vauto. + { destruct OUT with x0 x1. + { split; vauto. + unfold WCore.X_start; ins. split. + { split. + { split. + { destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rmwE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] RF2]]; vauto. } + destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { apply rexec_acts. + subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rmwE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] RF2]]; vauto. } + destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. + apply dtrmt_cmt in DTT1; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rmwE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] RF2]]; vauto. } + split. + { split. + { destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rmwE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { apply rexec_acts. + subst; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rmwE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst; vauto. + apply dtrmt_cmt in DTT1; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rmwE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + unfold WCore.X_start in H; ins. + destruct H as [x2 [[EQ1 DT1] [x3 [RF [EQ2 DT2]]]]]. + subst; vauto. } + { destruct CD2 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst. + apply DTRSAME; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rmwE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + destruct CD3 as [[[x2 [DTT1 MP1]] ES] + [x3 [CMT1 MP2]]]. + apply (seq_inj SIMRELQ) in MP1. + { subst. + apply DTRSAME; vauto. } + { apply dtrmt_cmt in DTT1. + apply reexec_embd_dom in DTT1; vauto. } + apply wf_rmwE in CDD; [|apply INV']. + destruct CDD as [x4 [[INE EQQ] + [x5 [RF [INE2 EQ2]]]]]; vauto. } + red; split; vauto. + destruct CD3 as [[CD1 CD3] CD4]; vauto. } + all : vauto. } + { unfold WCore.X_start; ins. + rewrite (seq_data SIMREL). + clear; basic_solver 8. } + { unfold WCore.X_start; ins. + rewrite (seq_ctrl SIMREL). + clear; basic_solver 8. } + unfold WCore.X_start; ins. + rewrite (seq_rmw_dep SIMREL). + clear; basic_solver 8. } + all : admit. } { apply XmmCons.monoton_cons with (G_t := G_t') (m := mapper'); vauto. @@ -1659,310 +2004,10 @@ Proof using. unfold same_loc, loc; vauto. } { apply INV'. } { arewrite (G_s' = (WCore.G X_s')). - constructor. - { intros a b COND. - destruct COND as [INA [INB [NEQ [TIDS NINIT]]]]. - intros FLS. - specialize INDLEMMA with a b. - apply NEQ; apply INDLEMMA; vauto. - unfold is_init in NINIT. - clear - NINIT. unfold not in NINIT. - unfold not. intros FLS. - unfold tid in FLS. - destruct a. - { apply NINIT; vauto. } - admit. (* ??? *) } - { rewrite (seq_data SIMRELQ); vauto. } - { rewrite (seq_data SIMRELQ); clear; [ basic_solver 4 ]. } - { rewrite (seq_addr SIMRELQ); vauto. } - { rewrite (seq_addr SIMRELQ); clear; [ basic_solver 4 ]. } - { rewrite (seq_ctrl SIMRELQ); vauto. } - { rewrite (seq_ctrl SIMRELQ); clear; [ basic_solver 4 ]. } - { rewrite (seq_ctrl SIMRELQ); clear; [ basic_solver 4 ]. } - { split; [| basic_solver 9 ]. - rewrite (seq_rmw SIMRELQ); vauto. - intros x y COND. destruct COND as [x0 [y0 [RMW [M1 M2]]]]. - apply wf_rmwE in RMW. - { destruct RMW as [x1 [[EQ1 INE1] [x2 [PTH [EQ2 INE2]]]]]. - subst. destruct SIMRELQ. - apply seq_lab in INE1, INE2. - apply wf_rmwD in PTH. - { destruct PTH as [x2 [[EQ1 RD] [x3 [PTH [EQ2 WT]]]]]. - subst. unfold seq. exists (mapper' x2); splits. - { red; splits; vauto. - unfold compose in INE1. - unfold is_r in *. - rewrite <- INE1; vauto. } - exists (mapper' y0); splits; vauto. - red; splits; vauto. unfold is_w in *. - unfold compose in INE2. - rewrite <- INE2; vauto. } - apply INV'. } - apply INV'. } - { rewrite (seq_rmw SIMRELQ). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rmwE in PTH; [| apply INV']. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_rmwl in PTH; [| apply INV']. - unfold same_loc in *. - apply (seq_lab SIMRELQ) in INE1, INE2. - unfold compose in *. - unfold loc in *. - rewrite <- INE1. - rewrite <- INE2; vauto. } - { rewrite (seq_rmw SIMRELQ). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rmwE in PTH; [| apply INV']. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. apply wf_rmwi in PTH; [| apply INV']. - admit. (* false *) } - { split; [| basic_solver 4]. - rewrite (seq_rf SIMRELQ). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rfE in PTH; [| apply INV']. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - unfold seq. - exists (mapper' x2); split. - { red; split; vauto. - destruct SIMRELQ. apply seq_codom. - red; exists x2; vauto. } - exists (mapper' y0); split; vauto. } - { split; [| basic_solver 4]. - rewrite (seq_rf SIMRELQ). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rfE in PTH; [| apply INV']. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_rfD in PTH; [| apply INV']. - destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. - subst. - destruct SIMRELQ. - apply seq_lab in INE1, INE2. - unfold compose in *. - unfold seq. exists (mapper' x3); splits. - { red; splits; vauto. - unfold compose in INE1. - unfold is_w in *. - rewrite <- INE1; vauto. } - exists (mapper' y0); splits; vauto. - red; splits; vauto. unfold is_r in *. - unfold compose in INE2. - rewrite <- INE2; vauto. } - { rewrite (seq_rf SIMRELQ). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rfE in PTH; [| apply INV']. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_rfl in PTH; [| apply INV']. - unfold same_loc in *. - apply (seq_lab SIMRELQ) in INE1, INE2. - unfold compose in *. - unfold loc in *. - rewrite <- INE1. - rewrite <- INE2; vauto. } - { rewrite (seq_rf SIMRELQ). - unfold funeq. intros a b MAP. - destruct MAP as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_rfE in PTH; [| apply INV']. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_rfv in PTH; [| apply INV']. - apply (seq_lab SIMRELQ) in INE1. - apply (seq_lab SIMRELQ) in INE2. - unfold compose in *. - unfold val in *. - rewrite <- INE1. - rewrite <- INE2; vauto. } - { rewrite (seq_rf SIMRELQ). - unfold functional. - intros x y z M M'. - destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. - destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. - destruct SIMRELQ. - assert (EQQ : y1 = y0). - { apply seq_inj; vauto. - { apply wf_rfE in PTH2; [| apply INV']. - destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - apply wf_rfE in PTH1; [| apply INV']. - destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - subst. - assert (EQQ' : x0 = x1). - { destruct wf_rff with (G := G_t') (x := y0) - (y := x0) (z := x1); vauto. - apply INV'. } - basic_solver. } - { split; [| basic_solver]. - rewrite (seq_co SIMRELQ). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_coE in PTH; [| apply INV']. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - unfold seq. - exists (mapper' x2); split. - { red; split; vauto. - destruct SIMRELQ. apply seq_codom. - red; exists x2; vauto. } - exists (mapper' y0); split; vauto. } - { split; [| basic_solver 4]. - rewrite (seq_co SIMRELQ). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_coE in PTH; [| apply INV']. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_coD in PTH; [| apply INV']. - destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. - subst. - destruct SIMRELQ. - apply seq_lab in INE1, INE2. - unfold compose in *. - unfold seq. exists (mapper' x3); splits. - { red; splits; vauto. - unfold compose in INE1. - unfold is_w in *. - rewrite <- INE1; vauto. } - exists (mapper' y0); splits; vauto. - red; splits; vauto. unfold is_w in *. - unfold compose in INE2. - rewrite <- INE2; vauto. } - { rewrite (seq_co SIMRELQ). - intros x y COND. - destruct COND as [x0 [y0 [PTH [M1 M2]]]]. - subst. - apply wf_coE in PTH; [| apply INV']. - destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. - subst. - apply wf_col in PTH; [| apply INV']. - unfold same_loc in *. - apply (seq_lab SIMRELQ) in INE1, INE2. - unfold compose in *. - unfold loc in *. - rewrite <- INE1. - rewrite <- INE2; vauto. } - { rewrite (seq_co SIMRELQ). - unfold transitive. - intros x y z M M'. - destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. - destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. - destruct SIMRELQ. - red; exists x0, y1; splits; vauto. - assert (EQQ : x1 = y0). - { apply seq_inj; vauto. - { apply wf_coE in PTH2; [| apply INV']. - destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - apply wf_coE in PTH1; [| apply INV']. - destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - subst. - apply co_trans with (x := x0) (y := y0) (z := y1); vauto. - apply INV'. } - { intros ol. - rewrite (seq_co SIMRELQ). - unfold is_total. - intros a COND1 b COND2 NEQ. - unfold collect_rel. - destruct COND1 as [[INE1 ISW1] LOC1]. - destruct COND2 as [[INE2 ISW2] LOC2]. - destruct SIMRELQ. - apply seq_acts in INE1, INE2. - destruct INE1 as [a0 [INE1 MAP1]]. - destruct INE2 as [b0 [INE2 MAP2]]. - destruct wf_co_total with (G := G_t') (ol := ol) - (a := a0) (b := b0). - { apply INV'. } - { split. - { split; vauto. - apply seq_lab in INE1. - unfold compose in *. - unfold is_w in *. - rewrite INE1; vauto. } - unfold loc in *. - apply seq_lab in INE1. - unfold compose in *. - rewrite INE1; vauto. } - { split. - { split; vauto. - apply seq_lab in INE2. - unfold compose in *. - unfold is_w in *. - rewrite INE2; vauto. } - unfold loc in *. - apply seq_lab in INE2. - unfold compose in *. - rewrite INE2; vauto. } - { intros FALSE. - apply NEQ. subst; vauto. } - { left. exists a0, b0; splits; vauto. } - right. exists b0, a0; splits; vauto. } - { rewrite (seq_co SIMRELQ). - unfold irreflexive. - intros x COND. - destruct COND as [x0 [y0 [PTH1 [M1 M2]]]]; subst. - destruct co_irr with (G := G_t') (x := x0); [apply INV'|]. - assert (EQQ : y0 = x0). - { apply (seq_inj SIMRELQ); vauto. - { apply wf_coE in PTH1; [| apply INV']. - destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - apply wf_coE in PTH1; [| apply INV']. - destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } - subst; vauto. } - { intros l COND. - destruct COND. - destruct H as [INE LOC]. - apply (seq_acts SIMRELQ) in INE. - destruct INE as [x0 [INE MAP]]. - apply (seq_acts SIMRELQ). - unfold set_collect. exists (InitEvent l); split; vauto. - { apply wf_init; [apply INV' |]. - exists x0; split; vauto. - unfold loc in *. apply (seq_lab SIMRELQ) in INE. - unfold compose in *. - rewrite INE; vauto. } - rewrite (seq_init SIMRELQ); vauto. } - { intros l. - assert (INE1 : acts_set (WCore.G X_s') (InitEvent l)). - { apply (seq_acts SIMRELQ). - exists (InitEvent l). - split; [now apply (rsr_init_acts INV') |]. - destruct SIMRELQ. - rewrite seq_init; vauto. } - destruct SIMRELQ. - apply seq_lab_rev in INE1. - rewrite INE1. - unfold compose. - rewrite seq_init_rev; vauto. - apply wf_init_lab; apply INV'. } - { rewrite (seq_rmw_dep SIMRELQ); vauto. } - { rewrite (seq_rmw_dep SIMRELQ); basic_solver 4. } - intros e INE. - assert (INE' : acts_set (WCore.G X_s') e) by vauto. - destruct SIMRELQ. - apply seq_acts in INE. - destruct INE as [e0 [INE MAP]]. - assert (INE2 : E_t' e0) by vauto. - apply wf_threads in INE; [| apply INV']. - rewrite <- MAP. - apply seq_threads. - destruct classic with (tid (mapper' e0) = t_2). - { right; vauto. } - left. apply seq_mapeq in H. - { rewrite H; vauto. } - vauto. } + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. } destruct STEP; vauto. } { destruct SIMREL. unfold dtrmt'. unfold WCore.reexec_thread. diff --git a/src/sequentialization/SequentWf.v b/src/sequentialization/SequentWf.v new file mode 100644 index 0000000..93d8749 --- /dev/null +++ b/src/sequentialization/SequentWf.v @@ -0,0 +1,418 @@ +Require Import AuxDef. +Require Import Core. +Require Import AuxRel AuxRel2. +Require Import Srf Rhb. +Require Import SimrelCommon. +Require Import SubToFullExec. +Require Import StepOps. +Require Import AuxInj. +Require Import xmm_s_hb. +Require Import Lia. +From xmm Require Import Reordering. +From xmm Require Import ThreadTrace. +From xmm Require Import Programs. +From xmm Require Import SequentBase. +From xmm Require Import ConsistencyMonotonicity. + +From hahn Require Import Hahn. +From hahnExt Require Import HahnExt. +From imm Require Import Events Execution Execution_eco SubExecution. +Require Import Setoid Morphisms Program.Basics. + +Open Scope program_scope. + +Set Implicit Arguments. + +Section SequentWf. + +Variable X_t X_s : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. +Variable mapper_rev : actid -> actid. + +Variable dtrmt_t cmt_t : actid -> Prop. +Variable thrdle : relation thread_id. +Variable f_t : actid -> actid. + +Variable ptc_1 ptc_2 : program_trace. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'G_s'" := (WCore.G X_s). + +Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). +Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). +Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). +Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). +Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). +Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). + +Notation "'lab_t'" := (lab G_t). +Notation "'val_t'" := (val lab_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'same_loc_t'" := (same_loc lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). +Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). +Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). +Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). + +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'same_loc_s'" := (same_loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). +Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). +Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). +Notation "'F_s'" := (F G_s). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. +Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. + +Definition t_12_len := length (ptc_2 t_2). +Definition t_1_len := length (ptc_1 t_1). +Definition t_2_len := length (ptc_1 t_2). + +Hypothesis INV : seq_simrel_inv X_t. + +Lemma wf_transition + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) : + Wf G_s. +Proof using. + assert (INDLEMMA : forall x y (NNIT : tid x <> tid_init) (EQT : tid x = tid y) (EQI : index x = index y), + x = y). + { clear. intros x y NNIT EQT EQI. + destruct x; destruct y; desf; ins. + desf. } + constructor. + { intros a b COND. + destruct COND as [INA [INB [NEQ [TIDS NINIT]]]]. + intros FLS. + specialize INDLEMMA with a b. + apply NEQ; apply INDLEMMA; vauto. + unfold is_init in NINIT. + clear - NINIT. unfold not in NINIT. + unfold not. intros FLS. + unfold tid in FLS. + destruct a. + { apply NINIT; vauto. } + admit. (* ??? *) } + { rewrite (seq_data SIMREL); vauto. } + { rewrite (seq_data SIMREL); clear; [ basic_solver 4 ]. } + { rewrite (seq_addr SIMREL); vauto. } + { rewrite (seq_addr SIMREL); clear; [ basic_solver 4 ]. } + { rewrite (seq_ctrl SIMREL); vauto. } + { rewrite (seq_ctrl SIMREL); clear; [ basic_solver 4 ]. } + { rewrite (seq_ctrl SIMREL); clear; [ basic_solver 4 ]. } + { split; [| basic_solver 9 ]. + rewrite (seq_rmw SIMREL); vauto. + intros x y COND. destruct COND as [x0 [y0 [RMW [M1 M2]]]]. + apply wf_rmwE in RMW. + { destruct RMW as [x1 [[EQ1 INE1] [x2 [PTH [EQ2 INE2]]]]]. + subst. destruct SIMREL. + apply seq_lab in INE1, INE2. + apply wf_rmwD in PTH. + { destruct PTH as [x2 [[EQ1 RD] [x3 [PTH [EQ2 WT]]]]]. + subst. unfold seq. exists (mapper x2); splits. + { red; splits; vauto. + unfold compose in INE1. + unfold is_r in *. + rewrite <- INE1; vauto. } + exists (mapper y0); splits; vauto. + red; splits; vauto. unfold is_w in *. + unfold compose in INE2. + rewrite <- INE2; vauto. } + apply INV. } + apply INV. } + { rewrite (seq_rmw SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rmwE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rmwl in PTH; [| apply INV]. + unfold same_loc in *. + apply (seq_lab SIMREL) in INE1, INE2. + unfold compose in *. + unfold loc in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_rmw SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rmwE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. apply wf_rmwi in PTH; [| apply INV]. + admit. (* false *) } + { split; [| basic_solver 4]. + rewrite (seq_rf SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + unfold seq. + exists (mapper x2); split. + { red; split; vauto. + destruct SIMREL. apply seq_codom. + red; exists x2; vauto. } + exists (mapper y0); split; vauto. + red; split; vauto. + destruct SIMREL. apply seq_codom. + red; exists y0; vauto. } + { split; [| basic_solver 4]. + rewrite (seq_rf SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rfD in PTH; [| apply INV]. + destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. + subst. + destruct SIMREL. + apply seq_lab in INE1, INE2. + unfold compose in *. + unfold seq. exists (mapper x3); splits. + { red; splits; vauto. + unfold compose in INE1. + unfold is_w in *. + rewrite <- INE1; vauto. } + exists (mapper y0); splits; vauto. + red; splits; vauto. unfold is_r in *. + unfold compose in INE2. + rewrite <- INE2; vauto. } + { rewrite (seq_rf SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rfl in PTH; [| apply INV]. + unfold same_loc in *. + apply (seq_lab SIMREL) in INE1, INE2. + unfold compose in *. + unfold loc in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_rf SIMREL). + unfold funeq. intros a b MAP. + destruct MAP as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_rfE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_rfv in PTH; [| apply INV]. + apply (seq_lab SIMREL) in INE1. + apply (seq_lab SIMREL) in INE2. + unfold compose in *. + unfold val in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_rf SIMREL). + unfold functional. + intros x y z M M'. + destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. + destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. + destruct SIMREL. + assert (EQQ : y1 = y0). + { apply seq_inj; vauto. + { apply wf_rfE in PTH2; [| apply INV]. + destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + apply wf_rfE in PTH1; [| apply INV]. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + subst. + assert (EQQ' : x0 = x1). + { destruct wf_rff with (G := G_t) (x := y0) + (y := x0) (z := x1); vauto. + apply INV. } + basic_solver. } + { split; [| basic_solver]. + rewrite (seq_co SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_coE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + unfold seq. + exists (mapper x2); split. + { red; split; vauto. + destruct SIMREL. apply seq_codom. + red; exists x2; vauto. } + exists (mapper y0); split; vauto. + red; split; vauto. + destruct SIMREL. apply seq_codom. + red; exists y0; vauto. } + { split; [| basic_solver 4]. + rewrite (seq_co SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_coE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_coD in PTH; [| apply INV]. + destruct PTH as [x3 [[EQ1 WT] [x4 [PTH [EQ2 RD]]]]]. + subst. + destruct SIMREL. + apply seq_lab in INE1, INE2. + unfold compose in *. + unfold seq. exists (mapper x3); splits. + { red; splits; vauto. + unfold compose in INE1. + unfold is_w in *. + rewrite <- INE1; vauto. } + exists (mapper y0); splits; vauto. + red; splits; vauto. unfold is_w in *. + unfold compose in INE2. + rewrite <- INE2; vauto. } + { rewrite (seq_co SIMREL). + intros x y COND. + destruct COND as [x0 [y0 [PTH [M1 M2]]]]. + subst. + apply wf_coE in PTH; [| apply INV]. + destruct PTH as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]. + subst. + apply wf_col in PTH; [| apply INV]. + unfold same_loc in *. + apply (seq_lab SIMREL) in INE1, INE2. + unfold compose in *. + unfold loc in *. + rewrite <- INE1. + rewrite <- INE2; vauto. } + { rewrite (seq_co SIMREL). + unfold transitive. + intros x y z M M'. + destruct M as [x0 [y0 [PTH1 [M1 M2]]]]; subst. + destruct M' as [x1 [y1 [PTH2 [M3 M4]]]]; subst. + destruct SIMREL. + red; exists x0, y1; splits; vauto. + assert (EQQ : x1 = y0). + { apply seq_inj; vauto. + { apply wf_coE in PTH2; [| apply INV]. + destruct PTH2 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + apply wf_coE in PTH1; [| apply INV]. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + subst. + apply co_trans with (x := x0) (y := y0) (z := y1); vauto. + apply INV. } + { intros ol. + rewrite (seq_co SIMREL). + unfold is_total. + intros a COND1 b COND2 NEQ. + unfold collect_rel. + destruct COND1 as [[INE1 ISW1] LOC1]. + destruct COND2 as [[INE2 ISW2] LOC2]. + destruct SIMREL. + apply seq_acts in INE1, INE2. + destruct INE1 as [a0 [INE1 MAP1]]. + destruct INE2 as [b0 [INE2 MAP2]]. + destruct wf_co_total with (G := G_t) (ol := ol) + (a := a0) (b := b0). + { apply INV. } + { split. + { split; vauto. + apply seq_lab in INE1. + unfold compose in *. + unfold is_w in *. + rewrite INE1; vauto. } + unfold loc in *. + apply seq_lab in INE1. + unfold compose in *. + rewrite INE1; vauto. } + { split. + { split; vauto. + apply seq_lab in INE2. + unfold compose in *. + unfold is_w in *. + rewrite INE2; vauto. } + unfold loc in *. + apply seq_lab in INE2. + unfold compose in *. + rewrite INE2; vauto. } + { intros FALSE. + apply NEQ. subst; vauto. } + { left. exists a0, b0; splits; vauto. } + right. exists b0, a0; splits; vauto. } + { rewrite (seq_co SIMREL). + unfold irreflexive. + intros x COND. + destruct COND as [x0 [y0 [PTH1 [M1 M2]]]]; subst. + destruct co_irr with (G := G_t) (x := x0); [apply INV|]. + assert (EQQ : y0 = x0). + { apply (seq_inj SIMREL); vauto. + { apply wf_coE in PTH1; [| apply INV]. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + apply wf_coE in PTH1; [| apply INV]. + destruct PTH1 as [x2 [[EQ1 INE1] [x3 [PTH [EQ2 INE2]]]]]; vauto. } + subst; vauto. } + { intros l COND. + destruct COND. + destruct H as [INE LOC]. + apply (seq_acts SIMREL) in INE. + destruct INE as [x0 [INE MAP]]. + apply (seq_acts SIMREL). + unfold set_collect. exists (InitEvent l); split; vauto. + { apply wf_init; [apply INV |]. + exists x0; split; vauto. + unfold loc in *. apply (seq_lab SIMREL) in INE. + unfold compose in *. + rewrite INE; vauto. } + rewrite (seq_init SIMREL); vauto. } + { intros l. + assert (INE1 : E_s (InitEvent l)). + { apply (seq_acts SIMREL). + exists (InitEvent l). + split; [now apply (rsr_init_acts INV) |]. + destruct SIMREL. + rewrite seq_init; vauto. } + destruct SIMREL. + apply seq_lab_rev in INE1. + rewrite INE1. + unfold compose. + rewrite seq_init_rev; vauto. + apply wf_init_lab; apply INV. } + { rewrite (seq_rmw_dep SIMREL); vauto. } + { rewrite (seq_rmw_dep SIMREL); basic_solver 4. } + intros e INE. + assert (INE' : E_s e) by vauto. + destruct SIMREL. + apply seq_acts in INE. + destruct INE as [e0 [INE MAP]]. + assert (INE2 : E_t e0) by vauto. + apply wf_threads in INE; [| apply INV]. + rewrite <- MAP. + apply seq_threads. + destruct classic with (tid (mapper e0) = t_2). + { right; vauto. } + left. apply seq_mapeq in H. + { rewrite H; vauto. } + vauto. +Admitted. + +End SequentWf. \ No newline at end of file diff --git a/src/xmm/Core.v b/src/xmm/Core.v index b0b108e..c620741 100644 --- a/src/xmm/Core.v +++ b/src/xmm/Core.v @@ -437,7 +437,7 @@ Record stable_uncmt_reads_gen thrdle : Prop := Record commit_embedded : Prop := { reexec_embd_inj : inj_dom cmt f; - reexec_embd_tid : forall e (CMT : cmt e), tid (f e) = tid e; + (* reexec_embd_tid : forall e (CMT : cmt e), tid (f e) = tid e; *) reexec_embd_lab : forall e (CMT : cmt e), lab' e = lab (f e); reexec_embd_rpo : f ↑ restr_rel cmt rpo' ⊆ rpo; reexec_embd_rf : f ↑ restr_rel cmt rf' ⊆ rf; From 1e483a08a814d2dd13a19121cd0ef5faa1857a03 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Sun, 11 May 2025 02:39:14 +0200 Subject: [PATCH 33/51] reexec work --- src/sequentialization/SequentReexec.v | 87 ++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index a36ae51..bc4a6b9 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -1951,14 +1951,95 @@ Proof using. unfold WCore.X_start; ins. rewrite (seq_rmw_dep SIMREL). clear; basic_solver 8. } - - all : admit. } + { unfold rf_complete. + unfold restrict; ins. + arewrite ((fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x + then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + + index x))) = mapper_rev'). + destruct STEP. + intros x COND. + destruct COND as [[CD2 CD3] CD1]. + destruct CD2 as [x0 [CM MP]]. + destruct reexec_start_wf. + destruct wf_rfc with x0. + { split. + { unfold restrict; ins. + split; vauto. + apply reexec_embd_dom in CM; vauto. } + unfold restrict; ins. + unfold compose in CD1. + unfold is_r in *. + rewrite <- MP in CD1. + unfold compose in MAPCOMP. + rewrite MAPCOMP in CD1. + { unfold id in CD1; vauto. } + apply reexec_embd_dom in CM; vauto. } + unfold restrict in H; ins. + unfold codom_rel. + exists (mapper' x1). + unfold seq. exists (mapper' x1); split. + { red. split; vauto. + destruct H as [x2 [[EQQ CMM] MP]]; subst. + unfold cmt'. + unfold set_collect. + exists x2; split; vauto. } + exists x; split; vauto. + unfold collect_rel. + exists x1, x0; splits; vauto. + destruct H as [x2 [[EQQ CMM] + [x3 [RF [CM3 EQ]]]]]; subst; vauto. } + intros x COND. + destruct COND as [[DTT ESS] RD]. + destruct DTT as [x0 [DTT MP1]]. + destruct STEP. + destruct reexec_start_wf. + destruct wf_sub_rfD with x0. + { unfold WCore.X_start; ins. + split. + { split; vauto. + apply rexec_acts; vauto. } + rewrite <- MP1 in RD. + unfold is_r in *. + destruct SIMREL. + rewrite seq_lab. + { unfold compose. + assert (COND : mapper' x0 = mapper x0). + { apply DTRSAME in DTT; vauto. } + rewrite <- COND; vauto. } + apply rexec_acts; vauto. } + { left. unfold WCore.X_start; ins. + destruct SIMREL. + destruct H as [x1 PTH]. + unfold codom_rel. exists (mapper' x1). + unfold seq. exists (mapper' x1); split. + { red. split; vauto. + unfold dtrmt'. unfold set_collect. + exists x1; split; vauto. + destruct PTH as [x2 [[EQQ CMM] MP]]; subst; vauto. } + exists x; split; vauto. + apply seq_rf. + unfold collect_rel. + exists x1, x0; splits; vauto. + { destruct PTH as [x2 [[EQQ CMM] + [x3 [RF [CM3 EQ]]]]]; subst; vauto. } + { apply DTRSAME. + destruct PTH as [x2 [[EQQ CMM] MP]]; vauto. } + apply DTRSAME. + destruct PTH as [x2 [[EQQ CMM] MP]]; vauto. } + right. + unfold cmt'. + unfold set_collect. + exists x0; split; vauto. } { apply XmmCons.monoton_cons with (G_t := G_t') (m := mapper'); vauto. all : try arewrite (WCore.G X_s' = G_s'). { apply SIMRELQ. } { unfold rpo. unfold rpo_imm. - admit. } + admit. (* ugh *)} { unfold G_s'; ins. arewrite ((fun x : actid => ifP ~ (mapper' ↑₁ E_t') x then x From 3f1c766cd9e7d770d6acb4a094642541e37ce100 Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Sun, 11 May 2025 02:44:39 +0200 Subject: [PATCH 34/51] reexec work --- src/sequentialization/SequentReexec.v | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index bc4a6b9..27574c7 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -2136,6 +2136,9 @@ Proof using. basic_solver. } apply sub_to_full_exec_listless with (thrdle := thrdle'); vauto. + { admit. (* we have it *) } + { admit. (* we have it *) } + { admit. (* we have it *) } all : admit. Admitted. From 7c6cc5632f7d49e0abed895ef9d6fb50fd42dc8a Mon Sep 17 00:00:00 2001 From: keba4ok <77245196+keba4ok@users.noreply.github.com> Date: Sun, 11 May 2025 03:11:57 +0200 Subject: [PATCH 35/51] reexec work --- src/sequentialization/SequentReexec.v | 33 ++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 27574c7..d0816b8 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -2139,7 +2139,38 @@ Proof using. { admit. (* we have it *) } { admit. (* we have it *) } { admit. (* we have it *) } - all : admit. + { admit. } + { constructor. + all : admit. } + { apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. } + { unfold WCore.X_start; ins. + destruct STEP. + intros x COND. + destruct COND as [MP NOT]. + intros FLS. + assert (INITT: is_init x). + { admit. (* is this a joke? *) } + assert (INITT2: is_init x) by vauto. + apply dtrmt_init in INITT. + assert (DTRF : dtrmt' x). + { unfold dtrmt'. + unfold set_collect. + exists x; split; vauto. + destruct SIMRELQ. + apply seq_init; vauto. } + destruct NOT. + split; vauto. + destruct SIMREL. + apply seq_acts. + unfold set_collect. + exists x; split; vauto. + { apply rexec_acts; vauto. } + destruct MP as [x0 [INE MPP]]. + apply seq_init; vauto. } + admit. (* we have it *) Admitted. End SequentReexec. \ No newline at end of file From 0e34e5a3deffc84ad4a0ee1daadd1a81badb53dc Mon Sep 17 00:00:00 2001 From: keba4ok Date: Mon, 19 May 2025 19:45:36 +0200 Subject: [PATCH 36/51] po-work, ci fixes --- .vscode/settings.json | 10 +- src/sequentialization/SequentExec.v | 473 +++++++++++++++++++++++++-- src/sequentialization/SequentProgs.v | 30 +- 3 files changed, 460 insertions(+), 53 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f06b84c..ab3b3b4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,16 +1,16 @@ { "files.exclude": { + "**/*.vo": true, + "**/*.vok": true, + "**/*.vos": true, + "**/*.aux": true, + "**/*.glob": true, "**/.git": true, "**/.svn": true, "**/.hg": true, "**/CVS": true, "**/.DS_Store": true, "**/Thumbs.db": true, - "**/*.vo": true, - "**/*.vok": true, - "**/*.vos": true, - "**/*.aux": true, - "**/*.glob": true, "**/*_cp_aux.v": true }, "nixEnvSelector.suggestion": false, diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 391e376..002fa46 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -464,11 +464,399 @@ Proof using. destruct CD2 as [C1 C2]. destruct C1 as [TR1 [x0 [IN1 MAP1]]]. destruct C2 as [TR2 [y0 [IN2 MAP2]]]. - unfold collect_rel. exists x0, y0; splits; vauto. - unfold seq. exists x0; splits; vauto. - exists y0; splits; vauto. - admit. } - admit. } + unfold collect_rel. exists x0, y0; splits. + { unfold seq. exists x0; splits. + { red; vauto. } + exists y0; splits. + { destruct SIMREL. + assert (NEQ1 : y0 <> e). + { intros FLS. subst y0. + unfold mapper' in MAP2. + rewrite upds in MAP2. + subst e. rewrite TID in TR2. + desf. } + assert (EQQ : mapper' y0 = mapper y0). + { unfold mapper'. rewrite updo; vauto. } + rewrite EQQ in MAP2. + destruct classic with (x0 = e) as [EQ | NEQ]. + { unfold ext_sb. + rewrite <- MAP2 in TR2. + apply seq_mapto in TR2. + { desf. + { rewrite seq_init in TR2. + { clear - TR2 NINIT2. + desf. } + desf. } + split. + { assert (TRH : tid (mapper + (ThreadEvent thread0 index0)) = t_2). + { rewrite TR2. + unfold tid; vauto. } + apply seq_thrd in TRH. + { unfold tid in *. desf. } + apply EQACTS in IN2. + destruct IN2 as [C1 | C2]; vauto. } + assert (LIAH : t_1_len <= index0). + { assert (TRH : tid (mapper + (ThreadEvent thread0 index0)) = t_2). + { rewrite TR2. + unfold tid; vauto. } + apply seq_index in TRH. + { unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. rewrite TRH. + assert (NINNIT : ~ is_init (mapper + (ThreadEvent thread0 index0))). + { intros FLS. + rewrite TR2 in FLS. + unfold is_init in FLS. + desf. } + lia. } + apply EQACTS in IN2. + destruct IN2 as [C1 | C2]; vauto. } + unfold Events.index in *. + lia. } + apply EQACTS in IN2. + destruct IN2 as [C1 | C2]; vauto. } + unfold ext_sb. + rewrite <- MAP2 in TR2. + apply seq_mapto in TR2. + { desf. + { rewrite seq_init in TR2. + { clear - TR2 NINIT2. + desf. } + desf. } + { rewrite seq_init in TR2. + { clear - TR2 NINIT2. + desf. } + desf. } + split. + { assert (TRH : tid (mapper + (ThreadEvent thread0 index0)) = t_2). + { rewrite TR2. + unfold tid; vauto. } + apply seq_thrd in TRH. + { unfold tid in *. desf. + { exfalso. clear - TR1 NINIT1. + apply NINIT1; vauto. } + destruct classic with (thread = t_2) as [EQ2 | NEQ2]. + { apply wf_threads in IN1; [| apply INV']. + unfold tid in IN1. + rewrite EQ2 in IN1. + destruct ADD. + apply add_event_threads in IN1. + desf. } + destruct classic with (thread = t_1) as [EQ3 | NEQ3]; vauto. + unfold mapper' in Heq. + rewrite updo in Heq; vauto. + assert (INEE : E_t (ThreadEvent thread index)). + { apply EQACTS in IN1. + destruct IN1 as [C1 | C2]; vauto. } + assert (TNEQQ : tid (mapper (ThreadEvent thread index)) <> t_2). + { rewrite Heq. unfold tid; vauto. } + apply seq_out in INEE; vauto. + rewrite Heq in INEE. + clear - INEE. basic_solver. } + apply EQACTS in IN2. + destruct IN2 as [C1 | C2]; vauto. } + assert (LIAH : t_1_len <= index0). + { assert (TRH : tid (mapper + (ThreadEvent thread0 index0)) = t_2). + { rewrite TR2. + unfold tid; vauto. } + apply seq_index in TRH. + { unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. rewrite TRH. + assert (NINNIT : ~ is_init (mapper + (ThreadEvent thread0 index0))). + { intros FLS. + rewrite TR2 in FLS. + unfold is_init in FLS. + desf. } + lia. } + apply EQACTS in IN2. + destruct IN2 as [C1 | C2]; vauto. } + assert (INDN : index < t_1_len). + { assert (INEE : E_t (ThreadEvent thread index)). + { apply EQACTS in IN1. + destruct IN1 as [C1 | C2]; vauto. } + unfold mapper' in TR1. + rewrite updo in TR1; vauto. + assert (TNEQQ : tid (mapper (ThreadEvent thread index)) <> t_2). + { rewrite TR1. rewrite TID. desf. } + apply seq_mapeq in INEE; vauto. + assert (TTDS : thread = t_1). + { rewrite INEE in TR1. + unfold tid in *; vauto. } + assert (INET : E_t (ThreadEvent thread index)). + { apply EQACTS in IN1. + destruct IN1 as [C1 | C2]; vauto. } + apply NNPP. intros FLS. + apply Compare_dec.not_lt in FLS. + apply seq_out_move in INET; vauto. + rewrite INEE in INET. + clear - INET THRDNEQ. + desf. } + lia. } + apply EQACTS in IN2. + destruct IN2 as [C1 | C2]; vauto. } + red; vauto. } + all : vauto. } + destruct COND as [x0 [y0 [[x1 [[EQ1 INE1] + [y1 [COND [EQ2 INE2]]]]] [M1 M2]]]]. + subst. + assert (INE1' : (acts_set G_s') (mapper' x1)). + { unfold G_s'; ins. + unfold set_collect. + exists x1; vauto. } + assert (INE2' : (acts_set G_s') (mapper' y0)). + { unfold G_s'; ins. + unfold set_collect. + exists y0; vauto. } + destruct classic with (tid (mapper' y0) = t_2) as [EQ1 | NEQ1]. + { destruct classic with (tid (mapper' x1) = t_1) as [EQ2 | NEQ2]. + { right. unfold po_seq. + split. + { split; vauto. + rewrite TID; vauto. } + split; vauto. } + left. + assert (TIDD2 : tid y0 = t_1). + { destruct classic with (y0 = e) as [EQ | NEQ]. + { subst y0; vauto. } + unfold mapper' in EQ1. + rewrite updo in EQ1. + { assert (EQ1' : tid (mapper y0) = t_2) by vauto. + apply (seq_thrd SIMREL) in EQ1'; vauto. + apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + vauto. } + destruct x1. + { unfold seq. exists (mapper' (InitEvent l0)); split. + { red; vauto. } + exists (mapper' y0); split. + { arewrite (mapper' (InitEvent l0) = mapper (InitEvent l0)). + { unfold mapper'. rewrite updo; vauto. + intros FLS. apply NINIT; vauto. } + rewrite (seq_init SIMREL). + { unfold ext_sb; vauto. + desf. } + vauto. } + red; vauto. } + assert (TIDD : thread = t_1). + { unfold ext_sb in COND. + desf. unfold tid in TIDD2. + rewrite <- TIDD2; vauto. + destruct COND; vauto. } + destruct y0. + { exfalso. unfold tid in TIDD2; vauto. } + unfold ext_sb in COND. + destruct COND as [COND1 COND2]. + unfold seq. + exists (mapper' (ThreadEvent thread index)); split. + { red; vauto. } + exists (mapper' (ThreadEvent thread0 index0)); split. + { assert (INDD : index >= t_1_len). + { apply NNPP. intros FLS. + apply Compare_dec.not_ge in FLS. + assert (INET : E_t (ThreadEvent thread index)). + { destruct classic with ((ThreadEvent thread index) = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in NEQ2. + rewrite EQ in NEQ2. + rewrite upds in NEQ2; vauto. } + apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + apply (seq_out_snd SIMREL) in INET; vauto. + destruct classic with ((ThreadEvent t_1 index) = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in NEQ2. + rewrite EQ in NEQ2. + rewrite upds in NEQ2; vauto. } + unfold mapper' in NEQ2. + rewrite updo in NEQ2; vauto. + rewrite INET in NEQ2. + desf. } + assert (INEE1 : E_t (ThreadEvent thread index)). + { destruct classic with ((ThreadEvent thread index) = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in NEQ2. + rewrite EQ in NEQ2. + rewrite upds in NEQ2; vauto. } + apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + assert (INEE2 : E_t (ThreadEvent thread0 index0)). + { destruct classic with ((ThreadEvent thread0 index0) = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in EQ1. + rewrite EQ in EQ1. + rewrite upds in EQ1; vauto. } + apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + apply (seq_out_move SIMREL) in INEE1, INEE2; vauto. + { assert (SWP1 : mapper' (ThreadEvent t_1 index) + = mapper (ThreadEvent t_1 index)). + { unfold mapper'. + destruct classic with (ThreadEvent t_1 index = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in NEQ2. + rewrite EQ in NEQ2. + rewrite upds in NEQ2; vauto. } + rewrite updo; vauto. } + assert (SWP2 : mapper' (ThreadEvent t_1 index0) + = mapper (ThreadEvent t_1 index0)). + { unfold mapper'. + destruct classic with (ThreadEvent t_1 index0 = e) as [EQ | NEQ]. + { exfalso. rewrite EQ in THRDNEQ. + unfold mapper' in THRDNEQ. + rewrite upds in THRDNEQ; vauto. } + rewrite updo; vauto. } + rewrite SWP1, SWP2. + rewrite INEE1, INEE2. + unfold ext_sb. split; vauto. + unfold Events.index. + clear - COND2 INDD. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + red; vauto. } + destruct classic with (y0 = e) as [EQ | NEQ]. + { subst y0. left. + unfold seq. exists (mapper' x1); split; vauto. + exists (mapper' e); split; vauto. + destruct classic with (tid (mapper' x1) = t_2) as [EQ2 | NEQ2]. + { destruct classic with (x1 = e) as [EQ3 | NEQ3]. + { subst x1. unfold mapper'. + desf. } + assert (INEE : E_t x1). + { apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + apply (seq_index SIMREL) in INEE; vauto. + { exfalso. unfold ext_sb in COND. + desf. + { rewrite (seq_init SIMREL) in INEE; vauto. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + destruct COND as [COND1 COND2]. + unfold Events.index in INEE at 1. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + unfold Events.index in IND. + lia. } + unfold mapper'. rewrite updo; vauto. } + assert (INEE : E_t x1). + { destruct classic with (x1 = e) as [EQ3 | NEQ3]. + { subst x1. unfold ext_sb in COND. desf. + destruct COND as [COND1 COND2]. + exfalso. apply Arith_base.gt_irrefl_stt in COND2; vauto. } + apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + apply (seq_mapeq SIMREL) in INEE; vauto. + { arewrite (mapper' x1 = mapper x1). + { unfold mapper'. rewrite updo; vauto. + intros FALSO. subst x1. + unfold ext_sb in COND. desf. + destruct COND as [COND1 COND2]. + exfalso. apply Arith_base.gt_irrefl_stt in COND2; vauto. } + rewrite INEE. + unfold mapper'. + rewrite upds; vauto. } + assert (SWP : mapper' x1 = mapper x1). + { unfold mapper'. rewrite updo; vauto. + intros FALSO. subst x1. + unfold ext_sb in COND. desf. } + rewrite SWP in NEQ2; vauto. } + destruct classic with (x1 = e) as [EQ2 | NEQ2]. + { subst x1. + left. + assert (SWP : mapper' y0 = mapper y0). + { unfold mapper'. rewrite updo; vauto. } + rewrite SWP in NEQ1; vauto. + assert (INEE : E_t y0). + { apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + apply (seq_mapeq SIMREL) in INEE; vauto. + unfold seq. exists (mapper' e); split; vauto. + exists (mapper' y0); split; vauto. + rewrite SWP, INEE. + unfold mapper'. + rewrite upds; vauto. } + left. + unfold seq. exists (mapper' x1); split; vauto. + exists (mapper' y0); split; vauto. + destruct classic with (tid (mapper' x1) = t_2) as [EQ3 | NEQ3]. + { unfold mapper' in EQ3. rewrite updo in EQ3. + { assert (INEE : E_t x1). + { apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + assert (INEE' : E_t x1) by vauto. + apply (seq_index SIMREL) in INEE. + { apply (seq_thrd SIMREL) in INEE'. + { destruct classic with (index y0 < t_1_len) as [LS | GT]. + assert (INEY : E_t y0). + { apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + unfold ext_sb in COND. + desf. + { unfold mapper' at 1. + rewrite updo; vauto. + rewrite (seq_init SIMREL); vauto. + unfold ext_sb; vauto. + desf. + unfold mapper' in Heq. + rewrite updo in Heq; vauto. + assert (REVV : mapper_rev (mapper (ThreadEvent thread index)) + = mapper_rev (InitEvent l1)). + { rewrite Heq; vauto. } + unfold compose in MAPREV. + rewrite MAPREV in REVV; vauto. + unfold id in REVV. + rewrite (seq_init_rev SIMREL) in REVV; vauto. } + { unfold mapper'. + rewrite !updo; vauto. + unfold Events.index in *. + destruct COND as [COND1 COND2]. + exfalso. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + exfalso. + apply Compare_dec.not_lt in GT. + assert (INEY : E_t y0). + { apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + apply (seq_out_move SIMREL) in INEY; vauto. + { unfold mapper' in NEQ1. + rewrite updo in NEQ1; vauto. + rewrite INEY in NEQ1. + desf. } + unfold ext_sb in COND. + desf. + { exfalso. + unfold tid in INEE'. + apply NINIT1; vauto. } + unfold tid in INEE'. + destruct COND as [COND1 COND2]. + unfold tid; vauto. } + vauto. } + vauto. } + vauto. } + assert (INEE : E_t x1). + { apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + assert (INEE' : E_t y0). + { apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + apply (seq_mapeq SIMREL) in INEE. + { apply (seq_mapeq SIMREL) in INEE'. + { unfold mapper'. + rewrite !updo; vauto. + rewrite INEE, INEE'; vauto. } + unfold mapper' in NEQ1. + rewrite updo in NEQ1; vauto. } + unfold mapper' in NEQ3. + rewrite updo in NEQ3; vauto. } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } { unfold mapper'. intros x COND. @@ -745,7 +1133,12 @@ Proof using. { rewrite (seq_ctrl SIMREL); vauto. } { rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } - admit. (* wf_s' *) } + arewrite (G_s' = WCore.G X_s'). + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. + rewrite <- TID; vauto. } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -788,8 +1181,11 @@ Proof using. { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } { apply INV'. } - constructor. (* wf_s' *) - all : admit. + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. + rewrite <- TID; vauto. Admitted. Lemma simrel_step_e_t2 @@ -966,6 +1362,7 @@ Proof using. unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } subst e'. unfold mapper'. rewrite upds; vauto. unfold mapper' in NTID2. rewrite upds in NTID2; vauto. } + { admit. } { intros e' INE TID2. apply EQACTS in INE. destruct INE as [C1 | C2]. @@ -975,17 +1372,18 @@ Proof using. apply (seq_mapto SIMREL) in C1; vauto. unfold mapper' in TID2. rewrite updo in TID2; vauto. } subst e'. unfold mapper'. rewrite upds; vauto. } - intros e' INE TID2. - apply EQACTS in INE. - destruct INE as [C1 | C2]. - { destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_index SIMREL) in C1; vauto. - unfold mapper' in TID2. rewrite updo in TID2; vauto. } - subst e'. unfold mapper'. rewrite upds; vauto. - simpl. unfold SequentBase.t_1_len. - unfold t_1_len in *. clear - IND. lia. } + { intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_index SIMREL) in C1; vauto. + unfold mapper' in TID2. rewrite updo in TID2; vauto. } + subst e'. unfold mapper'. rewrite upds; vauto. + simpl. unfold SequentBase.t_1_len. + unfold t_1_len in *. clear - IND. lia. } + all : admit. } splits; vauto. constructor. { unfold WCore.add_event. @@ -1232,6 +1630,7 @@ Proof using. { rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } desf. } + { admit. } { admit. (*TODO : po-work*) } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } @@ -1254,6 +1653,7 @@ Proof using. apply (seq_mapeq SIMREL) in C1; vauto. unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } subst e'. unfold mapper'. rewrite upds; vauto. } + { admit. } { intros e' INE TID2. apply EQACTS in INE. destruct INE as [C1 | C2]. @@ -1271,23 +1671,24 @@ Proof using. assert (T2NOTIN' : ~ threads_set G_t' t_2). { intros FALSE. apply add_event_threads in FALSE; vauto. } desf. } - intros e' INE TID2. - apply EQACTS in INE. - destruct INE as [C1 | C2]. - { destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_index SIMREL) in C1; vauto. - unfold mapper'. rewrite updo; vauto. } - subst e'. unfold mapper' in TID2. - rewrite upds in TID2. - assert (INEN : E_t' e). - { apply EQACTS. basic_solver. } - exfalso. - destruct ADD. symmetry in add_event_threads. - assert (T2NOTIN' : ~ threads_set G_t' t_2). - { intros FALSE. apply add_event_threads in FALSE; vauto. } - desf. } + { intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_index SIMREL) in C1; vauto. + unfold mapper'. rewrite updo; vauto. } + subst e'. unfold mapper' in TID2. + rewrite upds in TID2. + assert (INEN : E_t' e). + { apply EQACTS. basic_solver. } + exfalso. + destruct ADD. symmetry in add_event_threads. + assert (T2NOTIN' : ~ threads_set G_t' t_2). + { intros FALSE. apply add_event_threads in FALSE; vauto. } + desf. } + all : admit. } split; vauto. constructor. { unfold WCore.add_event. exists (option_map mapper' r), (mapper' ↑₁ R1), diff --git a/src/sequentialization/SequentProgs.v b/src/sequentialization/SequentProgs.v index 4183008..42fcdc6 100644 --- a/src/sequentialization/SequentProgs.v +++ b/src/sequentialization/SequentProgs.v @@ -28,6 +28,9 @@ Section SimrelGen. Variable X_t X_t' X_s : WCore.t. Variable t_1 t_2 : thread_id. Variable mapper : actid -> actid. +Variable mapper_rev : actid -> actid. + +Variable ptc_1 ptc_2 : program_trace. Variable dtrmt_t cmt_t : actid -> Prop. Variable thrdle : relation thread_id. @@ -105,9 +108,9 @@ Lemma seq_step_gen (NINIT2 : t_2 <> tid_init) (THRDNEQ : t_1 <> t_2) (STEP : xmm_step X_t X_t') - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper) : - exists X_s' mapper', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' >> /\ + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) : + exists X_s' mapper' mapper_rev', + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ << STEP : xmm_step⁺ X_s X_s' >>. Proof using. admit. @@ -137,6 +140,7 @@ Section SimrelMain. Variable X_t_init X_s_init X_t : WCore.t. Variable t_1 t_2 : thread_id. +Variable ptc_1 ptc_2 : program_trace. Notation "'G_t_init'" := (WCore.G X_t_init). Notation "'G_s_init'" := (WCore.G X_s_init). @@ -211,8 +215,8 @@ Lemma simrel_main (NINIT2 : t_2 <> tid_init) (THRDNEQ : t_1 <> t_2) (TARGETPTH : xmm_step* X_t_init X_t) : - exists X_s mapper, - << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper >> /\ + exists X_s mapper mapper_rev, + << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1>> /\ << STEP : xmm_step* X_s_init X_s >> /\ << BEHRS : same_behaviors (WCore.G X_s) G_t >>. Proof using. @@ -226,6 +230,7 @@ Section ProgMain. Variable X_t : WCore.t. Variable t_1 t_2 : thread_id. Variable threads : thread_id -> Prop. +Variable ptc_1 ptc_2 : program_trace. Variable p1 p2 : program. @@ -235,16 +240,16 @@ Definition X_s_init : WCore.t := WCore.Build_t (WCore.init_exec (threads ∪₁ Hypothesis PROGSEQ : program_sequented p1 p2 t_1 t_2. Lemma prog_supp : - exists X_s mapper, - << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper >> /\ + exists X_s mapper mapper_rev, + << SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1>> /\ << STEP : xmm_step* X_s_init X_s >> /\ << BEHRS : same_behaviors (WCore.G X_s) (WCore.G X_t) >>. Proof using. admit. Admitted. -Lemma prog_helper X_s mapper : - seq_simrel X_s X_t t_1 t_2 mapper -> +Lemma prog_helper X_s mapper mapper_rev : + seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1 -> exec_sequent X_s X_t p1 p2 t_1 t_2. Proof using. intros SIMREL. @@ -259,10 +264,11 @@ Lemma prog_main : << STEP : xmm_step* X_s_init X_s >> /\ << BEHRS : same_behaviors (WCore.G X_s) (WCore.G X_t) >>. Proof using. - destruct prog_supp as (X_s & mapper & SIMREL & STEP & BEHRS). + destruct prog_supp as (X_s & mapper & mapper_rev & SIMREL & STEP & BEHRS). exists X_s; splits; auto. - apply prog_helper with (mapper := mapper). + apply prog_helper with (mapper := mapper) + (mapper_rev := mapper_rev). vauto. -Qed. +Admitted. End ProgMain. From 3d73e729651ac411be65bc49cac2d1038b5f85f8 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Tue, 20 May 2025 03:17:16 +0200 Subject: [PATCH 37/51] exec work --- src/sequentialization/SequentExec.v | 158 ++++++++++++++++++++++++++-- 1 file changed, 147 insertions(+), 11 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 002fa46..6084a89 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -1252,10 +1252,14 @@ Proof using. assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. assert (NEWE : << NINIT : ~is_init (ThreadEvent t_2 (index e - t_1_len)) >> /\ + << NINIT' : ~is_init e >> /\ << NOTIN : ~E_s (ThreadEvent t_2 (index e - t_1_len)) >> /\ << TID : tid (ThreadEvent t_2 (index e - t_1_len)) = t_2 >>). - { unfold NW; splits; vauto. } - unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). + { unfold NW; splits; vauto. + intros FLS. unfold is_init in FLS. + desf. unfold tid in T1. + apply NINIT1; vauto. } + unfold NW in NEWE. destruct NEWE as (NINIT & NINIT' & NOTIN & TID). set (G_s' := {| acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - t_1_len)); @@ -1332,7 +1336,12 @@ Proof using. desf. } { rewrite EQACTS. rewrite set_collect_union. rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } - { admit. } + { rewrite set_collect_union. + rewrite MAPREVSUB. + unfold mapper_rev'. + rewrite set_collect_eq. + rewrite upds, EQACTS. + rewrite (seq_acts_rev SIMREL); vauto. } { admit. (*TODO : po-work*) } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } @@ -1362,7 +1371,15 @@ Proof using. unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } subst e'. unfold mapper'. rewrite upds; vauto. unfold mapper' in NTID2. rewrite upds in NTID2; vauto. } - { admit. } + { intros x MAP TIDS. + destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst x. unfold mapper_rev'. rewrite upds; vauto. } + destruct MAP as [INE | MAP]. + { unfold mapper_rev'. + rewrite updo; vauto. + apply (seq_mapeq_rev SIMREL) in INE; vauto. } + unfold mapper_rev'. + rewrite updo; vauto. } { intros e' INE TID2. apply EQACTS in INE. destruct INE as [C1 | C2]. @@ -1383,7 +1400,84 @@ Proof using. subst e'. unfold mapper'. rewrite upds; vauto. simpl. unfold SequentBase.t_1_len. unfold t_1_len in *. clear - IND. lia. } - all : admit. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x; vauto. } + unfold mapper' in TID2. + rewrite updo in TID2. + { destruct SIMREL. + apply seq_thrd in TID2. + { rewrite TID2; vauto. } + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + vauto. } + { intros x INE TID2. + unfold mapper_rev'. + destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst x. rewrite upds. + destruct e. + { desf. } + unfold tid in T1. rewrite T1. + unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + assert (INDEQ : index = index - length (ptc_1 t_1) + length (ptc_1 t_1)). + { lia. } + rewrite INDEQ at 1; vauto. } + rewrite updo. + { apply (seq_maprev SIMREL); vauto. + destruct INE; vauto. + exfalso. apply NEQ; vauto. } + vauto. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + rewrite upds. exfalso. desf. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + subst x. exfalso. + apply Arith_base.lt_not_le_stt in IDXS. + apply IDXS; vauto. } + unfold mapper'. + rewrite updo; vauto. + apply (seq_out_snd SIMREL); vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { unfold mapper'. subst x. + rewrite upds. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + vauto. } + unfold mapper'. + rewrite updo; vauto. + apply (seq_out_move SIMREL); vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros e' NINE. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. exfalso. apply NINE. + apply EQACTS; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_rest SIMREL); vauto. + intros INN. apply NINE. + apply EQACTS; vauto. } + intros e' NINE. + destruct classic with (e' = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst e'. exfalso. + apply NINE; vauto. } + unfold mapper_rev'. rewrite updo; vauto. + apply (seq_rest_rev SIMREL); vauto. + intros FALSE. apply NINE; vauto. } splits; vauto. constructor. { unfold WCore.add_event. @@ -1402,9 +1496,45 @@ Proof using. { unfold mapper'. rewrite upds. clear - NINIT2. unfold tid; vauto. } { unfold mapper'. rewrite upds. basic_solver. } - { unfold mapper', mapper_rev'. - destruct ADD. rewrite add_event_lab. - rewrite upds. admit. } + { destruct ADD. destruct SIMRELQ. + unfold mapper', mapper_rev'. + apply functional_extensionality; ins. + destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst x. rewrite !upds. vauto. + rewrite add_event_lab. + unfold compose. rewrite upds. + rewrite upds; vauto. } + rewrite !updo; vauto. + { rewrite add_event_lab. + unfold compose. rewrite updo; vauto. + { destruct SIMREL. + destruct classic with (E_s x) as [INN | NINN]. + { rewrite updo; vauto. + rewrite seq_lab_rev0; vauto. } + rewrite updo; vauto. + rewrite seq_rlab0; vauto. } + rewrite updo; vauto. + destruct classic with (E_s x) as [INN | NINN]. + { destruct SIMREL. + intros FALSE. + assert (STT : mapper (mapper_rev x) = mapper e) + by vauto. + unfold compose in MAPREVR. + rewrite MAPREVR in STT. + { unfold id in STT. + assert (HLP : E_t (mapper_rev x)). + { apply seq_acts_rev0. + red; exists x; vauto. } + rewrite FALSE in HLP. + apply seq_mapto0 in HLP. + { subst x. + unfold SequentBase.t_1_len, t_1_len in *. + desf. } + apply seq_out_move0 in HLP; vauto. + rewrite HLP. unfold tid; vauto. } + vauto. } + admit. (* ??? *) } + rewrite upds; vauto. } { destruct ADD. rewrite add_event_rf. rewrite !collect_rel_union. arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). @@ -1456,7 +1586,11 @@ Proof using. { rewrite (seq_ctrl SIMREL); vauto. } { rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } - admit. (* wf_s' *) } + arewrite (G_s' = WCore.G X_s'). + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -1499,8 +1633,10 @@ Proof using. { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } { apply INV'. } - constructor. (* wf_s' *) - all : admit. + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. Admitted. Lemma simrel_step_e_else From 8c4af14aeb9647f75cc625c1df51fff5ad6b37a4 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Tue, 20 May 2025 22:23:01 +0200 Subject: [PATCH 38/51] fixes --- src/sequentialization/SequentExec.v | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 6084a89..2800739 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -749,7 +749,7 @@ Proof using. { destruct classic with (x1 = e) as [EQ3 | NEQ3]. { subst x1. unfold ext_sb in COND. desf. destruct COND as [COND1 COND2]. - exfalso. apply Arith_base.gt_irrefl_stt in COND2; vauto. } + exfalso. clear - COND2. lia. } apply EQACTS in INE1. destruct INE1 as [C1 | C2]; vauto. } apply (seq_mapeq SIMREL) in INEE; vauto. @@ -758,7 +758,7 @@ Proof using. intros FALSO. subst x1. unfold ext_sb in COND. desf. destruct COND as [COND1 COND2]. - exfalso. apply Arith_base.gt_irrefl_stt in COND2; vauto. } + exfalso. lia. } rewrite INEE. unfold mapper'. rewrite upds; vauto. } @@ -1444,8 +1444,7 @@ Proof using. { unfold SequentBase.t_1_len in *. unfold t_1_len in *. subst x. exfalso. - apply Arith_base.lt_not_le_stt in IDXS. - apply IDXS; vauto. } + lia. } unfold mapper'. rewrite updo; vauto. apply (seq_out_snd SIMREL); vauto. From e5a052dd9c85c7c205a967bb4b814e1f29e4910f Mon Sep 17 00:00:00 2001 From: keba4ok Date: Wed, 21 May 2025 14:15:06 +0200 Subject: [PATCH 39/51] seq-exec only po left --- src/sequentialization/SequentExec.v | 241 ++++++++++++++++++++++++++-- 1 file changed, 231 insertions(+), 10 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 2800739..2fe1c22 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -946,7 +946,7 @@ Proof using. { rewrite TID2; vauto. } apply EQACTS in INE. destruct INE as [C1 | C2]; vauto. } - vauto. } + vauto. } { intros x INE TID2. unfold mapper_rev'. destruct classic with (x = e) as [EQ | NEQ]. @@ -1664,6 +1664,20 @@ Proof using. assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). { clear - MAPEQ. now apply set_collect_eq_dom. } assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + assert (MAPREVDOM : E_t ≡₁ mapper_rev ↑₁ E_s). + { rewrite (seq_acts SIMREL). split. + { unfolder. intros x XINE. + exists (mapper x). splits; vauto. + apply MAPREV; vauto. } + unfolder. intros x (y & XINE & YEQ). + destruct XINE as (x0 & (INE & MAPPED)). + rewrite <- MAPPED in YEQ. rewrite <- YEQ. + assert (INE' : E_t x0) by vauto. + apply MAPREV in INE. clear - INE INE'. + unfold compose in INE. rewrite INE. + basic_solver. } + assert (MEPERREV_E : mapper_rev' ↑₁ eq e ≡₁ eq e). + { subst mapper_rev'. rewrite set_collect_eq. now rupd. } assert (NEWE : << NINIT : ~is_init e >> /\ << NOTIN : ~E_s e >> /\ @@ -1765,7 +1779,54 @@ Proof using. { rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } desf. } - { admit. } + { rewrite EQACTS. + rewrite set_collect_union. + rewrite set_collect_union. + apply set_union_more. + { split. + { intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + desf. } + unfold set_collect. + exists (mapper' x). splits; vauto. + unfold mapper'. + rewrite updo; vauto. + unfold mapper_rev'. + rewrite updo; vauto. + { apply MAPREV; vauto. } + intros FALSE. + assert (INE : E_s e). + { destruct SIMREL. + apply seq_acts. + red; vauto. } + desf. } + intros x COND. + destruct COND as [x0 [[x1 [INE MAP1]] MAP2]]. + apply MAPREVDOM. + unfold set_collect. + exists x0; splits; vauto. + { destruct classic with (x1 = e) as [EQ | NEQ]. + { subst x1. unfold mapper'. + desf. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + apply seq_acts. + red; vauto. } + unfold mapper'. + rewrite updo. + { unfold mapper_rev'. + rewrite updo; vauto. + intros FALSE. + assert (INES : E_s e). + { destruct SIMREL. + apply seq_acts. + red; vauto. } + desf. } + intros FALSE. desf. } + rewrite MAPER_E. + rewrite MEPERREV_E; vauto. } { admit. (*TODO : po-work*) } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } @@ -1788,7 +1849,35 @@ Proof using. apply (seq_mapeq SIMREL) in C1; vauto. unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } subst e'. unfold mapper'. rewrite upds; vauto. } - { admit. } + { intros x MAP TIDS. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper_rev'. rewrite upds; vauto. } + destruct MAP as [x0 [INE MAP]]. + unfold mapper_rev'. + rewrite updo; vauto. + unfold mapper'. + rewrite updo; vauto. + { unfold mapper' in TIDS. + rewrite updo in TIDS; vauto. + { destruct SIMREL. + apply seq_mapeq_rev in TIDS; vauto. + apply seq_acts. + red; exists x0; splits; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. + apply seq_mapeq in TIDS; vauto. + { unfold mapper' in NEQ. + rewrite upds in NEQ. + desf. } + unfold mapper' in NEQ. + rewrite upds in NEQ. + desf. } + intros FLS. subst. + unfold mapper' in NEQ. + rewrite upds in NEQ. desf. } + intros FLS. subst. + unfold mapper' in NEQ. + rewrite upds in NEQ. desf. } { intros e' INE TID2. apply EQACTS in INE. destruct INE as [C1 | C2]. @@ -1823,7 +1912,105 @@ Proof using. assert (T2NOTIN' : ~ threads_set G_t' t_2). { intros FALSE. apply add_event_threads in FALSE; vauto. } desf. } - all : admit. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper' in TID2. + rewrite upds in TID2. exfalso. + apply wf_threads in INE; [ | apply INV']. + destruct ADD. apply add_event_threads in INE. + apply T2NOTIN; vauto. } + unfold mapper' in TID2. + rewrite updo in TID2. + { destruct SIMREL. + apply seq_thrd in TID2. + { rewrite TID2; vauto. } + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + vauto. } + { intros x INE TID2. + unfold mapper_rev'. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper' in INE. + destruct INE as [x0 [INE MAP]]. + rewrite upds. + destruct classic with (x0 = e) as [EQ1 | NEQ1]. + { subst x0. apply wf_threads in INE; [ | apply INV']. + destruct ADD. apply add_event_threads in INE. + exfalso. apply T2NOTIN; vauto. } + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. + apply wf_threads in C1; [ | apply INV]. + destruct ADD. apply add_event_threads in C1. + exfalso. apply T2NOTIN; vauto. } + rewrite updo; vauto. + rewrite (seq_maprev SIMREL); vauto. + apply (seq_acts SIMREL). + apply MAPSUB. + unfold set_collect in INE. + destruct INE as [x0 [INE MAP]]. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { vauto. } + rewrite <- C2 in MAP. + assert (MAPNORM : mapper' e = e). + { rewrite set_collect_eq in MAPER_E. + apply MAPER_E; vauto. } + desf. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + rewrite upds; vauto. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + rewrite upds. desf. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out_snd; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { subst. clear - IDXS TID. + exfalso. unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out_move; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros e' NINE. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_rest SIMREL); vauto. + intros FALSE. apply NINE. + apply EQACTS. unfold set_union. + left; vauto. } + intros e' NINE. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper_rev'. rewrite upds; vauto. } + unfold mapper_rev'. rewrite updo; vauto. + apply (seq_rest_rev SIMREL); vauto. + intros FALSE. apply NINE. unfold set_collect. + exists (mapper_rev e'). split. + { apply EQACTS. left. apply MAPREVDOM. + basic_solver. } + unfold mapper'. rewrite updo; vauto. + { apply MAPREVR; vauto. } + intros FLS. + assert (WRG : E_t e). + { apply MAPREVDOM. basic_solver 4. } + desf. } split; vauto. constructor. { unfold WCore.add_event. exists (option_map mapper' r), (mapper' ↑₁ R1), @@ -1843,9 +2030,37 @@ Proof using. { rewrite EQACTS. rewrite set_collect_union. rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). unfold mapper'. rewrite upds. basic_solver. } - { unfold mapper', mapper_rev'. - destruct ADD. rewrite add_event_lab. - rewrite upds. admit. } + { destruct ADD. destruct SIMRELQ. + unfold mapper', mapper_rev'. + apply functional_extensionality; ins. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite !upds. vauto. + rewrite add_event_lab. + unfold compose. rewrite upds. + rewrite upds; vauto. } + rewrite !updo; vauto. + { rewrite add_event_lab. + unfold compose. rewrite updo; vauto. + { destruct SIMREL. + destruct classic with (E_s x) as [INN | NINN]. + { rewrite updo; vauto. + rewrite seq_lab_rev0; vauto. } + rewrite updo; vauto. + rewrite seq_rlab0; vauto. } + rewrite updo; vauto. + destruct classic with (E_s x) as [INN | NINN]. + { destruct SIMREL. + intros FALSE. + assert (STT : mapper (mapper_rev x) = mapper e) + by vauto. + unfold compose in MAPREVR. + rewrite MAPREVR in STT. + { unfold id in STT. + rewrite seq_rest0 in STT; vauto. } + vauto. } + destruct SIMREL. + rewrite seq_rest_rev0; vauto. } + rewrite upds; vauto. } { destruct ADD. rewrite add_event_rf. rewrite !collect_rel_union. arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). @@ -1897,7 +2112,11 @@ Proof using. { rewrite (seq_ctrl SIMREL); vauto. } { rewrite (seq_rmw_dep SIMREL); vauto. } { admit. (* po-work *) } - admit. (* wf_s' *) } + arewrite (G_s' = WCore.G X_s'). + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. } { unfold rf_complete. rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). unfold rf_complete in RFC. rewrite EQACTS. @@ -1940,8 +2159,10 @@ Proof using. { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } { apply INV'. } - constructor. (* wf_s' *) - all : admit. + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. Admitted. End SimrelStep. From 33bbf4940be7dc7b1716cbd06259f1f876dc64e5 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Wed, 21 May 2025 19:22:56 +0200 Subject: [PATCH 40/51] both rpo done --- src/sequentialization/SequentExec.v | 261 +++++++++++++++++++++++++- src/sequentialization/SequentReexec.v | 254 ++++++++++++++++++++++++- 2 files changed, 513 insertions(+), 2 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 2fe1c22..aa732d5 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -1177,7 +1177,266 @@ Proof using. unfold mapper'. rewrite upds. vauto. } apply XmmCons.monoton_cons with (G_t := G_t') (m := mapper'); vauto; try apply SIMRELQ. - { admit. (* TODO : po-work? *) } + { unfold rpo. unfold rpo_imm. + arewrite (WCore.G X_s' = G_s'). + destruct SIMRELQ. + assert (RESTR : ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘ ≡ restr_rel E_t' ( + ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘)). + { split. + { rewrite !restr_union. + repeat apply union_mori. + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] COND]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x1 [COND [EQ2 CD2]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + rewrite inclusion_restr; vauto. } + rewrite RESTR. + rewrite collect_rel_ct_inj. + { assert (MAPREVCOMP : eq_dom (acts_set G_s') (mapper' ∘ mapper_rev') id). + { intros x COND. + unfold G_s' in COND; ins. + destruct COND as [x0 [COND EQ]]; subst. + unfold compose. + destruct classic with (x0 = e) as [EQ1 | NEQ1]. + { subst x0. unfold mapper', mapper_rev'. + rewrite !upds; vauto. } + apply EQACTS in COND. + destruct COND as [C1 | C2]. + { unfold mapper', mapper_rev'. + unfold id. + arewrite (upd mapper e e x0 = mapper x0). + arewrite (upd mapper_rev e e (mapper x0) = mapper_rev (mapper x0)). + { destruct classic with (mapper x0 = e) as [EQ2 | NEQ2]. + { destruct SIMREL. + assert (INEE : E_s e). + { apply seq_acts0. + red; vauto. } + desf. } + rewrite updo; vauto. } + unfold compose in MAPREV. + rewrite MAPREV; vauto. + unfold id. rewrite updo; vauto. } + desf. } + assert (SBIN : sb G_s' ⊆ mapper' ↑ sb_t'). + { rewrite <- seq_sb; vauto. } + apply clos_trans_mori. + rewrite <- RESTR. + rewrite !collect_rel_union. + repeat apply union_mori. + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘ ≡ + ⦗R_t' ∩₁ Rlx G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISR ISRLX] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISRLX. + rewrite seq_lab_rev in ISRLX; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISRLX; vauto. } + { unfold is_rlx. unfold compose in ISRLX; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + arewrite (⦗Acq G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘ ≡ + ⦗Acq G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [ISA INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_acq. unfold compose in ISA; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE ISR]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISR. + rewrite seq_lab_rev in ISR; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + unfold is_rel. unfold compose in ISR; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘ ≡ + ⦗F G_t' ∩₁ Rel G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISF ISREL] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISREL. + rewrite seq_lab_rev in ISREL; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISREL; vauto. } + { unfold is_rlx. unfold compose in ISREL; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + vauto. } { rewrite <- (seq_lab SIMRELQ); vauto. } { admit. (* TODO : po-work? *) } { apply INV'. } diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index d0816b8..dc61c4b 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -376,6 +376,8 @@ Proof using. assert (HLP : (t_1_len + (index - t_1_len)) = index). { lia. } basic_solver. } + assert (MAPREVCOMP : eq_dom (acts_set G_s') (mapper' ∘ mapper_rev') id). + { admit. } assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1). @@ -2039,7 +2041,239 @@ Proof using. all : try arewrite (WCore.G X_s' = G_s'). { apply SIMRELQ. } { unfold rpo. unfold rpo_imm. - admit. (* ugh *)} + destruct SIMRELQ. + assert (RESTR : ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘ ≡ restr_rel E_t' ( + ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘)). + { split. + { rewrite !restr_union. + repeat apply union_mori. + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] COND]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x1 [COND [EQ2 CD2]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + rewrite inclusion_restr; vauto. } + rewrite RESTR. + rewrite collect_rel_ct_inj. + { assert (SBIN : sb G_s' ⊆ mapper' ↑ sb_t'). + { rewrite <- seq_sb; vauto. } + apply clos_trans_mori. + rewrite <- RESTR. + rewrite !collect_rel_union. + repeat apply union_mori. + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘ ≡ + ⦗R_t' ∩₁ Rlx G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISR ISRLX] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISRLX. + rewrite seq_lab_rev in ISRLX; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISRLX; vauto. } + { unfold is_rlx. unfold compose in ISRLX; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + arewrite (⦗Acq G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘ ≡ + ⦗Acq G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [ISA INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_acq. unfold compose in ISA; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE ISR]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISR. + rewrite seq_lab_rev in ISR; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + unfold is_rel. unfold compose in ISR; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘ ≡ + ⦗F G_t' ∩₁ Rel G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISF ISREL] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISREL. + rewrite seq_lab_rev in ISREL; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISREL; vauto. } + { unfold is_rlx. unfold compose in ISREL; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + vauto. } { unfold G_s'; ins. arewrite ((fun x : actid => ifP ~ (mapper' ↑₁ E_t') x then x @@ -2141,6 +2375,24 @@ Proof using. { admit. (* we have it *) } { admit. } { constructor. + { unfold WCore.X_start; ins. + destruct STEP; vauto. + unfold dtrmt'. rewrite <- dtrmt_init. + destruct SIMREL. rewrite seq_acts. + split. + { destruct SIMRELQ. + unfold set_collect. exists x; split; vauto. + apply seq_init0 in H; vauto. } + unfold set_collect. + exists x; split. + { apply INV; vauto. } + destruct SIMRELQ. + apply seq_init in H; vauto. } + { unfold WCore.X_start; ins. + rewrite (seq_acts SIMREL). + unfold dtrmt'. destruct STEP. + rewrite dtrmt_cmt, reexec_embd_dom. + admit. } all : admit. } { apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) From 98d34293a0129725c28aada68063b17d4fe11889 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Thu, 22 May 2025 23:58:22 +0200 Subject: [PATCH 41/51] reexec attempts --- src/sequentialization/SequentReexec.v | 506 ++++++++++++++------------ 1 file changed, 269 insertions(+), 237 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index dc61c4b..b7d777f 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -377,7 +377,12 @@ Proof using. { lia. } basic_solver. } assert (MAPREVCOMP : eq_dom (acts_set G_s') (mapper' ∘ mapper_rev') id). - { admit. } + { intros x COND. + unfold G_s' in COND; ins. + destruct COND as [x0 [INE MAP]]. + rewrite <- MAP. unfold compose in *. + rewrite MAPCOMP; vauto. } + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1). @@ -771,6 +776,264 @@ Proof using. unfold SequentBase.t_1_len in *. lia. } + assert (RPOIN : rpo G_s' ⊆ mapper' ↑ rpo_t'). + { unfold rpo. unfold rpo_imm. + destruct SIMRELQ. + assert (RESTR : ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘ ≡ restr_rel E_t' ( + ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘)). + { split. + { rewrite !restr_union. + repeat apply union_mori. + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] COND]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x1 [COND [EQ2 CD2]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + rewrite inclusion_restr; vauto. } + rewrite RESTR. + rewrite collect_rel_ct_inj. + { assert (SBIN : sb G_s' ⊆ mapper' ↑ sb_t'). + { rewrite <- seq_sb; vauto. } + apply clos_trans_mori. + rewrite <- RESTR. + rewrite !collect_rel_union. + repeat apply union_mori. + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘ ≡ + ⦗R_t' ∩₁ Rlx G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISR ISRLX] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISRLX. + rewrite seq_lab_rev in ISRLX; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISRLX; vauto. } + { unfold is_rlx. unfold compose in ISRLX; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + arewrite (⦗Acq G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘ ≡ + ⦗Acq G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [ISA INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_acq. unfold compose in ISA; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE ISR]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISR. + rewrite seq_lab_rev in ISR; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + unfold is_rel. unfold compose in ISR; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘ ≡ + ⦗F G_t' ∩₁ Rel G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISF ISREL] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISREL. + rewrite seq_lab_rev in ISREL; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISREL; vauto. } + { unfold is_rlx. unfold compose in ISREL; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + vauto. } + + assert (SBSEQ : sb (WCore.G X_s') ≡ mapper' ↑ sb_t' \ po_seq X_s' t_1 t_2). + { destruct SIMRELQ. + assert (HLP : (sb (WCore.G X_s') ∪ po_seq X_s' t_1 t_2) + \ po_seq X_s' t_1 t_2 ≡ mapper' ↑ sb_t' \ po_seq X_s' t_1 t_2). + { apply minus_rel_more; vauto. } + rewrite <- HLP. + rewrite minus_union_l. + rewrite minusK. + rewrite minus_disjoint; [basic_solver |]. + split; vauto. + intros x y COND. + destruct COND as [COND1 COND2]. + unfold po_seq in COND2. + destruct COND2 as [[TID1 IN1] [TID2 IN2]]. + unfold sb in COND1. + destruct COND1 as [x0 [[EQ1 INE1] [x1 [COND [EQ2 INE2]]]]]. + subst x0 x1. + unfold ext_sb in COND. + desf. + { unfold tid in TID1. apply NINIT1; vauto. } + unfold tid in *. desf. } + unfold WCore.reexec. exists thrdle'. constructor; vauto. @@ -1058,7 +1321,10 @@ Proof using. apply reexec_embd_dom in DT; vauto. } exists (mapper x3); split; vauto. red; split; vauto. } - { admit. (* ugh *)} + { unfold nin_sb. + rewrite SBSEQ. + rewrite <- seq_eqv_minus_ll. + admit. (* something for immediate of exclusion is needed *)} { arewrite (WCore.G X_s' = G_s'). unfold G_s' at 1; ins. intros x COND. @@ -1158,7 +1424,7 @@ Proof using. apply seq_lab0. apply reexec_embd_acts; red; vauto. } apply reexec_embd_dom; vauto. } - { admit. (* ugh *) } + { admit. (* needs a better analysis of sb structure *) } { unfold cmt'. rewrite (seq_rf SIMRELQ). rewrite (seq_rf SIMREL). @@ -2040,240 +2306,6 @@ Proof using. (m := mapper'); vauto. all : try arewrite (WCore.G X_s' = G_s'). { apply SIMRELQ. } - { unfold rpo. unfold rpo_imm. - destruct SIMRELQ. - assert (RESTR : ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ - ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘ ≡ restr_rel E_t' ( - ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ - ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘)). - { split. - { rewrite !restr_union. - repeat apply union_mori. - { intros x y COND. - unfold restr_rel; split; vauto. - destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. - apply wf_sbE in COND. - clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. - basic_solver. } - { intros x y COND. - unfold restr_rel; split; vauto. - destruct COND as [x0 [[EQ1 CD1] COND]]; subst. - apply wf_sbE in COND. - clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. - basic_solver. } - { intros x y COND. - unfold restr_rel; split; vauto. - destruct COND as [x1 [COND [EQ2 CD2]]]; subst. - apply wf_sbE in COND. - clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. - basic_solver. } - intros x y COND. - unfold restr_rel; split; vauto. - destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. - apply wf_sbE in COND. - clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. - basic_solver. } - rewrite inclusion_restr; vauto. } - rewrite RESTR. - rewrite collect_rel_ct_inj. - { assert (SBIN : sb G_s' ⊆ mapper' ↑ sb_t'). - { rewrite <- seq_sb; vauto. } - apply clos_trans_mori. - rewrite <- RESTR. - rewrite !collect_rel_union. - repeat apply union_mori. - { rewrite wf_sbE. rewrite !seqA. - rewrite <- id_inter. - rewrite <- seqA. - rewrite <- id_inter. - rewrite SBIN. - rewrite wf_sbE at 2. - rewrite !seqA. - rewrite <- id_inter. - arewrite (⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘ ≡ - ⦗R_t' ∩₁ Rlx G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘). - { rewrite <- seqA. - rewrite <- id_inter; vauto. } - rewrite !collect_rel_seq. - { repeat apply seq_mori; vauto. - { intros x y COND. - destruct COND as [EQ [[ISR ISRLX] INE]]; subst. - assert (SUB : G_s' = WCore.G X_s') by vauto. - rewrite SUB in *. - unfold is_rlx, mod in ISRLX. - rewrite seq_lab_rev in ISRLX; vauto. - red. exists (mapper_rev' y), (mapper_rev' y); splits. - { red; split; vauto. - repeat split. - { unfold is_r. unfold compose in ISRLX; vauto. } - { unfold is_rlx. unfold compose in ISRLX; vauto. } - apply seq_acts_rev; red; vauto. } - { unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - intros x y COND. - destruct COND as [EQ [INE [ISF ISA]]]; subst. - assert (SUB : G_s' = WCore.G X_s') by vauto. - rewrite SUB in *. - unfold is_acq, mod in ISA. - rewrite seq_lab_rev in ISA; vauto. - red. exists (mapper_rev' y), (mapper_rev' y); splits. - { red; split; vauto. - repeat split. - { apply seq_acts_rev; red; vauto. } - { unfold is_r. unfold compose in ISA; vauto. } - unfold is_rlx. unfold compose in ISA; vauto. } - { unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - { rewrite wf_sbE. - rewrite !codom_seq. - clear - seq_inj. - basic_solver 8. } - rewrite wf_sbE. - clear - seq_inj. - basic_solver 8. } - { rewrite wf_sbE. - rewrite <- seqA. - rewrite <- id_inter. - rewrite SBIN. - rewrite wf_sbE at 2. - arewrite (⦗Acq G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘ ≡ - ⦗Acq G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘). - { rewrite <- seqA. - rewrite <- id_inter; vauto. } - rewrite !collect_rel_seq. - { repeat apply seq_mori; vauto. - { intros x y COND. - destruct COND as [EQ [ISA INE]]; subst. - assert (SUB : G_s' = WCore.G X_s') by vauto. - rewrite SUB in *. - unfold is_acq, mod in ISA. - rewrite seq_lab_rev in ISA; vauto. - red. exists (mapper_rev' y), (mapper_rev' y); splits. - { red; split; vauto. - repeat split. - { unfold is_acq. unfold compose in ISA; vauto. } - apply seq_acts_rev; red; vauto. } - { unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - intros x y COND. - destruct COND as [EQ INE]; subst. - assert (SUB : G_s' = WCore.G X_s') by vauto. - rewrite SUB in *. - red. exists (mapper_rev' y), (mapper_rev' y); splits. - { red; split; vauto. - apply seq_acts_rev; red; vauto. } - { unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - { rewrite wf_sbE. - rewrite !codom_seq. - clear - seq_inj. - basic_solver 8. } - rewrite wf_sbE. - clear - seq_inj. - basic_solver 8. } - { rewrite wf_sbE. rewrite !seqA. - rewrite <- id_inter. - rewrite SBIN. - rewrite wf_sbE at 2. - rewrite !seqA. - rewrite <- id_inter. - rewrite !collect_rel_seq. - { repeat apply seq_mori; vauto. - { intros x y COND. - destruct COND as [EQ INE]; subst. - assert (SUB : G_s' = WCore.G X_s') by vauto. - rewrite SUB in *. - red. exists (mapper_rev' y), (mapper_rev' y); splits. - { red; split; vauto. - apply seq_acts_rev; red; vauto. } - { unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - intros x y COND. - destruct COND as [EQ [INE ISR]]; subst. - assert (SUB : G_s' = WCore.G X_s') by vauto. - rewrite SUB in *. - unfold is_rel, mod in ISR. - rewrite seq_lab_rev in ISR; vauto. - red. exists (mapper_rev' y), (mapper_rev' y); splits. - { red; split; vauto. - repeat split. - { apply seq_acts_rev; red; vauto. } - unfold is_rel. unfold compose in ISR; vauto. } - { unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - { rewrite wf_sbE. - rewrite !codom_seq. - clear - seq_inj. - basic_solver 8. } - rewrite wf_sbE. - clear - seq_inj. - basic_solver 8. } - rewrite wf_sbE. rewrite !seqA. - rewrite <- id_inter. - rewrite <- seqA. - rewrite <- id_inter. - rewrite SBIN. - rewrite wf_sbE at 2. - rewrite !seqA. - rewrite <- id_inter. - arewrite (⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘ ≡ - ⦗F G_t' ∩₁ Rel G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘). - { rewrite <- seqA. - rewrite <- id_inter; vauto. } - rewrite !collect_rel_seq. - { repeat apply seq_mori; vauto. - { intros x y COND. - destruct COND as [EQ [[ISF ISREL] INE]]; subst. - assert (SUB : G_s' = WCore.G X_s') by vauto. - rewrite SUB in *. - unfold is_rel, mod in ISREL. - rewrite seq_lab_rev in ISREL; vauto. - red. exists (mapper_rev' y), (mapper_rev' y); splits. - { red; split; vauto. - repeat split. - { unfold is_r. unfold compose in ISREL; vauto. } - { unfold is_rlx. unfold compose in ISREL; vauto. } - apply seq_acts_rev; red; vauto. } - { unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - intros x y COND. - destruct COND as [EQ [INE [ISF ISA]]]; subst. - assert (SUB : G_s' = WCore.G X_s') by vauto. - rewrite SUB in *. - unfold is_rlx, mod in ISA. - rewrite seq_lab_rev in ISA; vauto. - red. exists (mapper_rev' y), (mapper_rev' y); splits. - { red; split; vauto. - repeat split. - { apply seq_acts_rev; red; vauto. } - { unfold is_r. unfold compose in ISA; vauto. } - unfold is_rlx. unfold compose in ISA; vauto. } - { unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - unfold compose in MAPREVCOMP. - rewrite MAPREVCOMP; vauto. } - { rewrite wf_sbE. - rewrite !codom_seq. - clear - seq_inj. - basic_solver 8. } - rewrite wf_sbE. - clear - seq_inj. - basic_solver 8. } - vauto. } { unfold G_s'; ins. arewrite ((fun x : actid => ifP ~ (mapper' ↑₁ E_t') x then x From ba900c3ebc9986ad6654b26079856573ca1795b5 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Fri, 23 May 2025 16:43:29 +0200 Subject: [PATCH 42/51] threads admit closed --- src/sequentialization/SequentReexec.v | 186 +++++++++++++++++++++++--- 1 file changed, 170 insertions(+), 16 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index b7d777f..21eb821 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -144,8 +144,10 @@ Proof using. rewrite rel_low. basic_solver. Qed. -Definition thrdle' := thrdle ∪ eq t_2 × eq t_1 ∪ (dom_rel (thrdle ⨾ ⦗eq t_1⦘) \₁ eq t_2) × eq t_2 - ∪ eq t_2 × (codom_rel (⦗eq t_1⦘ ⨾ thrdle) \₁ eq t_2) +Hypothesis THRLEE : thrdle ≡ ⦗threads_set G_t⦘ ⨾ thrdle ⨾ ⦗threads_set G_t⦘. + +Definition thrdle' := thrdle ∪ eq t_2 × eq t_1 ∪ dom_rel (thrdle ⨾ ⦗eq t_1⦘) × eq t_2 + ∪ eq t_2 × codom_rel (⦗eq t_1⦘ ⨾ thrdle) ∪ eq tid_init × codom_rel (thrdle). Hypothesis INV : seq_simrel_inv X_t. @@ -1100,8 +1102,6 @@ Proof using. apply codom_crossed in FLS3. desf. } apply codom_crossed in FLS2. - unfold set_minus in FLS2. - destruct FLS2 as [FLS2 _]. destruct STEP. destruct reexec_sur. clear - FLS2 surg_init_min. unfold min_elt in surg_init_min. @@ -1119,16 +1119,23 @@ Proof using. desf. } { constructor. { unfold thrdle'. - apply irreflexive_union; split. - { apply irreflexive_union; split. - { apply irreflexive_union; split. - { apply irreflexive_union; split. - { destruct STEP. destruct reexec_sur. - unfold strict_partial_order in surg_order. - destruct surg_order as [IRR _]; vauto. } - clear - THRDNEQ. basic_solver. } - clear. basic_solver. } - clear. basic_solver. } + repeat (apply irreflexive_union; split). + { destruct STEP. destruct reexec_sur. + unfold strict_partial_order in surg_order. + destruct surg_order as [IRR _]; vauto. } + { clear - THRDNEQ. basic_solver. } + { intros x COND. + destruct COND as [CD1 CD2]; subst x. + destruct CD1 as [x1 [x2 [CD1 CD2]]]. + apply THRLEE in CD1. + destruct CD1 as [x3 [[EQ INE] CD3]]. + subst x3. desf. } + { intros x COND. + destruct COND as [CD1 CD2]; subst x. + destruct CD2 as [x1 [x2 [CD1 CD2]]]. + apply THRLEE in CD2. + destruct CD2 as [x3 [CD2 [x4 [CD3 [EQ INE]]]]]. + subst x4. desf. } destruct STEP. destruct reexec_sur. unfold min_elt in surg_init_min. clear - surg_init_min. @@ -1137,8 +1144,155 @@ Proof using. basic_solver 4. } unfold thrdle'. unfold transitive. intros x y z XY YZ. - (* TODO : discuss *) - admit. } + destruct XY as [[[[C1 | C1] | C1] | C1] | C1]. + all : destruct YZ as [[[[C2 | C2] | C2] | C2] | C2]. + all : destruct STEP. + all : destruct reexec_sur. + all : destruct surg_order as [IR TR]. + { do 4 left. clear - C1 C2 TR. basic_solver 4. } + { destruct C2 as [EQ1 EQ2]. + subst y. apply THRLEE in C1. + destruct C1 as [x3 [CD2 [x4 [CD3 [EQ INE]]]]]. + desf. } + { do 2 left; right. + clear - C1 C2 TR. + destruct C2 as [C2 EQ]; subst z. + split; vauto. + destruct C2 as [x0 [x1 [CD2 [EQ1 EQ2]]]]; subst. + basic_solver 8. } + { destruct C2 as [EQ1 EQ2]. + subst y. apply THRLEE in C1. + destruct C1 as [x3 [CD2 [x4 [CD3 [EQ INE]]]]]. + desf. } + { clear - C1 C2 surg_init_min. + exfalso. unfold min_elt in surg_init_min. + destruct C2 as [C2 C3]. + basic_solver 4. } + { left; right. + clear - C1 C2 TR. + destruct C1 as [C1 EQ]; subst x y. + split; vauto. } + { clear - C1 C2 THRDNEQ. + destruct C1 as [C1 EQ]; subst x y. + destruct C2 as [C2 EQ1]; subst z. + exfalso. desf. } + { clear - C1 C2 IR. + exfalso. + destruct C1 as [C1 EQ]; subst x y. + destruct C2 as [C2 EQ1]; subst z. + destruct IR with t_1. + destruct C2 as [x0 [x1 [CD [EQ1 EQ2]]]]; subst. + vauto. } + { clear - C1 C2 THRDNEQ. + destruct C1 as [C1 EQ]; subst x y. + destruct C2 as [C2 EQ1]. + exfalso. desf. } + { clear - C1 C2 NINIT1. + destruct C1 as [C1 EQ]; subst x y. + destruct C2 as [C2 EQ1]. + exfalso. desf. } + { destruct C1 as [EQ1 EQ2]. + subst y. apply THRLEE in C2. + destruct C2 as [x3 [[EQ TD] [x4 [CD3 CD4]]]]. + desf. } + { do 4 left. clear - C1 C2 TR. + destruct C2 as [C2 EQ]; subst y z. + destruct C1 as [C1 EQ1]. + destruct C1 as [x0 [x1 [CD1 [EQ2 EQ3]]]]; subst. + vauto. } + { destruct C1 as [EQ1 EQ2]. + subst y. + destruct C2 as [C2 EQ]; subst z. + destruct C2 as [x0 [x1 [CD2 [EQ3 EQ4]]]]; subst. + apply THRLEE in CD2. + destruct CD2 as [x3 [[EQ TD] [x4 [CD3 CD4]]]]. + desf. } + { do 4 left. clear - C1 C2 TR. + destruct C2 as [C2 EQ]; subst. + destruct C1 as [C1 EQ1]; subst. + destruct C1 as [x0 [x1 [CD1 [EQ2 EQ3]]]]; subst. + destruct EQ as [x1 [x2 [[EQ INE] CDD]]]; subst. + basic_solver 8. } + { clear - C1 C2 NINIT2. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + exfalso. desf. } + { left; right. + clear - C1 C2 TR. + destruct C1 as [EQ1 EQ2]. + subst x. split; vauto. + unfold codom_rel. + destruct EQ2 as [x0 [x1 [[EQ1 EQ2] CD]]]. + basic_solver 8. } + { clear - C1 C2 THRLEE T2NOTIN. + destruct C2 as [C2 EQ]; subst. + destruct C1 as [C1 EQ1]; subst. + destruct EQ1 as [x0 [x1 [[EQ1 EQ2] CD]]]. + apply THRLEE in CD. + destruct CD as [x3 [[EQ TD] [x4 [CD3 [EQ3 TD2]]]]]. + desf. } + { clear - C1 C2 IR TR. + exfalso. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + destruct EQ as [x0 [x1 [[EQ1 EQ2] CD]]]; subst. + destruct C2 as [x2 [x3 [CD2 [INE1 INE2]]]]; subst. + basic_solver 8. } + { destruct C1 as [EQ1 EQ2]. + subst x. + destruct C2 as [C2 EQ]; subst. + destruct EQ2 as [x0 [x1 [CD2 CD3]]]; subst. + apply THRLEE in CD3. + destruct CD3 as [x3 [[EQ2 TD] [x4 [CD3 [EQ3 EQ4]]]]]. + desf. } + { clear - C1 C2 surg_init_min TR. + exfalso. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + destruct EQ as [x0 [x1 [[EQ3 EQ2] CD]]]; subst. + destruct surg_init_min with x1; vauto. } + { do 4 left. clear - C1 C2 TR surg_init_least surg_init_min. + destruct C1. + destruct H0 as [x0 CND]; subst. + unfold least_elt in surg_init_least. + apply surg_init_least. + intros FLS. basic_solver 12. } + { clear - C1 C2 THRLEE T2NOTIN. + exfalso. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + destruct EQ as [x0 CND]; subst. + apply THRLEE in CND. + destruct CND as [x3 [[EQ2 TD] [x4 [CD3 [EQ3 EQ4]]]]]. + desf. } + { do 2 left; right. + clear - C1 C2 TR NINIT1 surg_init_least. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + split; vauto. + unfold dom_rel. + exists t_1; vauto. + unfold seq; exists t_1; split; vauto. + unfold least_elt in surg_init_least. + specialize (surg_init_least t_1). + apply surg_init_least. + basic_solver. } + { clear - C1 C2 THRLEE T2NOTIN. + exfalso. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + destruct EQ as [x0 CND]; subst. + apply THRLEE in CND. + destruct CND as [x3 [[EQ2 TD] [x4 [CD3 [EQ3 EQ4]]]]]. + desf. } + clear - C1 C2 surg_init_min. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + exfalso. + unfold min_elt in surg_init_min. + destruct EQ as [x0 CND]. + specialize (surg_init_min x0). + vauto. } admit. } { unfold sb. rewrite !seqA. rewrite <- !id_inter. From 0de5ac211c23747690fab25555b93aadee37708d Mon Sep 17 00:00:00 2001 From: keba4ok Date: Fri, 23 May 2025 22:00:15 +0200 Subject: [PATCH 43/51] some work --- src/sequentialization/SequentExec.v | 59 ++++++++++++++++++++++++++- src/sequentialization/SequentReexec.v | 18 ++------ 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index aa732d5..8c2a05c 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -1132,7 +1132,36 @@ Proof using. { rewrite (seq_addr SIMREL); vauto. } { rewrite (seq_ctrl SIMREL); vauto. } { rewrite (seq_rmw_dep SIMREL); vauto. } - { admit. (* po-work *) } + { assert (SBEQ1 : sb_s ≡ mapper ↑ sb_t \ po_seq X_s t_1 t_2). + { rewrite <- (seq_sb SIMREL). + rewrite minus_union_l. + rewrite minusK. split; [| basic_solver]. + intros x y COND. + left. split; vauto. + intros FLS. + unfold po_seq in FLS. + destruct FLS as [[TID1 INE1] [TID2 INE2]]. + unfold sb in COND. unfold ext_sb in COND. + clear - COND TID1 TID2 NINIT1 NINIT2 THRDNEQ. + destruct COND as [x0 [[EQQ1 INEE1] [x1 [COND2 [EQQ2 INEE2]]]]]. + subst. desf. basic_solver 42. } + assert (SBEQ2 : sb G_s' ≡ mapper' ↑ sb_t' \ po_seq X_s' t_1 t_2). + { rewrite <- (seq_sb SIMRELQ). + rewrite minus_union_l. rewrite TID. + rewrite minusK. split; [| basic_solver]. + intros x y COND. + left. split; vauto. + intros FLS. + unfold po_seq in FLS. + destruct FLS as [[TID1 INE1] [TID2 INE2]]. + unfold sb in COND. unfold ext_sb in COND. + clear - COND TID1 TID2 NINIT1 NINIT2 THRDNEQ. + destruct COND as [x0 [[EQQ1 INEE1] [x1 [COND2 [EQQ2 INEE2]]]]]. + subst. desf. basic_solver 42. } + rewrite SBEQ1, SBEQ2. + unfold WCore.sb_delta. + destruct ADD. rewrite add_event_sb. + admit. (* po-work *) } arewrite (G_s' = WCore.G X_s'). apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) @@ -1438,7 +1467,33 @@ Proof using. basic_solver 8. } vauto. } { rewrite <- (seq_lab SIMRELQ); vauto. } - { admit. (* TODO : po-work? *) } + { assert (SBEQ : sb G_s' ≡ mapper' ↑ sb_t' \ po_seq X_s' t_1 t_2). + { rewrite <- (seq_sb SIMRELQ). + rewrite minus_union_l. rewrite TID. + rewrite minusK. split; [| basic_solver]. + intros x y COND. + left. split; vauto. + intros FLS. + unfold po_seq in FLS. + destruct FLS as [[TID1 INE1] [TID2 INE2]]. + unfold sb in COND. unfold ext_sb in COND. + clear - COND TID1 TID2 NINIT1 NINIT2 THRDNEQ. + destruct COND as [x0 [[EQQ1 INEE1] [x1 [COND2 [EQQ2 INEE2]]]]]. + subst. desf. basic_solver 42. } + arewrite (WCore.G X_s' = G_s'). + rewrite SBEQ. + intros x y COND. + destruct COND as [[CDMAP POSEQ] COND2]. + destruct CDMAP as [x0 [x1 [CND [M1 M2]]]]. + unfold collect_rel. + exists x0, x1; split; vauto. + split; vauto. + unfold same_loc in *. + destruct SIMRELQ. + unfold loc. rewrite !seq_lab. + { unfold compose; vauto. } + all : apply wf_sbE in CND. + all : destruct CND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; vauto. } { apply INV'. } apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index 21eb821..d2acc65 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -2534,20 +2534,10 @@ Proof using. apply DTRSAME; vauto. } unfold WCore.reexec_thread. split. - { intros x COND. - destruct COND as [x0 [COND EQ]]. - split. - { unfold set_collect. - exists x0; split; vauto. - apply COND; vauto. } - destruct COND as [CD1 CD2]. - unfold set_collect in CD2. - unfold set_collect. - unfold set_map in CD2. - unfold set_map. - destruct CD2 as [x1 [INE TIDS]]. - exists (mapper' x1); split; vauto. - admit. (* ?????? *) } + { rewrite set_collect_inter. + apply set_subset_inter_r. + split; [clear; basic_solver |]. + admit. } admit. } destruct STEP. rewrite dtrmt_cmt. rewrite reexec_embd_dom. From 1dda4a8e8c39cea958b289e8169adc60c5603e7a Mon Sep 17 00:00:00 2001 From: keba4ok Date: Fri, 23 May 2025 22:04:35 +0200 Subject: [PATCH 44/51] proof distribution --- src/sequentialization/SequentExec2.v | 570 +++++++++++++++++++++++ src/sequentialization/SequentExec3.v | 647 +++++++++++++++++++++++++++ src/sequentialization/SequentProgs.v | 2 + 3 files changed, 1219 insertions(+) create mode 100644 src/sequentialization/SequentExec2.v create mode 100644 src/sequentialization/SequentExec3.v diff --git a/src/sequentialization/SequentExec2.v b/src/sequentialization/SequentExec2.v new file mode 100644 index 0000000..02b421b --- /dev/null +++ b/src/sequentialization/SequentExec2.v @@ -0,0 +1,570 @@ +Require Import AuxDef. +Require Import Core. +Require Import AuxRel AuxRel2. +Require Import Srf Rhb. +Require Import SimrelCommon. +Require Import StepOps. +Require Import AuxInj. +Require Import xmm_s_hb. +Require Import Lia. +From xmm Require Import Reordering. +From xmm Require Import ThreadTrace. +From xmm Require Import Programs. +From xmm Require Import SequentBase. +From xmm Require Import SequentWf. +From xmm Require Import ConsistencyMonotonicity. + +From hahn Require Import Hahn. +From hahnExt Require Import HahnExt. +From imm Require Import Events Execution Execution_eco. +Require Import Setoid Morphisms Program.Basics. + +Open Scope program_scope. + +Set Implicit Arguments. + +Section SimrelStep. + +Variable X_t X_t' X_s : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. +Variable mapper_rev : actid -> actid. + +Variable e : actid. +Variable l : label. + +Variable thrdle : relation thread_id. + +Variable ptc_1 ptc_2 : program_trace. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'G_t''" := (WCore.G X_t'). +Notation "'G_s'" := (WCore.G X_s). + +Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). +Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). +Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). +Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). +Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). +Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). + +Notation "'lab_t'" := (lab G_t). +Notation "'val_t'" := (val lab_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'same_loc_t'" := (same_loc lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). +Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). +Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). +Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). + +Notation "'lab_t''" := (lab G_t'). +Notation "'val_t''" := (val lab_t'). +Notation "'loc_t''" := (loc lab_t'). +Notation "'same_loc_t''" := (same_loc lab_t'). +Notation "'E_t''" := (acts_set G_t'). +Notation "'sb_t''" := (sb G_t'). +Notation "'rf_t''" := (rf G_t'). +Notation "'co_t''" := (co G_t'). +Notation "'rmw_t''" := (rmw G_t'). +Notation "'rpo_t''" := (rpo G_t'). +Notation "'rmw_dep_t''" := (rmw_dep G_t'). +Notation "'data_t''" := (data G_t'). +Notation "'ctrl_t''" := (ctrl G_t'). +Notation "'addr_t''" := (addr G_t'). +Notation "'W_t''" := (fun x => is_true (is_w lab_t' x)). +Notation "'R_t''" := (fun x => is_true (is_r lab_t' x)). +Notation "'Loc_t_'' l" := (fun e => loc_t' e = l) (at level 1). + +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'same_loc_s'" := (same_loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). +Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). +Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). +Notation "'F_s'" := (F G_s). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. +Hypothesis MAPREVR : eq_dom E_s (mapper ∘ mapper_rev) id. +Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. +Hypothesis WFT : Wf G_t. + +Definition t_12_len := length (ptc_2 t_1). +Definition t_1_len := length (ptc_1 t_1). +Definition t_2_len := length (ptc_1 t_2). + +Hypothesis INV : seq_simrel_inv X_t. +Hypothesis INV' : seq_simrel_inv X_t'. + +Lemma simrel_step_e_t2 + (T1 : tid e = t_1) + (IND: index e >= t_1_len) + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (T2NOTIN : ~ threads_set G_t t_2) + (THRDNEQ : t_1 <> t_2) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) + (STEP : WCore.exec_inst X_t X_t' e l) : + exists mapper' mapper_rev' X_s', + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ + << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. +Proof using. + destruct STEP as [ADD RFC CONS]. + destruct ADD as (r & R1 & w & W1 & W2 & ADD). + set (mapper' := upd mapper e (ThreadEvent t_2 (index e - t_1_len))). + set (mapper_rev' := upd mapper_rev (ThreadEvent t_2 (index e - t_1_len)) e). + assert (ENOTIN : ~E_t e) by apply ADD. + assert (EMAPNOTIN : ~E_s (ThreadEvent t_2 (index e - t_1_len))). + { intros FALSE. destruct ADD. + assert (CDD : (ThreadEvent t_2 (index e - t_1_len)) = mapper' e). + { unfold mapper'. rewrite upds; vauto. } + rewrite CDD in FALSE. + apply (seq_acts SIMREL) in FALSE. + destruct FALSE as [e' [C1 C2]]. + assert (C1' : E_t e') by vauto. + apply (seq_mapto SIMREL) in C1; vauto. + { assert (TID' : tid e' = t_1). + { apply (seq_tid_2 SIMREL) in C1'; vauto. + rewrite C1; vauto. } + rewrite <- CDD in C2. rewrite C1 in C2; vauto. + assert (INDEX : index e' = index e). + { unfold t_1_len in H0. + assert (index e' >= t_1_len). + { apply (seq_index SIMREL) in C1'. + { rewrite C1'. + unfold SequentBase.t_1_len, t_1_len. + clear. lia. } + rewrite C1; vauto. } + unfold SequentBase.t_1_len in H0. + clear - H0 H IND. unfold t_1_len in *. lia. } + assert (EQE : e' = e). + { clear - INDEX TID' T1 NINIT1. + destruct e', e; basic_solver 8. } + desf. } + rewrite C2; rewrite <- CDD. + vauto. } + assert (MAPEQ : eq_dom E_t mapper' mapper). + { subst mapper'. unfolder. intros x XINE. + clear - EMAPNOTIN ENOTIN XINE. rewrite updo; vauto. + all: congruence. } + assert (MAPREVEQ : eq_dom E_s mapper_rev' mapper_rev). + { subst mapper_rev'. unfolder. intros x XINE. + clear - EMAPNOTIN ENOTIN XINE. rewrite updo; vauto. + all: congruence. } + assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq (ThreadEvent t_2 (index e - t_1_len))). + { subst mapper'. rewrite set_collect_eq. now rupd. } + assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). + { clear - MAPEQ. now apply set_collect_eq_dom. } + assert (MAPREVSUB : mapper_rev' ↑₁ E_s ≡₁ mapper_rev ↑₁ E_s). + { clear - MAPREVEQ. now apply set_collect_eq_dom. } + assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + assert (NEWE : + << NINIT : ~is_init (ThreadEvent t_2 (index e - t_1_len)) >> /\ + << NINIT' : ~is_init e >> /\ + << NOTIN : ~E_s (ThreadEvent t_2 (index e - t_1_len)) >> /\ + << TID : tid (ThreadEvent t_2 (index e - t_1_len)) = t_2 >>). + { unfold NW; splits; vauto. + intros FLS. unfold is_init in FLS. + desf. unfold tid in T1. + apply NINIT1; vauto. } + unfold NW in NEWE. destruct NEWE as (NINIT & NINIT' & NOTIN & TID). + + set (G_s' := {| + acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - t_1_len)); + threads_set := threads_set G_s; + lab := lab_t' ∘ mapper_rev'; + rf := mapper' ↑ rf_t'; + co := mapper' ↑ co_t'; + rmw := mapper' ↑ rmw_t'; + rmw_dep := ∅₂; + ctrl := ∅₂; + data := ∅₂; + addr := ∅₂; + |}). + set (X_s' := {| + WCore.sc := WCore.sc X_s; + WCore.G := G_s'; + |}). + + exists mapper', mapper_rev', X_s'. + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1). + { constructor; vauto; simpl; try basic_solver 6. + { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. + { clear - SIMREL MAPEQ. + unfolder. ins. apply (seq_inj SIMREL); ins. + now rewrite <- !MAPEQ. } + { clear. basic_solver. } + rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). + unfold set_disjoint. intros x INE' INE. + assert (CC : E_t (mapper_rev' x)). + { rewrite <- INE. unfold mapper_rev'. + rewrite upds; vauto. } + destruct MAPREVSUB as [IN OUT]. + destruct IN with x. + { unfold set_collect. exists x; split; vauto. } + destruct H as [INEE MAPR]. + rewrite <- INE in CC. + unfold mapper_rev' in CC. + rewrite updo in CC; vauto. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]. + { subst ev. unfold mapper'. rewrite upds; vauto. + unfold mapper' in TIDCOND. rewrite upds in TIDCOND; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_tid_1 SIMREL); vauto. + apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } + { intros ev INE' TIDCOND. destruct SIMREL. + destruct classic with (ev = e) as [EQ | NEQ]. + { subst e; vauto. } + assert (EINN : E_t ev). + { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + clear - C2 NEQ. basic_solver. } + specialize seq_tid_2 with ev. + apply seq_tid_2 in EINN; vauto. + unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } + { intros x COND. unfold compose. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper', mapper_rev'. + rewrite !upds; vauto. } + unfold mapper', mapper_rev'. + rewrite !updo; vauto. + { unfold compose in MAPREV. rewrite MAPREV. + { basic_solver. } + apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + rewrite updo; vauto. + assert (INE : E_t x). + { apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + intros FALSE. + assert (PROP : E_s (ThreadEvent t_2 (index e - t_1_len))). + { rewrite <- FALSE. + apply (seq_codom SIMREL); vauto. } + desf. } + { rewrite EQACTS. rewrite set_collect_union. + rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } + { rewrite set_collect_union. + rewrite MAPREVSUB. + unfold mapper_rev'. + rewrite set_collect_eq. + rewrite upds, EQACTS. + rewrite (seq_acts_rev SIMREL); vauto. } + { admit. (*TODO : po-work*) } + { rewrite (seq_threads SIMREL). + destruct ADD. rewrite add_event_threads; vauto. } + { unfold mapper'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. clear - T1 COND NINIT1. + unfold tid in T1. unfold is_init in COND. + desf. basic_solver 8. } + rewrite updo; vauto. + apply (seq_init SIMREL); vauto. } + { unfold mapper_rev'. intros x COND. + destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst x. clear - T1 COND NINIT1. + unfold tid in T1. unfold is_init in COND. + desf. } + rewrite updo; vauto. + apply (seq_init_rev SIMREL); vauto. } + { rewrite EQACTS. rewrite set_collect_union. + rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } + { intros e' INE NTID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_mapeq SIMREL) in C1; vauto. + unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } + subst e'. unfold mapper'. rewrite upds; vauto. + unfold mapper' in NTID2. rewrite upds in NTID2; vauto. } + { intros x MAP TIDS. + destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst x. unfold mapper_rev'. rewrite upds; vauto. } + destruct MAP as [INE | MAP]. + { unfold mapper_rev'. + rewrite updo; vauto. + apply (seq_mapeq_rev SIMREL) in INE; vauto. } + unfold mapper_rev'. + rewrite updo; vauto. } + { intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_mapto SIMREL) in C1; vauto. + unfold mapper' in TID2. rewrite updo in TID2; vauto. } + subst e'. unfold mapper'. rewrite upds; vauto. } + { intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_index SIMREL) in C1; vauto. + unfold mapper' in TID2. rewrite updo in TID2; vauto. } + subst e'. unfold mapper'. rewrite upds; vauto. + simpl. unfold SequentBase.t_1_len. + unfold t_1_len in *. clear - IND. lia. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x; vauto. } + unfold mapper' in TID2. + rewrite updo in TID2. + { destruct SIMREL. + apply seq_thrd in TID2. + { rewrite TID2; vauto. } + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + vauto. } + { intros x INE TID2. + unfold mapper_rev'. + destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst x. rewrite upds. + destruct e. + { desf. } + unfold tid in T1. rewrite T1. + unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + assert (INDEQ : index = index - length (ptc_1 t_1) + length (ptc_1 t_1)). + { lia. } + rewrite INDEQ at 1; vauto. } + rewrite updo. + { apply (seq_maprev SIMREL); vauto. + destruct INE; vauto. + exfalso. apply NEQ; vauto. } + vauto. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + rewrite upds. exfalso. desf. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + subst x. exfalso. + lia. } + unfold mapper'. + rewrite updo; vauto. + apply (seq_out_snd SIMREL); vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { unfold mapper'. subst x. + rewrite upds. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + vauto. } + unfold mapper'. + rewrite updo; vauto. + apply (seq_out_move SIMREL); vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros e' NINE. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. exfalso. apply NINE. + apply EQACTS; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_rest SIMREL); vauto. + intros INN. apply NINE. + apply EQACTS; vauto. } + intros e' NINE. + destruct classic with (e' = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst e'. exfalso. + apply NINE; vauto. } + unfold mapper_rev'. rewrite updo; vauto. + apply (seq_rest_rev SIMREL); vauto. + intros FALSE. apply NINE; vauto. } + splits; vauto. + constructor. + { unfold WCore.add_event. + exists (option_map mapper' r), (mapper' ↑₁ R1), + (option_map mapper' w), + (mapper' ↑₁ W1), + (mapper' ↑₁ W2). + apply add_event_to_wf; simpl; vauto. + { apply sico_init_acts_s with + (X_t := X_t) (mapper := mapper). + { constructor. all : try apply SIMREL. + rewrite (seq_lab SIMREL); vauto. } + destruct ADD. apply add_event_init. } + { unfold mapper'. rewrite upds; vauto. } + { unfold mapper'. rewrite upds; vauto. } + { unfold mapper'. rewrite upds. + clear - NINIT2. unfold tid; vauto. } + { unfold mapper'. rewrite upds. basic_solver. } + { destruct ADD. destruct SIMRELQ. + unfold mapper', mapper_rev'. + apply functional_extensionality; ins. + destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. + { subst x. rewrite !upds. vauto. + rewrite add_event_lab. + unfold compose. rewrite upds. + rewrite upds; vauto. } + rewrite !updo; vauto. + { rewrite add_event_lab. + unfold compose. rewrite updo; vauto. + { destruct SIMREL. + destruct classic with (E_s x) as [INN | NINN]. + { rewrite updo; vauto. + rewrite seq_lab_rev0; vauto. } + rewrite updo; vauto. + rewrite seq_rlab0; vauto. } + rewrite updo; vauto. + destruct classic with (E_s x) as [INN | NINN]. + { destruct SIMREL. + intros FALSE. + assert (STT : mapper (mapper_rev x) = mapper e) + by vauto. + unfold compose in MAPREVR. + rewrite MAPREVR in STT. + { unfold id in STT. + assert (HLP : E_t (mapper_rev x)). + { apply seq_acts_rev0. + red; exists x; vauto. } + rewrite FALSE in HLP. + apply seq_mapto0 in HLP. + { subst x. + unfold SequentBase.t_1_len, t_1_len in *. + desf. } + apply seq_out_move0 in HLP; vauto. + rewrite HLP. unfold tid; vauto. } + vauto. } + admit. (* ??? *) } + rewrite upds; vauto. } + { destruct ADD. rewrite add_event_rf. + rewrite !collect_rel_union. + arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rfE); vauto. } + rewrite (seq_rf SIMREL). + arewrite (mapper' ↑ WCore.rf_delta_R e w + ≡ WCore.rf_delta_R (mapper' e) + (option_map mapper' w)). + { unfold WCore.rf_delta_R. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + arewrite (mapper' ↑ WCore.rf_delta_W e R1 + ≡ WCore.rf_delta_W (mapper' e) (mapper' ↑₁ R1)). + { unfold WCore.rf_delta_W. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + vauto. } + { destruct ADD. rewrite add_event_co. + rewrite !collect_rel_union. + arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_coE); vauto. } + rewrite (seq_co SIMREL). + arewrite (mapper' ↑ WCore.co_delta e W1 W2 + ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) + (mapper' ↑₁ W2)). + { unfold WCore.co_delta. rewrite collect_rel_union. + apply union_more. + { rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + vauto. } + { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), + collect_rel_union. + arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rmwE); vauto. } + now rewrite (seq_rmw SIMREL). } + { rewrite (seq_data SIMREL); vauto. } + { rewrite (seq_addr SIMREL); vauto. } + { rewrite (seq_ctrl SIMREL); vauto. } + { rewrite (seq_rmw_dep SIMREL); vauto. } + { admit. (* po-work *) } + arewrite (G_s' = WCore.G X_s'). + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. } + { unfold rf_complete. + rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). + unfold rf_complete in RFC. rewrite EQACTS. + rewrite !set_collect_union, MAPER_E, MAPSUB. + rewrite set_inter_union_l. + rewrite set_subset_union_l; split. + { unfold rf_complete in RFC. + rewrite <- set_collect_codom, <- RFC. + unfolder. intros x ((x' & INE & XEQ) & ISR). + exists x'. splits; try basic_solver. + { apply EQACTS; vauto. } + subst x. unfold is_r in *. + assert (CHNG : WCore.G X_s' = G_s') by vauto. + rewrite CHNG in ISR. unfold G_s' in ISR; ins. + unfold compose in ISR. + assert (NEQ : x' <> e). + { intros FALSE. subst x'. basic_solver 8. } + assert (NEQ' : mapper x' <> (ThreadEvent t_2 (index e - t_1_len))). + { intros FALSE. destruct NOTIN. + rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } + assert (EQQ : mapper_rev' (mapper x') = x'). + { unfold eq_dom in MAPREV. specialize MAPREV with x'. + apply MAPREV in INE. unfold compose in INE. + unfold mapper_rev'. rewrite updo; vauto. } + rewrite EQQ in ISR; vauto. } + rewrite <- set_collect_codom. rewrite <- RFC. + intros x (EQ & RD). subst x. + unfold set_collect. exists e. splits; vauto. + { split. + { apply EQACTS. basic_solver. } + assert (FEQ : WCore.G X_s' = G_s') by vauto. + rewrite FEQ in RD. unfold G_s' in RD. + simpl in RD. clear - RD. unfold compose in RD. + unfold is_r in RD. unfold mapper_rev' in RD. + rewrite upds in RD; vauto. } + unfold mapper'. rewrite upds. vauto. } + apply XmmCons.monoton_cons with (G_t := G_t') + (m := mapper'); vauto; try apply SIMRELQ. + { admit. (* TODO : po-work? *) } + { rewrite <- (seq_lab SIMRELQ); vauto. } + { admit. (* TODO : po-work? *) } + { apply INV'. } + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. +Admitted. + +End SimrelStep. diff --git a/src/sequentialization/SequentExec3.v b/src/sequentialization/SequentExec3.v new file mode 100644 index 0000000..c7f5d43 --- /dev/null +++ b/src/sequentialization/SequentExec3.v @@ -0,0 +1,647 @@ +Require Import AuxDef. +Require Import Core. +Require Import AuxRel AuxRel2. +Require Import Srf Rhb. +Require Import SimrelCommon. +Require Import StepOps. +Require Import AuxInj. +Require Import xmm_s_hb. +Require Import Lia. +From xmm Require Import Reordering. +From xmm Require Import ThreadTrace. +From xmm Require Import Programs. +From xmm Require Import SequentBase. +From xmm Require Import SequentWf. +From xmm Require Import ConsistencyMonotonicity. + +From hahn Require Import Hahn. +From hahnExt Require Import HahnExt. +From imm Require Import Events Execution Execution_eco. +Require Import Setoid Morphisms Program.Basics. + +Open Scope program_scope. + +Set Implicit Arguments. + +Section SimrelStep. + +Variable X_t X_t' X_s : WCore.t. +Variable t_1 t_2 : thread_id. +Variable mapper : actid -> actid. +Variable mapper_rev : actid -> actid. + +Variable e : actid. +Variable l : label. + +Variable thrdle : relation thread_id. + +Variable ptc_1 ptc_2 : program_trace. + +Notation "'G_t'" := (WCore.G X_t). +Notation "'G_t''" := (WCore.G X_t'). +Notation "'G_s'" := (WCore.G X_s). + +Notation "'R' G" := (fun e => is_true (is_r (lab G) e)) (at level 1). +Notation "'F' G" := (fun e => is_true (is_f (lab G) e)) (at level 1). +Notation "'W' G" := (fun e => is_true (is_w (lab G) e)) (at level 1). +Notation "'Acq' G" := (fun e => is_true (is_acq (lab G) e)) (at level 1). +Notation "'Rlx' G" := (fun e => is_true (is_rlx (lab G) e)) (at level 1). +Notation "'Rel' G" := (fun e => is_true (is_rel (lab G) e)) (at level 1). + +Notation "'lab_t'" := (lab G_t). +Notation "'val_t'" := (val lab_t). +Notation "'loc_t'" := (loc lab_t). +Notation "'same_loc_t'" := (same_loc lab_t). +Notation "'E_t'" := (acts_set G_t). +Notation "'sb_t'" := (sb G_t). +Notation "'rf_t'" := (rf G_t). +Notation "'co_t'" := (co G_t). +Notation "'rmw_t'" := (rmw G_t). +Notation "'rpo_t'" := (rpo G_t). +Notation "'rmw_dep_t'" := (rmw_dep G_t). +Notation "'data_t'" := (data G_t). +Notation "'ctrl_t'" := (ctrl G_t). +Notation "'addr_t'" := (addr G_t). +Notation "'W_t'" := (fun x => is_true (is_w lab_t x)). +Notation "'R_t'" := (fun x => is_true (is_r lab_t x)). +Notation "'Loc_t_' l" := (fun e => loc_t e = l) (at level 1). + +Notation "'lab_t''" := (lab G_t'). +Notation "'val_t''" := (val lab_t'). +Notation "'loc_t''" := (loc lab_t'). +Notation "'same_loc_t''" := (same_loc lab_t'). +Notation "'E_t''" := (acts_set G_t'). +Notation "'sb_t''" := (sb G_t'). +Notation "'rf_t''" := (rf G_t'). +Notation "'co_t''" := (co G_t'). +Notation "'rmw_t''" := (rmw G_t'). +Notation "'rpo_t''" := (rpo G_t'). +Notation "'rmw_dep_t''" := (rmw_dep G_t'). +Notation "'data_t''" := (data G_t'). +Notation "'ctrl_t''" := (ctrl G_t'). +Notation "'addr_t''" := (addr G_t'). +Notation "'W_t''" := (fun x => is_true (is_w lab_t' x)). +Notation "'R_t''" := (fun x => is_true (is_r lab_t' x)). +Notation "'Loc_t_'' l" := (fun e => loc_t' e = l) (at level 1). + +Notation "'lab_s'" := (lab G_s). +Notation "'val_s'" := (val lab_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'same_loc_s'" := (same_loc lab_s). +Notation "'E_s'" := (acts_set G_s). +Notation "'loc_s'" := (loc lab_s). +Notation "'sb_s'" := (sb G_s). +Notation "'rf_s'" := (rf G_s). +Notation "'co_s'" := (co G_s). +Notation "'rmw_s'" := (rmw G_s). +Notation "'rpo_s'" := (rpo G_s). +Notation "'rmw_dep_s'" := (rmw_dep G_s). +Notation "'data_s'" := (data G_s). +Notation "'ctrl_s'" := (ctrl G_s). +Notation "'addr_s'" := (addr G_s). +Notation "'W_s'" := (fun x => is_true (is_w lab_s x)). +Notation "'R_s'" := (fun x => is_true (is_r lab_s x)). +Notation "'F_s'" := (F G_s). + +Notation "'Tid_' t" := (fun e => tid e = t) (at level 1). + +Hypothesis MAPREV : eq_dom E_t (mapper_rev ∘ mapper) id. +Hypothesis MAPREVR : eq_dom E_s (mapper ∘ mapper_rev) id. +Hypothesis PROGSEQ : program_trace_sequented ptc_1 ptc_2 t_1 t_2. +Hypothesis WFT : Wf G_t. + +Definition t_12_len := length (ptc_2 t_1). +Definition t_1_len := length (ptc_1 t_1). +Definition t_2_len := length (ptc_1 t_2). + +Hypothesis INV : seq_simrel_inv X_t. +Hypothesis INV' : seq_simrel_inv X_t'. + +Lemma simrel_step_e_else + (T1 : tid e <> t_1) + (NINIT1 : t_1 <> tid_init) + (NINIT2 : t_2 <> tid_init) + (T2NOTIN : ~ threads_set G_t t_2) + (THRDNEQ : t_1 <> t_2) + (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1 ) + (STEP : WCore.exec_inst X_t X_t' e l) : + exists mapper' mapper_rev' X_s', + << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ + << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. +Proof using. + destruct STEP as [ADD RFC CONS]. + destruct ADD as (r & R1 & w & W1 & W2 & ADD). + set (mapper' := upd mapper e e). + set (mapper_rev' := upd mapper_rev e e). + assert (ENOTIN : ~E_t e) by apply ADD. + assert (MAPEQ : eq_dom E_t mapper' mapper). + { subst mapper'. unfolder. intros x XINE. + clear - ENOTIN XINE. rewrite updo. + all: congruence. } + assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq e). + { subst mapper'. rewrite set_collect_eq. now rupd. } + assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). + { clear - MAPEQ. now apply set_collect_eq_dom. } + assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. + assert (MAPREVDOM : E_t ≡₁ mapper_rev ↑₁ E_s). + { rewrite (seq_acts SIMREL). split. + { unfolder. intros x XINE. + exists (mapper x). splits; vauto. + apply MAPREV; vauto. } + unfolder. intros x (y & XINE & YEQ). + destruct XINE as (x0 & (INE & MAPPED)). + rewrite <- MAPPED in YEQ. rewrite <- YEQ. + assert (INE' : E_t x0) by vauto. + apply MAPREV in INE. clear - INE INE'. + unfold compose in INE. rewrite INE. + basic_solver. } + assert (MEPERREV_E : mapper_rev' ↑₁ eq e ≡₁ eq e). + { subst mapper_rev'. rewrite set_collect_eq. now rupd. } + assert (NEWE : + << NINIT : ~is_init e >> /\ + << NOTIN : ~E_s e >> /\ + << TID : tid e <> t_1 >>). + { unfold NW; splits; vauto. + { intro FALSO. unfold is_init in FALSO. + destruct ADD; vauto. } + intro FALSO. destruct ADD. + assert (CDD : e = mapper' e). + { unfold mapper'. rewrite upds; vauto. } + rewrite CDD in FALSO. + apply (seq_acts SIMREL) in FALSO. + destruct FALSO as [e' [C1 C2]]. + assert (C1' : E_t e') by vauto. + apply (seq_mapeq SIMREL) in C1; vauto. + { assert (EQQ : e' = e). + { rewrite CDD. rewrite <- C2. vauto. } + subst e'; desf. } + rewrite C2; rewrite <- CDD. + symmetry in add_event_threads. + assert (T2NOTIN' : ~ threads_set G_t' t_2). + { intros FALSE. apply add_event_threads in FALSE; vauto. } + assert (INEN : E_t' e). + { apply EQACTS. basic_solver. } + intros FALSE; desf. } + unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). + + set (G_s' := {| + acts_set := mapper' ↑₁ E_t'; + threads_set := threads_set G_s; + lab := lab_t' ∘ mapper_rev'; + rf := mapper' ↑ rf_t'; + co := mapper' ↑ co_t'; + rmw := mapper' ↑ rmw_t'; + rmw_dep := ∅₂; + ctrl := ∅₂; + data := ∅₂; + addr := ∅₂; + |}). + set (X_s' := {| + WCore.sc := WCore.sc X_s; + WCore.G := G_s'; + |}). + + exists mapper', mapper_rev', X_s'. + assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1). + { constructor; vauto; simpl; try basic_solver 6. + { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. + { clear - SIMREL MAPEQ. + unfolder. ins. apply (seq_inj SIMREL); ins. + now rewrite <- !MAPEQ. } + { clear. basic_solver. } + rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). + clear - NOTIN. basic_solver. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]. + { subst ev. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_tid_1 SIMREL); vauto. + apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. + unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } + { intros ev INE' TIDCOND. + destruct classic with (ev = e) as [EQ | NEQ]. + { unfold mapper' in TIDCOND. + rewrite EQ in TIDCOND. + rewrite upds in TIDCOND. + subst ev. apply EQACTS in INE'. + destruct INE' as [C1 | C2]. + { desf. } + assert (INEN : E_t' e). + { apply EQACTS. basic_solver. } + exfalso. + destruct ADD. symmetry in add_event_threads. + assert (T2NOTIN' : ~ threads_set G_t' t_2). + { intros FALSE. apply add_event_threads in FALSE; vauto. } + desf. } + destruct SIMREL. + assert (NINE : E_t ev). + { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. } + specialize seq_tid_2 with ev. + apply seq_tid_2 in NINE; vauto. + unfold mapper'. rewrite updo; vauto. } + { intros x COND. unfold compose. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper', mapper_rev'. + rewrite !upds; vauto. } + unfold mapper', mapper_rev'. + rewrite !updo; vauto. + { unfold compose in MAPREV. rewrite MAPREV. + { basic_solver. } + apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + rewrite updo; vauto. + assert (INE : E_t x). + { apply EQACTS in COND. + destruct COND as [C1 | C2]; vauto. } + intros FALSE. + assert (PROP : E_s e). + { rewrite <- FALSE. + apply (seq_codom SIMREL); vauto. } + desf. } + { rewrite EQACTS. + rewrite set_collect_union. + rewrite set_collect_union. + apply set_union_more. + { split. + { intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + desf. } + unfold set_collect. + exists (mapper' x). splits; vauto. + unfold mapper'. + rewrite updo; vauto. + unfold mapper_rev'. + rewrite updo; vauto. + { apply MAPREV; vauto. } + intros FALSE. + assert (INE : E_s e). + { destruct SIMREL. + apply seq_acts. + red; vauto. } + desf. } + intros x COND. + destruct COND as [x0 [[x1 [INE MAP1]] MAP2]]. + apply MAPREVDOM. + unfold set_collect. + exists x0; splits; vauto. + { destruct classic with (x1 = e) as [EQ | NEQ]. + { subst x1. unfold mapper'. + desf. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + apply seq_acts. + red; vauto. } + unfold mapper'. + rewrite updo. + { unfold mapper_rev'. + rewrite updo; vauto. + intros FALSE. + assert (INES : E_s e). + { destruct SIMREL. + apply seq_acts. + red; vauto. } + desf. } + intros FALSE. desf. } + rewrite MAPER_E. + rewrite MEPERREV_E; vauto. } + { admit. (*TODO : po-work*) } + { rewrite (seq_threads SIMREL). + destruct ADD. rewrite add_event_threads; vauto. } + { unfold mapper'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. + apply (seq_init SIMREL); vauto. } + { unfold mapper_rev'. intros x COND. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite upds; vauto. } + rewrite updo; vauto. + apply (seq_init_rev SIMREL); vauto. } + { intros e' INE NTID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_mapeq SIMREL) in C1; vauto. + unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } + subst e'. unfold mapper'. rewrite upds; vauto. } + { intros x MAP TIDS. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper_rev'. rewrite upds; vauto. } + destruct MAP as [x0 [INE MAP]]. + unfold mapper_rev'. + rewrite updo; vauto. + unfold mapper'. + rewrite updo; vauto. + { unfold mapper' in TIDS. + rewrite updo in TIDS; vauto. + { destruct SIMREL. + apply seq_mapeq_rev in TIDS; vauto. + apply seq_acts. + red; exists x0; splits; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. + apply seq_mapeq in TIDS; vauto. + { unfold mapper' in NEQ. + rewrite upds in NEQ. + desf. } + unfold mapper' in NEQ. + rewrite upds in NEQ. + desf. } + intros FLS. subst. + unfold mapper' in NEQ. + rewrite upds in NEQ. desf. } + intros FLS. subst. + unfold mapper' in NEQ. + rewrite upds in NEQ. desf. } + { intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_mapto SIMREL) in C1; vauto. + unfold mapper'. rewrite updo; vauto. } + subst e'. unfold mapper' in TID2. + rewrite upds in TID2. + assert (INEN : E_t' e). + { apply EQACTS. basic_solver. } + exfalso. + destruct ADD. symmetry in add_event_threads. + assert (T2NOTIN' : ~ threads_set G_t' t_2). + { intros FALSE. apply add_event_threads in FALSE; vauto. } + desf. } + { intros e' INE TID2. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_index SIMREL) in C1; vauto. + unfold mapper'. rewrite updo; vauto. } + subst e'. unfold mapper' in TID2. + rewrite upds in TID2. + assert (INEN : E_t' e). + { apply EQACTS. basic_solver. } + exfalso. + destruct ADD. symmetry in add_event_threads. + assert (T2NOTIN' : ~ threads_set G_t' t_2). + { intros FALSE. apply add_event_threads in FALSE; vauto. } + desf. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper' in TID2. + rewrite upds in TID2. exfalso. + apply wf_threads in INE; [ | apply INV']. + destruct ADD. apply add_event_threads in INE. + apply T2NOTIN; vauto. } + unfold mapper' in TID2. + rewrite updo in TID2. + { destruct SIMREL. + apply seq_thrd in TID2. + { rewrite TID2; vauto. } + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + vauto. } + { intros x INE TID2. + unfold mapper_rev'. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper' in INE. + destruct INE as [x0 [INE MAP]]. + rewrite upds. + destruct classic with (x0 = e) as [EQ1 | NEQ1]. + { subst x0. apply wf_threads in INE; [ | apply INV']. + destruct ADD. apply add_event_threads in INE. + exfalso. apply T2NOTIN; vauto. } + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. + apply wf_threads in C1; [ | apply INV]. + destruct ADD. apply add_event_threads in C1. + exfalso. apply T2NOTIN; vauto. } + rewrite updo; vauto. + rewrite (seq_maprev SIMREL); vauto. + apply (seq_acts SIMREL). + apply MAPSUB. + unfold set_collect in INE. + destruct INE as [x0 [INE MAP]]. + apply EQACTS in INE. + destruct INE as [C1 | C2]. + { vauto. } + rewrite <- C2 in MAP. + assert (MAPNORM : mapper' e = e). + { rewrite set_collect_eq in MAPER_E. + apply MAPER_E; vauto. } + desf. } + { intros x INE TID2. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + rewrite upds; vauto. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. unfold mapper'. + rewrite upds. desf. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out_snd; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros x INE TIDS IDXS. + destruct classic with (x = e) as [EQ | NEQ]. + { subst. clear - IDXS TID. + exfalso. unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + unfold mapper'. + rewrite updo; vauto. + destruct SIMREL. + rewrite seq_out_move; vauto. + apply EQACTS in INE. + destruct INE as [C1 | C2]; vauto. } + { intros e' NINE. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper'. rewrite upds; vauto. } + unfold mapper'. rewrite updo; vauto. + apply (seq_rest SIMREL); vauto. + intros FALSE. apply NINE. + apply EQACTS. unfold set_union. + left; vauto. } + intros e' NINE. + destruct classic with (e' = e) as [EQ | NEQ]. + { subst e'. unfold mapper_rev'. rewrite upds; vauto. } + unfold mapper_rev'. rewrite updo; vauto. + apply (seq_rest_rev SIMREL); vauto. + intros FALSE. apply NINE. unfold set_collect. + exists (mapper_rev e'). split. + { apply EQACTS. left. apply MAPREVDOM. + basic_solver. } + unfold mapper'. rewrite updo; vauto. + { apply MAPREVR; vauto. } + intros FLS. + assert (WRG : E_t e). + { apply MAPREVDOM. basic_solver 4. } + desf. } + split; vauto. constructor. + { unfold WCore.add_event. + exists (option_map mapper' r), (mapper' ↑₁ R1), + (option_map mapper' w), + (mapper' ↑₁ W1), + (mapper' ↑₁ W2). + apply add_event_to_wf; simpl; vauto. + { apply sico_init_acts_s with + (X_t := X_t) (mapper := mapper). + { constructor. all : try apply SIMREL. + rewrite (seq_lab SIMREL); vauto. } + destruct ADD. apply add_event_init. } + { unfold mapper'. rewrite upds. exact NOTIN. } + { unfold mapper'. rewrite upds; vauto. } + { unfold mapper'. rewrite upds. + destruct ADD; vauto. } + { rewrite EQACTS. rewrite set_collect_union. + rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). + unfold mapper'. rewrite upds. basic_solver. } + { destruct ADD. destruct SIMRELQ. + unfold mapper', mapper_rev'. + apply functional_extensionality; ins. + destruct classic with (x = e) as [EQ | NEQ]. + { subst x. rewrite !upds. vauto. + rewrite add_event_lab. + unfold compose. rewrite upds. + rewrite upds; vauto. } + rewrite !updo; vauto. + { rewrite add_event_lab. + unfold compose. rewrite updo; vauto. + { destruct SIMREL. + destruct classic with (E_s x) as [INN | NINN]. + { rewrite updo; vauto. + rewrite seq_lab_rev0; vauto. } + rewrite updo; vauto. + rewrite seq_rlab0; vauto. } + rewrite updo; vauto. + destruct classic with (E_s x) as [INN | NINN]. + { destruct SIMREL. + intros FALSE. + assert (STT : mapper (mapper_rev x) = mapper e) + by vauto. + unfold compose in MAPREVR. + rewrite MAPREVR in STT. + { unfold id in STT. + rewrite seq_rest0 in STT; vauto. } + vauto. } + destruct SIMREL. + rewrite seq_rest_rev0; vauto. } + rewrite upds; vauto. } + { destruct ADD. rewrite add_event_rf. + rewrite !collect_rel_union. + arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rfE); vauto. } + rewrite (seq_rf SIMREL). + arewrite (mapper' ↑ WCore.rf_delta_R e w + ≡ WCore.rf_delta_R (mapper' e) + (option_map mapper' w)). + { unfold WCore.rf_delta_R. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + arewrite (mapper' ↑ WCore.rf_delta_W e R1 + ≡ WCore.rf_delta_W (mapper' e) (mapper' ↑₁ R1)). + { unfold WCore.rf_delta_W. + rewrite collect_rel_cross. + apply cross_more. + { clear. unfold option_map. basic_solver. } + clear. unfold option_map. basic_solver. } + vauto. } + { destruct ADD. rewrite add_event_co. + rewrite !collect_rel_union. + arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_coE); vauto. } + rewrite (seq_co SIMREL). + arewrite (mapper' ↑ WCore.co_delta e W1 W2 + ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) + (mapper' ↑₁ W2)). + { unfold WCore.co_delta. rewrite collect_rel_union. + apply union_more. + { rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + rewrite collect_rel_cross. + apply cross_more; vauto. + clear. basic_solver. } + vauto. } + { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), + collect_rel_union. + arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). + { apply collect_rel_eq_dom' with (s := E_t); ins. + apply (wf_rmwE); vauto. } + now rewrite (seq_rmw SIMREL). } + { rewrite (seq_data SIMREL); vauto. } + { rewrite (seq_addr SIMREL); vauto. } + { rewrite (seq_ctrl SIMREL); vauto. } + { rewrite (seq_rmw_dep SIMREL); vauto. } + { admit. (* po-work *) } + arewrite (G_s' = WCore.G X_s'). + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. } + { unfold rf_complete. + rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). + unfold rf_complete in RFC. rewrite EQACTS. + rewrite !set_collect_union, MAPER_E, MAPSUB. + rewrite set_inter_union_l. + rewrite set_subset_union_l; split. + { unfold rf_complete in RFC. + rewrite <- set_collect_codom, <- RFC. + unfolder. intros x ((x' & INE & XEQ) & ISR). + exists x'. splits; try basic_solver. + { apply EQACTS; vauto. } + subst x. unfold is_r in *. + assert (CHNG : WCore.G X_s' = G_s') by vauto. + rewrite CHNG in ISR. unfold G_s' in ISR; ins. + unfold compose in ISR. + assert (NEQ : x' <> e). + { intros FALSE. subst x'. basic_solver 8. } + assert (NEQ' : mapper x' <> e). + { intros FALSE. destruct NOTIN. + rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } + assert (EQQ : mapper_rev' (mapper x') = x'). + { unfold eq_dom in MAPREV. specialize MAPREV with x'. + apply MAPREV in INE. unfold compose in INE. + unfold mapper_rev'. rewrite updo; vauto. } + rewrite EQQ in ISR; vauto. } + rewrite <- set_collect_codom. rewrite <- RFC. + intros x (EQ & RD). subst x. + unfold set_collect. exists e. splits; vauto. + { split. + { apply EQACTS. basic_solver. } + assert (FEQ : WCore.G X_s' = G_s') by vauto. + rewrite FEQ in RD. unfold G_s' in RD. + simpl in RD. clear - RD. unfold compose in RD. + unfold is_r in RD. unfold mapper_rev' in RD. + rewrite upds in RD; vauto. } + unfold mapper'. rewrite upds. vauto. } + apply XmmCons.monoton_cons with (G_t := G_t') + (m := mapper'); vauto; try apply SIMRELQ. + { admit. (* TODO : po-work? *) } + { rewrite <- (seq_lab SIMRELQ); vauto. } + { admit. (* TODO : po-work? *) } + { apply INV'. } + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. +Admitted. + +End SimrelStep. diff --git a/src/sequentialization/SequentProgs.v b/src/sequentialization/SequentProgs.v index 42fcdc6..c3e4104 100644 --- a/src/sequentialization/SequentProgs.v +++ b/src/sequentialization/SequentProgs.v @@ -12,6 +12,8 @@ From xmm Require Import ThreadTrace. From xmm Require Import Programs. From xmm Require Import SequentBase. From xmm Require Import SequentExec. +From xmm Require Import SequentExec2. +From xmm Require Import SequentExec3. From xmm Require Import SequentReexec. From hahn Require Import Hahn. From 0aef6c547f204503a614f058af2abcd26eac086a Mon Sep 17 00:00:00 2001 From: keba4ok Date: Fri, 23 May 2025 22:05:20 +0200 Subject: [PATCH 45/51] proof distribution --- src/sequentialization/SequentExec.v | 977 ---------------------------- 1 file changed, 977 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 8c2a05c..7ea2b10 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -1502,981 +1502,4 @@ Proof using. rewrite <- TID; vauto. Admitted. -Lemma simrel_step_e_t2 - (T1 : tid e = t_1) - (IND: index e >= t_1_len) - (NINIT1 : t_1 <> tid_init) - (NINIT2 : t_2 <> tid_init) - (T2NOTIN : ~ threads_set G_t t_2) - (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1) - (STEP : WCore.exec_inst X_t X_t' e l) : - exists mapper' mapper_rev' X_s', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ - << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. -Proof using. - destruct STEP as [ADD RFC CONS]. - destruct ADD as (r & R1 & w & W1 & W2 & ADD). - set (mapper' := upd mapper e (ThreadEvent t_2 (index e - t_1_len))). - set (mapper_rev' := upd mapper_rev (ThreadEvent t_2 (index e - t_1_len)) e). - assert (ENOTIN : ~E_t e) by apply ADD. - assert (EMAPNOTIN : ~E_s (ThreadEvent t_2 (index e - t_1_len))). - { intros FALSE. destruct ADD. - assert (CDD : (ThreadEvent t_2 (index e - t_1_len)) = mapper' e). - { unfold mapper'. rewrite upds; vauto. } - rewrite CDD in FALSE. - apply (seq_acts SIMREL) in FALSE. - destruct FALSE as [e' [C1 C2]]. - assert (C1' : E_t e') by vauto. - apply (seq_mapto SIMREL) in C1; vauto. - { assert (TID' : tid e' = t_1). - { apply (seq_tid_2 SIMREL) in C1'; vauto. - rewrite C1; vauto. } - rewrite <- CDD in C2. rewrite C1 in C2; vauto. - assert (INDEX : index e' = index e). - { unfold t_1_len in H0. - assert (index e' >= t_1_len). - { apply (seq_index SIMREL) in C1'. - { rewrite C1'. - unfold SequentBase.t_1_len, t_1_len. - clear. lia. } - rewrite C1; vauto. } - unfold SequentBase.t_1_len in H0. - clear - H0 H IND. unfold t_1_len in *. lia. } - assert (EQE : e' = e). - { clear - INDEX TID' T1 NINIT1. - destruct e', e; basic_solver 8. } - desf. } - rewrite C2; rewrite <- CDD. - vauto. } - assert (MAPEQ : eq_dom E_t mapper' mapper). - { subst mapper'. unfolder. intros x XINE. - clear - EMAPNOTIN ENOTIN XINE. rewrite updo; vauto. - all: congruence. } - assert (MAPREVEQ : eq_dom E_s mapper_rev' mapper_rev). - { subst mapper_rev'. unfolder. intros x XINE. - clear - EMAPNOTIN ENOTIN XINE. rewrite updo; vauto. - all: congruence. } - assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq (ThreadEvent t_2 (index e - t_1_len))). - { subst mapper'. rewrite set_collect_eq. now rupd. } - assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). - { clear - MAPEQ. now apply set_collect_eq_dom. } - assert (MAPREVSUB : mapper_rev' ↑₁ E_s ≡₁ mapper_rev ↑₁ E_s). - { clear - MAPREVEQ. now apply set_collect_eq_dom. } - assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. - assert (NEWE : - << NINIT : ~is_init (ThreadEvent t_2 (index e - t_1_len)) >> /\ - << NINIT' : ~is_init e >> /\ - << NOTIN : ~E_s (ThreadEvent t_2 (index e - t_1_len)) >> /\ - << TID : tid (ThreadEvent t_2 (index e - t_1_len)) = t_2 >>). - { unfold NW; splits; vauto. - intros FLS. unfold is_init in FLS. - desf. unfold tid in T1. - apply NINIT1; vauto. } - unfold NW in NEWE. destruct NEWE as (NINIT & NINIT' & NOTIN & TID). - - set (G_s' := {| - acts_set := E_s ∪₁ eq (ThreadEvent t_2 (index e - t_1_len)); - threads_set := threads_set G_s; - lab := lab_t' ∘ mapper_rev'; - rf := mapper' ↑ rf_t'; - co := mapper' ↑ co_t'; - rmw := mapper' ↑ rmw_t'; - rmw_dep := ∅₂; - ctrl := ∅₂; - data := ∅₂; - addr := ∅₂; - |}). - set (X_s' := {| - WCore.sc := WCore.sc X_s; - WCore.G := G_s'; - |}). - - exists mapper', mapper_rev', X_s'. - assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1). - { constructor; vauto; simpl; try basic_solver 6. - { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. - { clear - SIMREL MAPEQ. - unfolder. ins. apply (seq_inj SIMREL); ins. - now rewrite <- !MAPEQ. } - { clear. basic_solver. } - rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). - unfold set_disjoint. intros x INE' INE. - assert (CC : E_t (mapper_rev' x)). - { rewrite <- INE. unfold mapper_rev'. - rewrite upds; vauto. } - destruct MAPREVSUB as [IN OUT]. - destruct IN with x. - { unfold set_collect. exists x; split; vauto. } - destruct H as [INEE MAPR]. - rewrite <- INE in CC. - unfold mapper_rev' in CC. - rewrite updo in CC; vauto. } - { intros ev INE' TIDCOND. - destruct classic with (ev = e) as [EQ | NEQ]. - { subst ev. unfold mapper'. rewrite upds; vauto. - unfold mapper' in TIDCOND. rewrite upds in TIDCOND; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_tid_1 SIMREL); vauto. - apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. - unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } - { intros ev INE' TIDCOND. destruct SIMREL. - destruct classic with (ev = e) as [EQ | NEQ]. - { subst e; vauto. } - assert (EINN : E_t ev). - { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. - clear - C2 NEQ. basic_solver. } - specialize seq_tid_2 with ev. - apply seq_tid_2 in EINN; vauto. - unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } - { intros x COND. unfold compose. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold mapper', mapper_rev'. - rewrite !upds; vauto. } - unfold mapper', mapper_rev'. - rewrite !updo; vauto. - { unfold compose in MAPREV. rewrite MAPREV. - { basic_solver. } - apply EQACTS in COND. - destruct COND as [C1 | C2]; vauto. } - rewrite updo; vauto. - assert (INE : E_t x). - { apply EQACTS in COND. - destruct COND as [C1 | C2]; vauto. } - intros FALSE. - assert (PROP : E_s (ThreadEvent t_2 (index e - t_1_len))). - { rewrite <- FALSE. - apply (seq_codom SIMREL); vauto. } - desf. } - { rewrite EQACTS. rewrite set_collect_union. - rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } - { rewrite set_collect_union. - rewrite MAPREVSUB. - unfold mapper_rev'. - rewrite set_collect_eq. - rewrite upds, EQACTS. - rewrite (seq_acts_rev SIMREL); vauto. } - { admit. (*TODO : po-work*) } - { rewrite (seq_threads SIMREL). - destruct ADD. rewrite add_event_threads; vauto. } - { unfold mapper'. intros x COND. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. clear - T1 COND NINIT1. - unfold tid in T1. unfold is_init in COND. - desf. basic_solver 8. } - rewrite updo; vauto. - apply (seq_init SIMREL); vauto. } - { unfold mapper_rev'. intros x COND. - destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. - { subst x. clear - T1 COND NINIT1. - unfold tid in T1. unfold is_init in COND. - desf. } - rewrite updo; vauto. - apply (seq_init_rev SIMREL); vauto. } - { rewrite EQACTS. rewrite set_collect_union. - rewrite MAPER_E, MAPSUB, (seq_acts SIMREL); vauto. } - { intros e' INE NTID2. - apply EQACTS in INE. - destruct INE as [C1 | C2]. - { destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_mapeq SIMREL) in C1; vauto. - unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } - subst e'. unfold mapper'. rewrite upds; vauto. - unfold mapper' in NTID2. rewrite upds in NTID2; vauto. } - { intros x MAP TIDS. - destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. - { subst x. unfold mapper_rev'. rewrite upds; vauto. } - destruct MAP as [INE | MAP]. - { unfold mapper_rev'. - rewrite updo; vauto. - apply (seq_mapeq_rev SIMREL) in INE; vauto. } - unfold mapper_rev'. - rewrite updo; vauto. } - { intros e' INE TID2. - apply EQACTS in INE. - destruct INE as [C1 | C2]. - { destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_mapto SIMREL) in C1; vauto. - unfold mapper' in TID2. rewrite updo in TID2; vauto. } - subst e'. unfold mapper'. rewrite upds; vauto. } - { intros e' INE TID2. - apply EQACTS in INE. - destruct INE as [C1 | C2]. - { destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_index SIMREL) in C1; vauto. - unfold mapper' in TID2. rewrite updo in TID2; vauto. } - subst e'. unfold mapper'. rewrite upds; vauto. - simpl. unfold SequentBase.t_1_len. - unfold t_1_len in *. clear - IND. lia. } - { intros x INE TID2. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x; vauto. } - unfold mapper' in TID2. - rewrite updo in TID2. - { destruct SIMREL. - apply seq_thrd in TID2. - { rewrite TID2; vauto. } - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. } - vauto. } - { intros x INE TID2. - unfold mapper_rev'. - destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. - { subst x. rewrite upds. - destruct e. - { desf. } - unfold tid in T1. rewrite T1. - unfold Events.index in *. - unfold SequentBase.t_1_len in *. - unfold t_1_len in *. - assert (INDEQ : index = index - length (ptc_1 t_1) + length (ptc_1 t_1)). - { lia. } - rewrite INDEQ at 1; vauto. } - rewrite updo. - { apply (seq_maprev SIMREL); vauto. - destruct INE; vauto. - exfalso. apply NEQ; vauto. } - vauto. } - { intros x INE TID2. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold mapper'. - rewrite upds. exfalso. desf. } - unfold mapper'. - rewrite updo; vauto. - destruct SIMREL. - rewrite seq_out; vauto. - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. } - { intros x INE TIDS IDXS. - destruct classic with (x = e) as [EQ | NEQ]. - { unfold SequentBase.t_1_len in *. - unfold t_1_len in *. - subst x. exfalso. - lia. } - unfold mapper'. - rewrite updo; vauto. - apply (seq_out_snd SIMREL); vauto. - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. } - { intros x INE TIDS IDXS. - destruct classic with (x = e) as [EQ | NEQ]. - { unfold mapper'. subst x. - rewrite upds. - unfold t_1_len in *. - unfold SequentBase.t_1_len in *. - vauto. } - unfold mapper'. - rewrite updo; vauto. - apply (seq_out_move SIMREL); vauto. - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. } - { intros e' NINE. - destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. exfalso. apply NINE. - apply EQACTS; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_rest SIMREL); vauto. - intros INN. apply NINE. - apply EQACTS; vauto. } - intros e' NINE. - destruct classic with (e' = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. - { subst e'. exfalso. - apply NINE; vauto. } - unfold mapper_rev'. rewrite updo; vauto. - apply (seq_rest_rev SIMREL); vauto. - intros FALSE. apply NINE; vauto. } - splits; vauto. - constructor. - { unfold WCore.add_event. - exists (option_map mapper' r), (mapper' ↑₁ R1), - (option_map mapper' w), - (mapper' ↑₁ W1), - (mapper' ↑₁ W2). - apply add_event_to_wf; simpl; vauto. - { apply sico_init_acts_s with - (X_t := X_t) (mapper := mapper). - { constructor. all : try apply SIMREL. - rewrite (seq_lab SIMREL); vauto. } - destruct ADD. apply add_event_init. } - { unfold mapper'. rewrite upds; vauto. } - { unfold mapper'. rewrite upds; vauto. } - { unfold mapper'. rewrite upds. - clear - NINIT2. unfold tid; vauto. } - { unfold mapper'. rewrite upds. basic_solver. } - { destruct ADD. destruct SIMRELQ. - unfold mapper', mapper_rev'. - apply functional_extensionality; ins. - destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ | NEQ]. - { subst x. rewrite !upds. vauto. - rewrite add_event_lab. - unfold compose. rewrite upds. - rewrite upds; vauto. } - rewrite !updo; vauto. - { rewrite add_event_lab. - unfold compose. rewrite updo; vauto. - { destruct SIMREL. - destruct classic with (E_s x) as [INN | NINN]. - { rewrite updo; vauto. - rewrite seq_lab_rev0; vauto. } - rewrite updo; vauto. - rewrite seq_rlab0; vauto. } - rewrite updo; vauto. - destruct classic with (E_s x) as [INN | NINN]. - { destruct SIMREL. - intros FALSE. - assert (STT : mapper (mapper_rev x) = mapper e) - by vauto. - unfold compose in MAPREVR. - rewrite MAPREVR in STT. - { unfold id in STT. - assert (HLP : E_t (mapper_rev x)). - { apply seq_acts_rev0. - red; exists x; vauto. } - rewrite FALSE in HLP. - apply seq_mapto0 in HLP. - { subst x. - unfold SequentBase.t_1_len, t_1_len in *. - desf. } - apply seq_out_move0 in HLP; vauto. - rewrite HLP. unfold tid; vauto. } - vauto. } - admit. (* ??? *) } - rewrite upds; vauto. } - { destruct ADD. rewrite add_event_rf. - rewrite !collect_rel_union. - arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). - { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rfE); vauto. } - rewrite (seq_rf SIMREL). - arewrite (mapper' ↑ WCore.rf_delta_R e w - ≡ WCore.rf_delta_R (mapper' e) - (option_map mapper' w)). - { unfold WCore.rf_delta_R. - rewrite collect_rel_cross. - apply cross_more. - { clear. unfold option_map. basic_solver. } - clear. unfold option_map. basic_solver. } - arewrite (mapper' ↑ WCore.rf_delta_W e R1 - ≡ WCore.rf_delta_W (mapper' e) (mapper' ↑₁ R1)). - { unfold WCore.rf_delta_W. - rewrite collect_rel_cross. - apply cross_more. - { clear. unfold option_map. basic_solver. } - clear. unfold option_map. basic_solver. } - vauto. } - { destruct ADD. rewrite add_event_co. - rewrite !collect_rel_union. - arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). - { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_coE); vauto. } - rewrite (seq_co SIMREL). - arewrite (mapper' ↑ WCore.co_delta e W1 W2 - ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) - (mapper' ↑₁ W2)). - { unfold WCore.co_delta. rewrite collect_rel_union. - apply union_more. - { rewrite collect_rel_cross. - apply cross_more; vauto. - clear. basic_solver. } - rewrite collect_rel_cross. - apply cross_more; vauto. - clear. basic_solver. } - vauto. } - { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), - collect_rel_union. - arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). - { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rmwE); vauto. } - now rewrite (seq_rmw SIMREL). } - { rewrite (seq_data SIMREL); vauto. } - { rewrite (seq_addr SIMREL); vauto. } - { rewrite (seq_ctrl SIMREL); vauto. } - { rewrite (seq_rmw_dep SIMREL); vauto. } - { admit. (* po-work *) } - arewrite (G_s' = WCore.G X_s'). - apply wf_transition with (X_t := X_t') - (t_1 := t_1) (t_2 := t_2) - (mapper := mapper') (mapper_rev := mapper_rev') - (ptc_1 := ptc_1); vauto. } - { unfold rf_complete. - rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). - unfold rf_complete in RFC. rewrite EQACTS. - rewrite !set_collect_union, MAPER_E, MAPSUB. - rewrite set_inter_union_l. - rewrite set_subset_union_l; split. - { unfold rf_complete in RFC. - rewrite <- set_collect_codom, <- RFC. - unfolder. intros x ((x' & INE & XEQ) & ISR). - exists x'. splits; try basic_solver. - { apply EQACTS; vauto. } - subst x. unfold is_r in *. - assert (CHNG : WCore.G X_s' = G_s') by vauto. - rewrite CHNG in ISR. unfold G_s' in ISR; ins. - unfold compose in ISR. - assert (NEQ : x' <> e). - { intros FALSE. subst x'. basic_solver 8. } - assert (NEQ' : mapper x' <> (ThreadEvent t_2 (index e - t_1_len))). - { intros FALSE. destruct NOTIN. - rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } - assert (EQQ : mapper_rev' (mapper x') = x'). - { unfold eq_dom in MAPREV. specialize MAPREV with x'. - apply MAPREV in INE. unfold compose in INE. - unfold mapper_rev'. rewrite updo; vauto. } - rewrite EQQ in ISR; vauto. } - rewrite <- set_collect_codom. rewrite <- RFC. - intros x (EQ & RD). subst x. - unfold set_collect. exists e. splits; vauto. - { split. - { apply EQACTS. basic_solver. } - assert (FEQ : WCore.G X_s' = G_s') by vauto. - rewrite FEQ in RD. unfold G_s' in RD. - simpl in RD. clear - RD. unfold compose in RD. - unfold is_r in RD. unfold mapper_rev' in RD. - rewrite upds in RD; vauto. } - unfold mapper'. rewrite upds. vauto. } - apply XmmCons.monoton_cons with (G_t := G_t') - (m := mapper'); vauto; try apply SIMRELQ. - { admit. (* TODO : po-work? *) } - { rewrite <- (seq_lab SIMRELQ); vauto. } - { admit. (* TODO : po-work? *) } - { apply INV'. } - apply wf_transition with (X_t := X_t') - (t_1 := t_1) (t_2 := t_2) - (mapper := mapper') (mapper_rev := mapper_rev') - (ptc_1 := ptc_1); vauto. -Admitted. - -Lemma simrel_step_e_else - (T1 : tid e <> t_1) - (NINIT1 : t_1 <> tid_init) - (NINIT2 : t_2 <> tid_init) - (T2NOTIN : ~ threads_set G_t t_2) - (THRDNEQ : t_1 <> t_2) - (SIMREL : seq_simrel X_s X_t t_1 t_2 mapper mapper_rev ptc_1 ) - (STEP : WCore.exec_inst X_t X_t' e l) : - exists mapper' mapper_rev' X_s', - << SIMREL : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1 >> /\ - << STEP : WCore.exec_inst X_s X_s' (mapper' e) l >>. -Proof using. - destruct STEP as [ADD RFC CONS]. - destruct ADD as (r & R1 & w & W1 & W2 & ADD). - set (mapper' := upd mapper e e). - set (mapper_rev' := upd mapper_rev e e). - assert (ENOTIN : ~E_t e) by apply ADD. - assert (MAPEQ : eq_dom E_t mapper' mapper). - { subst mapper'. unfolder. intros x XINE. - clear - ENOTIN XINE. rewrite updo. - all: congruence. } - assert (MAPER_E : mapper' ↑₁ eq e ≡₁ eq e). - { subst mapper'. rewrite set_collect_eq. now rupd. } - assert (MAPSUB : mapper' ↑₁ E_t ≡₁ mapper ↑₁ E_t). - { clear - MAPEQ. now apply set_collect_eq_dom. } - assert (EQACTS : E_t' ≡₁ E_t ∪₁ eq e) by apply ADD. - assert (MAPREVDOM : E_t ≡₁ mapper_rev ↑₁ E_s). - { rewrite (seq_acts SIMREL). split. - { unfolder. intros x XINE. - exists (mapper x). splits; vauto. - apply MAPREV; vauto. } - unfolder. intros x (y & XINE & YEQ). - destruct XINE as (x0 & (INE & MAPPED)). - rewrite <- MAPPED in YEQ. rewrite <- YEQ. - assert (INE' : E_t x0) by vauto. - apply MAPREV in INE. clear - INE INE'. - unfold compose in INE. rewrite INE. - basic_solver. } - assert (MEPERREV_E : mapper_rev' ↑₁ eq e ≡₁ eq e). - { subst mapper_rev'. rewrite set_collect_eq. now rupd. } - assert (NEWE : - << NINIT : ~is_init e >> /\ - << NOTIN : ~E_s e >> /\ - << TID : tid e <> t_1 >>). - { unfold NW; splits; vauto. - { intro FALSO. unfold is_init in FALSO. - destruct ADD; vauto. } - intro FALSO. destruct ADD. - assert (CDD : e = mapper' e). - { unfold mapper'. rewrite upds; vauto. } - rewrite CDD in FALSO. - apply (seq_acts SIMREL) in FALSO. - destruct FALSO as [e' [C1 C2]]. - assert (C1' : E_t e') by vauto. - apply (seq_mapeq SIMREL) in C1; vauto. - { assert (EQQ : e' = e). - { rewrite CDD. rewrite <- C2. vauto. } - subst e'; desf. } - rewrite C2; rewrite <- CDD. - symmetry in add_event_threads. - assert (T2NOTIN' : ~ threads_set G_t' t_2). - { intros FALSE. apply add_event_threads in FALSE; vauto. } - assert (INEN : E_t' e). - { apply EQACTS. basic_solver. } - intros FALSE; desf. } - unfold NW in NEWE. destruct NEWE as (NINIT & NOTIN & TID). - - set (G_s' := {| - acts_set := mapper' ↑₁ E_t'; - threads_set := threads_set G_s; - lab := lab_t' ∘ mapper_rev'; - rf := mapper' ↑ rf_t'; - co := mapper' ↑ co_t'; - rmw := mapper' ↑ rmw_t'; - rmw_dep := ∅₂; - ctrl := ∅₂; - data := ∅₂; - addr := ∅₂; - |}). - set (X_s' := {| - WCore.sc := WCore.sc X_s; - WCore.G := G_s'; - |}). - - exists mapper', mapper_rev', X_s'. - assert (SIMRELQ : seq_simrel X_s' X_t' t_1 t_2 mapper' mapper_rev' ptc_1). - { constructor; vauto; simpl; try basic_solver 6. - { rewrite (WCore.add_event_acts ADD). apply inj_dom_union. - { clear - SIMREL MAPEQ. - unfolder. ins. apply (seq_inj SIMREL); ins. - now rewrite <- !MAPEQ. } - { clear. basic_solver. } - rewrite MAPER_E, MAPSUB, (seq_codom SIMREL). - clear - NOTIN. basic_solver. } - { intros ev INE' TIDCOND. - destruct classic with (ev = e) as [EQ | NEQ]. - { subst ev. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_tid_1 SIMREL); vauto. - apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. - unfold mapper' in TIDCOND. rewrite updo in TIDCOND; vauto. } - { intros ev INE' TIDCOND. - destruct classic with (ev = e) as [EQ | NEQ]. - { unfold mapper' in TIDCOND. - rewrite EQ in TIDCOND. - rewrite upds in TIDCOND. - subst ev. apply EQACTS in INE'. - destruct INE' as [C1 | C2]. - { desf. } - assert (INEN : E_t' e). - { apply EQACTS. basic_solver. } - exfalso. - destruct ADD. symmetry in add_event_threads. - assert (T2NOTIN' : ~ threads_set G_t' t_2). - { intros FALSE. apply add_event_threads in FALSE; vauto. } - desf. } - destruct SIMREL. - assert (NINE : E_t ev). - { apply EQACTS in INE'. destruct INE' as [C1 | C2]; vauto. } - specialize seq_tid_2 with ev. - apply seq_tid_2 in NINE; vauto. - unfold mapper'. rewrite updo; vauto. } - { intros x COND. unfold compose. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold mapper', mapper_rev'. - rewrite !upds; vauto. } - unfold mapper', mapper_rev'. - rewrite !updo; vauto. - { unfold compose in MAPREV. rewrite MAPREV. - { basic_solver. } - apply EQACTS in COND. - destruct COND as [C1 | C2]; vauto. } - rewrite updo; vauto. - assert (INE : E_t x). - { apply EQACTS in COND. - destruct COND as [C1 | C2]; vauto. } - intros FALSE. - assert (PROP : E_s e). - { rewrite <- FALSE. - apply (seq_codom SIMREL); vauto. } - desf. } - { rewrite EQACTS. - rewrite set_collect_union. - rewrite set_collect_union. - apply set_union_more. - { split. - { intros x COND. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold mapper'. - desf. } - unfold set_collect. - exists (mapper' x). splits; vauto. - unfold mapper'. - rewrite updo; vauto. - unfold mapper_rev'. - rewrite updo; vauto. - { apply MAPREV; vauto. } - intros FALSE. - assert (INE : E_s e). - { destruct SIMREL. - apply seq_acts. - red; vauto. } - desf. } - intros x COND. - destruct COND as [x0 [[x1 [INE MAP1]] MAP2]]. - apply MAPREVDOM. - unfold set_collect. - exists x0; splits; vauto. - { destruct classic with (x1 = e) as [EQ | NEQ]. - { subst x1. unfold mapper'. - desf. } - unfold mapper'. - rewrite updo; vauto. - destruct SIMREL. - apply seq_acts. - red; vauto. } - unfold mapper'. - rewrite updo. - { unfold mapper_rev'. - rewrite updo; vauto. - intros FALSE. - assert (INES : E_s e). - { destruct SIMREL. - apply seq_acts. - red; vauto. } - desf. } - intros FALSE. desf. } - rewrite MAPER_E. - rewrite MEPERREV_E; vauto. } - { admit. (*TODO : po-work*) } - { rewrite (seq_threads SIMREL). - destruct ADD. rewrite add_event_threads; vauto. } - { unfold mapper'. intros x COND. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. rewrite upds; vauto. } - rewrite updo; vauto. - apply (seq_init SIMREL); vauto. } - { unfold mapper_rev'. intros x COND. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. rewrite upds; vauto. } - rewrite updo; vauto. - apply (seq_init_rev SIMREL); vauto. } - { intros e' INE NTID2. - apply EQACTS in INE. - destruct INE as [C1 | C2]. - { destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_mapeq SIMREL) in C1; vauto. - unfold mapper' in NTID2. rewrite updo in NTID2; vauto. } - subst e'. unfold mapper'. rewrite upds; vauto. } - { intros x MAP TIDS. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold mapper_rev'. rewrite upds; vauto. } - destruct MAP as [x0 [INE MAP]]. - unfold mapper_rev'. - rewrite updo; vauto. - unfold mapper'. - rewrite updo; vauto. - { unfold mapper' in TIDS. - rewrite updo in TIDS; vauto. - { destruct SIMREL. - apply seq_mapeq_rev in TIDS; vauto. - apply seq_acts. - red; exists x0; splits; vauto. - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. - apply seq_mapeq in TIDS; vauto. - { unfold mapper' in NEQ. - rewrite upds in NEQ. - desf. } - unfold mapper' in NEQ. - rewrite upds in NEQ. - desf. } - intros FLS. subst. - unfold mapper' in NEQ. - rewrite upds in NEQ. desf. } - intros FLS. subst. - unfold mapper' in NEQ. - rewrite upds in NEQ. desf. } - { intros e' INE TID2. - apply EQACTS in INE. - destruct INE as [C1 | C2]. - { destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_mapto SIMREL) in C1; vauto. - unfold mapper'. rewrite updo; vauto. } - subst e'. unfold mapper' in TID2. - rewrite upds in TID2. - assert (INEN : E_t' e). - { apply EQACTS. basic_solver. } - exfalso. - destruct ADD. symmetry in add_event_threads. - assert (T2NOTIN' : ~ threads_set G_t' t_2). - { intros FALSE. apply add_event_threads in FALSE; vauto. } - desf. } - { intros e' INE TID2. - apply EQACTS in INE. - destruct INE as [C1 | C2]. - { destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_index SIMREL) in C1; vauto. - unfold mapper'. rewrite updo; vauto. } - subst e'. unfold mapper' in TID2. - rewrite upds in TID2. - assert (INEN : E_t' e). - { apply EQACTS. basic_solver. } - exfalso. - destruct ADD. symmetry in add_event_threads. - assert (T2NOTIN' : ~ threads_set G_t' t_2). - { intros FALSE. apply add_event_threads in FALSE; vauto. } - desf. } - { intros x INE TID2. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold mapper' in TID2. - rewrite upds in TID2. exfalso. - apply wf_threads in INE; [ | apply INV']. - destruct ADD. apply add_event_threads in INE. - apply T2NOTIN; vauto. } - unfold mapper' in TID2. - rewrite updo in TID2. - { destruct SIMREL. - apply seq_thrd in TID2. - { rewrite TID2; vauto. } - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. } - vauto. } - { intros x INE TID2. - unfold mapper_rev'. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold mapper' in INE. - destruct INE as [x0 [INE MAP]]. - rewrite upds. - destruct classic with (x0 = e) as [EQ1 | NEQ1]. - { subst x0. apply wf_threads in INE; [ | apply INV']. - destruct ADD. apply add_event_threads in INE. - exfalso. apply T2NOTIN; vauto. } - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. - apply wf_threads in C1; [ | apply INV]. - destruct ADD. apply add_event_threads in C1. - exfalso. apply T2NOTIN; vauto. } - rewrite updo; vauto. - rewrite (seq_maprev SIMREL); vauto. - apply (seq_acts SIMREL). - apply MAPSUB. - unfold set_collect in INE. - destruct INE as [x0 [INE MAP]]. - apply EQACTS in INE. - destruct INE as [C1 | C2]. - { vauto. } - rewrite <- C2 in MAP. - assert (MAPNORM : mapper' e = e). - { rewrite set_collect_eq in MAPER_E. - apply MAPER_E; vauto. } - desf. } - { intros x INE TID2. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold mapper'. - rewrite upds; vauto. } - unfold mapper'. - rewrite updo; vauto. - destruct SIMREL. - rewrite seq_out; vauto. - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. } - { intros x INE TIDS IDXS. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. unfold mapper'. - rewrite upds. desf. } - unfold mapper'. - rewrite updo; vauto. - destruct SIMREL. - rewrite seq_out_snd; vauto. - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. } - { intros x INE TIDS IDXS. - destruct classic with (x = e) as [EQ | NEQ]. - { subst. clear - IDXS TID. - exfalso. unfold t_1_len in *. - unfold SequentBase.t_1_len in *. - lia. } - unfold mapper'. - rewrite updo; vauto. - destruct SIMREL. - rewrite seq_out_move; vauto. - apply EQACTS in INE. - destruct INE as [C1 | C2]; vauto. } - { intros e' NINE. - destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper'. rewrite upds; vauto. } - unfold mapper'. rewrite updo; vauto. - apply (seq_rest SIMREL); vauto. - intros FALSE. apply NINE. - apply EQACTS. unfold set_union. - left; vauto. } - intros e' NINE. - destruct classic with (e' = e) as [EQ | NEQ]. - { subst e'. unfold mapper_rev'. rewrite upds; vauto. } - unfold mapper_rev'. rewrite updo; vauto. - apply (seq_rest_rev SIMREL); vauto. - intros FALSE. apply NINE. unfold set_collect. - exists (mapper_rev e'). split. - { apply EQACTS. left. apply MAPREVDOM. - basic_solver. } - unfold mapper'. rewrite updo; vauto. - { apply MAPREVR; vauto. } - intros FLS. - assert (WRG : E_t e). - { apply MAPREVDOM. basic_solver 4. } - desf. } - split; vauto. constructor. - { unfold WCore.add_event. - exists (option_map mapper' r), (mapper' ↑₁ R1), - (option_map mapper' w), - (mapper' ↑₁ W1), - (mapper' ↑₁ W2). - apply add_event_to_wf; simpl; vauto. - { apply sico_init_acts_s with - (X_t := X_t) (mapper := mapper). - { constructor. all : try apply SIMREL. - rewrite (seq_lab SIMREL); vauto. } - destruct ADD. apply add_event_init. } - { unfold mapper'. rewrite upds. exact NOTIN. } - { unfold mapper'. rewrite upds; vauto. } - { unfold mapper'. rewrite upds. - destruct ADD; vauto. } - { rewrite EQACTS. rewrite set_collect_union. - rewrite MAPER_E, MAPSUB. rewrite (seq_acts SIMREL). - unfold mapper'. rewrite upds. basic_solver. } - { destruct ADD. destruct SIMRELQ. - unfold mapper', mapper_rev'. - apply functional_extensionality; ins. - destruct classic with (x = e) as [EQ | NEQ]. - { subst x. rewrite !upds. vauto. - rewrite add_event_lab. - unfold compose. rewrite upds. - rewrite upds; vauto. } - rewrite !updo; vauto. - { rewrite add_event_lab. - unfold compose. rewrite updo; vauto. - { destruct SIMREL. - destruct classic with (E_s x) as [INN | NINN]. - { rewrite updo; vauto. - rewrite seq_lab_rev0; vauto. } - rewrite updo; vauto. - rewrite seq_rlab0; vauto. } - rewrite updo; vauto. - destruct classic with (E_s x) as [INN | NINN]. - { destruct SIMREL. - intros FALSE. - assert (STT : mapper (mapper_rev x) = mapper e) - by vauto. - unfold compose in MAPREVR. - rewrite MAPREVR in STT. - { unfold id in STT. - rewrite seq_rest0 in STT; vauto. } - vauto. } - destruct SIMREL. - rewrite seq_rest_rev0; vauto. } - rewrite upds; vauto. } - { destruct ADD. rewrite add_event_rf. - rewrite !collect_rel_union. - arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). - { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rfE); vauto. } - rewrite (seq_rf SIMREL). - arewrite (mapper' ↑ WCore.rf_delta_R e w - ≡ WCore.rf_delta_R (mapper' e) - (option_map mapper' w)). - { unfold WCore.rf_delta_R. - rewrite collect_rel_cross. - apply cross_more. - { clear. unfold option_map. basic_solver. } - clear. unfold option_map. basic_solver. } - arewrite (mapper' ↑ WCore.rf_delta_W e R1 - ≡ WCore.rf_delta_W (mapper' e) (mapper' ↑₁ R1)). - { unfold WCore.rf_delta_W. - rewrite collect_rel_cross. - apply cross_more. - { clear. unfold option_map. basic_solver. } - clear. unfold option_map. basic_solver. } - vauto. } - { destruct ADD. rewrite add_event_co. - rewrite !collect_rel_union. - arewrite (mapper' ↑ co_t ≡ mapper ↑ co_t). - { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_coE); vauto. } - rewrite (seq_co SIMREL). - arewrite (mapper' ↑ WCore.co_delta e W1 W2 - ≡ WCore.co_delta (mapper' e) (mapper' ↑₁ W1) - (mapper' ↑₁ W2)). - { unfold WCore.co_delta. rewrite collect_rel_union. - apply union_more. - { rewrite collect_rel_cross. - apply cross_more; vauto. - clear. basic_solver. } - rewrite collect_rel_cross. - apply cross_more; vauto. - clear. basic_solver. } - vauto. } - { rewrite <- mapped_rmw_delta, (WCore.add_event_rmw ADD), - collect_rel_union. - arewrite (mapper' ↑ rmw_t ≡ mapper ↑ rmw_t). - { apply collect_rel_eq_dom' with (s := E_t); ins. - apply (wf_rmwE); vauto. } - now rewrite (seq_rmw SIMREL). } - { rewrite (seq_data SIMREL); vauto. } - { rewrite (seq_addr SIMREL); vauto. } - { rewrite (seq_ctrl SIMREL); vauto. } - { rewrite (seq_rmw_dep SIMREL); vauto. } - { admit. (* po-work *) } - arewrite (G_s' = WCore.G X_s'). - apply wf_transition with (X_t := X_t') - (t_1 := t_1) (t_2 := t_2) - (mapper := mapper') (mapper_rev := mapper_rev') - (ptc_1 := ptc_1); vauto. } - { unfold rf_complete. - rewrite (seq_acts SIMRELQ), (seq_rf SIMRELQ). - unfold rf_complete in RFC. rewrite EQACTS. - rewrite !set_collect_union, MAPER_E, MAPSUB. - rewrite set_inter_union_l. - rewrite set_subset_union_l; split. - { unfold rf_complete in RFC. - rewrite <- set_collect_codom, <- RFC. - unfolder. intros x ((x' & INE & XEQ) & ISR). - exists x'. splits; try basic_solver. - { apply EQACTS; vauto. } - subst x. unfold is_r in *. - assert (CHNG : WCore.G X_s' = G_s') by vauto. - rewrite CHNG in ISR. unfold G_s' in ISR; ins. - unfold compose in ISR. - assert (NEQ : x' <> e). - { intros FALSE. subst x'. basic_solver 8. } - assert (NEQ' : mapper x' <> e). - { intros FALSE. destruct NOTIN. - rewrite <- FALSE. apply (seq_codom SIMREL); vauto. } - assert (EQQ : mapper_rev' (mapper x') = x'). - { unfold eq_dom in MAPREV. specialize MAPREV with x'. - apply MAPREV in INE. unfold compose in INE. - unfold mapper_rev'. rewrite updo; vauto. } - rewrite EQQ in ISR; vauto. } - rewrite <- set_collect_codom. rewrite <- RFC. - intros x (EQ & RD). subst x. - unfold set_collect. exists e. splits; vauto. - { split. - { apply EQACTS. basic_solver. } - assert (FEQ : WCore.G X_s' = G_s') by vauto. - rewrite FEQ in RD. unfold G_s' in RD. - simpl in RD. clear - RD. unfold compose in RD. - unfold is_r in RD. unfold mapper_rev' in RD. - rewrite upds in RD; vauto. } - unfold mapper'. rewrite upds. vauto. } - apply XmmCons.monoton_cons with (G_t := G_t') - (m := mapper'); vauto; try apply SIMRELQ. - { admit. (* TODO : po-work? *) } - { rewrite <- (seq_lab SIMRELQ); vauto. } - { admit. (* TODO : po-work? *) } - { apply INV'. } - apply wf_transition with (X_t := X_t') - (t_1 := t_1) (t_2 := t_2) - (mapper := mapper') (mapper_rev := mapper_rev') - (ptc_1 := ptc_1); vauto. -Admitted. - End SimrelStep. From df989794a2cb32e633d74e1cf7a83ce0e5f02384 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Sat, 24 May 2025 01:38:31 +0200 Subject: [PATCH 46/51] 2 cases of exec done mod 2 admits --- src/sequentialization/SequentExec3.v | 816 ++++++++++++++++++++++++++- 1 file changed, 813 insertions(+), 3 deletions(-) diff --git a/src/sequentialization/SequentExec3.v b/src/sequentialization/SequentExec3.v index c7f5d43..00eb7b8 100644 --- a/src/sequentialization/SequentExec3.v +++ b/src/sequentialization/SequentExec3.v @@ -306,7 +306,532 @@ Proof using. intros FALSE. desf. } rewrite MAPER_E. rewrite MEPERREV_E; vauto. } - { admit. (*TODO : po-work*) } + { unfold sb. unfold G_s'; ins. + split; intros x y COND. + { destruct COND as [CD1 | CD2]. + { destruct CD1 as [x0 [[EQ1 [x' [INE1 M1]]] + [x1 [EXT [EQ2 [y' [INE2 M2]]]]]]]; subst. + unfold collect_rel. exists x', y'; splits; vauto. + unfold seq. exists x'; splits; vauto. + exists y'; splits; vauto. + unfold ext_sb in EXT. + destruct classic with (x' = e) as [EQ | NEQ]. + { subst. destruct e. + { clear - NINIT. desf. } + destruct classic with (thread = t_2) as [EQ | NEQ]. + { subst. apply wf_threads in INE1; [| apply INV']. + unfold tid in INE1. exfalso. + destruct ADD. desf. } + unfold mapper' in EXT. rewrite upds in EXT. + destruct y'. + { destruct SIMREL. + clear - EXT seq_init. + unfold upd in EXT. desf. + rewrite seq_init in Heq; desf. } + destruct classic with (thread0 = t_2) as [EQ' | NEQ']. + { subst. destruct ADD. + exfalso. apply T2NOTIN. + apply add_event_threads; vauto. + apply wf_threads with (G := G_t') + (e := (ThreadEvent t_2 index0)); vauto. + apply INV'. } + desf. unfold upd in Heq. desf. + assert (MIND : index0 = index1). + { rewrite (seq_mapeq SIMREL) in Heq; vauto. + { apply EQACTS in INE2. + clear - INE2 n. + destruct INE2 as [C1 | C2]; vauto. } + intros FALSE. + rewrite <- (seq_tid_1 SIMREL) in FALSE; vauto. + { apply EQACTS in INE2. + clear - INE2 n. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq in NEQ. desf. } + assert (MTID : thread0 = thread1). + { rewrite (seq_mapeq SIMREL) in Heq; vauto. + { apply EQACTS in INE2. + clear - INE2 n. + destruct INE2 as [C1 | C2]; vauto. } + intros FALSE. + rewrite <- (seq_tid_1 SIMREL) in FALSE; vauto. + { apply EQACTS in INE2. + clear - INE2 n. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq in NEQ. desf. } + basic_solver 21. } + unfold mapper' in EXT. rewrite updo in EXT; vauto. + destruct x'. + { destruct SIMREL. + clear - seq_init EXT. + unfold upd in EXT. desf. + { destruct y'. + { rewrite seq_init in Heq0; desf. } + unfold ext_sb; basic_solver. } + destruct y'. + { rewrite seq_init in Heq0; desf. } + unfold ext_sb; basic_solver. } + destruct classic with (thread = t_2) as [EQ' | NEQ']. + { subst. destruct ADD. + exfalso. apply T2NOTIN. + apply add_event_threads; vauto. + apply wf_threads with (G := G_t') + (e := (ThreadEvent t_2 index)); vauto. + apply INV'. } + destruct classic with (y' = e) as [EQY | NEQY]. + { subst. unfold mapper' in EXT. rewrite upds in EXT. + desf. + { rewrite (seq_mapeq SIMREL) in Heq; vauto. + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + intros FALSE. + rewrite <- (seq_tid_1 SIMREL) in FALSE; vauto. + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq in NEQ'. + unfold tid in NEQ'. destruct SIMREL. + assert (HLP : mapper_rev (InitEvent l0) = ThreadEvent thread index). + { rewrite <- Heq. apply MAPREV. + apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite seq_init_rev in HLP; vauto. } + destruct classic with (thread0 = t_2) as [EQT | NEQT]. + { subst. destruct ADD. + exfalso. apply T2NOTIN. + apply add_event_threads; vauto. + apply wf_threads with (G := G_t') + (e := (ThreadEvent t_2 index1)); vauto. + { apply INV'. } + destruct EXT; vauto. } + rewrite (seq_mapeq SIMREL) in Heq; vauto. + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq. basic_solver. } + unfold mapper' in EXT. rewrite updo in EXT; vauto. + destruct y'. + { desf. + { destruct SIMREL. + clear - seq_init Heq0. + rewrite seq_init in Heq0; desf. } + destruct SIMREL. + clear - seq_init Heq0. + rewrite seq_init in Heq0; desf. } + desf. + { assert (HLP : mapper_rev (InitEvent l0) = ThreadEvent thread index). + { rewrite <- Heq. apply MAPREV. + apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite seq_init_rev in HLP; vauto. } + destruct EXT; subst. + destruct classic with (thread2 = t_2) as [EQT | NEQT]. + { subst. + assert (MIND1 : thread = t_1). + { rewrite <- (seq_tid_2 SIMREL) + with (e := (ThreadEvent thread index)); vauto. + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq; vauto. } + assert (MIND2 : thread0 = t_1). + { rewrite <- (seq_tid_2 SIMREL) + with (e := (ThreadEvent thread0 index0)); vauto. + { apply EQACTS in INE2. + clear - INE2 NEQY. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq0; vauto. } + assert (INDLESS : Events.index (ThreadEvent thread index) + < Events.index (ThreadEvent thread0 index0)). + { rewrite (seq_index SIMREL) + with (e := (ThreadEvent thread0 index0)). + { rewrite (seq_index SIMREL) + with (e := (ThreadEvent thread index)). + { rewrite Heq, Heq0. ins. + lia. } + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq; vauto. } + { apply EQACTS in INE2. + clear - INE2 NEQY. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq0; vauto. } + clear - MIND1 MIND2 INDLESS. + unfold ext_sb. basic_solver 21. } + rewrite (seq_mapeq SIMREL) in Heq; vauto. + { rewrite (seq_mapeq SIMREL) in Heq0; vauto. + { apply EQACTS in INE2. + clear - INE2 NEQY. + destruct INE2 as [C1 | C2]; vauto. } + rewrite Heq0; vauto. } + { apply EQACTS in INE1. + clear - INE1 NEQ. + destruct INE1 as [C1 | C2]; vauto. } + rewrite Heq; vauto. } + unfold po_seq in CD2. + change (WCore.G X_s') with G_s' in CD2. + unfold G_s' in CD2. ins. + destruct CD2 as [C1 C2]. + destruct C1 as [TR1 [x0 [IN1 MAP1]]]. + destruct C2 as [TR2 [y0 [IN2 MAP2]]]. + unfold collect_rel. exists x0, y0; splits. + { unfold seq. exists x0; splits. + { red; vauto. } + exists y0; splits. + { destruct SIMREL. + assert (NEQ1 : y0 <> e). + { intros FLS. subst y0. + unfold mapper' in MAP2. + rewrite upds in MAP2. + subst e. + apply wf_threads in IN2; [| apply INV']. + rewrite TR2 in IN2. + destruct ADD. desf. } + assert (EQQ : mapper' y0 = mapper y0). + { unfold mapper'. rewrite updo; vauto. } + rewrite EQQ in MAP2. + destruct classic with (x0 = e) as [EQ | NEQ]. + { unfold mapper' in MAP1. subst x0. + rewrite upds in MAP1; subst x. + desf. } + apply EQACTS in IN1. + destruct IN1 as [C1 | C2]. + { apply EQACTS in IN2. + destruct IN2 as [C3 | C4]. + { destruct x0, y0. + { unfold ext_sb. + rewrite seq_init in MAP2; vauto. } + { unfold ext_sb; vauto. } + { unfold ext_sb. + rewrite seq_init in MAP2; vauto. } + destruct classic with (index < SequentBase.t_1_len (tid + (mapper' (ThreadEvent thread index))) ptc_1) as [LT | GT]. + { assert (TEQ : thread = thread0). + { apply seq_thrd in C3. + { apply seq_mapeq in C1. + { unfold tid in C3. + subst thread0. + unfold mapper' in MAP1. + rewrite updo in MAP1. + { rewrite MAP1 in C1. + rewrite C1 in TR1. + unfold tid in TR1; vauto. } + vauto. } + unfold mapper' in MAP1. + rewrite updo in MAP1. + { rewrite MAP1; vauto. } + vauto. } + vauto. } + assert (IEQ : index < index0). + { apply seq_index in C3. + { unfold Events.index in *. + unfold mapper' in LT. + rewrite updo in LT. + { unfold mapper' in MAP1. + rewrite updo in MAP1. + { rewrite MAP1 in LT. + rewrite TR1 in LT. + lia. } + vauto. } + vauto. } + unfold mapper' in MAP2. + rewrite MAP2; vauto. } + desf; vauto. } + assert (GT' : index >= SequentBase.t_1_len (tid + (mapper' (ThreadEvent thread index))) ptc_1). + { lia. } + unfold mapper' in MAP1. + rewrite updo in MAP1. + { assert (C1' : E_t (ThreadEvent thread index)) by vauto. + apply seq_mapeq in C1. + { assert (TDD : thread = t_1). + { rewrite <- MAP1 in TR1. + rewrite C1 in TR1. + unfold tid in TR1; vauto. } + apply seq_out_move in C1'. + { exfalso. + rewrite MAP1 in C1'. + rewrite C1' in TR1. + unfold tid in TR1; vauto. } + { unfold tid; vauto. } + unfold Events.index in *. + unfold mapper' in GT'. + rewrite updo in GT'. + { rewrite MAP1 in GT'. + rewrite TR1 in GT'. + lia. } + vauto. } + rewrite MAP1; vauto. } + vauto. } + desf. } + desf. } + red; vauto. } + all : vauto. } + destruct COND as [x0 [y0 [[x1 [[EQ1 INE1] + [y1 [COND [EQ2 INE2]]]]] [M1 M2]]]]. + subst. + assert (INE1' : (acts_set G_s') (mapper' x1)). + { unfold G_s'; ins. + unfold set_collect. + exists x1; vauto. } + assert (INE2' : (acts_set G_s') (mapper' y0)). + { unfold G_s'; ins. + unfold set_collect. + exists y0; vauto. } + destruct classic with (tid (mapper' y0) = t_2) as [EQ1 | NEQ1]. + { destruct classic with (tid (mapper' x1) = t_1) as [EQ2 | NEQ2]. + { right. unfold po_seq. + split. + { split; vauto. } + split; vauto. } + left. + assert (TIDD2 : tid y0 = t_1). + { destruct classic with (y0 = e) as [EQ | NEQ]. + { subst y0. + unfold mapper' in EQ1. + rewrite upds in EQ1. + apply wf_threads in INE2; [| apply INV']. + destruct ADD. + apply add_event_threads in INE2. + desf. } + unfold mapper' in EQ1. + rewrite updo in EQ1. + { assert (EQ1' : tid (mapper y0) = t_2) by vauto. + apply (seq_thrd SIMREL) in EQ1'; vauto. + apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + vauto. } + destruct x1. + { unfold seq. exists (mapper' (InitEvent l0)); split. + { red; vauto. } + exists (mapper' y0); split. + { arewrite (mapper' (InitEvent l0) = mapper (InitEvent l0)). + { unfold mapper'. rewrite updo; vauto. + intros FLS. apply NINIT; vauto. } + rewrite (seq_init SIMREL). + { unfold ext_sb; vauto. + desf. } + vauto. } + red; vauto. } + assert (TIDD : thread = t_1). + { unfold ext_sb in COND. + desf. unfold tid. + destruct COND as [COND1 COND2]. + vauto. } + destruct y0. + { exfalso. unfold tid in TIDD2; vauto. } + unfold ext_sb in COND. + destruct COND as [COND1 COND2]. + unfold seq. + exists (mapper' (ThreadEvent thread index)); split. + { red; vauto. } + exists (mapper' (ThreadEvent thread0 index0)); split. + { assert (INDD : index >= t_1_len). + { apply NNPP. intros FLS. + apply Compare_dec.not_ge in FLS. + assert (INET : E_t (ThreadEvent thread index)). + { destruct classic with ((ThreadEvent thread index) = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in NEQ2. + rewrite EQ in NEQ2. + rewrite upds in NEQ2; vauto. } + apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + apply (seq_out_snd SIMREL) in INET; vauto. + destruct classic with ((ThreadEvent t_1 index) = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in NEQ2. + rewrite EQ in NEQ2. + rewrite upds in NEQ2; vauto. } + unfold mapper' in NEQ2. + rewrite updo in NEQ2; vauto. + rewrite INET in NEQ2. + desf. } + assert (INEE1 : E_t (ThreadEvent thread index)). + { destruct classic with ((ThreadEvent thread index) = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in NEQ2. + rewrite EQ in NEQ2. + rewrite upds in NEQ2; vauto. } + apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + assert (INEE2 : E_t (ThreadEvent thread0 index0)). + { destruct classic with ((ThreadEvent thread0 index0) = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in EQ1. + rewrite EQ in EQ1. + rewrite upds in EQ1; vauto. } + apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + apply (seq_out_move SIMREL) in INEE1, INEE2; vauto. + { assert (SWP1 : mapper' (ThreadEvent t_1 index) + = mapper (ThreadEvent t_1 index)). + { unfold mapper'. + destruct classic with (ThreadEvent t_1 index = e) as [EQ | NEQ]. + { exfalso. unfold mapper' in NEQ2. + rewrite EQ in NEQ2. + rewrite upds in NEQ2; vauto. } + rewrite updo; vauto. } + assert (SWP2 : mapper' (ThreadEvent t_1 index0) + = mapper (ThreadEvent t_1 index0)). + { unfold mapper'. + destruct classic with (ThreadEvent t_1 index0 = e) as [EQ | NEQ]. + { exfalso. rewrite EQ in THRDNEQ. + unfold mapper' in THRDNEQ. + rewrite upds in THRDNEQ; vauto. } + rewrite updo; vauto. } + rewrite SWP1, SWP2. + rewrite INEE1, INEE2. + unfold ext_sb. split; vauto. + unfold Events.index. + clear - COND2 INDD. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + red; vauto. } + destruct classic with (y0 = e) as [EQ | NEQ]. + { subst y0. left. + unfold seq. exists (mapper' x1); split; vauto. + exists (mapper' e); split; vauto. + destruct classic with (tid (mapper' x1) = t_2) as [EQ2 | NEQ2]. + { destruct classic with (x1 = e) as [EQ3 | NEQ3]. + { subst x1. unfold mapper'. + desf. } + assert (INEE : E_t x1). + { apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. + apply (seq_index SIMREL) in INEE; vauto. + { unfold ext_sb in COND. + desf. + { unfold mapper'. + rewrite updo; vauto. + rewrite upds; vauto. + rewrite (seq_init SIMREL); vauto. } + unfold mapper'. + rewrite upds; vauto. + rewrite updo; vauto. + rewrite (seq_out SIMREL); vauto. + unfold tid. + destruct COND as [COND1 COND2]. + vauto. } + unfold mapper'. rewrite updo; vauto. } + assert (INEE : E_t x1). + { destruct classic with (x1 = e) as [EQ3 | NEQ3]. + { subst x1. unfold ext_sb in COND. desf. + destruct COND as [COND1 COND2]. + exfalso. clear - COND2. lia. } + apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + apply (seq_mapeq SIMREL) in INEE; vauto. + { arewrite (mapper' x1 = mapper x1). + { unfold mapper'. rewrite updo; vauto. + intros FALSO. subst x1. + unfold ext_sb in COND. desf. + destruct COND as [COND1 COND2]. + exfalso. lia. } + rewrite INEE. + unfold mapper'. + rewrite upds; vauto. } + assert (SWP : mapper' x1 = mapper x1). + { unfold mapper'. rewrite updo; vauto. + intros FALSO. subst x1. + unfold ext_sb in COND. desf. } + rewrite SWP in NEQ2; vauto. } + destruct classic with (x1 = e) as [EQ2 | NEQ2]. + { subst x1. + left. + assert (SWP : mapper' y0 = mapper y0). + { unfold mapper'. rewrite updo; vauto. } + rewrite SWP in NEQ1; vauto. + assert (INEE : E_t y0). + { apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + apply (seq_mapeq SIMREL) in INEE; vauto. + unfold seq. exists (mapper' e); split; vauto. + exists (mapper' y0); split; vauto. + rewrite SWP, INEE. + unfold mapper'. + rewrite upds; vauto. } + left. + unfold seq. exists (mapper' x1); split; vauto. + exists (mapper' y0); split; vauto. + destruct classic with (tid (mapper' x1) = t_2) as [EQ3 | NEQ3]. + { unfold mapper' in EQ3. rewrite updo in EQ3. + { assert (INEE : E_t x1). + { apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + assert (INEE' : E_t x1) by vauto. + apply (seq_index SIMREL) in INEE. + { apply (seq_thrd SIMREL) in INEE'. + { destruct classic with (index y0 < t_1_len) as [LS | GT]. + assert (INEY : E_t y0). + { apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + unfold ext_sb in COND. + desf. + { unfold mapper' at 1. + rewrite updo; vauto. + rewrite (seq_init SIMREL); vauto. + unfold ext_sb; vauto. + desf. + unfold mapper' in Heq. + rewrite updo in Heq; vauto. + assert (REVV : mapper_rev (mapper (ThreadEvent thread index)) + = mapper_rev (InitEvent l1)). + { rewrite Heq; vauto. } + unfold compose in MAPREV. + rewrite MAPREV in REVV; vauto. + unfold id in REVV. + rewrite (seq_init_rev SIMREL) in REVV; vauto. } + { unfold mapper'. + rewrite !updo; vauto. + unfold Events.index in *. + destruct COND as [COND1 COND2]. + exfalso. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + exfalso. + apply Compare_dec.not_lt in GT. + assert (INEY : E_t y0). + { apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + apply (seq_out_move SIMREL) in INEY; vauto. + { unfold mapper' in NEQ1. + rewrite updo in NEQ1; vauto. + rewrite INEY in NEQ1. + desf. } + unfold ext_sb in COND. + desf. + { exfalso. + unfold tid in INEE'. + apply NINIT1; vauto. } + unfold tid in INEE'. + destruct COND as [COND1 COND2]. + unfold tid; vauto. } + vauto. } + vauto. } + vauto. } + assert (INEE : E_t x1). + { apply EQACTS in INE1. + destruct INE1 as [C1 | C2]; vauto. } + assert (INEE' : E_t y0). + { apply EQACTS in INE2. + destruct INE2 as [C1 | C2]; vauto. } + apply (seq_mapeq SIMREL) in INEE. + { apply (seq_mapeq SIMREL) in INEE'. + { unfold mapper'. + rewrite !updo; vauto. + rewrite INEE, INEE'; vauto. } + unfold mapper' in NEQ1. + rewrite updo in NEQ1; vauto. } + unfold mapper' in NEQ3. + rewrite updo in NEQ3; vauto. } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } { unfold mapper'. intros x COND. @@ -634,9 +1159,294 @@ Proof using. unfold mapper'. rewrite upds. vauto. } apply XmmCons.monoton_cons with (G_t := G_t') (m := mapper'); vauto; try apply SIMRELQ. - { admit. (* TODO : po-work? *) } + { unfold rpo. unfold rpo_imm. + arewrite (WCore.G X_s' = G_s'). + destruct SIMRELQ. + assert (RESTR : ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘ ≡ restr_rel E_t' ( + ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘)). + { split. + { rewrite !restr_union. + repeat apply union_mori. + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] COND]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x1 [COND [EQ2 CD2]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + rewrite inclusion_restr; vauto. } + rewrite RESTR. + rewrite collect_rel_ct_inj. + { assert (MAPREVCOMP : eq_dom (acts_set G_s') (mapper' ∘ mapper_rev') id). + { intros x COND. + unfold G_s' in COND; ins. + destruct COND as [x0 [COND EQ]]; subst. + unfold compose. + destruct classic with (x0 = e) as [EQ1 | NEQ1]. + { subst x0. unfold mapper', mapper_rev'. + rewrite !upds; vauto. } + apply EQACTS in COND. + destruct COND as [C1 | C2]. + { unfold mapper', mapper_rev'. + unfold id. + arewrite (upd mapper e e x0 = mapper x0). + arewrite (upd mapper_rev e e (mapper x0) = mapper_rev (mapper x0)). + { destruct classic with (mapper x0 = e) as [EQ2 | NEQ2]. + { destruct SIMREL. + assert (INEE : E_s e). + { apply seq_acts0. + red; vauto. } + desf. } + rewrite updo; vauto. } + unfold compose in MAPREV. + rewrite MAPREV; vauto. + unfold id. rewrite updo; vauto. } + desf. } + assert (SBIN : sb G_s' ⊆ mapper' ↑ sb_t'). + { rewrite <- seq_sb; vauto. } + apply clos_trans_mori. + rewrite <- RESTR. + rewrite !collect_rel_union. + repeat apply union_mori. + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘ ≡ + ⦗R_t' ∩₁ Rlx G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISR ISRLX] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISRLX. + rewrite seq_lab_rev in ISRLX; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISRLX; vauto. } + { unfold is_rlx. unfold compose in ISRLX; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + arewrite (⦗Acq G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘ ≡ + ⦗Acq G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [ISA INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_acq. unfold compose in ISA; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE ISR]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISR. + rewrite seq_lab_rev in ISR; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + unfold is_rel. unfold compose in ISR; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘ ≡ + ⦗F G_t' ∩₁ Rel G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISF ISREL] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISREL. + rewrite seq_lab_rev in ISREL; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISREL; vauto. } + { unfold is_rlx. unfold compose in ISREL; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + vauto. } { rewrite <- (seq_lab SIMRELQ); vauto. } - { admit. (* TODO : po-work? *) } + { assert (SBEQ : sb G_s' ≡ mapper' ↑ sb_t' \ po_seq X_s' t_1 t_2). + { rewrite <- (seq_sb SIMRELQ). + rewrite minus_union_l. + rewrite minusK. split; [| basic_solver]. + intros x y COND. + left. split; vauto. + intros FLS. + unfold po_seq in FLS. + destruct FLS as [[TID1 INE1] [TID2 INE2]]. + unfold sb in COND. unfold ext_sb in COND. + clear - COND TID1 TID2 NINIT1 NINIT2 THRDNEQ. + destruct COND as [x0 [[EQQ1 INEE1] [x1 [COND2 [EQQ2 INEE2]]]]]. + subst. desf. basic_solver 42. } + arewrite (WCore.G X_s' = G_s'). + rewrite SBEQ. + intros x y COND. + destruct COND as [[CDMAP POSEQ] COND2]. + destruct CDMAP as [x0 [x1 [CND [M1 M2]]]]. + unfold collect_rel. + exists x0, x1; split; vauto. + split; vauto. + unfold same_loc in *. + destruct SIMRELQ. + unfold loc. rewrite !seq_lab. + { unfold compose; vauto. } + all : apply wf_sbE in CND. + all : destruct CND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; vauto. } { apply INV'. } apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) From 431925977448807db8602a115ca1f2a494d77667 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Sat, 24 May 2025 16:10:18 +0200 Subject: [PATCH 47/51] reexec work --- src/sequentialization/SequentReexec.v | 2109 +++++++++++++------------ 1 file changed, 1059 insertions(+), 1050 deletions(-) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index d2acc65..b00fc14 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -116,6 +116,9 @@ Definition t_2_len := length (ptc_1 t_2). (* Definition cmt' := mapper ↑₁ cmt_t. Definition dtrmt' := mapper ↑₁ dtrmt_t. *) +Hypothesis INTREADS : forall (x : actid), + tid x = tid_init <-> is_init x. + Definition relation_lowering (A : Type) (r : relation A) (P : A -> Prop) : relation A := fun x y => r x y /\ P x /\ P y. @@ -1036,893 +1039,200 @@ Proof using. { unfold tid in TID1. apply NINIT1; vauto. } unfold tid in *. desf. } - unfold WCore.reexec. - exists thrdle'. - constructor; vauto. - { unfold dtrmt'. destruct SIMRELQ. - arewrite ((fun a : actid => is_init a) ⊆₁ - mapper' ↑₁ (fun a : actid => is_init a)). - { clear- seq_init. - unfold fixset in seq_init. - basic_solver. } - destruct STEP. - rewrite dtrmt_init; vauto. } - { unfold dtrmt', cmt'. - rewrite (WCore.dtrmt_cmt STEP); vauto. } - { unfold dtrmt'. - unfold fixset. - intros x DTT. - destruct DTT as [x0 [INX DTT]]. - subst. unfold compose. - assert (HLP : mapper_rev' (mapper' x0) = x0). - { unfold compose in MAPCOMP. - apply MAPCOMP. destruct STEP. - apply dtrmt_cmt, reexec_embd_dom in INX; vauto. } - rewrite HLP. - arewrite (f_t x0 = x0). - { destruct STEP. - apply dtrmt_fixed; vauto. } - apply DTRSAME; vauto. } - { destruct STEP. unfold cmt'. - arewrite (WCore.G X_s' = G_s'). - unfold G_s'. simpls. - basic_solver 8. } - { constructor. - { destruct STEP. destruct reexec_sur. - unfold least_elt. intros trn INIT. - unfold thrdle'. - right. - split; vauto. - unfold least_elt in surg_init_least. - specialize (surg_init_least trn INIT). - clear - surg_init_least. - basic_solver. } - { unfold min_elt. intros trn INIT. - assert (FLS : codom_rel thrdle' tid_init). - { clear - INIT. basic_solver. } - unfold thrdle' in INIT. - apply codom_union in FLS. - destruct FLS as [FLS | FLS1]. - { apply codom_union in FLS. - destruct FLS as [FLS | FLS2]. - { apply codom_union in FLS. - destruct FLS as [FLS | FLS3]. - { apply codom_union in FLS. - destruct FLS as [FLS | FLS4]. - { destruct STEP. destruct reexec_sur. - unfold min_elt in surg_init_min. - destruct FLS as [x FLS]. - specialize (surg_init_min x). - apply surg_init_min. - vauto. } - clear - NINIT1 FLS4. - apply codom_crossed in FLS4. + assert (WFSTART : WCore.wf (WCore.X_start X_s dtrmt') X_s' cmt'). + { constructor; ins. + { apply sub_WF with (G := G_s) (sc := ∅₂) (sc' := ∅₂). + { ins. + assert (INITDER : (fun a : actid => is_init a) ⊆₁ dtrmt_t). + { destruct STEP; vauto. } + arewrite ((fun a : actid => is_init a) ⊆₁ mapper' ↑₁ + (fun a : actid => is_init a)). + { destruct SIMRELQ. clear- seq_init. + unfold fixset in seq_init. + basic_solver. } + rewrite INITDER. + unfold dtrmt'; vauto. } + { apply wf_transition with (X_t := X_t) + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper) (mapper_rev := mapper_rev) + (ptc_1 := ptc_1); vauto. } + apply restrict_sub; [basic_solver |]. + unfold dtrmt'. + destruct SIMREL. + rewrite seq_acts. + intros x COND. + unfold set_collect in COND. + destruct COND as [x0 [COND EQ]]. + unfold set_collect. + exists x0; split; vauto. + { destruct STEP. + apply rexec_acts; vauto. } + destruct classic with (tid (mapper + x0) = t_2) as [TID2 | TID2]. + { assert (TID2' : tid (mapper x0) = t_2) by vauto. + assert (TID2S : tid (mapper x0) = t_2) by vauto. + apply seq_index in TID2. + apply seq_thrd in TID2'. + { apply INDLEMMA. + { unfold mapper'. desf. } + { unfold mapper'. + rewrite TID2S. clear TID2S. + desf. + { destruct STEP. + apply dtrmt_cmt in COND. + apply reexec_embd_dom in COND; vauto. } + symmetry in TID2. + rewrite <- TID2 in l. + exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold mapper'. + rewrite TID2. clear TID2. + desf. + { destruct STEP. + apply dtrmt_cmt in COND. + apply reexec_embd_dom in COND; vauto. } + { exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + { destruct STEP. apply rexec_acts; vauto. } + destruct STEP. apply rexec_acts; vauto. } + assert (TID2' : tid (mapper x0) <> t_2) by vauto. + assert (TID2S : tid (mapper x0) <> t_2) by vauto. + apply seq_mapeq in TID2. + { rewrite TID2. clear TID2. + unfold mapper'. desf. + apply INDLEMMA. + { unfold not in n0. + apply NNPP in n0. + rewrite n0; vauto. } + { unfold tid. + unfold not in n0. + apply NNPP in n0. + apply seq_out_move in n0; vauto. + { apply seq_mapeq in TID2S; vauto. + rewrite TID2S in n0. + desf. + destruct STEP. apply rexec_acts; vauto. } + { destruct STEP. apply rexec_acts; vauto. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + unfold Events.index in *. + unfold not in n0. + apply NNPP in n0. + apply seq_out_move in n0; vauto. + { apply seq_mapeq in TID2S; vauto. + { rewrite TID2S in n0. desf. } - clear - NINIT2 FLS3. - apply codom_crossed in FLS3. - desf. } - apply codom_crossed in FLS2. - destruct STEP. destruct reexec_sur. - clear - FLS2 surg_init_min. - unfold min_elt in surg_init_min. - destruct FLS2 as [x FLS2]. - specialize (surg_init_min x). - apply surg_init_min. - destruct FLS2 as [x0 [EQ FLS2]]. - destruct EQ. desf. } - apply codom_crossed in FLS1. - destruct STEP. destruct reexec_sur. - clear - FLS1 surg_init_min. - unfold min_elt in surg_init_min. - destruct FLS1 as [x FLS1]. - specialize (surg_init_min x). - desf. } + destruct STEP. apply rexec_acts; vauto. } + { destruct STEP. apply rexec_acts; vauto. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + destruct STEP. apply rexec_acts; vauto. } { constructor. - { unfold thrdle'. - repeat (apply irreflexive_union; split). - { destruct STEP. destruct reexec_sur. - unfold strict_partial_order in surg_order. - destruct surg_order as [IRR _]; vauto. } - { clear - THRDNEQ. basic_solver. } - { intros x COND. - destruct COND as [CD1 CD2]; subst x. - destruct CD1 as [x1 [x2 [CD1 CD2]]]. - apply THRLEE in CD1. - destruct CD1 as [x3 [[EQ INE] CD3]]. - subst x3. desf. } - { intros x COND. - destruct COND as [CD1 CD2]; subst x. - destruct CD2 as [x1 [x2 [CD1 CD2]]]. - apply THRLEE in CD2. - destruct CD2 as [x3 [CD2 [x4 [CD3 [EQ INE]]]]]. - subst x4. desf. } - destruct STEP. destruct reexec_sur. - unfold min_elt in surg_init_min. - clear - surg_init_min. - intros x [EQ [y FLS]]. - specialize (surg_init_min y). - basic_solver 4. } - unfold thrdle'. unfold transitive. - intros x y z XY YZ. - destruct XY as [[[[C1 | C1] | C1] | C1] | C1]. - all : destruct YZ as [[[[C2 | C2] | C2] | C2] | C2]. - all : destruct STEP. - all : destruct reexec_sur. - all : destruct surg_order as [IR TR]. - { do 4 left. clear - C1 C2 TR. basic_solver 4. } - { destruct C2 as [EQ1 EQ2]. - subst y. apply THRLEE in C1. - destruct C1 as [x3 [CD2 [x4 [CD3 [EQ INE]]]]]. - desf. } - { do 2 left; right. - clear - C1 C2 TR. - destruct C2 as [C2 EQ]; subst z. - split; vauto. - destruct C2 as [x0 [x1 [CD2 [EQ1 EQ2]]]]; subst. - basic_solver 8. } - { destruct C2 as [EQ1 EQ2]. - subst y. apply THRLEE in C1. - destruct C1 as [x3 [CD2 [x4 [CD3 [EQ INE]]]]]. - desf. } - { clear - C1 C2 surg_init_min. - exfalso. unfold min_elt in surg_init_min. - destruct C2 as [C2 C3]. - basic_solver 4. } - { left; right. - clear - C1 C2 TR. - destruct C1 as [C1 EQ]; subst x y. - split; vauto. } - { clear - C1 C2 THRDNEQ. - destruct C1 as [C1 EQ]; subst x y. - destruct C2 as [C2 EQ1]; subst z. - exfalso. desf. } - { clear - C1 C2 IR. - exfalso. - destruct C1 as [C1 EQ]; subst x y. - destruct C2 as [C2 EQ1]; subst z. - destruct IR with t_1. - destruct C2 as [x0 [x1 [CD [EQ1 EQ2]]]]; subst. - vauto. } - { clear - C1 C2 THRDNEQ. - destruct C1 as [C1 EQ]; subst x y. - destruct C2 as [C2 EQ1]. - exfalso. desf. } - { clear - C1 C2 NINIT1. - destruct C1 as [C1 EQ]; subst x y. - destruct C2 as [C2 EQ1]. - exfalso. desf. } - { destruct C1 as [EQ1 EQ2]. - subst y. apply THRLEE in C2. - destruct C2 as [x3 [[EQ TD] [x4 [CD3 CD4]]]]. - desf. } - { do 4 left. clear - C1 C2 TR. - destruct C2 as [C2 EQ]; subst y z. - destruct C1 as [C1 EQ1]. - destruct C1 as [x0 [x1 [CD1 [EQ2 EQ3]]]]; subst. - vauto. } - { destruct C1 as [EQ1 EQ2]. - subst y. - destruct C2 as [C2 EQ]; subst z. - destruct C2 as [x0 [x1 [CD2 [EQ3 EQ4]]]]; subst. - apply THRLEE in CD2. - destruct CD2 as [x3 [[EQ TD] [x4 [CD3 CD4]]]]. - desf. } - { do 4 left. clear - C1 C2 TR. - destruct C2 as [C2 EQ]; subst. - destruct C1 as [C1 EQ1]; subst. - destruct C1 as [x0 [x1 [CD1 [EQ2 EQ3]]]]; subst. - destruct EQ as [x1 [x2 [[EQ INE] CDD]]]; subst. - basic_solver 8. } - { clear - C1 C2 NINIT2. - destruct C1 as [C1 EQ]; subst. - destruct C2 as [C2 EQ1]; subst. - exfalso. desf. } - { left; right. - clear - C1 C2 TR. - destruct C1 as [EQ1 EQ2]. - subst x. split; vauto. - unfold codom_rel. - destruct EQ2 as [x0 [x1 [[EQ1 EQ2] CD]]]. - basic_solver 8. } - { clear - C1 C2 THRLEE T2NOTIN. - destruct C2 as [C2 EQ]; subst. - destruct C1 as [C1 EQ1]; subst. - destruct EQ1 as [x0 [x1 [[EQ1 EQ2] CD]]]. - apply THRLEE in CD. - destruct CD as [x3 [[EQ TD] [x4 [CD3 [EQ3 TD2]]]]]. - desf. } - { clear - C1 C2 IR TR. - exfalso. - destruct C1 as [C1 EQ]; subst. - destruct C2 as [C2 EQ1]; subst. - destruct EQ as [x0 [x1 [[EQ1 EQ2] CD]]]; subst. - destruct C2 as [x2 [x3 [CD2 [INE1 INE2]]]]; subst. - basic_solver 8. } - { destruct C1 as [EQ1 EQ2]. - subst x. - destruct C2 as [C2 EQ]; subst. - destruct EQ2 as [x0 [x1 [CD2 CD3]]]; subst. - apply THRLEE in CD3. - destruct CD3 as [x3 [[EQ2 TD] [x4 [CD3 [EQ3 EQ4]]]]]. - desf. } - { clear - C1 C2 surg_init_min TR. - exfalso. - destruct C1 as [C1 EQ]; subst. - destruct C2 as [C2 EQ1]; subst. - destruct EQ as [x0 [x1 [[EQ3 EQ2] CD]]]; subst. - destruct surg_init_min with x1; vauto. } - { do 4 left. clear - C1 C2 TR surg_init_least surg_init_min. - destruct C1. - destruct H0 as [x0 CND]; subst. - unfold least_elt in surg_init_least. - apply surg_init_least. - intros FLS. basic_solver 12. } - { clear - C1 C2 THRLEE T2NOTIN. - exfalso. - destruct C1 as [C1 EQ]; subst. - destruct C2 as [C2 EQ1]; subst. - destruct EQ as [x0 CND]; subst. - apply THRLEE in CND. - destruct CND as [x3 [[EQ2 TD] [x4 [CD3 [EQ3 EQ4]]]]]. - desf. } - { do 2 left; right. - clear - C1 C2 TR NINIT1 surg_init_least. - destruct C1 as [C1 EQ]; subst. - destruct C2 as [C2 EQ1]; subst. - split; vauto. - unfold dom_rel. - exists t_1; vauto. - unfold seq; exists t_1; split; vauto. - unfold least_elt in surg_init_least. - specialize (surg_init_least t_1). - apply surg_init_least. - basic_solver. } - { clear - C1 C2 THRLEE T2NOTIN. - exfalso. - destruct C1 as [C1 EQ]; subst. - destruct C2 as [C2 EQ1]; subst. - destruct EQ as [x0 CND]; subst. - apply THRLEE in CND. - destruct CND as [x3 [[EQ2 TD] [x4 [CD3 [EQ3 EQ4]]]]]. - desf. } - clear - C1 C2 surg_init_min. - destruct C1 as [C1 EQ]; subst. - destruct C2 as [C2 EQ1]; subst. - exfalso. - unfold min_elt in surg_init_min. - destruct EQ as [x0 CND]. - specialize (surg_init_min x0). - vauto. } - admit. } - { unfold sb. rewrite !seqA. - rewrite <- !id_inter. - rewrite <- seqA with (r1 := ⦗dtrmt'⦘). - rewrite <- id_inter. - unfold dtrmt'. destruct SIMREL. - rewrite seq_acts. - intros x y PTH. - destruct PTH as [x0 [[EQ1 IN1] - [x1 [PTH [EQ2 [IN2 IN3]]]]]]. - destruct IN1 as [x2 [IN1 M1]]. - destruct IN2 as [x3 [IN2 M2]]. - subst. - unfold seq. exists (mapper x2); split. - { red; split; vauto. - split; [| basic_solver]. - destruct STEP. - destruct reexec_dtrmt_sb_closed with - (x := x2) (y := x3). - { unfold seq. exists x3; split. - { destruct x2. - { unfold sb. - unfold seq; exists (InitEvent l); split; vauto. - exists x3; split; vauto. - unfold ext_sb. desf. - rewrite !seq_init in PTH; vauto. } - destruct classic with (tid (mapper - (ThreadEvent thread index)) = t_2) as [TID2 | TID2]. - { rewrite seq_mapto in PTH. - { destruct x3. - { rewrite !seq_init in PTH; vauto. } - destruct classic with (tid (mapper - (ThreadEvent thread0 index0)) = t_2) as [TID2' | TID2']. - { rewrite seq_mapto in PTH. - { assert (TD1 : thread = t_1). - { apply seq_thrd in TID2; vauto. } - assert (TD2 : thread0 = t_1). - { apply seq_thrd in TID2'; vauto. } - clear - PTH IN1 IN2 TID2 TID2' TD1 TD2. - unfold sb. unfold seq. - exists (ThreadEvent thread index); split; vauto. - exists (ThreadEvent t_1 index0); split; vauto. - unfold ext_sb. desf; split; vauto. - unfold ext_sb in PTH. desf. - unfold Events.index in *. lia. } - all : vauto. } - clear - TID2 TID2' PTH IN1 IN2. - unfold sb. unfold seq. - exists (ThreadEvent thread index); split; vauto. - exists (ThreadEvent thread0 index0); split; vauto. - unfold ext_sb in *. - unfold tid in *. - desf; desf. } - all : vauto. } - destruct x3. - { exfalso. - assert (HLP : mapper (InitEvent l) - = InitEvent l). - { rewrite seq_init; vauto. } - rewrite HLP in PTH. - clear - PTH. - unfold ext_sb in PTH. - desf. } - destruct classic with (tid (mapper - (ThreadEvent thread0 index0)) = t_2) as [TID2' | TID2']. - { clear - TID2 TID2' PTH IN1 IN2 seq_init seq_init_rev MAPREV. - unfold sb. unfold seq. - exists (ThreadEvent thread index); split; vauto. - exists (ThreadEvent thread0 index0); split; vauto. - exfalso. unfold ext_sb in *. - unfolder. desf. - { assert (Heqq : mapper_rev (mapper (ThreadEvent thread index)) = - mapper_rev (InitEvent l)). - { rewrite Heq; vauto. } - unfold compose in MAPREV. - rewrite MAPREV in Heqq; vauto. - unfold id in Heqq. - rewrite seq_init_rev in Heqq; vauto. } - unfold tid in *. desf. } - assert (EQQ1 : mapper (ThreadEvent thread index) = - ThreadEvent thread index). - { rewrite seq_mapeq; vauto. } - assert (EQQ2 : mapper (ThreadEvent thread0 index0) = - ThreadEvent thread0 index0). - { rewrite seq_mapeq; vauto. } - rewrite EQQ1, EQQ2 in PTH. - unfold sb. unfold seq. - exists (ThreadEvent thread index); split; vauto. } - red; split; vauto. - unfold set_collect in IN3. - destruct IN3 as [x4 [IN3 EQ]]. - assert (IN4 : E_t' x4). - { apply dtrmt_cmt, reexec_embd_dom in IN3; vauto. } - unfold mapper' in EQ. - apply MAPS in EQ; vauto. } - unfold set_collect. - exists x2; split. - { destruct H as [DT _]. - red in DT. basic_solver 4. } - destruct x2. - { rewrite seq_init; vauto. + { unfold WCore.X_start; ins. destruct SIMRELQ. - rewrite seq_init0; vauto. } - destruct H as [DT SB]. - destruct classic with (tid (mapper - (ThreadEvent thread index)) = t_2) as [TID2 | TID2]. - { assert (TID2' : tid (mapper (ThreadEvent thread index)) = t_2) by vauto. - assert (TID2S : tid (mapper (ThreadEvent thread index)) = t_2) by vauto. - apply seq_index in TID2. - apply seq_thrd in TID2'. - { apply INDLEMMA. - { unfold mapper'. desf. - { rewrite TID2'; vauto. } - unfold not in n0. - apply NNPP in n0. - rewrite n0; vauto. } - { unfold mapper'. - rewrite TID2S. clear TID2S. - desf. - { red in DT. destruct DT as [EQ DT]. - apply dtrmt_cmt in DT. - apply reexec_embd_dom in DT; vauto. } - symmetry in TID2. - rewrite <- TID2 in l. - exfalso. unfold Events.index in *. - unfold SequentBase.t_1_len in *. - unfold t_1_len in *. - lia. } - unfold mapper'. - rewrite TID2. clear TID2. - desf. - { red in DT. destruct DT as [EQ DT]. - apply dtrmt_cmt in DT. - apply reexec_embd_dom in DT; vauto. } - { exfalso. unfold Events.index in *. - unfold SequentBase.t_1_len in *. - unfold t_1_len in *. - lia. } - unfold Events.index in *. - unfold t_1_len in *. - unfold SequentBase.t_1_len in *. - lia. } - { red in DT. destruct DT as [EQ DT]. - apply dtrmt_cmt in DT. - apply reexec_embd_dom in DT; vauto. } - red in DT. destruct DT as [EQ DT]. - apply dtrmt_cmt in DT. - apply reexec_embd_dom in DT; vauto. } - assert (TID2' : tid (mapper (ThreadEvent thread index)) <> t_2) by vauto. - assert (TID2S : tid (mapper (ThreadEvent thread index)) <> t_2) by vauto. - apply seq_mapeq in TID2. - { rewrite TID2. clear TID2. - unfold mapper'. desf. - apply INDLEMMA. - { unfold tid; vauto. } - { unfold tid. - unfold not in n0. - apply NNPP in n0. - apply seq_out_move in n0; vauto. - { apply seq_mapeq in TID2S; vauto. - rewrite TID2S in n0. - desf. } - unfold Events.index in *. - unfold t_1_len in *. - unfold SequentBase.t_1_len in *. - lia. } - unfold Events.index in *. - unfold not in n0. - apply NNPP in n0. - apply seq_out_move in n0; vauto. - { apply seq_mapeq in TID2S; vauto. - rewrite TID2S in n0. - desf. } - unfold Events.index in *. - unfold t_1_len in *. - unfold SequentBase.t_1_len in *. - lia. } - red in DT. destruct DT as [EQ DT]. - apply dtrmt_cmt in DT. - apply reexec_embd_dom in DT; vauto. } - exists (mapper x3); split; vauto. - red; split; vauto. } - { unfold nin_sb. - rewrite SBSEQ. - rewrite <- seq_eqv_minus_ll. - admit. (* something for immediate of exclusion is needed *)} - { arewrite (WCore.G X_s' = G_s'). - unfold G_s' at 1; ins. - intros x COND. - destruct COND as (INE & NDT). - unfold set_compl. intros FLS. - destruct INE as [x0 [INE M1]]; subst. - unfold dtrmt' in NDT. - assert (DTRM : ~ dtrmt_t x0). - { intros FLSS. - apply NDT. unfold set_collect. - exists x0; split; vauto. } - destruct FLS as [FL1 | FL2]. - { assert (FLS : (Rel G_t') x0). - { assert (SUBST : (fun x : actid => - ifP ~ (mapper' ↑₁ E_t') x then x - else (ifP tid x <> t_2 then x - else ThreadEvent t_1 - (t_1_len + index x))) = mapper_rev') by vauto. - rewrite SUBST in FL1. - unfold compose in FL1. - unfold is_rel, mod in *. - assert (HLP : mapper_rev' (mapper' x0) = x0). - { unfold compose in MAPCOMP. - apply MAPCOMP in INE. - unfold id in INE; vauto. } - rewrite HLP in FL1; vauto. } - destruct STEP. - clear - reexec_dtrmt_rpo FLS DTRM INE. - unfold set_compl in reexec_dtrmt_rpo. - destruct reexec_dtrmt_rpo with x0; vauto. } - assert (FLS : (Acq G_t') x0). - { assert (SUBST : (fun x : actid => - ifP ~ (mapper' ↑₁ E_t') x then x - else (ifP tid x <> t_2 then x - else ThreadEvent t_1 - (t_1_len + index x))) = mapper_rev') by vauto. - rewrite SUBST in FL2. - unfold compose in FL2. - unfold is_acq, mod in *. - assert (HLP : mapper_rev' (mapper' x0) = x0). - { unfold compose in MAPCOMP. - apply MAPCOMP in INE. - unfold id in INE; vauto. } - rewrite HLP in FL2; vauto. } - destruct STEP. - clear - reexec_dtrmt_rpo FLS DTRM INE. - unfold set_compl in reexec_dtrmt_rpo. - destruct reexec_dtrmt_rpo with x0; vauto. } - { destruct STEP. - destruct reexec_embd_corr. - constructor; vauto. - { unfold cmt'. - unfold inj_dom. - intros x y CD1 CD2 EQQ. - destruct CD1 as [x0 [CD1 M1]]. - destruct CD2 as [x1 [CD2 M2]]. - subst. - unfold compose in EQQ. - unfold compose in MAPCOMP. - assert (HLP1 : mapper_rev' (mapper' x0) = x0). - { unfold compose in MAPCOMP. - apply MAPCOMP. - apply reexec_embd_dom in CD1; vauto. } - assert (HLP2 : mapper_rev' (mapper' x1) = x1). - { unfold compose in MAPCOMP. - apply MAPCOMP. - apply reexec_embd_dom in CD2; vauto. } - rewrite HLP1, HLP2 in EQQ. - destruct SIMREL. - apply seq_inj in EQQ. - { apply reexec_embd_inj in EQQ; vauto. } - { apply reexec_embd_acts; red. - exists x0; vauto. } - apply reexec_embd_acts; red. - exists x1; vauto. } - { intros e CMT. - unfold cmt' in CMT. - unfold set_collect in CMT. - destruct CMT as [x [CMT EQ]]. - specialize (reexec_embd_lab x). - assert (INE : E_t' x). - { apply reexec_embd_dom in CMT; vauto. } - assert (CMT' : cmt_t x) by vauto. - apply reexec_embd_lab in CMT. - destruct SIMRELQ. - apply seq_lab in INE. - unfold compose in INE. - rewrite EQ in INE. - rewrite <- INE. - destruct SIMREL. - rewrite CMT. - subst. - unfold compose. - unfold compose in MAPCOMP. - rewrite MAPCOMP. - { unfold id. - apply seq_lab0. - apply reexec_embd_acts; red; vauto. } - apply reexec_embd_dom; vauto. } - { admit. (* needs a better analysis of sb structure *) } - { unfold cmt'. - rewrite (seq_rf SIMRELQ). - rewrite (seq_rf SIMREL). - destruct STEP. - destruct reexec_embd_corr. - rewrite <- reexec_embd_rf0. - rewrite collect_rel_restr. - { intros x y COND. - unfold compose in COND. - unfold collect_rel in COND. - destruct COND as [x0 [x1 [COND [EQ1 EQ2]]]]. - destruct COND as [x2 [x3 [COND [EQ3 EQ4]]]]. - unfold collect_rel. - exists (f_t (mapper_rev' x0)), (f_t (mapper_rev' x1)); splits. - { exists x2, x3; splits; vauto. - { unfold compose in MAPCOMP. - rewrite MAPCOMP; vauto. - destruct COND as [RF CDS]. - apply wf_rfE in RF; [|apply INV']. - destruct RF as [x0 [[INE EQQ] RF2]]; vauto. } - unfold compose in MAPCOMP. - rewrite MAPCOMP; vauto. - destruct COND as [RF CDS]. - apply wf_rfE in RF; [|apply INV']. - destruct RF as [x0 [RF1 [RF2 [RF3 [INE EQQ]]]]]; vauto. } - all : vauto. } - rewrite reexec_embd_dom0. - rewrite wf_rfE; [| apply INV']. - rewrite dom_eqv1. - rewrite <- seqA. - rewrite codom_seq_eqv_r. - arewrite (E_t' ∩₁ dom_rel (rf_t' ⨾ ⦗E_t'⦘) ⊆₁ E_t'). - { basic_solver. } - destruct SIMRELQ. - clear - seq_inj. - basic_solver 8. } - { unfold cmt'. - rewrite (seq_co SIMRELQ). - rewrite (seq_co SIMREL). - destruct STEP. - destruct reexec_embd_corr. - rewrite <- reexec_embd_co0. - rewrite collect_rel_restr. - { intros x y COND. - unfold compose in COND. - unfold collect_rel in COND. - destruct COND as [x0 [x1 [COND [EQ1 EQ2]]]]. - destruct COND as [x2 [x3 [COND [EQ3 EQ4]]]]. - unfold collect_rel. - exists (f_t (mapper_rev' x0)), (f_t (mapper_rev' x1)); splits. - { exists x2, x3; splits; vauto. - { unfold compose in MAPCOMP. - rewrite MAPCOMP; vauto. - destruct COND as [CO CDS]. - apply wf_coE in CO; [|apply INV']. - destruct CO as [x0 [[INE EQQ] CO2]]; vauto. } + unfold dtrmt'. + unfold cmt'. + rewrite <- !set_interA. + split. + { arewrite (mapper' ↑₁ dtrmt_t ⊆₁ mapper' ↑₁ E_t'). + apply set_subset_collect. + { destruct STEP. + rewrite dtrmt_cmt. + rewrite reexec_embd_dom; vauto. } + clear. basic_solver 8. } + clear. basic_solver 8. } + { unfold WCore.X_start; ins. } + { unfold WCore.X_start; ins. + arewrite ((fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev'). + unfold eq_dom. intros x COND. + destruct SIMREL. + rewrite seq_lab_rev. + { destruct STEP. + destruct reexec_start_wf. + destruct wf_ereq. + unfold compose. + rewrite <- ereq_lab. + { unfold WCore.X_start; ins. + assert (EQQ: mapper_rev x = mapper_rev' x). + { unfold mapper_rev'. desf. + { apply seq_rest_rev. + clear - n COND reexec_embd_dom. + destruct n. + unfold cmt' in COND. + destruct COND as [CND [x0 [IN1 IN2]]]. + unfold set_collect. + exists x0; split; vauto. + apply reexec_embd_dom; vauto. } + { apply NNPP in n. + apply seq_mapeq_rev; vauto. + clear - COND. + destruct COND as [[DTT ES] RST]; vauto. } + unfold not in n0. + apply NNPP in n0. + rewrite seq_maprev; vauto. + { apply INDLEMMA; vauto. + unfold index. + unfold SequentBase.t_1_len, t_1_len. + lia. } + destruct COND as [[DTT ES] RST]; vauto. } + rewrite EQQ; vauto. } + unfold WCore.X_start; ins. + destruct COND as [[DTT ES] RST]. + apply seq_acts in ES. + unfold dtrmt', cmt' in *. + split. + { split. + { destruct DTT as [x0 [DTT M1]]. + rewrite <- M1. + unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + apply dtrmt_cmt in DTT. + apply reexec_embd_dom in DTT; vauto. } + destruct DTT as [x1 [DTT M1]]. + rewrite <- M1. + unfold compose in MAPCOMP. + rewrite MAPCOMP. + { apply rexec_acts; vauto. } + apply dtrmt_cmt in DTT. + apply reexec_embd_dom in DTT; vauto. } + destruct RST as [x1 [RST M1]]. + rewrite <- M1. unfold compose in MAPCOMP. - rewrite MAPCOMP; vauto. - destruct COND as [CO CDS]. - apply wf_coE in CO; [|apply INV']. - destruct CO as [x0 [CO1 [CO2 [CO3 [INE EQQ]]]]]; vauto. } - all : vauto. } - rewrite reexec_embd_dom0. - rewrite wf_coE; [| apply INV']. - rewrite dom_eqv1. - rewrite <- seqA. - rewrite codom_seq_eqv_r. - arewrite (E_t' ∩₁ dom_rel (co_t' ⨾ ⦗E_t'⦘) ⊆₁ E_t'). - { basic_solver. } - destruct SIMRELQ. - clear - seq_inj. - basic_solver 8. } - { unfold cmt'. - rewrite (seq_rmw SIMRELQ). - rewrite (seq_rmw SIMREL). - destruct STEP. - destruct reexec_embd_corr. - rewrite <- reexec_embd_rmw0. - rewrite collect_rel_restr. - { intros x y COND. - unfold compose in COND. - unfold collect_rel in COND. - destruct COND as [x0 [x1 [COND [EQ1 EQ2]]]]. - destruct COND as [x2 [x3 [COND [EQ3 EQ4]]]]. - unfold collect_rel. - exists (f_t (mapper_rev' x0)), (f_t (mapper_rev' x1)); splits. - { exists x2, x3; splits; vauto. - { unfold compose in MAPCOMP. - rewrite MAPCOMP; vauto. - destruct COND as [RM CDS]. - apply wf_rmwE in RM; [|apply INV']. - destruct RM as [x0 [[INE EQQ] RM2]]; vauto. } - unfold compose in MAPCOMP. - rewrite MAPCOMP; vauto. - destruct COND as [RM CDS]. - apply wf_rmwE in RM; [|apply INV']. - destruct RM as [x0 [RM1 [RM2 [RM3 [INE EQQ]]]]]; vauto. } - all : vauto. } - rewrite reexec_embd_dom0. - rewrite wf_rmwE; [| apply INV']. - rewrite dom_eqv1. - rewrite <- seqA. - rewrite codom_seq_eqv_r. - arewrite (E_t' ∩₁ dom_rel (rmw_t' ⨾ ⦗E_t'⦘) ⊆₁ E_t'). - { basic_solver. } - destruct SIMRELQ. - clear - seq_inj. - basic_solver 8. } - unfold cmt'. - intros x COND. - unfold set_collect in COND. - destruct COND as [x0 [COND EQ]]. - destruct COND as [x1 [COND EQ1]]. - rewrite <- EQ1 in EQ. - unfold compose in EQ. - unfold compose in MAPCOMP. - rewrite MAPCOMP in EQ. - { unfold id in EQ. - rewrite <- EQ. - destruct SIMREL. - apply seq_acts. - unfold set_collect. - exists (f_t x1); split; vauto. - apply reexec_embd_acts. - clear - COND. - basic_solver. } - apply reexec_embd_dom; vauto. } - { destruct STEP. unfold rf_complete. - arewrite (WCore.G X_s' = G_s'). - unfold G_s'. simpls. - arewrite ((fun x : actid => - ifP ~ (mapper' ↑₁ E_t') x then x - else (ifP tid x <> t_2 then x - else ThreadEvent t_1 - (t_1_len + index x))) = mapper_rev'). - unfold is_r. unfold compose. - intros x COND. - destruct COND as [MAP RD]. - destruct MAP as [x0 [MAP M1]]; subst. - unfold rf_complete in rexec_rfc. - destruct rexec_rfc with x0; vauto. - { split; vauto. - unfold compose in MAPCOMP. - apply MAPCOMP in MAP. - unfold id in MAP. - rewrite MAP in RD. - unfold is_r; vauto. } - unfold codom_rel. - exists (mapper' x). - unfold collect_rel. - exists x, x0; split; vauto. } - { constructor; ins. - { apply sub_WF with (G := G_s) (sc := ∅₂) (sc' := ∅₂). - { ins. - assert (INITDER : (fun a : actid => is_init a) ⊆₁ dtrmt_t). - { destruct STEP; vauto. } - arewrite ((fun a : actid => is_init a) ⊆₁ mapper' ↑₁ - (fun a : actid => is_init a)). - { destruct SIMRELQ. clear- seq_init. - unfold fixset in seq_init. - basic_solver. } - rewrite INITDER. - unfold dtrmt'; vauto. } - { apply wf_transition with (X_t := X_t) - (t_1 := t_1) (t_2 := t_2) - (mapper := mapper) (mapper_rev := mapper_rev) - (ptc_1 := ptc_1); vauto. } - apply restrict_sub; [basic_solver |]. - unfold dtrmt'. - destruct SIMREL. - rewrite seq_acts. - intros x COND. - unfold set_collect in COND. - destruct COND as [x0 [COND EQ]]. - unfold set_collect. - exists x0; split; vauto. - { destruct STEP. - apply rexec_acts; vauto. } - destruct classic with (tid (mapper - x0) = t_2) as [TID2 | TID2]. - { assert (TID2' : tid (mapper x0) = t_2) by vauto. - assert (TID2S : tid (mapper x0) = t_2) by vauto. - apply seq_index in TID2. - apply seq_thrd in TID2'. - { apply INDLEMMA. - { unfold mapper'. desf. } - { unfold mapper'. - rewrite TID2S. clear TID2S. - desf. - { destruct STEP. - apply dtrmt_cmt in COND. - apply reexec_embd_dom in COND; vauto. } - symmetry in TID2. - rewrite <- TID2 in l. - exfalso. unfold Events.index in *. - unfold SequentBase.t_1_len in *. - unfold t_1_len in *. - lia. } - unfold mapper'. - rewrite TID2. clear TID2. - desf. - { destruct STEP. - apply dtrmt_cmt in COND. - apply reexec_embd_dom in COND; vauto. } - { exfalso. unfold Events.index in *. - unfold SequentBase.t_1_len in *. - unfold t_1_len in *. - lia. } - unfold Events.index in *. - unfold t_1_len in *. - unfold SequentBase.t_1_len in *. - lia. } - { destruct STEP. apply rexec_acts; vauto. } - destruct STEP. apply rexec_acts; vauto. } - assert (TID2' : tid (mapper x0) <> t_2) by vauto. - assert (TID2S : tid (mapper x0) <> t_2) by vauto. - apply seq_mapeq in TID2. - { rewrite TID2. clear TID2. - unfold mapper'. desf. - apply INDLEMMA. - { unfold not in n0. - apply NNPP in n0. - rewrite n0; vauto. } - { unfold tid. - unfold not in n0. - apply NNPP in n0. - apply seq_out_move in n0; vauto. - { apply seq_mapeq in TID2S; vauto. - rewrite TID2S in n0. - desf. - destruct STEP. apply rexec_acts; vauto. } - { destruct STEP. apply rexec_acts; vauto. } - unfold Events.index in *. - unfold t_1_len in *. - unfold SequentBase.t_1_len in *. - lia. } - unfold Events.index in *. - unfold not in n0. - apply NNPP in n0. - apply seq_out_move in n0; vauto. - { apply seq_mapeq in TID2S; vauto. - { rewrite TID2S in n0. - desf. } - destruct STEP. apply rexec_acts; vauto. } - { destruct STEP. apply rexec_acts; vauto. } - unfold Events.index in *. - unfold t_1_len in *. - unfold SequentBase.t_1_len in *. - lia. } - destruct STEP. apply rexec_acts; vauto. } - { constructor. + rewrite MAPCOMP. + { unfold id; vauto. } + apply reexec_embd_dom in RST; vauto. } + destruct COND as [[DTT ES] RST]; vauto. } { unfold WCore.X_start; ins. - destruct SIMRELQ. - unfold dtrmt'. - unfold cmt'. - rewrite <- !set_interA. + destruct STEP. + destruct reexec_start_wf. + destruct wf_ereq. split. - { arewrite (mapper' ↑₁ dtrmt_t ⊆₁ mapper' ↑₁ E_t'). - apply set_subset_collect. - { destruct STEP. - rewrite dtrmt_cmt. - rewrite reexec_embd_dom; vauto. } - clear. basic_solver 8. } - clear. basic_solver 8. } - { unfold WCore.X_start; ins. } - { unfold WCore.X_start; ins. - arewrite ((fun x : actid => - ifP ~ (mapper' ↑₁ E_t') x then x - else (ifP tid x <> t_2 then x - else ThreadEvent t_1 - (t_1_len + index x))) = mapper_rev'). - unfold eq_dom. intros x COND. - destruct SIMREL. - rewrite seq_lab_rev. - { destruct STEP. - destruct reexec_start_wf. - destruct wf_ereq. - unfold compose. - rewrite <- ereq_lab. - { unfold WCore.X_start; ins. - assert (EQQ: mapper_rev x = mapper_rev' x). - { unfold mapper_rev'. desf. - { apply seq_rest_rev. - clear - n COND reexec_embd_dom. - destruct n. - unfold cmt' in COND. - destruct COND as [CND [x0 [IN1 IN2]]]. - unfold set_collect. - exists x0; split; vauto. - apply reexec_embd_dom; vauto. } - { apply NNPP in n. - apply seq_mapeq_rev; vauto. - clear - COND. - destruct COND as [[DTT ES] RST]; vauto. } - unfold not in n0. - apply NNPP in n0. - rewrite seq_maprev; vauto. - { apply INDLEMMA; vauto. - unfold index. - unfold SequentBase.t_1_len, t_1_len. - lia. } - destruct COND as [[DTT ES] RST]; vauto. } - rewrite EQQ; vauto. } - unfold WCore.X_start; ins. - destruct COND as [[DTT ES] RST]. - apply seq_acts in ES. - unfold dtrmt', cmt' in *. - split. - { split. - { destruct DTT as [x0 [DTT M1]]. - rewrite <- M1. - unfold compose in MAPCOMP. - rewrite MAPCOMP; vauto. - apply dtrmt_cmt in DTT. - apply reexec_embd_dom in DTT; vauto. } - destruct DTT as [x1 [DTT M1]]. - rewrite <- M1. - unfold compose in MAPCOMP. - rewrite MAPCOMP. - { apply rexec_acts; vauto. } - apply dtrmt_cmt in DTT. - apply reexec_embd_dom in DTT; vauto. } - destruct RST as [x1 [RST M1]]. - rewrite <- M1. - unfold compose in MAPCOMP. - rewrite MAPCOMP. - { unfold id; vauto. } - apply reexec_embd_dom in RST; vauto. } - destruct COND as [[DTT ES] RST]; vauto. } - { unfold WCore.X_start; ins. - destruct STEP. - destruct reexec_start_wf. - destruct wf_ereq. - split. - { intros x y COND. - unfold restr_rel in *. - destruct COND as [CD1 [CD2 CD3]]. - split; vauto. - destruct CD1 as [x0 [[EQ1 DT1] - [x1 [RF [EQ2 DT2]]]]]; subst. - destruct ereq_rf as [IN OUT]. - destruct DT1 as [x2 [DT1 M1]]. - destruct DT2 as [x3 [DT2 M2]]. - destruct IN with x2 x3. + { intros x y COND. + unfold restr_rel in *. + destruct COND as [CD1 [CD2 CD3]]. + split; vauto. + destruct CD1 as [x0 [[EQ1 DT1] + [x1 [RF [EQ2 DT2]]]]]; subst. + destruct ereq_rf as [IN OUT]. + destruct DT1 as [x2 [DT1 M1]]. + destruct DT2 as [x3 [DT2 M2]]. + destruct IN with x2 x3. { unfold WCore.X_start; ins. apply (seq_rf SIMREL) in RF. unfold collect_rel in RF. @@ -2364,152 +1674,854 @@ Proof using. red; split; vauto. destruct CD3 as [[CD1 CD3] CD4]; vauto. } all : vauto. } - { unfold WCore.X_start; ins. - rewrite (seq_data SIMREL). - clear; basic_solver 8. } - { unfold WCore.X_start; ins. - rewrite (seq_ctrl SIMREL). - clear; basic_solver 8. } - unfold WCore.X_start; ins. - rewrite (seq_rmw_dep SIMREL). - clear; basic_solver 8. } - { unfold rf_complete. - unfold restrict; ins. - arewrite ((fun x : actid => - ifP ~ (mapper' ↑₁ E_t') x - then x - else (ifP tid x <> t_2 then x - else ThreadEvent t_1 - (t_1_len + - index x))) = mapper_rev'). + { unfold WCore.X_start; ins. + rewrite (seq_data SIMREL). + clear; basic_solver 8. } + { unfold WCore.X_start; ins. + rewrite (seq_ctrl SIMREL). + clear; basic_solver 8. } + unfold WCore.X_start; ins. + rewrite (seq_rmw_dep SIMREL). + clear; basic_solver 8. } + { unfold rf_complete. + unfold restrict; ins. + arewrite ((fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x + then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + + index x))) = mapper_rev'). + destruct STEP. + intros x COND. + destruct COND as [[CD2 CD3] CD1]. + destruct CD2 as [x0 [CM MP]]. + destruct reexec_start_wf. + destruct wf_rfc with x0. + { split. + { unfold restrict; ins. + split; vauto. + apply reexec_embd_dom in CM; vauto. } + unfold restrict; ins. + unfold compose in CD1. + unfold is_r in *. + rewrite <- MP in CD1. + unfold compose in MAPCOMP. + rewrite MAPCOMP in CD1. + { unfold id in CD1; vauto. } + apply reexec_embd_dom in CM; vauto. } + unfold restrict in H; ins. + unfold codom_rel. + exists (mapper' x1). + unfold seq. exists (mapper' x1); split. + { red. split; vauto. + destruct H as [x2 [[EQQ CMM] MP]]; subst. + unfold cmt'. + unfold set_collect. + exists x2; split; vauto. } + exists x; split; vauto. + unfold collect_rel. + exists x1, x0; splits; vauto. + destruct H as [x2 [[EQQ CMM] + [x3 [RF [CM3 EQ]]]]]; subst; vauto. } + intros x COND. + destruct COND as [[DTT ESS] RD]. + destruct DTT as [x0 [DTT MP1]]. + destruct STEP. + destruct reexec_start_wf. + destruct wf_sub_rfD with x0. + { unfold WCore.X_start; ins. + split. + { split; vauto. + apply rexec_acts; vauto. } + rewrite <- MP1 in RD. + unfold is_r in *. + destruct SIMREL. + rewrite seq_lab. + { unfold compose. + assert (COND : mapper' x0 = mapper x0). + { apply DTRSAME in DTT; vauto. } + rewrite <- COND; vauto. } + apply rexec_acts; vauto. } + { left. unfold WCore.X_start; ins. + destruct SIMREL. + destruct H as [x1 PTH]. + unfold codom_rel. exists (mapper' x1). + unfold seq. exists (mapper' x1); split. + { red. split; vauto. + unfold dtrmt'. unfold set_collect. + exists x1; split; vauto. + destruct PTH as [x2 [[EQQ CMM] MP]]; subst; vauto. } + exists x; split; vauto. + apply seq_rf. + unfold collect_rel. + exists x1, x0; splits; vauto. + { destruct PTH as [x2 [[EQQ CMM] + [x3 [RF [CM3 EQ]]]]]; subst; vauto. } + { apply DTRSAME. + destruct PTH as [x2 [[EQQ CMM] MP]]; vauto. } + apply DTRSAME. + destruct PTH as [x2 [[EQQ CMM] MP]]; vauto. } + right. + unfold cmt'. + unfold set_collect. + exists x0; split; vauto. } + + assert (RFCS : rf_complete (WCore.G X_s')). + { destruct STEP. unfold rf_complete. + arewrite (WCore.G X_s' = G_s'). + unfold G_s'. simpls. + arewrite ((fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev'). + unfold is_r. unfold compose. + intros x COND. + destruct COND as [MAP RD]. + destruct MAP as [x0 [MAP M1]]; subst. + unfold rf_complete in rexec_rfc. + destruct rexec_rfc with x0; vauto. + { split; vauto. + unfold compose in MAPCOMP. + apply MAPCOMP in MAP. + unfold id in MAP. + rewrite MAP in RD. + unfold is_r; vauto. } + unfold codom_rel. + exists (mapper' x). + unfold collect_rel. + exists x, x0; split; vauto. } + + assert (CONSS : WCore.is_cons (WCore.G X_s')). + { apply XmmCons.monoton_cons with (G_t := G_t') + (m := mapper'); vauto. + all : try arewrite (WCore.G X_s' = G_s'). + { apply SIMRELQ. } + { unfold G_s'; ins. + arewrite ((fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev'). + unfold compose. unfold eq_dom. + intros x COND. + unfold compose in MAPCOMP. + apply MAPCOMP in COND. + rewrite COND. + unfold id; vauto. } + { intros x y PTH. + destruct PTH as [SBP SL]. + unfold sb in SBP. + unfold G_s' in SBP; ins. + destruct SBP as [x0 [[EQ1 INE1] + [x1 [PTH [EQ2 INE2]]]]]; subst. + unfold collect_rel. + destruct INE1 as [x2 [INE1 M1]]. + destruct INE2 as [x3 [INE2 M2]]. + exists x2, x3; splits; vauto. + split. + { unfold sb. + unfold seq. exists x2; split; vauto. + exists x3; split; vauto. + apply EXTSBL; vauto. } + assert (MAPP : (fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev') by vauto. + rewrite MAPP in SL. + unfold same_loc in SL. + unfold loc in SL. + unfold compose in SL. + unfold compose in MAPCOMP. + apply MAPCOMP in INE1. + unfold id in INE1. + apply MAPCOMP in INE2. + unfold id in INE2. + rewrite INE1, INE2 in SL. + unfold same_loc, loc; vauto. } + { apply INV'. } + { arewrite (G_s' = (WCore.G X_s')). + apply wf_transition with (X_t := X_t') + (t_1 := t_1) (t_2 := t_2) + (mapper := mapper') (mapper_rev := mapper_rev') + (ptc_1 := ptc_1); vauto. } + destruct STEP; vauto. } + + assert (STURG : WCore.stable_uncmt_reads_gen X_s' cmt' thrdle'). + { constructor. + { destruct STEP. destruct reexec_sur. + unfold least_elt. intros trn INIT. + unfold thrdle'. + right. + split; vauto. + unfold least_elt in surg_init_least. + specialize (surg_init_least trn INIT). + clear - surg_init_least. + basic_solver. } + { unfold min_elt. intros trn INIT. + assert (FLS : codom_rel thrdle' tid_init). + { clear - INIT. basic_solver. } + unfold thrdle' in INIT. + apply codom_union in FLS. + destruct FLS as [FLS | FLS1]. + { apply codom_union in FLS. + destruct FLS as [FLS | FLS2]. + { apply codom_union in FLS. + destruct FLS as [FLS | FLS3]. + { apply codom_union in FLS. + destruct FLS as [FLS | FLS4]. + { destruct STEP. destruct reexec_sur. + unfold min_elt in surg_init_min. + destruct FLS as [x FLS]. + specialize (surg_init_min x). + apply surg_init_min. + vauto. } + clear - NINIT1 FLS4. + apply codom_crossed in FLS4. + desf. } + clear - NINIT2 FLS3. + apply codom_crossed in FLS3. + desf. } + apply codom_crossed in FLS2. + destruct STEP. destruct reexec_sur. + clear - FLS2 surg_init_min. + unfold min_elt in surg_init_min. + destruct FLS2 as [x FLS2]. + specialize (surg_init_min x). + apply surg_init_min. + destruct FLS2 as [x0 [EQ FLS2]]. + destruct EQ. desf. } + apply codom_crossed in FLS1. + destruct STEP. destruct reexec_sur. + clear - FLS1 surg_init_min. + unfold min_elt in surg_init_min. + destruct FLS1 as [x FLS1]. + specialize (surg_init_min x). + desf. } + { constructor. + { unfold thrdle'. + repeat (apply irreflexive_union; split). + { destruct STEP. destruct reexec_sur. + unfold strict_partial_order in surg_order. + destruct surg_order as [IRR _]; vauto. } + { clear - THRDNEQ. basic_solver. } + { intros x COND. + destruct COND as [CD1 CD2]; subst x. + destruct CD1 as [x1 [x2 [CD1 CD2]]]. + apply THRLEE in CD1. + destruct CD1 as [x3 [[EQ INE] CD3]]. + subst x3. desf. } + { intros x COND. + destruct COND as [CD1 CD2]; subst x. + destruct CD2 as [x1 [x2 [CD1 CD2]]]. + apply THRLEE in CD2. + destruct CD2 as [x3 [CD2 [x4 [CD3 [EQ INE]]]]]. + subst x4. desf. } + destruct STEP. destruct reexec_sur. + unfold min_elt in surg_init_min. + clear - surg_init_min. + intros x [EQ [y FLS]]. + specialize (surg_init_min y). + basic_solver 4. } + unfold thrdle'. unfold transitive. + intros x y z XY YZ. + destruct XY as [[[[C1 | C1] | C1] | C1] | C1]. + all : destruct YZ as [[[[C2 | C2] | C2] | C2] | C2]. + all : destruct STEP. + all : destruct reexec_sur. + all : destruct surg_order as [IR TR]. + { do 4 left. clear - C1 C2 TR. basic_solver 4. } + { destruct C2 as [EQ1 EQ2]. + subst y. apply THRLEE in C1. + destruct C1 as [x3 [CD2 [x4 [CD3 [EQ INE]]]]]. + desf. } + { do 2 left; right. + clear - C1 C2 TR. + destruct C2 as [C2 EQ]; subst z. + split; vauto. + destruct C2 as [x0 [x1 [CD2 [EQ1 EQ2]]]]; subst. + basic_solver 8. } + { destruct C2 as [EQ1 EQ2]. + subst y. apply THRLEE in C1. + destruct C1 as [x3 [CD2 [x4 [CD3 [EQ INE]]]]]. + desf. } + { clear - C1 C2 surg_init_min. + exfalso. unfold min_elt in surg_init_min. + destruct C2 as [C2 C3]. + basic_solver 4. } + { left; right. + clear - C1 C2 TR. + destruct C1 as [C1 EQ]; subst x y. + split; vauto. } + { clear - C1 C2 THRDNEQ. + destruct C1 as [C1 EQ]; subst x y. + destruct C2 as [C2 EQ1]; subst z. + exfalso. desf. } + { clear - C1 C2 IR. + exfalso. + destruct C1 as [C1 EQ]; subst x y. + destruct C2 as [C2 EQ1]; subst z. + destruct IR with t_1. + destruct C2 as [x0 [x1 [CD [EQ1 EQ2]]]]; subst. + vauto. } + { clear - C1 C2 THRDNEQ. + destruct C1 as [C1 EQ]; subst x y. + destruct C2 as [C2 EQ1]. + exfalso. desf. } + { clear - C1 C2 NINIT1. + destruct C1 as [C1 EQ]; subst x y. + destruct C2 as [C2 EQ1]. + exfalso. desf. } + { destruct C1 as [EQ1 EQ2]. + subst y. apply THRLEE in C2. + destruct C2 as [x3 [[EQ TD] [x4 [CD3 CD4]]]]. + desf. } + { do 4 left. clear - C1 C2 TR. + destruct C2 as [C2 EQ]; subst y z. + destruct C1 as [C1 EQ1]. + destruct C1 as [x0 [x1 [CD1 [EQ2 EQ3]]]]; subst. + vauto. } + { destruct C1 as [EQ1 EQ2]. + subst y. + destruct C2 as [C2 EQ]; subst z. + destruct C2 as [x0 [x1 [CD2 [EQ3 EQ4]]]]; subst. + apply THRLEE in CD2. + destruct CD2 as [x3 [[EQ TD] [x4 [CD3 CD4]]]]. + desf. } + { do 4 left. clear - C1 C2 TR. + destruct C2 as [C2 EQ]; subst. + destruct C1 as [C1 EQ1]; subst. + destruct C1 as [x0 [x1 [CD1 [EQ2 EQ3]]]]; subst. + destruct EQ as [x1 [x2 [[EQ INE] CDD]]]; subst. + basic_solver 8. } + { clear - C1 C2 NINIT2. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + exfalso. desf. } + { left; right. + clear - C1 C2 TR. + destruct C1 as [EQ1 EQ2]. + subst x. split; vauto. + unfold codom_rel. + destruct EQ2 as [x0 [x1 [[EQ1 EQ2] CD]]]. + basic_solver 8. } + { clear - C1 C2 THRLEE T2NOTIN. + destruct C2 as [C2 EQ]; subst. + destruct C1 as [C1 EQ1]; subst. + destruct EQ1 as [x0 [x1 [[EQ1 EQ2] CD]]]. + apply THRLEE in CD. + destruct CD as [x3 [[EQ TD] [x4 [CD3 [EQ3 TD2]]]]]. + desf. } + { clear - C1 C2 IR TR. + exfalso. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + destruct EQ as [x0 [x1 [[EQ1 EQ2] CD]]]; subst. + destruct C2 as [x2 [x3 [CD2 [INE1 INE2]]]]; subst. + basic_solver 8. } + { destruct C1 as [EQ1 EQ2]. + subst x. + destruct C2 as [C2 EQ]; subst. + destruct EQ2 as [x0 [x1 [CD2 CD3]]]; subst. + apply THRLEE in CD3. + destruct CD3 as [x3 [[EQ2 TD] [x4 [CD3 [EQ3 EQ4]]]]]. + desf. } + { clear - C1 C2 surg_init_min TR. + exfalso. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + destruct EQ as [x0 [x1 [[EQ3 EQ2] CD]]]; subst. + destruct surg_init_min with x1; vauto. } + { do 4 left. clear - C1 C2 TR surg_init_least surg_init_min. + destruct C1. + destruct H0 as [x0 CND]; subst. + unfold least_elt in surg_init_least. + apply surg_init_least. + intros FLS. basic_solver 12. } + { clear - C1 C2 THRLEE T2NOTIN. + exfalso. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + destruct EQ as [x0 CND]; subst. + apply THRLEE in CND. + destruct CND as [x3 [[EQ2 TD] [x4 [CD3 [EQ3 EQ4]]]]]. + desf. } + { do 2 left; right. + clear - C1 C2 TR NINIT1 surg_init_least. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + split; vauto. + unfold dom_rel. + exists t_1; vauto. + unfold seq; exists t_1; split; vauto. + unfold least_elt in surg_init_least. + specialize (surg_init_least t_1). + apply surg_init_least. + basic_solver. } + { clear - C1 C2 THRLEE T2NOTIN. + exfalso. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + destruct EQ as [x0 CND]; subst. + apply THRLEE in CND. + destruct CND as [x3 [[EQ2 TD] [x4 [CD3 [EQ3 EQ4]]]]]. + desf. } + clear - C1 C2 surg_init_min. + destruct C1 as [C1 EQ]; subst. + destruct C2 as [C2 EQ1]; subst. + exfalso. + unfold min_elt in surg_init_min. + destruct EQ as [x0 CND]. + specialize (surg_init_min x0). + vauto. } + admit. } + + unfold WCore.reexec. + exists thrdle'. + constructor; vauto. + { unfold dtrmt'. destruct SIMRELQ. + arewrite ((fun a : actid => is_init a) ⊆₁ + mapper' ↑₁ (fun a : actid => is_init a)). + { clear- seq_init. + unfold fixset in seq_init. + basic_solver. } + destruct STEP. + rewrite dtrmt_init; vauto. } + { unfold dtrmt', cmt'. + rewrite (WCore.dtrmt_cmt STEP); vauto. } + { unfold dtrmt'. + unfold fixset. + intros x DTT. + destruct DTT as [x0 [INX DTT]]. + subst. unfold compose. + assert (HLP : mapper_rev' (mapper' x0) = x0). + { unfold compose in MAPCOMP. + apply MAPCOMP. destruct STEP. + apply dtrmt_cmt, reexec_embd_dom in INX; vauto. } + rewrite HLP. + arewrite (f_t x0 = x0). + { destruct STEP. + apply dtrmt_fixed; vauto. } + apply DTRSAME; vauto. } + { destruct STEP. unfold cmt'. + arewrite (WCore.G X_s' = G_s'). + unfold G_s'. simpls. + basic_solver 8. } + { unfold sb. rewrite !seqA. + rewrite <- !id_inter. + rewrite <- seqA with (r1 := ⦗dtrmt'⦘). + rewrite <- id_inter. + unfold dtrmt'. destruct SIMREL. + rewrite seq_acts. + intros x y PTH. + destruct PTH as [x0 [[EQ1 IN1] + [x1 [PTH [EQ2 [IN2 IN3]]]]]]. + destruct IN1 as [x2 [IN1 M1]]. + destruct IN2 as [x3 [IN2 M2]]. + subst. + unfold seq. exists (mapper x2); split. + { red; split; vauto. + split; [| basic_solver]. + destruct STEP. + destruct reexec_dtrmt_sb_closed with + (x := x2) (y := x3). + { unfold seq. exists x3; split. + { destruct x2. + { unfold sb. + unfold seq; exists (InitEvent l); split; vauto. + exists x3; split; vauto. + unfold ext_sb. desf. + rewrite !seq_init in PTH; vauto. } + destruct classic with (tid (mapper + (ThreadEvent thread index)) = t_2) as [TID2 | TID2]. + { rewrite seq_mapto in PTH. + { destruct x3. + { rewrite !seq_init in PTH; vauto. } + destruct classic with (tid (mapper + (ThreadEvent thread0 index0)) = t_2) as [TID2' | TID2']. + { rewrite seq_mapto in PTH. + { assert (TD1 : thread = t_1). + { apply seq_thrd in TID2; vauto. } + assert (TD2 : thread0 = t_1). + { apply seq_thrd in TID2'; vauto. } + clear - PTH IN1 IN2 TID2 TID2' TD1 TD2. + unfold sb. unfold seq. + exists (ThreadEvent thread index); split; vauto. + exists (ThreadEvent t_1 index0); split; vauto. + unfold ext_sb. desf; split; vauto. + unfold ext_sb in PTH. desf. + unfold Events.index in *. lia. } + all : vauto. } + clear - TID2 TID2' PTH IN1 IN2. + unfold sb. unfold seq. + exists (ThreadEvent thread index); split; vauto. + exists (ThreadEvent thread0 index0); split; vauto. + unfold ext_sb in *. + unfold tid in *. + desf; desf. } + all : vauto. } + destruct x3. + { exfalso. + assert (HLP : mapper (InitEvent l) + = InitEvent l). + { rewrite seq_init; vauto. } + rewrite HLP in PTH. + clear - PTH. + unfold ext_sb in PTH. + desf. } + destruct classic with (tid (mapper + (ThreadEvent thread0 index0)) = t_2) as [TID2' | TID2']. + { clear - TID2 TID2' PTH IN1 IN2 seq_init seq_init_rev MAPREV. + unfold sb. unfold seq. + exists (ThreadEvent thread index); split; vauto. + exists (ThreadEvent thread0 index0); split; vauto. + exfalso. unfold ext_sb in *. + unfolder. desf. + { assert (Heqq : mapper_rev (mapper (ThreadEvent thread index)) = + mapper_rev (InitEvent l)). + { rewrite Heq; vauto. } + unfold compose in MAPREV. + rewrite MAPREV in Heqq; vauto. + unfold id in Heqq. + rewrite seq_init_rev in Heqq; vauto. } + unfold tid in *. desf. } + assert (EQQ1 : mapper (ThreadEvent thread index) = + ThreadEvent thread index). + { rewrite seq_mapeq; vauto. } + assert (EQQ2 : mapper (ThreadEvent thread0 index0) = + ThreadEvent thread0 index0). + { rewrite seq_mapeq; vauto. } + rewrite EQQ1, EQQ2 in PTH. + unfold sb. unfold seq. + exists (ThreadEvent thread index); split; vauto. } + red; split; vauto. + unfold set_collect in IN3. + destruct IN3 as [x4 [IN3 EQ]]. + assert (IN4 : E_t' x4). + { apply dtrmt_cmt, reexec_embd_dom in IN3; vauto. } + unfold mapper' in EQ. + apply MAPS in EQ; vauto. } + unfold set_collect. + exists x2; split. + { destruct H as [DT _]. + red in DT. basic_solver 4. } + destruct x2. + { rewrite seq_init; vauto. + destruct SIMRELQ. + rewrite seq_init0; vauto. } + destruct H as [DT SB]. + destruct classic with (tid (mapper + (ThreadEvent thread index)) = t_2) as [TID2 | TID2]. + { assert (TID2' : tid (mapper (ThreadEvent thread index)) = t_2) by vauto. + assert (TID2S : tid (mapper (ThreadEvent thread index)) = t_2) by vauto. + apply seq_index in TID2. + apply seq_thrd in TID2'. + { apply INDLEMMA. + { unfold mapper'. desf. + { rewrite TID2'; vauto. } + unfold not in n0. + apply NNPP in n0. + rewrite n0; vauto. } + { unfold mapper'. + rewrite TID2S. clear TID2S. + desf. + { red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } + symmetry in TID2. + rewrite <- TID2 in l. + exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold mapper'. + rewrite TID2. clear TID2. + desf. + { red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } + { exfalso. unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + { red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } + red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } + assert (TID2' : tid (mapper (ThreadEvent thread index)) <> t_2) by vauto. + assert (TID2S : tid (mapper (ThreadEvent thread index)) <> t_2) by vauto. + apply seq_mapeq in TID2. + { rewrite TID2. clear TID2. + unfold mapper'. desf. + apply INDLEMMA. + { unfold tid; vauto. } + { unfold tid. + unfold not in n0. + apply NNPP in n0. + apply seq_out_move in n0; vauto. + { apply seq_mapeq in TID2S; vauto. + rewrite TID2S in n0. + desf. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + unfold Events.index in *. + unfold not in n0. + apply NNPP in n0. + apply seq_out_move in n0; vauto. + { apply seq_mapeq in TID2S; vauto. + rewrite TID2S in n0. + desf. } + unfold Events.index in *. + unfold t_1_len in *. + unfold SequentBase.t_1_len in *. + lia. } + red in DT. destruct DT as [EQ DT]. + apply dtrmt_cmt in DT. + apply reexec_embd_dom in DT; vauto. } + exists (mapper x3); split; vauto. + red; split; vauto. } + { unfold nin_sb. + rewrite SBSEQ. + rewrite <- seq_eqv_minus_ll. + admit. (* something for immediate of exclusion is needed *)} + { arewrite (WCore.G X_s' = G_s'). + unfold G_s' at 1; ins. + intros x COND. + destruct COND as (INE & NDT). + unfold set_compl. intros FLS. + destruct INE as [x0 [INE M1]]; subst. + unfold dtrmt' in NDT. + assert (DTRM : ~ dtrmt_t x0). + { intros FLSS. + apply NDT. unfold set_collect. + exists x0; split; vauto. } + destruct FLS as [FL1 | FL2]. + { assert (FLS : (Rel G_t') x0). + { assert (SUBST : (fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev') by vauto. + rewrite SUBST in FL1. + unfold compose in FL1. + unfold is_rel, mod in *. + assert (HLP : mapper_rev' (mapper' x0) = x0). + { unfold compose in MAPCOMP. + apply MAPCOMP in INE. + unfold id in INE; vauto. } + rewrite HLP in FL1; vauto. } + destruct STEP. + clear - reexec_dtrmt_rpo FLS DTRM INE. + unfold set_compl in reexec_dtrmt_rpo. + destruct reexec_dtrmt_rpo with x0; vauto. } + assert (FLS : (Acq G_t') x0). + { assert (SUBST : (fun x : actid => + ifP ~ (mapper' ↑₁ E_t') x then x + else (ifP tid x <> t_2 then x + else ThreadEvent t_1 + (t_1_len + index x))) = mapper_rev') by vauto. + rewrite SUBST in FL2. + unfold compose in FL2. + unfold is_acq, mod in *. + assert (HLP : mapper_rev' (mapper' x0) = x0). + { unfold compose in MAPCOMP. + apply MAPCOMP in INE. + unfold id in INE; vauto. } + rewrite HLP in FL2; vauto. } + destruct STEP. + clear - reexec_dtrmt_rpo FLS DTRM INE. + unfold set_compl in reexec_dtrmt_rpo. + destruct reexec_dtrmt_rpo with x0; vauto. } + { destruct STEP. + destruct reexec_embd_corr. + constructor; vauto. + { unfold cmt'. + unfold inj_dom. + intros x y CD1 CD2 EQQ. + destruct CD1 as [x0 [CD1 M1]]. + destruct CD2 as [x1 [CD2 M2]]. + subst. + unfold compose in EQQ. + unfold compose in MAPCOMP. + assert (HLP1 : mapper_rev' (mapper' x0) = x0). + { unfold compose in MAPCOMP. + apply MAPCOMP. + apply reexec_embd_dom in CD1; vauto. } + assert (HLP2 : mapper_rev' (mapper' x1) = x1). + { unfold compose in MAPCOMP. + apply MAPCOMP. + apply reexec_embd_dom in CD2; vauto. } + rewrite HLP1, HLP2 in EQQ. + destruct SIMREL. + apply seq_inj in EQQ. + { apply reexec_embd_inj in EQQ; vauto. } + { apply reexec_embd_acts; red. + exists x0; vauto. } + apply reexec_embd_acts; red. + exists x1; vauto. } + { intros e CMT. + unfold cmt' in CMT. + unfold set_collect in CMT. + destruct CMT as [x [CMT EQ]]. + specialize (reexec_embd_lab x). + assert (INE : E_t' x). + { apply reexec_embd_dom in CMT; vauto. } + assert (CMT' : cmt_t x) by vauto. + apply reexec_embd_lab in CMT. + destruct SIMRELQ. + apply seq_lab in INE. + unfold compose in INE. + rewrite EQ in INE. + rewrite <- INE. + destruct SIMREL. + rewrite CMT. + subst. + unfold compose. + unfold compose in MAPCOMP. + rewrite MAPCOMP. + { unfold id. + apply seq_lab0. + apply reexec_embd_acts; red; vauto. } + apply reexec_embd_dom; vauto. } + { admit. (* needs a better analysis of sb structure *) } + { unfold cmt'. + rewrite (seq_rf SIMRELQ). + rewrite (seq_rf SIMREL). + destruct STEP. + destruct reexec_embd_corr. + rewrite <- reexec_embd_rf0. + rewrite collect_rel_restr. + { intros x y COND. + unfold compose in COND. + unfold collect_rel in COND. + destruct COND as [x0 [x1 [COND [EQ1 EQ2]]]]. + destruct COND as [x2 [x3 [COND [EQ3 EQ4]]]]. + unfold collect_rel. + exists (f_t (mapper_rev' x0)), (f_t (mapper_rev' x1)); splits. + { exists x2, x3; splits; vauto. + { unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [RF CDS]. + apply wf_rfE in RF; [|apply INV']. + destruct RF as [x0 [[INE EQQ] RF2]]; vauto. } + unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [RF CDS]. + apply wf_rfE in RF; [|apply INV']. + destruct RF as [x0 [RF1 [RF2 [RF3 [INE EQQ]]]]]; vauto. } + all : vauto. } + rewrite reexec_embd_dom0. + rewrite wf_rfE; [| apply INV']. + rewrite dom_eqv1. + rewrite <- seqA. + rewrite codom_seq_eqv_r. + arewrite (E_t' ∩₁ dom_rel (rf_t' ⨾ ⦗E_t'⦘) ⊆₁ E_t'). + { basic_solver. } + destruct SIMRELQ. + clear - seq_inj. + basic_solver 8. } + { unfold cmt'. + rewrite (seq_co SIMRELQ). + rewrite (seq_co SIMREL). destruct STEP. - intros x COND. - destruct COND as [[CD2 CD3] CD1]. - destruct CD2 as [x0 [CM MP]]. - destruct reexec_start_wf. - destruct wf_rfc with x0. - { split. - { unfold restrict; ins. - split; vauto. - apply reexec_embd_dom in CM; vauto. } - unfold restrict; ins. - unfold compose in CD1. - unfold is_r in *. - rewrite <- MP in CD1. - unfold compose in MAPCOMP. - rewrite MAPCOMP in CD1. - { unfold id in CD1; vauto. } - apply reexec_embd_dom in CM; vauto. } - unfold restrict in H; ins. - unfold codom_rel. - exists (mapper' x1). - unfold seq. exists (mapper' x1); split. - { red. split; vauto. - destruct H as [x2 [[EQQ CMM] MP]]; subst. - unfold cmt'. - unfold set_collect. - exists x2; split; vauto. } - exists x; split; vauto. - unfold collect_rel. - exists x1, x0; splits; vauto. - destruct H as [x2 [[EQQ CMM] - [x3 [RF [CM3 EQ]]]]]; subst; vauto. } + destruct reexec_embd_corr. + rewrite <- reexec_embd_co0. + rewrite collect_rel_restr. + { intros x y COND. + unfold compose in COND. + unfold collect_rel in COND. + destruct COND as [x0 [x1 [COND [EQ1 EQ2]]]]. + destruct COND as [x2 [x3 [COND [EQ3 EQ4]]]]. + unfold collect_rel. + exists (f_t (mapper_rev' x0)), (f_t (mapper_rev' x1)); splits. + { exists x2, x3; splits; vauto. + { unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [CO CDS]. + apply wf_coE in CO; [|apply INV']. + destruct CO as [x0 [[INE EQQ] CO2]]; vauto. } + unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [CO CDS]. + apply wf_coE in CO; [|apply INV']. + destruct CO as [x0 [CO1 [CO2 [CO3 [INE EQQ]]]]]; vauto. } + all : vauto. } + rewrite reexec_embd_dom0. + rewrite wf_coE; [| apply INV']. + rewrite dom_eqv1. + rewrite <- seqA. + rewrite codom_seq_eqv_r. + arewrite (E_t' ∩₁ dom_rel (co_t' ⨾ ⦗E_t'⦘) ⊆₁ E_t'). + { basic_solver. } + destruct SIMRELQ. + clear - seq_inj. + basic_solver 8. } + { unfold cmt'. + rewrite (seq_rmw SIMRELQ). + rewrite (seq_rmw SIMREL). + destruct STEP. + destruct reexec_embd_corr. + rewrite <- reexec_embd_rmw0. + rewrite collect_rel_restr. + { intros x y COND. + unfold compose in COND. + unfold collect_rel in COND. + destruct COND as [x0 [x1 [COND [EQ1 EQ2]]]]. + destruct COND as [x2 [x3 [COND [EQ3 EQ4]]]]. + unfold collect_rel. + exists (f_t (mapper_rev' x0)), (f_t (mapper_rev' x1)); splits. + { exists x2, x3; splits; vauto. + { unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [RM CDS]. + apply wf_rmwE in RM; [|apply INV']. + destruct RM as [x0 [[INE EQQ] RM2]]; vauto. } + unfold compose in MAPCOMP. + rewrite MAPCOMP; vauto. + destruct COND as [RM CDS]. + apply wf_rmwE in RM; [|apply INV']. + destruct RM as [x0 [RM1 [RM2 [RM3 [INE EQQ]]]]]; vauto. } + all : vauto. } + rewrite reexec_embd_dom0. + rewrite wf_rmwE; [| apply INV']. + rewrite dom_eqv1. + rewrite <- seqA. + rewrite codom_seq_eqv_r. + arewrite (E_t' ∩₁ dom_rel (rmw_t' ⨾ ⦗E_t'⦘) ⊆₁ E_t'). + { basic_solver. } + destruct SIMRELQ. + clear - seq_inj. + basic_solver 8. } + unfold cmt'. intros x COND. - destruct COND as [[DTT ESS] RD]. - destruct DTT as [x0 [DTT MP1]]. - destruct STEP. - destruct reexec_start_wf. - destruct wf_sub_rfD with x0. - { unfold WCore.X_start; ins. - split. - { split; vauto. - apply rexec_acts; vauto. } - rewrite <- MP1 in RD. - unfold is_r in *. - destruct SIMREL. - rewrite seq_lab. - { unfold compose. - assert (COND : mapper' x0 = mapper x0). - { apply DTRSAME in DTT; vauto. } - rewrite <- COND; vauto. } - apply rexec_acts; vauto. } - { left. unfold WCore.X_start; ins. + unfold set_collect in COND. + destruct COND as [x0 [COND EQ]]. + destruct COND as [x1 [COND EQ1]]. + rewrite <- EQ1 in EQ. + unfold compose in EQ. + unfold compose in MAPCOMP. + rewrite MAPCOMP in EQ. + { unfold id in EQ. + rewrite <- EQ. destruct SIMREL. - destruct H as [x1 PTH]. - unfold codom_rel. exists (mapper' x1). - unfold seq. exists (mapper' x1); split. - { red. split; vauto. - unfold dtrmt'. unfold set_collect. - exists x1; split; vauto. - destruct PTH as [x2 [[EQQ CMM] MP]]; subst; vauto. } - exists x; split; vauto. - apply seq_rf. - unfold collect_rel. - exists x1, x0; splits; vauto. - { destruct PTH as [x2 [[EQQ CMM] - [x3 [RF [CM3 EQ]]]]]; subst; vauto. } - { apply DTRSAME. - destruct PTH as [x2 [[EQQ CMM] MP]]; vauto. } - apply DTRSAME. - destruct PTH as [x2 [[EQQ CMM] MP]]; vauto. } - right. - unfold cmt'. - unfold set_collect. - exists x0; split; vauto. } - { apply XmmCons.monoton_cons with (G_t := G_t') - (m := mapper'); vauto. - all : try arewrite (WCore.G X_s' = G_s'). - { apply SIMRELQ. } - { unfold G_s'; ins. - arewrite ((fun x : actid => - ifP ~ (mapper' ↑₁ E_t') x then x - else (ifP tid x <> t_2 then x - else ThreadEvent t_1 - (t_1_len + index x))) = mapper_rev'). - unfold compose. unfold eq_dom. - intros x COND. - unfold compose in MAPCOMP. - apply MAPCOMP in COND. - rewrite COND. - unfold id; vauto. } - { intros x y PTH. - destruct PTH as [SBP SL]. - unfold sb in SBP. - unfold G_s' in SBP; ins. - destruct SBP as [x0 [[EQ1 INE1] - [x1 [PTH [EQ2 INE2]]]]]; subst. - unfold collect_rel. - destruct INE1 as [x2 [INE1 M1]]. - destruct INE2 as [x3 [INE2 M2]]. - exists x2, x3; splits; vauto. - split. - { unfold sb. - unfold seq. exists x2; split; vauto. - exists x3; split; vauto. - apply EXTSBL; vauto. } - assert (MAPP : (fun x : actid => - ifP ~ (mapper' ↑₁ E_t') x then x - else (ifP tid x <> t_2 then x - else ThreadEvent t_1 - (t_1_len + index x))) = mapper_rev') by vauto. - rewrite MAPP in SL. - unfold same_loc in SL. - unfold loc in SL. - unfold compose in SL. - unfold compose in MAPCOMP. - apply MAPCOMP in INE1. - unfold id in INE1. - apply MAPCOMP in INE2. - unfold id in INE2. - rewrite INE1, INE2 in SL. - unfold same_loc, loc; vauto. } - { apply INV'. } - { arewrite (G_s' = (WCore.G X_s')). - apply wf_transition with (X_t := X_t') - (t_1 := t_1) (t_2 := t_2) - (mapper := mapper') (mapper_rev := mapper_rev') - (ptc_1 := ptc_1); vauto. } - destruct STEP; vauto. } + apply seq_acts. + unfold set_collect. + exists (f_t x1); split; vauto. + apply reexec_embd_acts. + clear - COND. + basic_solver. } + apply reexec_embd_dom; vauto. } + { destruct SIMREL. unfold dtrmt'. unfold WCore.reexec_thread. arewrite ((WCore.G X_s') = G_s'). @@ -2546,9 +2558,6 @@ Proof using. basic_solver. } apply sub_to_full_exec_listless with (thrdle := thrdle'); vauto. - { admit. (* we have it *) } - { admit. (* we have it *) } - { admit. (* we have it *) } { admit. } { constructor. { unfold WCore.X_start; ins. @@ -2568,37 +2577,37 @@ Proof using. rewrite (seq_acts SIMREL). unfold dtrmt'. destruct STEP. rewrite dtrmt_cmt, reexec_embd_dom. - admit. } + clear; basic_solver. } + { unfold WCore.X_start; ins. } all : admit. } { apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) (mapper := mapper') (mapper_rev := mapper_rev') (ptc_1 := ptc_1); vauto. } - { unfold WCore.X_start; ins. - destruct STEP. - intros x COND. - destruct COND as [MP NOT]. - intros FLS. - assert (INITT: is_init x). - { admit. (* is this a joke? *) } - assert (INITT2: is_init x) by vauto. - apply dtrmt_init in INITT. - assert (DTRF : dtrmt' x). - { unfold dtrmt'. - unfold set_collect. - exists x; split; vauto. - destruct SIMRELQ. - apply seq_init; vauto. } - destruct NOT. - split; vauto. - destruct SIMREL. - apply seq_acts. + unfold WCore.X_start; ins. + destruct STEP. + intros x COND. + destruct COND as [MP NOT]. + intros FLS. + assert (INITT: is_init x). + { apply INTREADS; vauto. } + assert (INITT2: is_init x) by vauto. + apply dtrmt_init in INITT. + assert (DTRF : dtrmt' x). + { unfold dtrmt'. unfold set_collect. exists x; split; vauto. - { apply rexec_acts; vauto. } - destruct MP as [x0 [INE MPP]]. + destruct SIMRELQ. apply seq_init; vauto. } - admit. (* we have it *) + destruct NOT. + split; vauto. + destruct SIMREL. + apply seq_acts. + unfold set_collect. + exists x; split; vauto. + { apply rexec_acts; vauto. } + destruct MP as [x0 [INE MPP]]. + apply seq_init; vauto. Admitted. End SequentReexec. \ No newline at end of file From 6d1aa51c91266bd0db91a1563b473d9bf8b0a19b Mon Sep 17 00:00:00 2001 From: keba4ok Date: Sat, 24 May 2025 17:18:20 +0200 Subject: [PATCH 48/51] attempts --- src/sequentialization/SequentExec2.v | 54 +++++++++++++--------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/src/sequentialization/SequentExec2.v b/src/sequentialization/SequentExec2.v index 02b421b..adefca4 100644 --- a/src/sequentialization/SequentExec2.v +++ b/src/sequentialization/SequentExec2.v @@ -432,37 +432,31 @@ Proof using. rewrite add_event_lab. unfold compose. rewrite upds. rewrite upds; vauto. } - rewrite !updo; vauto. - { rewrite add_event_lab. - unfold compose. rewrite updo; vauto. - { destruct SIMREL. - destruct classic with (E_s x) as [INN | NINN]. - { rewrite updo; vauto. - rewrite seq_lab_rev0; vauto. } - rewrite updo; vauto. - rewrite seq_rlab0; vauto. } + rewrite upds; vauto. + rewrite add_event_lab. + unfold compose. + destruct SIMREL. + assert (SWITCH : upd mapper_rev (ThreadEvent t_2 (index e - t_1_len)) e x + = mapper_rev x). + { rewrite updo; vauto. } + rewrite SWITCH. + assert (SWITCH2 : upd lab_s (ThreadEvent t_2 (index e - t_1_len)) l x + = lab_s x). + { rewrite updo; vauto. } + rewrite SWITCH2. + destruct classic with (E_s x) as [INNE | NINNE]. + { assert (INNE' : E_s x) by vauto. + apply seq_lab_rev0 in INNE'. rewrite updo; vauto. - destruct classic with (E_s x) as [INN | NINN]. - { destruct SIMREL. - intros FALSE. - assert (STT : mapper (mapper_rev x) = mapper e) - by vauto. - unfold compose in MAPREVR. - rewrite MAPREVR in STT. - { unfold id in STT. - assert (HLP : E_t (mapper_rev x)). - { apply seq_acts_rev0. - red; exists x; vauto. } - rewrite FALSE in HLP. - apply seq_mapto0 in HLP. - { subst x. - unfold SequentBase.t_1_len, t_1_len in *. - desf. } - apply seq_out_move0 in HLP; vauto. - rewrite HLP. unfold tid; vauto. } - vauto. } - admit. (* ??? *) } - rewrite upds; vauto. } + intros FLS. + assert (FF : E_t e). + { apply seq_acts_rev0. + red; vauto. } + desf. } + assert (NINNE' : ~ E_s x) by vauto. + apply seq_rlab0 in NINNE. + rewrite NINNE. + admit. } { destruct ADD. rewrite add_event_rf. rewrite !collect_rel_union. arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). From 7f29ac3916ba476237ef3d08b3a2df045148c665 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Sun, 25 May 2025 02:07:06 +0200 Subject: [PATCH 49/51] big admit in exec --- src/sequentialization/SequentExec2.v | 563 ++++++++++++++++++++++++++- 1 file changed, 562 insertions(+), 1 deletion(-) diff --git a/src/sequentialization/SequentExec2.v b/src/sequentialization/SequentExec2.v index adefca4..ae2a4cd 100644 --- a/src/sequentialization/SequentExec2.v +++ b/src/sequentialization/SequentExec2.v @@ -271,7 +271,568 @@ Proof using. rewrite set_collect_eq. rewrite upds, EQACTS. rewrite (seq_acts_rev SIMREL); vauto. } - { admit. (*TODO : po-work*) } + { unfold sb. unfold G_s'; ins. + split; intros x y COND. + { destruct COND as [CD1 | CD2]. + { destruct CD1 as [x0 [[EQ1 INE1] [x1 [EXT [EQ2 INE2]]]]]; subst. + destruct INE1 as [CD1 | CD2]. + { destruct INE2 as [CD3 | CD4]. + { apply (seq_acts SIMREL) in CD1, CD3. + destruct CD1 as [x2 [IN1 MAP1]], CD3 as [x3 [IN2 MAP2]]. + unfold collect_rel. + exists x2, x3; splits. + { unfold seq. exists x2; split. + { red; split; vauto. + apply EQACTS; vauto. } + exists x3; split. + { subst. + destruct x2, x3; desf. + { rewrite !(seq_init SIMREL) in EXT; vauto. } + { assert (INIT1 : mapper (InitEvent l0) = InitEvent l0). + { rewrite (seq_init SIMREL); vauto. } + rewrite INIT1 in EXT; vauto. + exfalso. + unfold ext_sb in EXT. + desf. } + unfold ext_sb in EXT. desf. + { exfalso. + assert (REVVV : mapper_rev (mapper (ThreadEvent thread index)) = + mapper_rev (InitEvent l0)). + { rewrite Heq; vauto. } + unfold compose in MAPREV. + rewrite MAPREV in REVVV; vauto. + rewrite (seq_init_rev SIMREL) in REVVV; vauto. } + destruct EXT as [EXT1 EXT2]. + subst thread2. + destruct classic with (thread1 = t_2) as [TD2 | TN2]. + { subst thread1. + destruct SIMREL. + assert (TT1 : thread = t_1). + { apply seq_thrd in IN1; vauto. + rewrite Heq; unfold tid; vauto. } + assert (TT2 : thread0 = t_1). + { apply seq_thrd in IN2; vauto. + rewrite Heq0; unfold tid; vauto. } + assert (INDX : index < index0). + { apply seq_index in IN1. + { apply seq_index in IN2. + { rewrite Heq in IN1. + rewrite Heq0 in IN2. + unfold SequentBase.t_1_len, t_1_len in *. + clear - IN1 IN2 IND EXT2. + unfold Events.index in *. lia. } + rewrite Heq0. + unfold tid; vauto. } + rewrite Heq. + unfold tid; vauto. } + unfold ext_sb; vauto. } + assert (TRDS : thread = thread0). + { destruct SIMREL. + apply seq_mapeq in IN1, IN2. + { rewrite Heq in IN1. + rewrite Heq0 in IN2. + unfold tid in *; vauto. } + { rewrite Heq0; unfold tid; vauto. } + rewrite Heq; unfold tid; vauto. } + assert (INDX : index < index0). + { destruct SIMREL. + apply seq_mapeq in IN1, IN2. + { rewrite Heq in IN1. + rewrite Heq0 in IN2. + unfold tid in *; vauto. } + { rewrite Heq0; unfold tid; vauto. } + rewrite Heq; unfold tid; vauto. } + unfold ext_sb; vauto. } + red; split; vauto. + apply EQACTS; vauto. } + { unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + apply (seq_acts SIMREL) in CD1. + destruct CD1 as [x2 [IN1 MAP1]]. + unfold collect_rel. + exists x2, e; splits. + { unfold seq. exists x2; split. + { red; split; vauto. + apply EQACTS; vauto. } + exists e; split. + { destruct x2; desf. + { unfold ext_sb; desf. } + unfold ext_sb in EXT. + desf. + { exfalso. + assert (REVVV : mapper_rev (mapper (ThreadEvent thread index)) = + mapper_rev (InitEvent l0)). + { rewrite Heq; vauto. } + unfold compose in MAPREV. + rewrite MAPREV in REVVV; vauto. + rewrite (seq_init_rev SIMREL) in REVVV; vauto. } + destruct EXT as [EXT1 EXT2]. + assert (TT1 : thread = t_1). + { apply (seq_thrd SIMREL) in IN1; vauto. + rewrite Heq; unfold tid; vauto. } + assert (INDX : index < Events.index e). + { apply (seq_index SIMREL) in IN1. + { rewrite Heq in IN1. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. lia. } + rewrite Heq; unfold tid; vauto. } + destruct e. + { exfalso. desf. } + unfold Events.index in *. + unfold ext_sb; vauto. } + red; split; vauto. + apply EQACTS; vauto. } + { unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + unfold mapper'. + rewrite upds; vauto. } + destruct INE2 as [C3 | C4]. + { apply (seq_acts SIMREL) in C3. + destruct C3 as [x2 [IN1 MAP1]]. + unfold collect_rel. + exists e, x2; splits. + { unfold seq. exists e; split. + { red; split; vauto. + apply EQACTS; vauto. } + exists x2; split. + { destruct x2; desf. + { rewrite (seq_init SIMREL) in EXT; vauto. } + unfold ext_sb in EXT. + desf. + destruct EXT as [EXT1 EXT2]. + assert (TT1 : thread = t_1). + { apply (seq_thrd SIMREL) in IN1; vauto. + rewrite Heq; unfold tid; vauto. } + assert (INDX : Events.index e < index). + { apply (seq_index SIMREL) in IN1. + { rewrite Heq in IN1. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. lia. } + rewrite Heq; unfold tid; vauto. } + destruct e. + { exfalso. desf. } + unfold Events.index in *. + unfold ext_sb; vauto. } + red; split; vauto. + apply EQACTS; vauto. } + { unfold mapper'. + rewrite upds; vauto. } + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + unfold ext_sb in EXT. + desf. lia. } + unfold po_seq in CD2. + destruct CD2 as [[TD1 INE1] [TD2 INE2]]. + assert (SWCH : WCore.G X_s' = G_s') by vauto. + rewrite SWCH in *. + unfold G_s' in INE1, INE2; ins. + destruct INE1 as [CD1 | CD2]. + { destruct INE2 as [CD3 | CD4]. + { destruct SIMREL. + apply seq_acts in CD1, CD3. + destruct CD1 as [x2 [IN1 MAP1]], CD3 as [x3 [IN2 MAP2]]. + unfold collect_rel. + exists x2, x3; splits. + { unfold seq. exists x2; split. + { red; split; vauto. + apply EQACTS; vauto. } + exists x3; split. + { subst. + destruct x2, x3; desf. + { rewrite seq_init in TD1; vauto. + unfold tid in TD1. + exfalso; apply NINIT1; vauto. } + { rewrite seq_init in NINIT2; vauto. } + assert (THRD1 : thread = t_1). + { apply seq_mapeq in IN1; vauto. + { rewrite IN1 in TD1. + unfold tid; vauto. } + rewrite TD1; unfold tid; vauto. } + assert (THRD2 : thread0 = t_1). + { apply seq_thrd in IN2; vauto. } + assert (INDX1 : index < t_1_len). + { apply NNPP. intros INDX'. + assert (INDX : index >= t_1_len) by lia. + apply seq_out_move in IN1. + { rewrite IN1 in TD1. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. basic_solver. } + { unfold tid; vauto. } + unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + assert (INDX2 : index0 >= t_1_len). + { apply NNPP. intros INDX'. + assert (INDX : index0 < t_1_len) by lia. + apply seq_index in IN2. + { unfold Events.index in IN2. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. lia. } + vauto. } + unfold ext_sb; split; vauto. + lia. } + red; split; vauto. + apply EQACTS; vauto. } + { unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + destruct SIMREL. + apply seq_acts in CD1. + destruct CD1 as [x2 [IN1 MAP1]]. + unfold collect_rel. + exists x2, e; splits. + { unfold seq. exists x2; split. + { red; split; vauto. + apply EQACTS; vauto. } + exists e; split. + { subst. + destruct x2, e; desf. + assert (THRD1 : thread = t_1). + { apply seq_mapeq in IN1; vauto. + { rewrite IN1 in TD1. + unfold tid; vauto. } + rewrite TD1; unfold tid; vauto. } + assert (THRD2 : thread0 = t_1). + { unfold tid in *; vauto. } + assert (INDX1 : index < t_1_len). + { apply NNPP. intros INDX'. + assert (INDX : index >= t_1_len) by lia. + apply seq_out_move in IN1. + { rewrite IN1 in TD1. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. basic_solver. } + { unfold tid; vauto. } + unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + unfold ext_sb; split; vauto. + unfold Events.index in *. + unfold SequentBase.t_1_len in *. + unfold t_1_len in *. + lia. } + red; split; vauto. + apply EQACTS; vauto. } + { unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + unfold mapper'. + rewrite upds; vauto. } + rewrite <- CD2 in TD1. + unfold tid in *. desf. } + destruct COND as [x0 [y0 [[x1 [[EQ1 INE1] + [y1 [COND [EQ2 INE2]]]]] [M1 M2]]]]. + subst. + apply EQACTS in INE1, INE2. + destruct INE1 as [C1 | C2], INE2 as [C3 | C4]. + { destruct x1, y0. + { desf. } + { left. unfold seq. + exists (mapper' (InitEvent l0)); split. + { red; split; vauto. + unfold mapper'. + rewrite updo; vauto. + { left. + apply (seq_acts SIMREL). + red; exists (InitEvent l0); split; vauto. } + intros FLS; subst; desf. } + exists (mapper' (ThreadEvent thread index)); split. + { unfold mapper'. + rewrite updo; vauto. + { rewrite (seq_init SIMREL); vauto. + unfold ext_sb; desf. + destruct classic with ((ThreadEvent thread index) = e) as [EQ | NEQ]. + { subst; vauto. } + rewrite updo in Heq; vauto. + assert (REVVV : mapper_rev (mapper (ThreadEvent thread index)) = + mapper_rev (InitEvent l1)). + { rewrite Heq; vauto. } + unfold compose in MAPREV. + rewrite MAPREV in REVVV; vauto. + rewrite (seq_init_rev SIMREL) in REVVV; vauto. } + intros FLS; subst; desf. } + red; split; vauto. + left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent thread index); split; vauto. + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + { unfold ext_sb in COND; desf. } + unfold ext_sb in COND. + destruct COND as [COND1 COND2]. + subst thread0. + destruct classic with (thread = t_1) as [TD1 | TN1]. + { destruct classic with (index >= t_1_len) as [IDL | IDG']. + { left. + unfold seq. + exists (mapper' (ThreadEvent thread index)); split. + { red; split; vauto. + unfold mapper'. + rewrite updo; vauto. + { left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent t_1 index); split; vauto. } + intros FLS; subst; desf. } + exists (mapper' (ThreadEvent thread index0)); split. + { unfold mapper'. + rewrite !updo; vauto. + { destruct SIMREL. + apply seq_out_move in C1, C3. + all : try unfold tid; vauto. + { rewrite C1, C3. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + unfold ext_sb; desf. + desf. lia. } + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + lia. } + { intros FLS; subst; desf. } + intros FLS; subst; desf. } + red; split; vauto. + left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent t_1 index0); split; vauto. + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + assert (IDG : index < t_1_len) by lia. + destruct classic with (index0 >= t_1_len) as [IDL2 | IDG2']. + { right. + unfold po_seq. split. + { split. + { unfold mapper'. + rewrite updo; vauto. + { destruct SIMREL. + apply seq_out_snd in C1. + { rewrite C1. + unfold tid; vauto. } + { unfold tid; vauto. } + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + lia. } + intros FLS; subst; desf. } + arewrite (WCore.G X_s' = G_s'). + unfold G_s'; ins. + left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent t_1 index); split; vauto. + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + split. + { unfold mapper'. + rewrite updo; vauto. + { destruct SIMREL. + apply seq_out_move in C3. + { rewrite C3. + unfold tid; vauto. } + { unfold tid; vauto. } + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + lia. } + intros FLS; subst; desf. } + arewrite (WCore.G X_s' = G_s'). + unfold G_s'; ins. + left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent thread index0); split; vauto. + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + assert (IDG2 : index0 < t_1_len) by lia. + left. + unfold seq. + exists (mapper' (ThreadEvent thread index)); split. + { red; split; vauto. + unfold mapper'. + rewrite updo; vauto. + { left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent t_1 index); split; vauto. } + intros FLS; subst; desf. } + exists (mapper' (ThreadEvent thread index0)); split. + { unfold mapper'. + rewrite !updo; vauto. + { destruct SIMREL. + apply seq_out_snd in C1, C3. + all : try unfold tid; vauto. + rewrite C1, C3. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + unfold ext_sb; desf. } + all : intros FLS; subst; desf. } + red; split; vauto. + left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent t_1 index0); split; vauto. + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + left. + unfold seq. + exists (mapper' (ThreadEvent thread index)); split. + { red; split; vauto. + unfold mapper'. + rewrite updo; vauto. + { left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent thread index); split; vauto. } + intros FLS; subst; desf. } + exists (mapper' (ThreadEvent thread index0)); split. + { unfold mapper'. + rewrite !updo; vauto. + { destruct SIMREL. + apply seq_out in C1, C3. + all : try unfold tid; vauto. + rewrite C1, C3. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + unfold ext_sb; desf. } + all : intros FLS; subst; desf. } + red; split; vauto. + left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent thread index0); split; vauto. + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + { subst y0. + destruct x1. + { left. unfold seq. + exists (mapper' (InitEvent l0)); split. + { red; split; vauto. + unfold mapper'. + rewrite updo; vauto. + { left. + apply (seq_acts SIMREL). + red; exists (InitEvent l0); split; vauto. } + intros FLS; subst; desf. } + exists (mapper' e); split. + { unfold mapper'. + rewrite updo; vauto. + { rewrite (seq_init SIMREL); vauto. + unfold ext_sb; desf. + rewrite upds in Heq; vauto. } + intros FLS; subst; desf. } + red; split; vauto. + right. + unfold mapper'. + rewrite upds; vauto. } + assert (TRD1 : thread = t_1). + { destruct e. + { desf. } + unfold ext_sb in COND; desf. } + subst thread. + destruct classic with (index < t_1_len) as [INDX | INDX']. + { right. + unfold po_seq. split. + { split. + { unfold mapper'. + rewrite updo; vauto. + { destruct SIMREL. + apply seq_out_snd in C1. + { rewrite C1. + unfold tid; vauto. } + { unfold tid; vauto. } + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + lia. } + intros FLS; subst; desf. } + arewrite (WCore.G X_s' = G_s'). + unfold G_s'; ins. + left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent t_1 index); split; vauto. + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + split. + { unfold mapper'. + rewrite upds; vauto. } + arewrite (WCore.G X_s' = G_s'). + unfold G_s'; ins. + right. + unfold mapper'. + rewrite upds; vauto. } + assert (INDX : index >= t_1_len) by lia. + left. + unfold seq. + exists (mapper' (ThreadEvent t_1 index)); split. + { red; split; vauto. + unfold mapper'. + rewrite updo; vauto. + { left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent t_1 index); split; vauto. } + intros FLS; subst; desf. } + exists (mapper' e); split. + { unfold mapper'. + rewrite updo; vauto. + { rewrite upds. + destruct SIMREL. + apply seq_out_move in C1. + { rewrite C1. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + unfold ext_sb; desf. + split; vauto. + unfold ext_sb in COND. desf. lia. } + { unfold tid; vauto. } + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + lia. } + intros FLS; subst; desf. } + red; split; vauto. + right. + unfold mapper'. + rewrite upds; vauto. } + { subst x1. + unfold ext_sb in COND; desf. + destruct COND as [COND1 COND2]. + left. + unfold seq. + exists (mapper' (ThreadEvent thread index)); split. + { red; split; vauto. + unfold mapper'. + rewrite upds; vauto. } + exists (mapper' (ThreadEvent thread0 index0)); split. + { unfold mapper'. + rewrite upds. rewrite updo. + { destruct SIMREL. + apply seq_out_move in C3. + { rewrite C3. + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + unfold ext_sb; desf. + split; vauto. + unfold ext_sb in COND2. desf. lia. } + { unfold tid; vauto. } + unfold SequentBase.t_1_len, t_1_len in *. + unfold Events.index in *. + lia. } + intros FLS; subst; desf. } + red; split; vauto. + left. + apply (seq_acts SIMREL). + red; exists (ThreadEvent thread0 index0); split; vauto. + unfold mapper'. + rewrite updo; vauto. + intros FLS; subst; desf. } + subst x1 y0; unfold ext_sb in COND. + exfalso. desf. + lia. } { rewrite (seq_threads SIMREL). destruct ADD. rewrite add_event_threads; vauto. } { unfold mapper'. intros x COND. From fde9e65f06f3b5f7aa4e56cade95093d8eed1688 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Sun, 25 May 2025 02:29:13 +0200 Subject: [PATCH 50/51] exec2 work --- src/sequentialization/SequentExec2.v | 295 ++++++++++++++++++++++++++- 1 file changed, 293 insertions(+), 2 deletions(-) diff --git a/src/sequentialization/SequentExec2.v b/src/sequentialization/SequentExec2.v index ae2a4cd..3304762 100644 --- a/src/sequentialization/SequentExec2.v +++ b/src/sequentialization/SequentExec2.v @@ -1112,9 +1112,300 @@ Proof using. unfold mapper'. rewrite upds. vauto. } apply XmmCons.monoton_cons with (G_t := G_t') (m := mapper'); vauto; try apply SIMRELQ. - { admit. (* TODO : po-work? *) } + { unfold rpo. unfold rpo_imm. + arewrite (WCore.G X_s' = G_s'). + destruct SIMRELQ. + assert (RESTR : ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘ ≡ restr_rel E_t' ( + ⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ sb_t' ⨾ ⦗F G_t' ∩₁ Acq G_t'⦘ ∪ ⦗Acq G_t'⦘ ⨾ sb_t' ∪ sb_t' ⨾ ⦗Rel G_t'⦘ + ∪ ⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ sb_t' ⨾ ⦗W_t' ∩₁ Rlx G_t'⦘)). + { split. + { rewrite !restr_union. + repeat apply union_mori. + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] COND]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + { intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x1 [COND [EQ2 CD2]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + intros x y COND. + unfold restr_rel; split; vauto. + destruct COND as [x0 [[EQ1 CD1] [x1 [COND [EQ2 CD2]]]]]; subst. + apply wf_sbE in COND. + clear - COND. destruct COND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; subst. + basic_solver. } + rewrite inclusion_restr; vauto. } + rewrite RESTR. + rewrite collect_rel_ct_inj. + { assert (MAPREVCOMP : eq_dom (acts_set G_s') (mapper' ∘ mapper_rev') id). + { intros x COND. + unfold G_s' in COND; ins. + destruct COND as [COND1 | COND2]. + { destruct SIMREL. + apply seq_acts0 in COND1. + destruct COND1 as [x0 [COND1 EQ1]]; subst. + unfold compose. + unfold mapper', mapper_rev'. + rewrite !updo; vauto. + { unfold compose in MAPREV. + rewrite MAPREV; vauto. } + { intros FLS. + assert (FF : E_s (ThreadEvent t_2 (index e - t_1_len))). + { apply seq_acts0. + red; vauto. } + desf. } + intros FLS. + rewrite updo in FLS. + { unfold compose in MAPREV. + rewrite MAPREV in FLS; vauto. } + intros FLSS. + assert (FF : E_s (ThreadEvent t_2 (index e - t_1_len))). + { apply seq_acts0. + red; vauto. } + desf. } + unfold compose. + unfold mapper', mapper_rev'. + destruct classic with (x = (ThreadEvent t_2 (index e - t_1_len))) as [EQ1 | NEQ1]. + { subst x. rewrite !upds; vauto. } + rewrite !updo; vauto. } + assert (SBIN : sb G_s' ⊆ mapper' ↑ sb_t'). + { rewrite <- seq_sb; vauto. } + apply clos_trans_mori. + rewrite <- RESTR. + rewrite !collect_rel_union. + repeat apply union_mori. + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗R_t' ∩₁ Rlx G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘ ≡ + ⦗R_t' ∩₁ Rlx G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (F G_t' ∩₁ Acq G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISR ISRLX] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISRLX. + rewrite seq_lab_rev in ISRLX; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISRLX; vauto. } + { unfold is_rlx. unfold compose in ISRLX; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + arewrite (⦗Acq G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘ ≡ + ⦗Acq G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t'⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [ISA INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_acq, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_acq. unfold compose in ISA; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + { rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ INE]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE ISR]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISR. + rewrite seq_lab_rev in ISR; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + unfold is_rel. unfold compose in ISR; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. rewrite !seqA. + rewrite <- id_inter. + rewrite <- seqA. + rewrite <- id_inter. + rewrite SBIN. + rewrite wf_sbE at 2. + rewrite !seqA. + rewrite <- id_inter. + arewrite (⦗F G_t' ∩₁ Rel G_t'⦘ ⨾ ⦗E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘ ≡ + ⦗F G_t' ∩₁ Rel G_t' ∩₁ E_t'⦘ ⨾ sb_t' ⨾ ⦗E_t' ∩₁ (W_t' ∩₁ Rlx G_t')⦘). + { rewrite <- seqA. + rewrite <- id_inter; vauto. } + rewrite !collect_rel_seq. + { repeat apply seq_mori; vauto. + { intros x y COND. + destruct COND as [EQ [[ISF ISREL] INE]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rel, mod in ISREL. + rewrite seq_lab_rev in ISREL; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { unfold is_r. unfold compose in ISREL; vauto. } + { unfold is_rlx. unfold compose in ISREL; vauto. } + apply seq_acts_rev; red; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + intros x y COND. + destruct COND as [EQ [INE [ISF ISA]]]; subst. + assert (SUB : G_s' = WCore.G X_s') by vauto. + rewrite SUB in *. + unfold is_rlx, mod in ISA. + rewrite seq_lab_rev in ISA; vauto. + red. exists (mapper_rev' y), (mapper_rev' y); splits. + { red; split; vauto. + repeat split. + { apply seq_acts_rev; red; vauto. } + { unfold is_r. unfold compose in ISA; vauto. } + unfold is_rlx. unfold compose in ISA; vauto. } + { unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + unfold compose in MAPREVCOMP. + rewrite MAPREVCOMP; vauto. } + { rewrite wf_sbE. + rewrite !codom_seq. + clear - seq_inj. + basic_solver 8. } + rewrite wf_sbE. + clear - seq_inj. + basic_solver 8. } + vauto. } { rewrite <- (seq_lab SIMRELQ); vauto. } - { admit. (* TODO : po-work? *) } + { assert (SBEQ : sb G_s' ≡ mapper' ↑ sb_t' \ po_seq X_s' t_1 t_2). + { rewrite <- (seq_sb SIMRELQ). + rewrite minus_union_l. + rewrite minusK. split; [| basic_solver]. + intros x y COND. + left. split; vauto. + intros FLS. + unfold po_seq in FLS. + destruct FLS as [[TID1 INE1] [TID2 INE2]]. + unfold sb in COND. unfold ext_sb in COND. + clear - COND TID1 TID2 NINIT1 NINIT2 THRDNEQ. + destruct COND as [x0 [[EQQ1 INEE1] [x1 [COND2 [EQQ2 INEE2]]]]]. + subst. desf; basic_solver 42. } + arewrite (WCore.G X_s' = G_s'). + rewrite SBEQ. + intros x y COND. + destruct COND as [[CDMAP POSEQ] COND2]. + destruct CDMAP as [x0 [x1 [CND [M1 M2]]]]. + unfold collect_rel. + exists x0, x1; split; vauto. + split; vauto. + unfold same_loc in *. + destruct SIMRELQ. + unfold loc. rewrite !seq_lab. + { unfold compose; vauto. } + all : apply wf_sbE in CND. + all : destruct CND as [x2 [[EQ1 CD1] [x3 [COND [EQ2 CD2]]]]]; vauto. } { apply INV'. } apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) From 1fa24486a044d1401577b1eeef6292daa477dd63 Mon Sep 17 00:00:00 2001 From: keba4ok Date: Sun, 25 May 2025 23:33:22 +0200 Subject: [PATCH 51/51] commentaries, additional work --- src/sequentialization/SequentExec.v | 4 +++- src/sequentialization/SequentExec2.v | 6 ++++-- src/sequentialization/SequentExec3.v | 4 +++- src/sequentialization/SequentReexec.v | 17 ++++++++++++----- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/sequentialization/SequentExec.v b/src/sequentialization/SequentExec.v index 7ea2b10..f3fc2f7 100644 --- a/src/sequentialization/SequentExec.v +++ b/src/sequentialization/SequentExec.v @@ -1161,7 +1161,9 @@ Proof using. rewrite SBEQ1, SBEQ2. unfold WCore.sb_delta. destruct ADD. rewrite add_event_sb. - admit. (* po-work *) } + admit. (* all the events except t_2 are stay on their + places, t_2 moves in order and delta-edges + are added respectively as well *) } arewrite (G_s' = WCore.G X_s'). apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) diff --git a/src/sequentialization/SequentExec2.v b/src/sequentialization/SequentExec2.v index 3304762..8f997df 100644 --- a/src/sequentialization/SequentExec2.v +++ b/src/sequentialization/SequentExec2.v @@ -1017,7 +1017,7 @@ Proof using. assert (NINNE' : ~ E_s x) by vauto. apply seq_rlab0 in NINNE. rewrite NINNE. - admit. } + admit. (* labels out of act_set are irrelevant *) } { destruct ADD. rewrite add_event_rf. rewrite !collect_rel_union. arewrite (mapper' ↑ rf_t ≡ mapper ↑ rf_t). @@ -1068,7 +1068,9 @@ Proof using. { rewrite (seq_addr SIMREL); vauto. } { rewrite (seq_ctrl SIMREL); vauto. } { rewrite (seq_rmw_dep SIMREL); vauto. } - { admit. (* po-work *) } + { admit. (* all the events except t_2 are stay on their + places, t_2 moves in order and delta-edges + are added respectively as well *) } arewrite (G_s' = WCore.G X_s'). apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) diff --git a/src/sequentialization/SequentExec3.v b/src/sequentialization/SequentExec3.v index 00eb7b8..97458f2 100644 --- a/src/sequentialization/SequentExec3.v +++ b/src/sequentialization/SequentExec3.v @@ -1115,7 +1115,9 @@ Proof using. { rewrite (seq_addr SIMREL); vauto. } { rewrite (seq_ctrl SIMREL); vauto. } { rewrite (seq_rmw_dep SIMREL); vauto. } - { admit. (* po-work *) } + { admit. (* all the events except t_2 are stay on their + places, t_2 moves in order and delta-edges + are added respectively as well *) } arewrite (G_s' = WCore.G X_s'). apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) diff --git a/src/sequentialization/SequentReexec.v b/src/sequentialization/SequentReexec.v index b00fc14..da8e1d4 100644 --- a/src/sequentialization/SequentReexec.v +++ b/src/sequentialization/SequentReexec.v @@ -2076,7 +2076,8 @@ Proof using. destruct EQ as [x0 CND]. specialize (surg_init_min x0). vauto. } - admit. } + admit. (* proof scheme of this statement is + in the appendix of the article*)} unfold WCore.reexec. exists thrdle'. @@ -2293,7 +2294,8 @@ Proof using. { unfold nin_sb. rewrite SBSEQ. rewrite <- seq_eqv_minus_ll. - admit. (* something for immediate of exclusion is needed *)} + admit. (* immediate on exclusion is unfolded and then + the mapper is taken out *)} { arewrite (WCore.G X_s' = G_s'). unfold G_s' at 1; ins. intros x COND. @@ -2393,7 +2395,10 @@ Proof using. apply seq_lab0. apply reexec_embd_acts; red; vauto. } apply reexec_embd_dom; vauto. } - { admit. (* needs a better analysis of sb structure *) } + { admit. (* case analysis on where in G_s' + the rpo-edge lies: if it lies not in t_1 or t_2, + it stays there and if not, we use the lemma + about rpo-edges proven earlier *) } { unfold cmt'. rewrite (seq_rf SIMRELQ). rewrite (seq_rf SIMREL). @@ -2558,7 +2563,7 @@ Proof using. basic_solver. } apply sub_to_full_exec_listless with (thrdle := thrdle'); vauto. - { admit. } + { admit. (* acts_set is generally finite *) } { constructor. { unfold WCore.X_start; ins. destruct STEP; vauto. @@ -2579,7 +2584,9 @@ Proof using. rewrite dtrmt_cmt, reexec_embd_dom. clear; basic_solver. } { unfold WCore.X_start; ins. } - all : admit. } + all : admit. (* all of these statements follow from + induction on guided step and + particularly its add_setp part *)} { apply wf_transition with (X_t := X_t') (t_1 := t_1) (t_2 := t_2) (mapper := mapper') (mapper_rev := mapper_rev')