src/HOL/TLA/Action.thy
changeset 62146 324bc1ffba12
parent 61853 fb7756087101
child 69597 ff784d5a5bfb
equal deleted inserted replaced
62145:5b946c81dfbf 62146:324bc1ffba12
     7 
     7 
     8 theory Action
     8 theory Action
     9 imports Stfun
     9 imports Stfun
    10 begin
    10 begin
    11 
    11 
    12 
    12 type_synonym 'a trfun = "state \<times> state \<Rightarrow> 'a"
    13 (** abstract syntax **)
    13 type_synonym action = "bool trfun"
    14 
       
    15 type_synonym 'a trfun = "(state * state) \<Rightarrow> 'a"
       
    16 type_synonym action   = "bool trfun"
       
    17 
    14 
    18 instance prod :: (world, world) world ..
    15 instance prod :: (world, world) world ..
    19 
    16 
       
    17 definition enabled :: "action \<Rightarrow> stpred"
       
    18   where "enabled A s \<equiv> \<exists>u. (s,u) \<Turnstile> A"
       
    19 
       
    20 
    20 consts
    21 consts
    21   (** abstract syntax **)
    22   before :: "'a stfun \<Rightarrow> 'a trfun"
    22   before        :: "'a stfun \<Rightarrow> 'a trfun"
    23   after :: "'a stfun \<Rightarrow> 'a trfun"
    23   after         :: "'a stfun \<Rightarrow> 'a trfun"
    24   unch :: "'a stfun \<Rightarrow> action"
    24   unch          :: "'a stfun \<Rightarrow> action"
       
    25 
       
    26   SqAct         :: "[action, 'a stfun] \<Rightarrow> action"
       
    27   AnAct         :: "[action, 'a stfun] \<Rightarrow> action"
       
    28   enabled       :: "action \<Rightarrow> stpred"
       
    29 
       
    30 (** concrete syntax **)
       
    31 
    25 
    32 syntax
    26 syntax
    33   (* Syntax for writing action expressions in arbitrary contexts *)
    27   (* Syntax for writing action expressions in arbitrary contexts *)
    34   "_ACT"        :: "lift \<Rightarrow> 'a"                      ("(ACT _)")
    28   "_ACT"        :: "lift \<Rightarrow> 'a"                      ("(ACT _)")
    35 
    29 
    38   "_unchanged"  :: "lift \<Rightarrow> lift"                    ("(unchanged _)" [100] 99)
    32   "_unchanged"  :: "lift \<Rightarrow> lift"                    ("(unchanged _)" [100] 99)
    39 
    33 
    40   (*** Priming: same as "after" ***)
    34   (*** Priming: same as "after" ***)
    41   "_prime"      :: "lift \<Rightarrow> lift"                    ("(_`)" [100] 99)
    35   "_prime"      :: "lift \<Rightarrow> lift"                    ("(_`)" [100] 99)
    42 
    36 
    43   "_SqAct"      :: "[lift, lift] \<Rightarrow> lift"            ("([_]'_(_))" [0,1000] 99)
       
    44   "_AnAct"      :: "[lift, lift] \<Rightarrow> lift"            ("(<_>'_(_))" [0,1000] 99)
       
    45   "_Enabled"    :: "lift \<Rightarrow> lift"                    ("(Enabled _)" [100] 100)
    37   "_Enabled"    :: "lift \<Rightarrow> lift"                    ("(Enabled _)" [100] 100)
    46 
    38 
    47 translations
    39 translations
    48   "ACT A"            =>   "(A::state*state \<Rightarrow> _)"
    40   "ACT A"            =>   "(A::state*state \<Rightarrow> _)"
    49   "_before"          ==   "CONST before"
    41   "_before"          ==   "CONST before"
    50   "_after"           ==   "CONST after"
    42   "_after"           ==   "CONST after"
    51   "_prime"           =>   "_after"
    43   "_prime"           =>   "_after"
    52   "_unchanged"       ==   "CONST unch"
    44   "_unchanged"       ==   "CONST unch"
    53   "_SqAct"           ==   "CONST SqAct"
       
    54   "_AnAct"           ==   "CONST AnAct"
       
    55   "_Enabled"         ==   "CONST enabled"
    45   "_Enabled"         ==   "CONST enabled"
    56   "w \<Turnstile> [A]_v"       <=   "_SqAct A v w"
       
    57   "w \<Turnstile> <A>_v"       <=   "_AnAct A v w"
       
    58   "s \<Turnstile> Enabled A"   <=   "_Enabled A s"
    46   "s \<Turnstile> Enabled A"   <=   "_Enabled A s"
    59   "w \<Turnstile> unchanged f" <=   "_unchanged f w"
    47   "w \<Turnstile> unchanged f" <=   "_unchanged f w"
    60 
    48 
    61 axiomatization where
    49 axiomatization where
    62   unl_before:    "(ACT $v) (s,t) \<equiv> v s" and
    50   unl_before:    "(ACT $v) (s,t) \<equiv> v s" and
    63   unl_after:     "(ACT v$) (s,t) \<equiv> v t" and
    51   unl_after:     "(ACT v$) (s,t) \<equiv> v t" and
    64 
       
    65   unchanged_def: "(s,t) \<Turnstile> unchanged v \<equiv> (v t = v s)"
    52   unchanged_def: "(s,t) \<Turnstile> unchanged v \<equiv> (v t = v s)"
    66 
    53 
    67 defs
    54 
    68   square_def:    "ACT [A]_v \<equiv> ACT (A \<or> unchanged v)"
    55 definition SqAct :: "[action, 'a stfun] \<Rightarrow> action"
    69   angle_def:     "ACT <A>_v \<equiv> ACT (A \<and> \<not> unchanged v)"
    56   where square_def: "SqAct A v \<equiv> ACT (A \<or> unchanged v)"
    70 
    57 
    71   enabled_def:   "s \<Turnstile> Enabled A  \<equiv>  \<exists>u. (s,u) \<Turnstile> A"
    58 definition AnAct :: "[action, 'a stfun] \<Rightarrow> action"
       
    59   where angle_def: "AnAct A v \<equiv> ACT (A \<and> \<not> unchanged v)"
       
    60 
       
    61 syntax
       
    62   "_SqAct" :: "[lift, lift] \<Rightarrow> lift"  ("([_]'_(_))" [0, 1000] 99)
       
    63   "_AnAct" :: "[lift, lift] \<Rightarrow> lift"  ("(<_>'_(_))" [0, 1000] 99)
       
    64 translations
       
    65   "_SqAct" == "CONST SqAct"
       
    66   "_AnAct" == "CONST AnAct"
       
    67   "w \<Turnstile> [A]_v" \<leftharpoondown> "_SqAct A v w"
       
    68   "w \<Turnstile> <A>_v" \<leftharpoondown> "_AnAct A v w"
    72 
    69 
    73 
    70 
    74 (* The following assertion specializes "intI" for any world type
    71 (* The following assertion specializes "intI" for any world type
    75    which is a pair, not just for "state * state".
    72    which is a pair, not just for "state * state".
    76 *)
    73 *)