(*******   Kripke_Model    ****************************************)


Inductive Kripke_Model (A : Set) (World : A -> Type) 
(le : A -> A -> Type) (forces0 : A -> Int -> Prop) : Type :=
    kripke_model :
      (forall k : A, World k -> le k k) ->
      (forall k0 k1 k2 : A,
       World k0 -> World k1 -> World k2 -> le k0 k1 -> le k1 k2 -> le k0 k2) ->
      (forall k0 k1 : A,
       World k0 ->
       World k1 -> le k0 k1 -> forall i : Int, forces0 k0 i -> forces0 k1 i) ->
      Kripke_Model A World le forces0.(*******   Kripke_Model    ****************************************)


Inductive Kripke_Model (A : Set) (World : A -> Type) 
(le : A -> A -> Type) (forces0 : A -> Int -> Prop) : Type :=
    kripke_model :
      (forall k : A, World k -> le k k) ->
      (forall k0 k1 k2 : A,
       World k0 -> World k1 -> World k2 -> le k0 k1 -> le k1 k2 -> le k0 k2) ->
      (forall k0 k1 : A,
       World k0 ->
       World k1 -> le k0 k1 -> forall i : Int, forces0 k0 i -> forces0 k1 i) ->
      Kripke_Model A World le forces0.Fixpoint forces (A : Set) (World : A -> Type) 
 (le : A -> A -> Type) (forces0 : A -> Int -> Prop) 
 (k : A) (a : form) {struct a} : Prop :=
  match a with
  | Falsum => False
  | Atom i => forces0 k i
  | AndF a0 a1 =>
      forces A World le forces0 k a0 /\ forces A World le forces0 k a1
  | OrF a0 a1 =>
      forces A World le forces0 k a0 \/ forces A World le forces0 k a1
  | Imp a0 a1 =>
      forall k' : A,
      World k' ->
      le k k' ->
      forces A World le forces0 k' a0 -> forces A World le forces0 k' a1
  end.

Lemma forces_a0_imp_c_and_a1_imp_c_and_c_imp_b__forces_a0_or_a1_imp_b : forall (A : Set) (World : A -> Type) (le : A -> A -> Type) (forces0 : A -> Int -> Prop) (k : A) (a0 a1 c b : form), forces A World le forces0 k (Imp a0 c) -> forces A World le forces0 k (Imp a1 c) -> forces A World le forces0 k (Imp c b) -> forces A World le forces0 k (Imp (OrF a0 a1) b).