Theory AOT_Axioms

(*<*)
theory AOT_Axioms
  imports AOT_Definitions
begin
(*>*)

section‹Axioms of PLM›

AOT_axiom "pl:1": ‹φ → (ψ → φ)›
  by (auto simp: AOT_sem_imp AOT_model_axiomI)
AOT_axiom "pl:2": ‹(φ → (ψ → χ)) → ((φ → ψ) → (φ → χ))›
  by (auto simp: AOT_sem_imp AOT_model_axiomI)
AOT_axiom "pl:3": ‹(¬φ → ¬ψ) → ((¬φ → ψ) → φ)›
  by (auto simp: AOT_sem_imp AOT_sem_not AOT_model_axiomI)

AOT_axiom "cqt:1": ‹∀α φ{α} → (τ↓ → φ{τ})›
  by (auto simp: AOT_sem_denotes AOT_sem_forall AOT_sem_imp AOT_model_axiomI)

AOT_axiom "cqt:2[const_var]": ‹α↓›
  using AOT_sem_vars_denote by (rule AOT_model_axiomI)
AOT_axiom "cqt:2[lambda]":
  assumes ‹INSTANCE_OF_CQT_2(φ)›
  shows ‹[λν1...νn φ{ν1...νn}]↓›
  by (auto intro!: AOT_model_axiomI AOT_sem_cqt_2[OF assms])
AOT_axiom "cqt:2[lambda0]":
  shows ‹[λ φ]↓›
  by (auto intro!: AOT_model_axiomI
           simp: AOT_sem_lambda_denotes "existence:3"[unfolded AOT_model_equiv_def])

AOT_axiom "cqt:3": ‹∀α (φ{α} → ψ{α}) → (∀α φ{α} → ∀α ψ{α})›
  by (simp add: AOT_sem_forall AOT_sem_imp AOT_model_axiomI)
AOT_axiom "cqt:4": ‹φ → ∀α φ›
  by (simp add: AOT_sem_forall AOT_sem_imp AOT_model_axiomI)
AOT_axiom "cqt:5:a": ‹[Π]κ1...κn → (Π↓ & κ1...κn↓)›
  by (simp add: AOT_sem_conj AOT_sem_denotes AOT_sem_exe
                AOT_sem_imp AOT_model_axiomI)
AOT_axiom "cqt:5:a[1]": ‹[Π]κ → (Π↓ & κ↓)›
  using "cqt:5:a" AOT_model_axiomI by blast
AOT_axiom "cqt:5:a[2]": ‹[Π]κ1κ2 → (Π↓ & κ1↓ & κ2↓)›
  by (rule AOT_model_axiomI)
     (metis AOT_model_denotes_prod_def AOT_sem_conj AOT_sem_denotes AOT_sem_exe
            AOT_sem_imp case_prodD)
AOT_axiom "cqt:5:a[3]": ‹[Π]κ1κ2κ3 → (Π↓ & κ1↓ & κ2↓ & κ3↓)›
  by (rule AOT_model_axiomI)
     (metis AOT_model_denotes_prod_def AOT_sem_conj AOT_sem_denotes AOT_sem_exe
            AOT_sem_imp case_prodD)
AOT_axiom "cqt:5:a[4]": ‹[Π]κ1κ2κ3κ4 → (Π↓ & κ1↓ & κ2↓ & κ3↓ & κ4↓)›
  by (rule AOT_model_axiomI)
     (metis AOT_model_denotes_prod_def AOT_sem_conj AOT_sem_denotes AOT_sem_exe
            AOT_sem_imp case_prodD)
AOT_axiom "cqt:5:b": ‹κ1...κn[Π] → (Π↓ & κ1...κn↓)›
  using AOT_sem_enc_denotes
  by (auto intro!: AOT_model_axiomI simp: AOT_sem_conj AOT_sem_denotes AOT_sem_imp)+
AOT_axiom "cqt:5:b[1]": ‹κ[Π] → (Π↓ & κ↓)›
  using "cqt:5:b" AOT_model_axiomI by blast
AOT_axiom "cqt:5:b[2]": ‹κ1κ2[Π] → (Π↓ & κ1↓ & κ2↓)›
  by (rule AOT_model_axiomI)
     (metis AOT_model_denotes_prod_def AOT_sem_conj AOT_sem_denotes
            AOT_sem_enc_denotes AOT_sem_imp case_prodD)
