Theory CSPM_Monotonies

(*<*)
―‹ ********************************************************************
 * Project         : HOL-CSPM - Architectural operators for HOL-CSP
 *
 * Author          : Benoît Ballenghien, Safouan Taha, Burkhart Wolff.
 *
 * This file       : CSPM monotonies
 *
 * Copyright (c) 2025 Université Paris-Saclay, France
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *
 *     * Redistributions in binary form must reproduce the above
 *       copyright notice, this list of conditions and the following
 *       disclaimer in the documentation and/or other materials provided
 *       with the distribution.
 *
 *     * Neither the name of the copyright holders nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ******************************************************************************›
(*>*)

section‹ Monotonies ›

(*<*)
theory CSPM_Monotonies                                            
  imports Global_Deterministic_Choice Multi_Synchronization_Product
    Multi_Sequential_Composition Interrupt Throw
begin 
  (*>*)


subsection ‹The Throw Operator›

lemma mono_Throw_F_right :
  ‹(⋀a. a ∈ A ⟹ a ∈ α(P) ⟹ Q a ⊑F Q' a) ⟹ P Θ a ∈ A. Q a ⊑F P Θ a ∈ A. Q' a›
  unfolding failure_refine_def by (simp add: F_Throw subset_iff disjoint_iff)
    (metis events_of_memI in_set_conv_decomp)

lemma mono_Throw_T_right : 
  ‹(⋀a. a ∈ A ⟹ a ∈ α(P) ⟹ Q a ⊑T Q' a) ⟹ P Θ a ∈ A. Q a ⊑T P Θ a ∈ A. Q' a›
  unfolding trace_refine_def by (simp add: T_Throw subset_iff disjoint_iff)
    (metis events_of_memI in_set_conv_decomp)

lemma mono_Throw_D_right : 
  ‹(⋀a. a ∈ A ⟹ a ∈ α(P) ⟹ Q a ⊑D Q' a) ⟹ P Θ a ∈ A. Q a ⊑D P Θ a ∈ A. Q' a›
  unfolding divergence_refine_def by (simp add: D_Throw subset_iff disjoint_iff)
    (metis events_of_memI in_set_conv_decomp)

lemma mono_Throw_FD : ‹P Θ a ∈ A. Q a ⊑FD P' Θ a ∈ A. Q' a›
  if ‹P ⊑FD P'› and ‹⋀a. a ∈ A ⟹ a ∈ α(P) ⟹ Q a ⊑FD Q' a›
proof (rule trans_FD)
  from ‹P ⊑FD P'› show ‹P Θ a ∈ A. Q a ⊑FD P' Θ a ∈ A. Q a›
    by (simp add: refine_defs Throw_projs subset_iff, safe, simp_all flip: T_F_spec, blast)
next
  show ‹P' Θ a ∈ A. Q a ⊑FD P' Θ a ∈ A. Q' a›
    by (meson anti_mono_events_of_FD failure_divergence_refine_def
        mono_Throw_D_right mono_Throw_F_right subsetD that)
qed


lemma mono_Throw_DT : ‹P Θ a ∈ A. Q a ⊑DT P' Θ a ∈ A. Q' a›
  if ‹P ⊑DT P'› and ‹⋀a. a ∈ A ⟹ a ∈ α(P) ⟹ Q a ⊑DT Q' a›
proof (rule trans_DT)
  from ‹P ⊑DT P'› show ‹P Θ a ∈ A. Q a ⊑DT P' Θ a ∈ A. Q a›
    by (simp add: refine_defs Throw_projs subset_iff, safe, auto)
next
  show ‹P' Θ a ∈ A. Q a ⊑DT P' Θ a ∈ A. Q' a›
    by (meson anti_mono_events_of_DT leDT_imp_leD leDT_imp_leT leD_leT_imp_leDT
        mono_Throw_D_right mono_Throw_T_right subsetD that)
qed


lemmas monos_Throw = mono_Throw mono_Throw_FD mono_Throw_DT
  mono_Throw_F_right mono_Throw_D_right mono_Throw_T_right



subsection ‹The Interrupt Operator›

lemma mono_Interrupt_T: ‹P ⊑T P' ⟹ Q ⊑T Q' ⟹ P △ Q ⊑T P' △ Q'›
  unfolding trace_refine_def by (auto simp add: T_Interrupt)

lemma mono_Interrupt_D_right : ‹Q ⊑D Q' ⟹ P △ Q ⊑D P △ Q'›
  unfolding divergence_refine_def by (auto simp add: D_Interrupt) 

―‹We have no monotony, even partial, with term‹(⊑F)›.›

lemma mono_Interrupt_FD:
  ‹P ⊑FD P' ⟹ Q ⊑FD Q' ⟹ P △ Q ⊑FD P' △ Q'›
  unfolding failure_divergence_refine_def failure_refine_def divergence_refine_def
  by (simp add: D_Interrupt F_Interrupt, safe;
      metis [[metis_verbose = false]] F_subset_imp_T_subset subsetD)

lemma mono_Interrupt_DT:
  ‹P ⊑DT P' ⟹ Q ⊑DT Q' ⟹ P △ Q ⊑DT P' △ Q'›
  unfolding trace_divergence_refine_def trace_refine_def divergence_refine_def
  by (auto simp add: T_Interrupt D_Interrupt subset_iff)


lemmas monos_Interrupt = mono_Interrupt mono_Interrupt_FD mono_Interrupt_DT
  mono_Interrupt_D_right mono_Interrupt_T



subsection ‹Global Deterministic Choice›

lemma mono_GlobalDet_DT : ‹(⋀a. a ∈ A ⟹ P a ⊑DT Q a) ⟹ (□a ∈ A. P a) ⊑DT (□a ∈ A. Q a)›
  and mono_GlobalDet_T  : ‹(⋀a. a ∈ A ⟹ P a ⊑T Q a) ⟹ (□a ∈ A. P a) ⊑T (□a ∈ A. Q a)›
  and mono_GlobalDet_D  : ‹(⋀a. a ∈ A ⟹ P a ⊑D Q a) ⟹ (□a ∈ A. P a) ⊑D (□a ∈ A. Q a)›
  by (auto simp add: refine_defs GlobalDet_projs)

lemma mono_GlobalDet_FD : ‹(⋀a. a ∈ A ⟹ P a ⊑FD Q a) ⟹ (□a ∈ A. P a) ⊑FD (□a ∈ A. Q a)›
  by (simp add: refine_defs GlobalDet_projs subset_iff) (meson F_T T_F in_mono)

lemmas monos_GlobalDet = mono_GlobalDet mono_GlobalDet_FD mono_GlobalDet_DT
  mono_GlobalDet_T mono_GlobalDet_D

lemma GlobalNdet_FD_GlobalDet : ‹(⊓a ∈ A. P a) ⊑FD (□a ∈ A. P a)›
  and GlobalNdet_DT_GlobalDet : ‹(⊓a ∈ A. P a) ⊑DT (□a ∈ A. P a)›
  and GlobalNdet_F_GlobalDet  : ‹(⊓a ∈ A. P a) ⊑F (□a ∈ A. P a)›
  and GlobalNdet_T_GlobalDet  : ‹(⊓a ∈ A. P a) ⊑T (□a ∈ A. P a)›
  and GlobalNdet_D_GlobalDet  : ‹(⊓a ∈ A. P a) ⊑D (□a ∈ A. P a)›
  by (simp_all add: refine_defs GlobalDet_projs GlobalNdet_projs subset_iff, safe)
    (blast, blast intro: is_processT8, metis append_Nil is_processT6_TR_notin)+

lemmas GlobalNdet_le_GlobalDet = GlobalNdet_FD_GlobalDet GlobalNdet_DT_GlobalDet
  GlobalNdet_F_GlobalDet GlobalNdet_T_GlobalDet GlobalNdet_D_GlobalDet



subsection ‹Multiple Synchronization Product›

lemma mono_MultiSync_FD :
  ‹(⋀m. m ∈# M ⟹ P m ⊑FD Q m) ⟹ (⟦S⟧ m ∈# M. P m) ⊑FD (⟦S⟧ m ∈# M. Q m)›
  and mono_MultiSync_DT :
  ‹(⋀m. m ∈# M ⟹ P m ⊑DT Q m) ⟹ (⟦S⟧ m ∈# M. P m) ⊑DT (⟦S⟧ m ∈# M. Q m)›
  by (cases ‹M = {#}›, simp, erule mset_induct_nonempty, simp_all add: monos_Sync)+

lemmas mono_MultiInter_FD = mono_MultiSync_FD[where S = ‹{}›]
  and mono_MultiInter_DT = mono_MultiSync_DT[where S = ‹{}›]
  and   mono_MultiPar_FD = mono_MultiSync_FD[where S = ‹UNIV›]
  and   mono_MultiPar_DT = mono_MultiSync_DT[where S = ‹UNIV›]

lemmas monos_MultiSync = mono_MultiSync mono_MultiSync_FD mono_MultiSync_DT
  and monos_MultiPar = mono_MultiPar mono_MultiPar_FD mono_MultiPar_DT
  and monos_MultiInter = mono_MultiInter mono_MultiInter_FD mono_MultiInter_DT

text ‹Monotony doesn't hold for term‹(⊑F)›, term‹(⊑T)› and term‹(⊑D)›.›



subsection ‹Multiple Sequential Composition›

lemma mono_MultiSeq_FD :
  ‹(⋀x. x ∈ set L ⟹ P x ⊑FD Q x) ⟹ SEQ l ∈@ L. P l ⊑FD SEQ l ∈@ L. Q l›
  and mono_MultiSeq_DT :
  ‹(⋀x. x ∈ set L ⟹ P x ⊑DT Q x) ⟹ SEQ l ∈@ L. P l ⊑DT SEQ l ∈@ L. Q l›
  by (induct L rule: rev_induct, simp_all add: monos_Seq)

lemmas monos_MultiSeq = mono_MultiSeq mono_MultiSeq_FD  mono_MultiSeq_FD



(*<*)
end
  (*>*)