Substitution construction

This module defines two functions that replace subformulas with propositional variables, thus constructing a simpler formula and a substitution. The first function replaces the arguments in a modality. This is needed in the completeness proof 4.13. The second one replaces whole modal formulas. This is needed for non-atomic axioms in 5.6.1.

Backward substitution for arguments of modalities

Substitute unique variables for formulas, needed in 4.13

  Variable V : Type.
  Variable L : modal_operators.

Need a decidable equality on propositional constants for function update in substitutions.
  Variable v_eq : eq_type V.

Function definition


  Definition back_subst_result(form_type : Type) : Type :=
    ( form_type × (lambda_subst V L) × nat )%type.

  Fixpoint mod_arg_back_subst_mod_args(f : natV)(next : nat)
               (subst : lambda_subst V L)
               (n : nat)(args : counted_list (lambda_formula V L) n) :
                    back_subst_result (counted_list (lambda_formula V L) n) :=
    match args with
      | counted_nil(counted_nil, subst, next)
      | counted_cons n arg args
        let (res_subst, next) :=
            mod_arg_back_subst_mod_args f next subst n args in
        let (res, subst) := res_subst
        in
          (counted_cons (lf_prop (f next)) res,
           function_update v_eq subst (f next) arg,
           S next)
    end.

  Definition mod_arg_back_subst_modal_form(f : natV)(next : nat)
               (subst : lambda_subst V L)
               (form : lambda_formula V L)(mod_form : modal_form form)
                                   : back_subst_result (lambda_formula V L) :=
    match form return modal_form formback_subst_result (lambda_formula V L)
    with
      | lf_modal op argsfun _
        let (res_subst, next) :=
                mod_arg_back_subst_mod_args f next subst (arity L op) args in
        let (res, subst) := res_subst
        in
          (lf_modal op res, subst, next)
      | _fun(H : False) ⇒ False_rect _ H
    end mod_form.

  Definition mod_arg_back_subst_neg_mod_form(f : natV)(next : nat)
               (subst : lambda_subst V L)
               (form : lambda_formula V L)
               (neg_mod_form : top_modal_form form)
                                   : back_subst_result (lambda_formula V L) :=
    match form
        return top_modal_form form
                     → back_subst_result (lambda_formula V L)
    with
      | lf_neg formfun(H : modal_form form) ⇒
        let (res_subst, next) :=
            mod_arg_back_subst_modal_form f next subst form H in
        let (res, subst) := res_subst
        in (lf_neg res, subst, next)
      | lf_modal op argsfun(H : modal_form (lf_modal op args)) ⇒
          mod_arg_back_subst_modal_form f next subst (lf_modal op args) H
      | _fun(H : False) ⇒ False_rect _ H
    end neg_mod_form.

  Fixpoint mod_arg_back_subst_sequent_rec(f : natV)(next : nat)
               (subst : lambda_subst V L)
               (s : sequent V L)(top_mod_s : top_modal_sequent s)
                                          : back_subst_result (sequent V L) :=
    match s return top_modal_sequent sback_subst_result (sequent V L)
    with
      | []fun _([], subst, next)
      | form :: seqfun(H : top_modal_sequent (form :: seq)) ⇒
        let (res_subst, next) :=
              mod_arg_back_subst_sequent_rec f next subst seq
                                                  (every_nth_tail _ _ _ H) in
        let (sres, subst) := res_subst in
        let (res_subst, next) :=
              mod_arg_back_subst_neg_mod_form f next subst form
                                                  (every_nth_head _ _ _ H) in
        let (fres, subst) := res_subst
        in
          (fres :: sres, subst, next)
    end top_mod_s.

  Definition mod_arg_back_subst_sequent(f : natV)
                  (s : sequent V L)(top_mod_s : top_modal_sequent s)
                                      : (sequent V L) × (lambda_subst V L) :=
    let (res, _) := mod_arg_back_subst_sequent_rec f 0 id_subst s top_mod_s
    in res.