AOT_axiom "cqt:5:b[3]": ‹κ1κ2κ3[Π] → (Π↓ & κ1↓ & κ2↓ & κ3↓)›
  by (rule AOT_model_axiomI)
     (metis AOT_model_denotes_prod_def AOT_sem_conj AOT_sem_denotes
            AOT_sem_enc_denotes AOT_sem_imp case_prodD)
AOT_axiom "cqt:5:b[4]": ‹κ1κ2κ3κ4[Π] → (Π↓ & κ1↓ & κ2↓ & κ3↓ & κ4↓)›
  by (rule AOT_model_axiomI)
     (metis AOT_model_denotes_prod_def AOT_sem_conj AOT_sem_denotes
            AOT_sem_enc_denotes AOT_sem_imp case_prodD)

AOT_axiom "l-identity": ‹α = β → (φ{α} → φ{β})›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_eq AOT_sem_imp)

AOT_act_axiom "logic-actual": ‹𝒜φ → φ›
  by (rule AOT_model_act_axiomI)
     (simp add: AOT_sem_act AOT_sem_imp)

AOT_axiom "logic-actual-nec:1": ‹𝒜¬φ ≡ ¬𝒜φ›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_act AOT_sem_equiv AOT_sem_not)
AOT_axiom "logic-actual-nec:2": ‹𝒜(φ → ψ) ≡ (𝒜φ → 𝒜ψ)›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_act AOT_sem_equiv AOT_sem_imp)

AOT_axiom "logic-actual-nec:3": ‹𝒜(∀α φ{α}) ≡ ∀α 𝒜φ{α}›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_act AOT_sem_equiv AOT_sem_forall AOT_sem_denotes)
AOT_axiom "logic-actual-nec:4": ‹𝒜φ ≡ 𝒜𝒜φ›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_act AOT_sem_equiv)

AOT_axiom "qml:1": ‹□(φ → ψ) → (□φ → □ψ)›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_box AOT_sem_imp)
AOT_axiom "qml:2": ‹□φ → φ›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_box AOT_sem_imp)
AOT_axiom "qml:3": ‹◇φ → □◇φ›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_box AOT_sem_dia AOT_sem_imp)

AOT_axiom "qml:4": ‹◇∃x (E!x & ¬𝒜E!x)›
  using AOT_sem_concrete AOT_model_contingent
  by (auto intro!: AOT_model_axiomI
             simp: AOT_sem_box AOT_sem_dia AOT_sem_imp AOT_sem_exists
                   AOT_sem_denotes AOT_sem_conj AOT_sem_not AOT_sem_act
                   AOT_sem_exe)+

AOT_axiom "qml-act:1": ‹𝒜φ → □𝒜φ›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_act AOT_sem_box AOT_sem_imp)
AOT_axiom "qml-act:2": ‹□φ ≡ 𝒜□φ›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_act AOT_sem_box AOT_sem_equiv)

AOT_axiom descriptions: ‹x = ιx(φ{x}) ≡ ∀z(𝒜φ{z} ≡ z = x)›
proof (rule AOT_model_axiomI)
  AOT_modally_strict {
    AOT_show ‹x = ιx(φ{x}) ≡ ∀z(𝒜φ{z} ≡ z = x)›
      by (induct; simp add: AOT_sem_equiv AOT_sem_forall AOT_sem_act AOT_sem_eq)
         (metis (no_types, opaque_lifting) AOT_sem_desc_denotes AOT_sem_desc_prop
                                           AOT_sem_denotes)
  }
qed

AOT_axiom "lambda-predicates:1":
  ‹[λν1...νn φ{ν1...νn}]↓ → [λν1...νn φ{ν1...νn}] = [λμ1...μn φ{μ1...μn}]›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_denotes AOT_sem_eq AOT_sem_imp)
AOT_axiom "lambda-predicates:1[zero]": ‹[λ p]↓ → [λ p] = [λ p]›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_denotes AOT_sem_eq AOT_sem_imp)
AOT_axiom "lambda-predicates:2":
  ‹[λx1...xn φ{x1...xn}]↓ → ([λx1...xn φ{x1...xn}]x1...xn ≡ φ{x1...xn})›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_equiv AOT_sem_imp AOT_sem_lambda_beta AOT_sem_vars_denote)
