Kripke Soundness


From Undecidability Require Import FOL.Semantics.Kripke.FragmentCore FOL.Deduction.FragmentND.
From Undecidability Require Import Shared.ListAutomation.
Import ListAutomationNotations.

Set Default Proof Using "Type".

Local Set Implicit Arguments.
Local Unset Strict Implicit.

Local Notation vec := Vector.t.

#[local] Ltac comp := repeat (progress (cbn in *; autounfold in *)).


Section KSoundness.

  Context {Σ_funcs : funcs_signature}.
  Context {Σ_preds : preds_signature}.
  Context {ff : falsity_flag}.

  Ltac clean_ksoundness :=
    match goal with
    | [ H : ?x = ?x -> _ |- _ ] => specialize (H eq_refl)
    | [ H : (?A -> ?B), H2 : (?A -> ?B) -> _ |- _] => specialize (H2 H)
    end.

  Lemma ksoundness A (phi : form) :
    A I phi -> kvalid_ctx A phi.
  Proof.
    intros Hprv D M. remember intu as s. induction Hprv; subst; cbn; intros u rho HA.
    all: repeat (clean_ksoundness + discriminate). all: (eauto || comp; eauto).
    - intros v Hr Hpi. eapply IHHprv. intros ? []; subst; eauto using ksat_mon.
    - eapply IHHprv1. 3: eapply IHHprv2. all: eauto. apply M.
    - intros d. apply IHHprv. intros psi [psi' [<- Hp]] % in_map_iff. cbn. rewrite ksat_comp. apply HA, Hp.
    - rewrite ksat_comp. eapply ksat_ext. 2: eapply (IHHprv u rho HA (eval rho t)).
      unfold funcomp. now intros [].
    - now apply IHHprv in HA.
  Qed.

  Lemma ksoundness' (phi : form) :
    [] I phi -> kvalid phi.
  Proof.
    intros H % ksoundness. firstorder.
  Qed.

  Lemma ksoundnessT (T : form -> Prop) phi :
    T TI phi -> kvalid_theo T phi.
  Proof.
    intros [A[H1 H2 % ksoundness]]. firstorder.
  Qed.

  Lemma ksoundness_bot {ff1 ff2 : falsity_flag} A (psi : @form _ _ _ ff1) (phi : @form _ _ _ ff2) :
    closed psi ->
    (forall xi, kvalid (psi xi)) ->
    A I phi -> kvalid_ctx (map (fun x => x [psi/⊥]) A) (phi[psi/⊥]).
  Proof.
    intros Hclosed Hexpl Hprv D M. remember intu as s. revert psi Hexpl Hclosed. induction Hprv; intros newbot Hexp Hclosed; subst; cbn; intros u rho HA.
    all: repeat (clean_ksoundness + discriminate). all: (eauto || comp; eauto).
    - intros v Hr Hpi. eapply IHHprv. 1-2:easy. intros ? []; subst; eauto using ksat_mon.
    - eapply IHHprv1. 1-2:easy. 3: eapply IHHprv2. all: eauto. apply M.
    - intros d. apply IHHprv. 1-2: now rewrite subst_closed. intros xi [psi' [<- [psi'' [<- Hpsi'']]%in_map_iff]] % in_map_iff.
      rewrite <- subst_falsity_comm. rewrite ksat_comp. apply HA, in_map, Hpsi''.
    - erewrite <- (subst_closed _ Hclosed). rewrite <- subst_falsity_comm.
      rewrite ksat_comp. eapply ksat_ext.
      2: {specialize (IHHprv newbot Hexp Hclosed).
          rewrite subst_closed in IHHprv. 2:easy.
          now eapply (IHHprv u rho HA (eval rho t)). }
      unfold funcomp. now intros [].
    - apply (Hexp (phi[newbot/⊥]) D M u rho). 1: apply M. apply IHHprv. 1-2:easy. apply HA.
  Qed.

  Lemma ksoundness_bot_model {ff1 ff2 : falsity_flag} A (psi : @form _ _ _ ff1) (phi : @form _ _ _ ff2) D (M : kmodel D):
    closed psi ->
    (ff2 = falsity_on -> forall u rho xi, rho ⊩(u,M) (psi xi)) ->
    A I phi ->
    forall u rho,
    (forall psi', psi' el (map (fun x => x [psi/⊥]) A) -> rho ⊩(u,M) psi') ->
    rho ⊩(u,M) (phi[psi/⊥]).
  Proof.
    intros Hclosed Hexpl Hprv. remember intu as s. revert psi Hexpl Hclosed. induction Hprv; intros newbot Hexp Hclosed; subst; cbn; intros u rho HA.
    all: repeat (clean_ksoundness + discriminate). all: (eauto || comp; eauto).
    - intros v Hr Hpi. eapply IHHprv. 1-2:easy. intros ? []; subst; eauto using ksat_mon.
    - eapply IHHprv1. 1-2:easy. 3: eapply IHHprv2. all: eauto. apply M.
    - intros d. apply IHHprv. 1-2: now rewrite subst_closed. intros xi [psi' [<- [psi'' [<- Hpsi'']]%in_map_iff]] % in_map_iff.
      rewrite <- subst_falsity_comm. rewrite ksat_comp. apply HA, in_map, Hpsi''.
    - erewrite <- (subst_closed _ Hclosed). rewrite <- subst_falsity_comm.
      rewrite ksat_comp. eapply ksat_ext.
      2: {specialize (IHHprv newbot Hexp Hclosed).
          rewrite subst_closed in IHHprv. 2:easy.
          now eapply (IHHprv u rho HA (eval rho t)). }
      unfold funcomp. now intros [].
    - apply (Hexp u rho). 1: apply M. apply IHHprv. 1-2:easy. apply HA.
  Qed.

  Lemma ksoundness'_bot {ff1 ff2 : falsity_flag} (psi : @form _ _ _ ff1) (phi : @form _ _ _ ff2) :
    closed psi ->
    (forall xi, kvalid (psi xi)) ->
    [] I phi -> kvalid (phi[psi/⊥]).
  Proof.
    intros Hcl Hexp H % (ksoundness_bot Hcl Hexp). intros D M u rho. now apply (H D M u rho).
  Qed.

End KSoundness.


Section DNE.

  Context {Σ_funcs : funcs_signature}.
  Context {Σ_preds : preds_signature}.

  Variable P : Σ_preds.

  Hypothesis preds_dec : forall P', (P' = P) + (P' <> P).

  Instance imodel : kmodel unit.
  Proof.
    unshelve esplit.
    - exact bool.
    - exact (fun b b' => if b then True else if b' then False else True).
    - exact (fun b P' v => if b then False else True).
    - now intros [].
    - now intros [] [] [].
    - split.
      + intros f v. exact tt.
      + intros P' v. exact True.
    - now intros [] [].
  Defined.

  Lemma imodel_dne (v : vec term (ar_preds P)) :
    ~ ksat true (fun _ => tt) (¬¬(atom P v) (atom P v)).
  Proof.
    cbn. intros H. apply (H true); trivial.
    intros [] _; trivial. intros H'. now apply (H' false).
  Qed.

  Lemma iprv_dne (v : vec term (ar_preds P)) :
    ~ [] I (¬¬(atom P v) (atom P v)).
  Proof.
    intros H % ksoundness. apply (@imodel_dne v). apply H. intros phi [].
  Qed.

End DNE.