Utility predicates


  Definition subst_equal_below(f : natV)(n : nat)
                              (sigma1 sigma2 : lambda_subst V L) : Prop :=
    (i : nat),
      i < n
      sigma1 (f i) = sigma2 (f i).

  Definition subst_equal_below_refl :
    (f : natV)(n : nat)(sigma : lambda_subst V L),
      subst_equal_below f n sigma sigma.

  Definition subst_equal_below_trans :
    (f : natV)(n : nat)(sigma1 sigma2 sigma3 : lambda_subst V L),
      subst_equal_below f n sigma1 sigma2
      subst_equal_below f n sigma2 sigma3
        subst_equal_below f n sigma1 sigma3.

  Definition subst_equal_below_single_update :
    (f : natV)(n1 n2 : nat)(sigma : lambda_subst V L)
          (form : lambda_formula V L),
      injective f
      n1 n2
        subst_equal_below f n1
          (function_update v_eq sigma (f n2) form)
          sigma.

  Definition subst_equal_below_mono :
    (f : natV)(n1 n2 : nat)(sigma1 sigma2 : lambda_subst V L),
      subst_equal_below f n1 sigma1 sigma2
      n2 n1
        subst_equal_below f n2 sigma1 sigma2.

  Definition prop_var_list_below(f : natV)(n : nat)
                                (prop_vars : list V) : Prop :=
    (v : V),
      In v prop_vars
      (i : nat),
        i < n f i = v.

  Lemma prop_var_list_below_singleton :
    (f : natV)(bound n : nat),
      n < bound
        prop_var_list_below f bound [f n].

  Lemma prop_var_list_below_empty :
    (f : natV)(n : nat),
      prop_var_list_below f n [].

  Lemma prop_var_list_below_append :
    (f : natV)(n : nat)(pv1 pv2 : list V),
      prop_var_list_below f n pv1
      prop_var_list_below f n pv2
        prop_var_list_below f n (pv1 ++ pv2).

  Lemma subst_eq_on_vars_below :
    (f : natV)(n : nat)
          (sigma1 sigma2 : lambda_subst V L)(prop_vars : list V),
      subst_equal_below f n sigma1 sigma2
      prop_var_list_below f n prop_vars
        subst_eq_on_vars sigma1 sigma2 prop_vars.

Prove substitution property for mod arg back subst


  Lemma mod_arg_back_subst_mod_args_prop_ind :
    (f : natV)(arity : nat)
          (args back_args : counted_list (lambda_formula V L) arity)
          (r n n_res : nat)(sigma sigma_res : lambda_subst V L),
      injective f
      every_nth (rank_formula (S r)) (list_of_counted_list args) →
      rank_subst (S r) sigma
      mod_arg_back_subst_mod_args f n sigma arity args =
                                (back_args, sigma_res, n_res)
        ((bound : nat),
           n_res bound
             prop_var_list_below f bound (prop_var_modal_args arity back_args))
         n n_res
        subst_equal_below f n sigma_res sigma
        counted_map (subst_form sigma_res) back_args = args
        every_nth prop_form (list_of_counted_list back_args)
        rank_subst (S r) sigma_res.

  Lemma mod_arg_back_subst_mod_args_prop :
    (arity : nat)(args : counted_list (lambda_formula V L) arity)
          (rank : nat),
      countably_infinite V
      every_nth (rank_formula (S rank)) (list_of_counted_list args) →
      (simple_args : counted_list (lambda_formula V L) arity)
            (sigma : lambda_subst V L),
        counted_map (subst_form sigma) simple_args = args
        every_nth prop_form (list_of_counted_list simple_args)
        rank_subst (S rank) sigma.

  Lemma mod_arg_back_subst_modal_form_prop :
    (f : natV)(form back_form : lambda_formula V L)
          (mod_form : modal_form form)
          (r n n_res : nat)(sigma sigma_res : lambda_subst V L) ,
      injective f
      rank_formula (2 + r) form
      rank_subst (S r) sigma
      mod_arg_back_subst_modal_form f n sigma form mod_form =
                                       (back_form, sigma_res, n_res)
        ((bound : nat),
           n_res bound
             prop_var_list_below f bound (prop_var_formula back_form))
        
        n n_res
        subst_equal_below f n sigma_res sigma
        subst_form sigma_res back_form = form
        simple_modal_form back_form
        rank_subst (S r) sigma_res.

  Lemma mod_arg_back_subst_neg_form_prop :
    (f : natV)(form back_form : lambda_formula V L)
          (neg_mod_form : top_modal_form form)
          (r n n_res : nat)(sigma sigma_res: lambda_subst V L),
      injective f
      rank_formula (2 + r) form
      rank_subst (S r) sigma
      mod_arg_back_subst_neg_mod_form f n sigma form neg_mod_form =
                  (back_form, sigma_res, n_res)
        ((bound : nat),
           n_res bound
             prop_var_list_below f bound (prop_var_formula back_form))
        
        n n_res
        subst_equal_below f n sigma_res sigma
        subst_form sigma_res back_form = form
        neg_form_maybe simple_modal_form back_form
        rank_subst (S r) sigma_res.

  Lemma mod_arg_back_subst_sequent_rec_prop :
    (f : natV)(s back_s : sequent V L)
          (top_mod_s : top_modal_sequent s)(r n n_res : nat)
          (sigma sigma_res : lambda_subst V L),
      injective f
      rank_sequent (2 + r) s
      rank_subst (S r) sigma
      mod_arg_back_subst_sequent_rec f n sigma s top_mod_s
                             = (back_s, sigma_res, n_res)
        ((bound : nat),
           n_res bound
             prop_var_list_below f bound (prop_var_sequent back_s))
        subst_sequent sigma_res back_s = s
        simple_modal_sequent back_s
        rank_subst (S r) sigma_res.

  Lemma mod_arg_back_subst_sequent_prop :
    (s : sequent V L)(n : nat),
      countably_infinite V
      top_modal_sequent s
      rank_sequent (2 + n) s
      (simple_s : sequent V L)(sigma : lambda_subst V L),
        subst_sequent sigma simple_s = s
        simple_modal_sequent simple_s
        rank_subst (S n) sigma.

