Library Nijn.TerminationTechniques.Certificate

Require Import Nijn.Prelude.
Require Import Nijn.Syntax.
Require Import Nijn.TerminationTechniques.RuleRemoval.
Require Import Nijn.Interpretation.OrderInterpretation.
Require Import Nijn.TerminationTechniques.PolynomialMethod.
Require Import Nijn.TerminationTechniques.NoRules.

Local Open Scope compat.

Certificates

A certificate is a representation of a proof of strong normalization. As such, the core specification is that from a certificate, one must get a proof of strong normalization. Our certificates allow the following steps:
  • If there are no rewrite rules, then the system is strongly normalizing
  • The polynomial method
  • Rule removal
Note that for rule removal, we also need another notion of certificate, which we call a rule removal certificate. From this notion of certificate, one must obtain a strong reduction pair that respects the rule selection. For this kind of certificate, we allow the following steps:
  • The polynomial method
Inductive rule_removal_certificate
          {B F : Type}
          `{decEq B} `{decEq F}
          (X : afs B F)
          (P : selector X)
  : Type
  :=
| PolySRP :
  ∀ (J : ∀ (f : F), poly ∙ (arity X f)),
    (∀ (r : rewriteRules X)
            (x : sem_Con p_base (vars r)),
       selector_members P r
       →
       sem_Tm p_base (p_fun_sym X J) p_app' (lhs r) x
       >
       sem_Tm p_base (p_fun_sym X J) p_app' (rhs r) x)
    →
    (∀ (r : rewriteRules X)
            (x : sem_Con p_base (vars r)),
       ~(selector_members P r)
       →
       sem_Tm p_base (p_fun_sym X J) p_app' (lhs r) x
       ≥
       sem_Tm p_base (p_fun_sym X J) p_app' (rhs r) x)
    → rule_removal_certificate X P.

Definition rr_certificate_to_srp
           {B F : Type}
           `{decEq B} `{decEq F}
           {X : afs B F}
           {P : selector X}
           (C : rule_removal_certificate X P)
  : strong_reduction_pair (arity X).
Proof.
  induction C as [ J ].
  apply interpretation_to_strong_reduction_pair.
  apply poly_InterpretationData.
  exact J.
Defined.

Theorem rr_certificate_respects_srp
        {B F : Type}
        `{decEq B} `{decEq F}
        {X : afs B F}
        {P : selector X}
        (C : rule_removal_certificate X P)
  : respects_selector X (rr_certificate_to_srp C) P.
Proof.
  induction C as [ J H_gt H_ge ].
  refine (interpretation_respects_selector
            P
            (poly_SelectorInterpretation X J P H_gt H_ge)).
Defined.

Inductive certificate
          {B F : Type}
          `{decEq B} `{decEq F}
          (X : afs B F)
  : Type
  :=
| EmptySN : isNil (list_of_rewriteRules X) → certificate X
| PolySN :
  ∀ (J : ∀ (f : F), poly ∙ (arity X f)),
         (∀ (r : rewriteRules X)
                 (x : sem_Con p_base (vars r)),
           sem_Tm p_base (p_fun_sym X J) p_app' (lhs r) x
           >
           sem_Tm p_base (p_fun_sym X J) p_app' (rhs r) x)
         →
         certificate X
| RuleRemovalSN :
  ∀ (P : selector X),
    rule_removal_certificate X P
    → certificate (remove_afs X P)
    → certificate X.

Theorem certificate_to_isSN
        {B F : Type}
        `{decEq B}
        `{decEq F}
        {X : afs B F}
        (C : certificate X)
  : isSN X.
Proof.
  induction C as [ ? HX | ? J HJ | ? P srp C IHC ].
  - apply empty_list_SN.
    exact HX.
  - apply afs_is_SN_from_Interpretation.
    exact (poly_Interpretation _ J HJ).
  - simple refine (rule_removal P _ _ IHC).
    + exact (rr_certificate_to_srp srp).
    + apply rr_certificate_respects_srp.
Defined.