Library Lambek.Semantics



Require Export Form.
Set Implicit Arguments.
Unset Strict Implicit.

Section Atoms_fixed.
Variable Atoms : Set.

Section semantic_defs.


Variables (W : Set) (R : W -> W -> W -> Prop) (v_at : Atoms -> W -> Prop).


Fixpoint val (F : Form Atoms) : W -> Prop :=
  match F with
  | At a => v_at a
  | Dot A B =>
      fun x => exists y : W, (exists z : W, R x y z /\ val A y /\ val B z)
  | Slash C B => fun y => forall x z : W, R x y z -> val B z -> val C x
  | Backslash A C => fun z => forall x y : W, R x y z -> val A y -> val C x
  end.

Definition satisfies (w : W) (A : Form Atoms) : Prop := val A w.

End semantic_defs.

Section model_types.


 Definition model_type := forall W : Set, (W -> W -> W -> Prop) -> Prop.

 Definition model_inter (P1 P2 : model_type) (W : Set)
   (R : W -> W -> W -> Prop) := P1 W R /\ P2 W R.
 Variable P : model_type.

 Definition sem_implies : Form Atoms -> Form Atoms -> Prop :=
   fun A B : Form _ =>
   forall (W : Set) (R : W -> W -> W -> Prop) (v_at : Atoms -> W -> Prop),
   P R -> forall w : W, satisfies R v_at w A -> satisfies R v_at w B.


 Lemma ONE : forall A : Form Atoms, sem_implies A A.
 Proof.
  unfold sem_implies, satisfies in |- *; auto.
 Qed.

 Lemma COMP :
  forall A B C : Form Atoms,
  sem_implies A B -> sem_implies B C -> sem_implies A C.
 Proof.
  unfold sem_implies, satisfies in |- *; auto.
 Qed.

 Lemma GAMMA' :
  forall A B C : Form Atoms,
  sem_implies B (Backslash A C) -> sem_implies (Dot A B) C.
 Proof.
  unfold sem_implies, satisfies in |- *; simpl in |- *; auto.
  intros A B C H W R v_at w H0 H1.
  case H1; intros y H2.
  case H2; intros z H3.
  case H3; intros H4 H5.
  case H5; eauto.
 Qed.

 Lemma GAMMA :
  forall A B C : Form _,
  sem_implies (Dot A B) C -> sem_implies B (Backslash A C).
 Proof.
  unfold sem_implies, satisfies in |- *; simpl in |- *; auto.
  intros A B C H W R v_at H0 w H1 x y H2 H3.
  apply H.
  assumption.
  exists y; exists w; auto.
 Qed.

 Lemma BETA' :
  forall A B C : Form Atoms,
  sem_implies A (Slash C B) -> sem_implies (Dot A B) C.
 Proof.
  unfold sem_implies, satisfies in |- *; simpl in |- *; auto.
  intros A B C H W R v_at w H0 H1.
  case H1; intros y H2.
  case H2; intros z H3.
  case H3; intros H4 H5.
  case H5; eauto.
 Qed.

 Lemma BETA :
  forall A B C : Form _, sem_implies (Dot A B) C -> sem_implies A (Slash C B).
 Proof.
  unfold sem_implies, satisfies in |- *; simpl in |- *; auto.
  intros A B C H W R v_at H0 w H1 x y H2 H3.
  apply H.
  assumption.
  exists w; exists y; auto.
 Qed.

 Lemma GAMMA'BETA :
  forall A B C : Form _,
  sem_implies B (Backslash A C) -> sem_implies A (Slash C B).
 Proof.
  unfold sem_implies, satisfies in |- *; simpl in |- *; eauto.
 Qed.

 End model_types.


 Definition ASS : model_type :=
   fun (W : Set) (R : W -> W -> W -> Prop) =>
   (forall x y z t u : W,
    R t x y -> R u t z -> exists v : W, R v y z /\ R u x v) /\
   (forall x y z v u : W,
    R v y z -> R u x v -> exists t : W, R t x y /\ R u t z).

 Definition COM : model_type :=
   fun (W : Set) (R : W -> W -> W -> Prop) =>
   forall x y z : W, R x y z -> R x z y.

 Section soundness.

 Definition sound (E : arrow_extension) (P : model_type) :=
   forall A B : Form _, arrow E A B -> sem_implies P A B.

 Lemma sem_implies_inter :
  forall (P1 P2 : model_type) (A B : Form _),
  sem_implies P1 A B ->
  sem_implies P2 A B -> sem_implies (model_inter P1 P2) A B.
 Proof.
  unfold model_inter, sem_implies in |- *; intros P1 P2 A B H H0 W R v_at H1.
  case H1; auto.
 Qed.

 Lemma ASS_lemma :
  forall (W : Set) (R : W -> W -> W -> Prop) (v_at : Atoms -> W -> Prop),
  ASS R ->
  forall (A B C : Form _) (w : W),
  satisfies R v_at w (Dot A (Dot B C)) ->
  satisfies R v_at w (Dot (Dot A B) C).
 Proof.
  intros W R v_at H A B C w H0.
  elim H; intros H1 H2.
  clear H; simpl in |- *.
  simpl in H0.
  elim H0; intros y Hy; clear H0.
  elim Hy; intros z Hz; clear Hy.
  elim Hz; intros H3 H4; elim H4; intros H5 H6; clear Hz H4.
  elim H6; intros y0 Hy0; clear H6.
  elim Hy0; intros z0 Hz0; clear Hy0.
  elim Hz0; intros H6 H7; elim H7; intros H8 H9; clear Hz0 H7.
  elim (H2 _ _ _ _ _ H6 H3); intros x H; case H; intros; clear H.
  exists x.
  exists z0; split.
  auto.
  split; auto.
  exists y; exists y0; auto.
 Qed.

 Lemma ASS_lemma_R :
  forall (W : Set) (R : W -> W -> W -> Prop) (v_at : Atoms -> W -> Prop),
  ASS R ->
  forall (A B C : Form _) (w : W),
  satisfies R v_at w (Dot (Dot A B) C) ->
  satisfies R v_at w (Dot A (Dot B C)).
 Proof.
  intros W R v_at H A B C w H0.
  elim H; intros H1 H2.
  clear H; simpl in |- *.
  simpl in H0.
  elim H0; intros y Hy; clear H0.
  elim Hy; intros z Hz; clear Hy.
  elim Hz; intros H3 H4; elim H4; intros H5 H6; clear Hz H4.
  elim H5; intros y0 Hy0; clear H5.
  elim Hy0; intros z0 Hz0; clear Hy0.
  elim Hz0; intros H5 H7; elim H7; intros H8 H9; clear Hz0 H7.
  elim (H1 _ _ _ _ _ H5 H3); intros x H; case H; intros; clear H.
  exists y0.
  exists x; split.
  auto.
  split; auto.
  exists z0; exists z; auto.
 Qed.

 Lemma COM_lemma :
  forall (W : Set) (R : W -> W -> W -> Prop) (v_at : Atoms -> W -> Prop),
  COM R ->
  forall (A B : Form _) (w : W),
  satisfies R v_at w (Dot A B) -> satisfies R v_at w (Dot B A).
 Proof.
  intros W R v_at H A B w H0.
  simpl in |- *.
  simpl in H0.
  case H0; intros y Hy; clear H0.
  case Hy; intros y0 Hy0; clear Hy.
  exists y0; exists y; auto.
  case Hy0.
  simple destruct 2; auto.
 Qed.

 Lemma soundX :
  forall (X : arrow_extension) (P : model_type),
  (forall A B : Form Atoms, X _ A B -> sem_implies P A B) -> sound X P.
 Proof.
  intros X P H.
  unfold sound in |- *; simple induction 1.
  apply ONE.
  intros; eapply COMP; eauto.
  intros; apply GAMMA'BETA; apply GAMMA; auto.
  intros; apply BETA'; assumption.
  intros; apply GAMMA; auto.