Backward substitution for modal formulas

Needed in 5.6.1

Function definition


  Fixpoint prop_back_subst_form_rec(f : natV)(next : nat)
               (subst : lambda_subst V L)(form : lambda_formula V L)
                                   : back_subst_result (lambda_formula V L) :=
    match form
    with
      | lf_prop v
        (lf_prop (f next),
         function_update v_eq subst (f next) (lf_prop v),
         S next)
      | lf_neg form
        let (res_subst, next) :=
            prop_back_subst_form_rec f next subst form in
        let (res, subst) := res_subst
        in (lf_neg res, subst, next)
      | lf_and form1 form2
        let (res_subst, next) :=
            prop_back_subst_form_rec f next subst form1 in
        let (res_1, subst) := res_subst in
        let (res_subst, next) :=
            prop_back_subst_form_rec f next subst form2 in
        let (res_2, subst) := res_subst
        in (lf_and res_1 res_2, subst, next)
      | lf_modal op args
        (lf_prop (f next),
         function_update v_eq subst (f next) (lf_modal op args),
         S next)
    end.

  Definition prop_back_subst_form(f : natV)(form : lambda_formula V L)
                               : (lambda_formula V L) × (lambda_subst V L) :=
    let (res, _) := prop_back_subst_form_rec f 0 id_subst form
    in res.

Prove substitution property for prop back subst


  Lemma prop_back_subst_form_prop_ind :
    (f : natV)(form back_form : lambda_formula V L)
          (r n n_res : nat)(sigma sigma_res : lambda_subst V L) ,
      injective f
      rank_formula (S r) form
      rank_subst (S r) sigma
      plain_prop_mod_subst sigma
      prop_back_subst_form_rec f n sigma form = (back_form, sigma_res, n_res)
        ((bound : nat),
           n_res bound
             prop_var_list_below f bound (prop_var_formula back_form))
        
        n n_res
        subst_equal_below f n sigma_res sigma
        subst_form sigma_res back_form = form
        propositional back_form
        rank_subst (S r) sigma_res
        plain_prop_mod_subst sigma_res.

  Lemma prop_back_subst_form_prop :
    (form : lambda_formula V L)(n : nat),
      countably_infinite V
      rank_formula (S n) form
      (simple_f : lambda_formula V L)(sigma : lambda_subst V L),
        subst_form sigma simple_f = form
        propositional simple_f
        rank_subst (S n) sigma
        plain_prop_mod_subst sigma.

End Back_subst.

Implicit Arguments mod_arg_back_subst_mod_args_prop [V L].
Implicit Arguments mod_arg_back_subst_sequent_prop [V L].
Implicit Arguments prop_back_subst_form_prop [V L].