Definition emb_trans (I J K : interp domain eta) :
embedding I J -> embedding J K -> embedding I K.
Class kmodel :=
{
nodes : Type ;
reachable : nodes -> nodes -> Prop ;
reach_refl u : reachable u u ;
reach_tran u v w : reachable u v -> reachable v w -> reachable u w ;
world : nodes -> interp domain eta ;
world_f : forall u v, reachable u v -> embedding (world u) (world v)
}.
Variable M : kmodel.
Implicit Type b : logic.
Fixpoint ksat b u (rho : var -> domain) (phi : form b) : Prop :=
match phi with
| Pr t1 t2 => @i_P _ _ (world u) (@eval _ _ (world u) rho t1) (@eval _ _ (world u) rho t2)
| Q => @i_Q _ _ (world u)
| Fal => False
| Impl phi psi => forall v, reachable u v -> ksat v rho phi -> ksat v rho psi
| All n phi => forall v, reachable u v -> forall j : domain, ksat v (rho [[ n := j ]]) phi
end.
Global Arguments ksat {_} _ _ _.
Notation "rho  '⊨(' u ')'  phi" := (ksat u rho phi) (at level 20).
Notation "rho  '⊫(' u ')'  A" := (forall phi, phi el A -> rho ⊨(u) phi) (at level 20).

Lemma eval_invar u v :
reachable u v -> forall rho t, @eval _ _ (world u) rho t = @eval _ _ (world v)rho t.