Library perm



Lemma apply_perm_equiv_perm p q e :
  p≌q → FFalse ⊢ p•e ≡ q•e.
Lemma eq_rm_perm : Proper (eq FFalse ==> eq FFalse) rm_perm.
Lemma eq_rm_perm_bis :
  ∀ e p, (eq_perm ∨ eq_perm_elim)
              ∨ zero_perm_u ⊢rm_perm (p•e) ≡ p•e.

Lemma zero_perm_u_apply_perm :
  ∀ p, Proper (zero_perm_u ==> (eq FFalse))
                   (rm_perm ∘ (apply_perm p)).
Lemma zero_perm_t_apply_perm :
  ∀ p, Proper (zero_perm_t ==> (eq FFalse))
                   (rm_perm ∘ (apply_perm p)).

Lemma eq_perm_apply_perm :
  ∀ p, Proper (eq_perm ==> (eq FFalse))
                   (rm_perm ∘ (apply_perm p)).
Lemma eq_perm_ω_apply_perm :
  ∀ p, Proper (eq_perm_ω ==> (eq FFalse))
                   (rm_perm ∘ (apply_perm p)).
Lemma eq_perm_elim_apply_perm :
  ∀ p, Proper (eq_perm_elim ==> (eq FFalse))
                   (rm_perm ∘ (apply_perm p)).

Lemma eq_nom_untyped_p_apply_perm :
  ∀ p, Proper (eq_nom_untyped_p ==> (eq eq_nom_untyped_np))
                   (rm_perm ∘ (apply_perm p)).
Lemma eq_nom_typed_p_apply_perm :
  ∀ p, Proper (eq_nom_typed_p ==> (eq eq_nom_typed_np))
                   (rm_perm ∘ (apply_perm p)).

Lemma apply_perm_θ_t e p :
  (∃ A, A ⊨ e) →
  eq_perm∨eq_perm_elim∨eq_perm_ω∨zero_perm_t ⊢ ‹ p › e ≡ p • e.
Lemma apply_perm_θ_u e p :
  untyped e →
  eq_perm∨eq_perm_elim∨zero_perm_u ⊢ ‹ p › e ≡ p • e.

Lemma eq_nom_untyped_np_apply_perm :
  ∀ e f , (ut ∧ eq_nom_untyped_np) e f →
                 (eq_perm∨eq_perm_elim∨zero_perm_u∨
                  eq_nom_untyped_p) ⊢ e ≡ f.

Lemma eq_nom_typed_np_apply_perm :
  ∀ e f , (eq_nom_typed_np) e f →
               (eq_perm∨eq_perm_elim∨ eq_perm_ω∨zero_perm_t∨
                         (eq_nom_typed_p)) ⊢ e ≡ f.

Lemma eq_apply_perm a b :
  (∀ p, Proper (a ==> eq b) (rm_perm ∘ (apply_perm p))) →
  Proper (equiv_perm ==> eq a ==> eq b)
         (fun p e ⇒ rm_perm (p • e)).

Lemma eq_rm_perm_ut_pos :
  ∀ (e : expr) (p : perm),
    untyped e → positive (‹ p › e) →
    eq_perm ∨ eq_perm_elim⊢ ‹ p › e ≡ rm_perm (p • e).

Lemma eq_rm_perm_pos :
  ∀ (e : expr) (p : perm),
     positive (‹ p › e) →
    eq_perm_ω∨eq_perm ∨ eq_perm_elim⊢ ‹ p › e ≡ rm_perm (p • e).

Lemma eq_apply_perm_ut_pos :
  ∀ (e : expr) (p : perm),
    untyped e → positive (‹ p › e) →
    eq_perm ∨ eq_perm_elim⊢ ‹ p › e ≡ (p • e).

Lemma eq_apply_perm_pos :
  ∀ (e : expr) (p : perm),
    positive (‹ p › e) →
    eq_perm_ω∨eq_perm ∨ eq_perm_elim⊢ ‹ p › e ≡ (p • e).

Lemma eq_nom_untyped_np_rm_perm_pos :
  ∀ e f : expr, str_positive e → str_positive f →
                    (ut ∧ eq_nom_untyped_np) e f →
                    eq_perm ∨ eq_perm_elim
                            ∨ eq_nom_untyped_p ⊢ e ≡ f.