Theory StandardModels

section ‹Standard Models›
text ‹We define the kind of models we are interested in here.
      In particular, we care about standard graphs.
      To allow some reuse, we distinguish a generic version called @{term standard},
      from an instantiated abbreviation @{term standard'}.
      There is little we can prove about these definition here, except for Lemma 2.›
theory StandardModels
imports LabeledGraphSemantics Main
begin

abbreviation "a_bot ≡ A_Lbl S_Bot"
abbreviation "a_top ≡ A_Lbl S_Top"
abbreviation "a_idt ≡ A_Lbl S_Idt"
notation a_bot (‹⊥›)
notation a_top (‹⊤›)
notation a_idt (‹𝟭›)
                                       
type_synonym 'v std_term = "'v Standard_Constant allegorical_term"
type_synonym 'v std_sentence = "'v std_term × 'v std_term"
type_synonym ('v,'a) std_graph = "('v Standard_Constant, ('v+'a)) labeled_graph"

abbreviation ident_rel where
"ident_rel idt G ≡ getRel idt G = (λ x.(x,x)) ` vertices G"

lemma ident_relI[intro]:
  assumes min:"⋀ x. x ∈ vertices G ⟹ (x,x) ∈ getRel idt G"
  and max1:"⋀ x y. (x,y) ∈ getRel idt G ⟹ x = y"
  and max2:"⋀ x y. (x,y) ∈ getRel idt G ⟹ x ∈ vertices G"
shows "ident_rel idt G"
proof
  from max1 max2 have "⋀ x y. (x,y) ∈ getRel idt G ⟹ (x = y ∧ x ∈ vertices G)" by simp
  thus "getRel idt G ⊆ (λx. (x, x)) ` vertices G" by auto
  show "(λx. (x, x)) ` vertices G ⊆ getRel idt G" using min by auto
qed


text ‹Definition 4, generically.›
definition standard :: "('l × 'v) set ⇒ 'l ⇒ 'l ⇒ 'l ⇒ ('l, 'v) labeled_graph ⇒ bool" where
"standard C b t idt G
   ≡ G = restrict G
   ∧ vertices G ≠ {}
   ∧ ident_rel idt G
   ∧ getRel b G = {}
   ∧ getRel t G = {(x,y). x∈vertices G ∧ y∈vertices G}
   ∧ (∀ (l,v) ∈ C. getRel l G = {(v,v)})"

text ‹Definition 4.›
abbreviation standard' :: "'v set ⇒ ('v,'a) std_graph ⇒ bool" where
"standard' C ≡ standard ((λ c. (S_Const c,Inl c)) ` C) S_Bot S_Top S_Idt"

text ‹Definition 5.›
definition model :: "'v set ⇒ ('v,'a) std_graph ⇒ ('v std_sentence) set ⇒ bool" where
"model C G T ≡ standard' C G ∧ (∀ S ∈ T. G ⊨ S)"

text ‹Definition 5.›
abbreviation consistent :: "'b itself ⇒ 'v set ⇒ ('v std_sentence) set ⇒ bool" where
"consistent _ C T ≡ ∃ (G::('v,'b) std_graph). model C G T"

text ‹Definition 6.›
definition entails :: "'b itself ⇒ 'v set ⇒ ('v std_sentence) set ⇒ 'v std_sentence ⇒ bool"  where
"entails _ C T S ≡ ∀ (G::('v,'b) std_graph). model C G T ⟶ G ⊨ S"

lemma standard_top_not_bot[intro]:
"standard' C G ⟹ :G:⟦⊥⟧ ≠ :G:⟦⊤⟧"
  unfolding standard_def by auto

text ‹Lemma 2.›
lemma consistent_iff_entails_nonsense:
"consistent t C T = (¬ entails t C T (⊥,⊤))"
proof
  show "consistent t C T ⟹ ¬ entails t C T (⊥, ⊤)"
    using standard_top_not_bot unfolding entails_def model_def
    by fastforce
qed (auto simp:entails_def model_def)

end