AOT_axiom "lambda-predicates:3": ‹[λx1...xn [F]x1...xn] = F›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_lambda_eta AOT_sem_vars_denote)
AOT_axiom "lambda-predicates:3[zero]": ‹[λ p] = p›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_eq AOT_sem_lambda0 AOT_sem_vars_denote)

AOT_axiom "safe-ext":
  ‹([λν1...νn φ{ν1...νn}]↓ & □∀ν1...∀νn (φ{ν1...νn} ≡ ψ{ν1...νn})) →
   [λν1...νn ψ{ν1...νn}]↓›
  using AOT_sem_lambda_coex
  by (auto intro!: AOT_model_axiomI simp: AOT_sem_imp AOT_sem_denotes AOT_sem_conj
                   AOT_sem_equiv AOT_sem_box AOT_sem_forall)
AOT_axiom "safe-ext[2]":
  ‹([λν1ν2 φ{ν1,ν2}]↓ & □∀ν1∀ν2 (φ{ν1, ν2} ≡ ψ{ν1, ν2})) →
   [λν1ν2 ψ{ν1,ν2}]↓›
  using "safe-ext"[where φ="λ(x,y). φ x y"]
  by (simp add: AOT_model_axiom_def AOT_sem_denotes AOT_model_denotes_prod_def
                AOT_sem_forall AOT_sem_imp AOT_sem_conj AOT_sem_equiv AOT_sem_box)
AOT_axiom "safe-ext[3]":
  ‹([λν1ν2ν3 φ{ν1,ν2,ν3}]↓ & □∀ν1∀ν2∀ν3 (φ{ν1, ν2, ν3} ≡ ψ{ν1, ν2, ν3})) →
   [λν1ν2ν3 ψ{ν1,ν2,ν3}]↓›
  using "safe-ext"[where φ="λ(x,y,z). φ x y z"]
  by (simp add: AOT_model_axiom_def AOT_model_denotes_prod_def AOT_sem_forall
                AOT_sem_denotes AOT_sem_imp AOT_sem_conj AOT_sem_equiv AOT_sem_box)
AOT_axiom "safe-ext[4]":
  ‹([λν1ν2ν3ν4 φ{ν1,ν2,ν3,ν4}]↓ &
    □∀ν1∀ν2∀ν3∀ν4 (φ{ν1, ν2, ν3, ν4} ≡ ψ{ν1, ν2, ν3, ν4})) →
   [λν1ν2ν3ν4 ψ{ν1,ν2,ν3,ν4}]↓›
  using "safe-ext"[where φ="λ(x,y,z,w). φ x y z w"]
  by (simp add: AOT_model_axiom_def AOT_model_denotes_prod_def AOT_sem_forall
                AOT_sem_denotes AOT_sem_imp AOT_sem_conj AOT_sem_equiv AOT_sem_box)

AOT_axiom "nary-encoding[2]":
  ‹x1x2[F] ≡ x1[λy [F]yx2] & x2[λy [F]x1y]›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_conj AOT_sem_equiv AOT_enc_prod_def AOT_proj_enc_prod_def
                AOT_sem_unary_proj_enc AOT_sem_vars_denote)
AOT_axiom "nary-encoding[3]":
  ‹x1x2x3[F] ≡ x1[λy [F]yx2x3] & x2[λy [F]x1yx3] & x3[λy [F]x1x2y]›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_conj AOT_sem_equiv AOT_enc_prod_def AOT_proj_enc_prod_def
                AOT_sem_unary_proj_enc AOT_sem_vars_denote)
AOT_axiom "nary-encoding[4]":
  ‹x1x2x3x4[F] ≡ x1[λy [F]yx2x3x4] &
                 x2[λy [F]x1yx3x4] &
                 x3[λy [F]x1x2yx4] &
                 x4[λy [F]x1x2x3y]›
  by (rule AOT_model_axiomI)
     (simp add: AOT_sem_conj AOT_sem_equiv AOT_enc_prod_def AOT_proj_enc_prod_def
                AOT_sem_unary_proj_enc AOT_sem_vars_denote)