intros; apply GAMMA'; assumption.
  exact H.
 Qed.

Lemma soundness_NL : sound NL (fun W R => True).
 Proof.
  apply soundX.
  simple induction 1.
Qed.

 Lemma sound_add :
  forall (E1 E2 : arrow_extension) (M1 M2 : model_type),
  sound E1 M1 ->
  sound E2 M2 -> sound (add_extension E1 E2) (model_inter M1 M2).
 Proof.
  intros E1 E2 M1 M2 H H0; apply soundX.
  unfold add_extension in |- *; simpl in |- *.
  simple induction 1.
  intro H2.
  unfold sem_implies in |- *.
  intros.
  case H3; intros.
  unfold sound in H.
  unfold sem_implies in H.
  eapply H.
  constructor 7.
  eexact H2.
  assumption.
  assumption.
  intro H2.
  unfold model_inter in |- *.
  unfold sem_implies in |- *.
  intros.
  case H3; intros.
  unfold sound in H0.
  unfold sem_implies in H0.
  eapply H0.
  constructor 7.
  eexact H2.
  assumption.
  assumption.
 Qed.

 Lemma sound_NLP : sound NLP COM.
 Proof.
  apply soundX.
  unfold sem_implies in |- *.
  simple destruct 1; intros.
  apply COM_lemma; auto.
 Qed.

 Lemma sound_L : sound L ASS.
 Proof.
  apply soundX.
  unfold sem_implies in |- *.
  simple destruct 1; intros.
  apply ASS_lemma; auto.
  apply ASS_lemma_R; auto.
 Qed.

 Lemma sound_LP : sound LP (model_inter COM ASS).
 Proof.
  unfold LP in |- *; apply sound_add.
  apply sound_NLP.
  apply sound_L.
 Qed.

 End soundness.

 Section completeness.

 Section truth_lemma_spec.

 Variable X : arrow_extension.


 Definition WK : Set := Form Atoms.
 Definition RK (A B C : Form Atoms) := weak (arrow X A (Dot B C)).
 Definition valK (p : Atoms) (A : WK) : Prop := weak (arrow X A (At p)).


 Definition truth_lemma :=
   forall phi A : Form _, weak (arrow X A phi) <-> satisfies RK valK A phi.

 End truth_lemma_spec.


 Definition model_OK (P : model_type) (X : arrow_extension) := P _ (RK X).

 Definition complete (P : model_type) (X : arrow_extension) :=
   forall A B : Form Atoms, sem_implies P A B -> weak (arrow X A B).

 Lemma truth_lemma_X : forall X : arrow_extension, truth_lemma X.
 Proof.
  intro X.
  unfold truth_lemma, satisfies in |- *; simple induction phi.
  unfold WK, RK, valK in |- *; simpl in |- *; tauto.
  intros C HC B HB A.
  split; intro.
  simpl in |- *; intros x z H0 H1.
  elim (HB A); intros.
  cut (weak (arrow X z B)).
  intro.
  cut (weak (arrow X x C)).
  intro.
  elim (HC x); tauto.
  apply weak_comp with (Dot A B).
  apply weak_comp with (Dot A z).
  apply H0.
  apply weak_Dot_mono_right; auto.
  apply weak_beta'.
  auto.
  elim (HB z); tauto.
  simpl in H.
  apply weak_beta.
  elim (HC (Dot A B)); intros H0 H1.
  apply H1.
  apply (H (Dot A B) B).
  unfold RK in |- *; auto with ctl.
  elim (HB B); intros.
  apply H2.
  auto with ctl.

  intros B HB C HC A.
  split; intro.
  simpl in |- *.
  exists B; exists C.
  split.
  unfold RK in |- *; auto.
  split.
  elim (HB B); auto with ctl.
  elim (HC C); auto with ctl.
  simpl in H; elim H.
  clear H.
  simple induction 1.
  intros x0 H0.
  case H0; intros H1 H2.
  case H2; intros H3 H4.
  apply weak_comp with (Dot x x0).
  apply H1.
  apply weak_comp with (Dot B x0).
  apply weak_Dot_mono_left.
  elim (HB x); auto.
  apply weak_Dot_mono_right.
  elim (HC x0); auto.

  intros A HA C HC B.
  split; intro.
  simpl in |- *.
  intros x y H0 H1.
  elim (HC (Dot A B)); intros H2 H3.
  elim (HC x); intros.
  apply H4.
  apply weak_comp with (Dot A B).
  apply weak_comp with (Dot y B).
  auto.
  apply weak_Dot_mono_left.
  elim (HA y); auto.
  apply weak_gamma'.
  auto.
  apply weak_gamma.
  simpl in H.
  elim (HC (Dot A B)); intros.
  apply H1.
  eapply H.
  unfold RK in |- *; apply weak_one.
  elim (HA A); auto with ctl.
 Qed.

 Lemma compl_X :
  forall (X : arrow_extension) (A B : Form Atoms),
  (forall w : WK,
   satisfies (RK X) (valK X) w A -> satisfies (RK X) (valK X) w B) ->
  weak (arrow X A B).
 Proof.
  intros X A B H.
  elim (truth_lemma_X X B A).
  intros.
  apply H1.
  apply H.
  elim (truth_lemma_X X A A).
  auto with ctl.
 Qed.

 Lemma X_complete :
  forall (P : model_type) (X : arrow_extension), model_OK P X -> complete P X.
 Proof.
  unfold complete in |- *; intros P X H0 A B H.
  apply compl_X; auto.
 Qed.

 Lemma NL_OK : model_OK (fun _ _ => True) NL.
 Proof.
  unfold model_OK in |- *; auto.
 Qed.

 Lemma NL_complete : complete (fun _ _ => True) NL.
 Proof.
  apply X_complete; apply NL_OK; auto.
 Qed.

 Lemma LX_OK : forall X : arrow_extension, extends L X -> model_OK ASS X.
 Proof.
  intros X HX.
  unfold model_OK, ASS in |- *.
  unfold RK in |- *; split.
  intros x y z t u H0 H1.
  case H0; intro H2.
  case H1; intro H3.
  exists (Dot y z).
  split.
  split.
  apply one.
  apply weak_comp with (Dot (Dot x y) z).
  split.
  apply comp with (Dot t z).
  assumption.
  apply Dot_mono_left.
  assumption.
  split.
  apply alpha'.
  apply HX.
  intros x y z v u H0 H1.
  case H0; intro H2.
  case H1; intro H3.
  exists (Dot x y).
  split.
  split.
  apply one.
  apply weak_comp with (Dot x (Dot y z)).
  split.
  apply comp with (Dot x v).
  assumption.
  apply Dot_mono_right.
  assumption.
  split.
  apply alpha.
  apply HX.
 Qed.

 Lemma L_OK : model_OK ASS L.
 Proof.
  apply LX_OK.
  unfold extends in |- *; auto.
 Qed.

 Lemma L_complete : complete ASS L.
 Proof.
  apply X_complete; apply L_OK.
 Qed.

 Lemma NLP_X_OK : forall X : arrow_extension, extends NLP X -> model_OK COM X.
 Proof.
  intros X HX; unfold model_OK, COM, RK in |- *; intros x y z H.
  apply weak_comp with (Dot y z).
  assumption.
  case H.
  intro H1.
  split.
  apply pi.
  exact HX.
 Qed.

 Lemma NLP_OK : model_OK COM NLP.
 Proof.
  apply NLP_X_OK.
  unfold extends in |- *; auto.
 Qed.

 Lemma NLP_complete : complete COM NLP.
 Proof.
  apply X_complete.
  apply NLP_OK.
 Qed.

 Lemma LPX_OK :
  forall X : arrow_extension,
  extends LP X -> model_OK (model_inter ASS COM) X.
 Proof.
  intros X HX.
  unfold model_inter in |- *.
  unfold model_OK, RK in |- *; split.
  generalize LX_OK.
  unfold model_OK in |- *.
  intros H.
  unfold RK in H.
  apply H.
  apply extends_trans with LP.
  unfold LP, extends in |- *; right; auto.
  auto.
  generalize NLP_X_OK.
  unfold model_OK in |- *.
  intro H.
  unfold RK in H. apply H.
  apply extends_trans with LP.
  unfold LP, extends in |- *; left; auto.
  auto.
 Qed.

Lemma LP_OK : model_OK (model_inter ASS COM) LP.
 Proof.
  apply LPX_OK.
  unfold extends in |- *; auto.
 Qed.

 Lemma LP_complete : complete (model_inter ASS COM) LP.
 Proof.
  apply X_complete; apply LP_OK.
 Qed.

 End completeness.

End Atoms_fixed.