(** ** Soundness **)
Hint Resolve reach_refl.
Definition kcast domain (eta eta' : nat -> domain) (M : kmodel eta) : kmodel eta'.

(* Specifications: *)
Lemma ksat_ext dom b (phi : form b) rho rho' eta (M : @kmodel dom eta ) u :
rho ⊩(u,M,eta) phi -> (forall v, rho v = rho' v) ->  rho' ⊩(u,M,eta) phi.
Lemma subst_ksat dom b eta rho (M : @kmodel dom eta ) u (phi : form b) x t :
vars_t t = [] ->
rho ⊩(u,M,eta) (subst x t phi) <-> rho[[x:=eval (I:=world u) rho t]] ⊩(u,M,eta) phi.
Lemma substconst_ksat b dom eta rho (phi : form b) x a d (M : @kmodel dom eta) u :
fresh a (consts phi) ->
rho ⊩(u, kcast (eta [[a := d]]) M, _) (subst x (P a) phi) <->
rho [[ x := d ]] ⊩(u,M,eta) phi.