theory Forcing_Theorems imports Interface Names begin
locale forcing_thms = forcing_data +
fixes forces :: "i ⇒ i"
assumes definition_of_forces: "p∈P ⟹ φ∈formula ⟹ env∈list(M) ⟹
sats(M,forces(φ), [P,leq,one,p] @ env) ⟷
(∀G.(M_generic(G)∧ p∈G)⟶sats(M[G],φ,map(val(G),env)))"
and definability[TC]: "φ∈formula ⟹ forces(φ) ∈ formula"
and arity_forces: "φ∈formula ⟹ arity(forces(φ)) = arity(φ) #+ 4"
and truth_lemma: "φ∈formula ⟹ env∈list(M) ⟹ M_generic(G) ⟹
(∃p∈G.(sats(M,forces(φ), [P,leq,one,p] @ env))) ⟷
sats(M[G],φ,map(val(G),env))"
and strengthening: "p∈P ⟹ φ∈formula ⟹ env∈list(M) ⟹ q∈P ⟹ <q,p>∈leq ⟹
sats(M,forces(φ), [P,leq,one,p] @ env) ⟹
sats(M,forces(φ), [P,leq,one,q] @ env)"
and density_lemma: "p∈P ⟹ φ∈formula ⟹ env∈list(M) ⟹
sats(M,forces(φ), [P,leq,one,p] @ env) ⟷
dense_below({q∈P. sats(M,forces(φ), [P,leq,one,q] @ env)},p)"
begin
end
locale G_generic = forcing_thms +
fixes G :: "i"
assumes generic : "M_generic(G)"
begin
lemma zero_in_MG :
"0 ∈ M[G]"
proof -
from zero_in_M and elem_of_val have
"0 = val(G,0)"
by auto
also from GenExtI and zero_in_M have
"... ∈ M[G]"
by simp
finally show ?thesis .
qed
lemma G_nonempty: "G≠0"
proof -
have "P⊆P" ..
with P_in_M P_dense ‹P⊆P› show
"G ≠ 0"
using generic unfolding M_generic_def by auto
qed
end
end