AOT_axiom encoding: ‹x[F] → □x[F]›
  using AOT_sem_enc_nec 
  by (auto intro!: AOT_model_axiomI simp: AOT_sem_imp AOT_sem_box)

AOT_axiom nocoder: ‹O!x → ¬∃F x[F]›
  by (auto intro!: AOT_model_axiomI
           simp: AOT_sem_imp AOT_sem_not AOT_sem_exists AOT_sem_ordinary
                 AOT_sem_dia
                AOT_sem_lambda_beta[OF AOT_sem_ordinary_def_denotes,
                                    OF AOT_sem_vars_denote])
     (metis AOT_sem_nocoder)

AOT_axiom "A-objects": ‹∃x (A!x & ∀F(x[F] ≡ φ{F}))›
proof(rule AOT_model_axiomI)
  AOT_modally_strict {
    AOT_obtain κ where ‹κ↓ & □¬E!κ & ∀F (κ[F] ≡ φ{F})›
      using AOT_sem_A_objects[of _ φ]
      by (auto simp: AOT_sem_imp AOT_sem_box AOT_sem_forall AOT_sem_exists
                     AOT_sem_conj AOT_sem_not AOT_sem_dia AOT_sem_denotes
                     AOT_sem_equiv) blast
    AOT_thus ‹∃x (A!x & ∀F(x[F] ≡ φ{F}))›
      unfolding AOT_sem_exists
      by (auto intro!: exI[where x=κ]
               simp: AOT_sem_lambda_beta[OF AOT_sem_abstract_def_denotes]
                     AOT_sem_box AOT_sem_dia AOT_sem_not AOT_sem_denotes
                     AOT_var_of_term_inverse AOT_sem_conj
                     AOT_sem_equiv AOT_sem_forall AOT_sem_abstract)
  }
qed

AOT_theorem universal_closure:
  assumes ‹for arbitrary α: φ{α} ∈ Λ□›
  shows ‹∀α φ{α} ∈ Λ□›
  using assms
  by (metis AOT_term_of_var_cases AOT_model_axiom_def AOT_sem_denotes AOT_sem_forall)

AOT_theorem act_closure:
  assumes ‹φ ∈ Λ□›
  shows ‹𝒜φ ∈ Λ□›
  using assms by (simp add: AOT_model_axiom_def AOT_sem_act)

AOT_theorem nec_closure:
  assumes ‹φ ∈ Λ□›
  shows ‹□φ ∈ Λ□›
  using assms by (simp add: AOT_model_axiom_def AOT_sem_box)

AOT_theorem universal_closure_act:
  assumes ‹for arbitrary α: φ{α} ∈ Λ›
  shows ‹∀α φ{α} ∈ Λ›
  using assms
  by (metis AOT_term_of_var_cases AOT_model_act_axiom_def AOT_sem_denotes
            AOT_sem_forall)

text‹The following are not part of PLM and only hold in the extended models.
     They are a generalization of the predecessor axiom.›
context AOT_ExtendedModel
begin
AOT_axiom indistinguishable_ord_enc_all:
  ‹Π↓ & A!x & A!y & ∀F □([F]x ≡ [F]y) →
  ((∀G(∀z(O!z → □([G]z ≡ [Π]z)) → x[G])) ≡
    ∀G(∀z(O!z → □([G]z ≡ [Π]z)) → y[G]))›
  by (rule AOT_model_axiomI)
     (auto simp: AOT_sem_equiv AOT_sem_imp AOT_sem_conj
                 AOT_sem_indistinguishable_ord_enc_all)
AOT_axiom indistinguishable_ord_enc_ex:
  ‹Π↓ & A!x & A!y & ∀F □([F]x ≡ [F]y) →
  ((∃G(∀z(O!z → □([G]z ≡ [Π]z)) & x[G])) ≡
    ∃G(∀z(O!z → □([G]z ≡ [Π]z)) & y[G]))›
  by (rule AOT_model_axiomI)
     (auto simp: AOT_sem_equiv AOT_sem_imp AOT_sem_conj 
                 AOT_sem_indistinguishable_ord_enc_ex)
end

(*<*)
end
(*>*)