Section KripkeSemantic.
Context {venv: Var_env}.
Class Frame : Type := {
Worlds: Type;
access: Worlds -> Worlds -> Prop;
access_refl: forall w, access w w;
access_trans: forall u v w, access u v -> access v w -> access u w
}.
Class Model: Type := {
F: Frame;
eval: Worlds -> Var -> bool;
hereditary: forall w v: Worlds, access w v -> (forall x: Var, eval w x = true -> eval v x = true)
}.
Existing Instance F.
Class KripkeSem : Type := {
M: Model;
Kripke_Sat : Worlds -> Term -> Prop;
satisfy_ind: forall (w: Worlds) (t: Term),
Kripke_Sat w t <->
match t with
| andp t1 t2 => Kripke_Sat w t1 /\ Kripke_Sat w t2
| orp t1 t2 => Kripke_Sat w t1 \/ Kripke_Sat w t2
| impp t1 t2 => forall v, access w v -> Kripke_Sat v t1 -> Kripke_Sat v t2
| falsep => False
| varp x => eval w x = true
end
}.
Existing Instance M.
Class PointModel: Type := {
KS: KripkeSem;
w: Worlds
}.
Existing Instance KS.
Instance Kripke_sem : Semantic := mk_sem PointModel (fun KM t => Kripke_Sat w t).
End KripkeSemantic.

Lemma sound_Kripke_IPC: sound Kripke_sem IPC.