Definition: permr
as ≡(T) bs ==  (||as|| ||bs|| ∈ ℤc∧ (∃p:Sym(||as||). ∀i:ℕ||as||. (as[p.f i] bs[i] ∈ T))

Lemma: permr_wf
T:Type. ∀as,bs:T List.  (as ≡(T) bs ∈ ℙ)

Lemma: comb_for_permr_wf
λT,as,bs,z. (as ≡(T) bs) ∈ T:Type ⟶ as:(T List) ⟶ bs:(T List) ⟶ (↓True) ⟶ ℙ

Lemma: permr_suptyping
T:Type. ∀Q:T ⟶ ℙ. ∀as,bs:{z:T| Q[z]}  List.  ((as ≡(T) bs)  (as ≡({z:T| Q[z]} bs))

Lemma: not_permr_cons_nil
T:Type. ∀a:T. ∀as:T List.  ([a as] ≡(T) []))

Lemma: permr_nil_is_nil
T:Type. ∀as:T List.  ((as ≡(T) [])  (as [] ∈ (T List)))

Lemma: permr_weakening
T:Type. ∀as,bs:T List.  ((as bs ∈ (T List))  (as ≡(T) bs))

Lemma: permr_reflex
T:Type. ∀as:T List.  (as ≡(T) as)

Lemma: permr_inversion
T:Type. ∀as,bs:T List.  ((bs ≡(T) as)  (as ≡(T) bs))

Lemma: permr_transitivity
T:Type. ∀as,bs,cs:T List.  ((as ≡(T) bs)  (bs ≡(T) cs)  (as ≡(T) cs))

Lemma: permr_equiv_rel
T:Type. EquivRel(T List;as,bs.as ≡(T) bs)

Lemma: cons_functionality_wrt_permr
T:Type. ∀a,b:T. ∀as,bs:T List.  ((a b ∈ T)  (as ≡(T) bs)  ([a as] ≡(T) [b bs]))

Lemma: permr_functionality_wrt_permr
T,T':Type. ∀as:T List. ∀as':T' List. ∀bs:T List. ∀bs':T' List.
  ((T T' ∈ Type)  (as ≡(T) as')  (bs ≡(T) bs')  (as ≡(T) bs ⇐⇒ as' ≡(T') bs'))

Lemma: perm_f_b_cancel
T:Type. ∀p:Perm(T). ∀x:T.  ((p.f (p.b x)) x ∈ T)

Lemma: perm_b_f_cancel
T:Type. ∀p:Perm(T). ∀x:T.  ((p.b (p.f x)) x ∈ T)

Lemma: perm_b_to_f
T:Type. ∀p:Perm(T). ∀x,y:T.  ((p.b x) y ∈ ⇐⇒ (p.f y) ∈ T)

Lemma: perm_f_inj
T:Type. ∀p:Perm(T). ∀x,y:T.  (((p.f x) (p.f y) ∈ T)  (x y ∈ T))

Lemma: perm_b_inj
T:Type. ∀p:Perm(T). ∀x,y:T.  (((p.b x) (p.b y) ∈ T)  (x y ∈ T))

Definition: tl_perm
tl_perm(p) ==  txpose_perm(0;p.b 0)

Lemma: tl_perm_wf
n:ℕ+. ∀p:Perm(ℕn).  (tl_perm(p) ∈ Perm(ℕ+n))

Definition: perm_morph
perm_morph(S;T;s2t;t2s;p) ==  mk_perm(s2t (p.f t2s);s2t (p.b t2s))

Lemma: perm_morph_wf
S,T:Type. ∀s2t:S ⟶ T. ∀t2s:T ⟶ S.  (InvFuns(S;T;s2t;t2s)  (∀p:Perm(S). (perm_morph(S;T;s2t;t2s;p) ∈ Perm(T))))

Lemma: permr_hd_cancel
T:Type. ∀a:T. ∀bs,bs':T List.  (([a bs] ≡(T) [a bs'])  (bs ≡(T) bs'))

Lemma: hd_two_swap_permr
T:Type. ∀as:T List. ∀a,a':T.  ([a; [a' as]] ≡(T) [a'; [a as]])

Lemma: cons_cons_permr
T:Type. ∀a,a':T. ∀as,as':T List.  ((as ≡(T) as')  ([a; [a' as]] ≡(T) [a'; [a as']]))

Lemma: append_functionality_wrt_permr
T:Type. ∀as,as',bs,bs':T List.  ((as ≡(T) as')  (bs ≡(T) bs')  ((as bs) ≡(T) (as' bs')))

Lemma: append_comm_1
T:Type. ∀a:T. ∀as:T List.  ((as [a]) ≡(T) ([a] as))

Lemma: append_comm
T:Type. ∀as,bs:T List.  ((as bs) ≡(T) (bs as))

Definition: permr_upto
as ≡ bs upto x,y.R[x; y]  ==  (||as|| ||bs|| ∈ ℤc∧ (∃p:Sym(||as||). ∀i:ℕ||as||. R[as[p.f i]; bs[i]])

Lemma: permr_upto_wf
T:Type. ∀R:T ⟶ T ⟶ ℙ. ∀as,bs:T List.  (as ≡ bs upto x,y.R[x;y]  ∈ ℙ)

Lemma: permr_upto_inversion
T:Type. ∀R:T ⟶ T ⟶ ℙ.
  (EquivRel(T;x,y.R[x;y])  (∀as,bs:T List.  (as ≡ bs upto x,y.R[x;y]   bs ≡ as upto x,y.R[x;y] )))

Lemma: permr_upto_transitivity
T:Type. ∀R:T ⟶ T ⟶ ℙ.
  (EquivRel(T;x,y.R[x;y])
   (∀as,bs,cs:T List.  (as ≡ bs upto x,y.R[x;y]   bs ≡ cs upto x,y.R[x;y]   as ≡ cs upto x,y.R[x;y] )))

Lemma: permr_upto_weakening
T:Type. ∀R:T ⟶ T ⟶ ℙ.  (EquivRel(T;x,y.R[x;y])  (∀as,bs:T List.  ((as ≡(T) bs)  as ≡ bs upto x,y.R[x;y] )))

Lemma: permr_upto_equiv_rel
T:Type. ∀R:T ⟶ T ⟶ ℙ.  (EquivRel(T;x,y.R[x;y])  EquivRel(T List;xs,ys.xs ≡ ys upto x,y.R[x;y] ))

Lemma: permr_upto_functionality_wrt_permr_upto
T:Type. ∀R:T ⟶ T ⟶ ℙ.
  (EquivRel(T;x,y.R[x;y])
   (∀as,as',bs,bs':T List.
        (as ≡ bs upto x,y.R[x;y] 
         as' ≡ bs' upto x,y.R[x;y] 
         (as ≡ as' upto x,y.R[x;y]  ⇐⇒ bs ≡ bs' upto x,y.R[x;y] ))))

Definition: lequiv
as bs upto {x,y.R[x; y]} ==  (||as|| ||bs|| ∈ ℤc∧ (∀i:ℕ||as||. R[as[i]; bs[i]])

Lemma: lequiv_wf
T:Type. ∀R:T ⟶ T ⟶ ℙ. ∀as,bs:T List.  (as bs upto {x,y.R[x;y]} ∈ ℙ)

Lemma: cons_functionality_wrt_lequiv
T:Type. ∀R:T ⟶ T ⟶ ℙ.
  (EquivRel(T;x,y.R[x;y])
   (∀a,b:T. ∀as,bs:T List.  (R[a;b]  as bs upto {x,y.R[x;y]}  [a as] [b bs] upto {x,y.R[x;y]})))

Lemma: permr_upto_split
T:Type. ∀R:T ⟶ T ⟶ ℙ.
  (EquivRel(T;x,y.R[x;y])
   (∀as,bs:T List.  (as ≡ bs upto x,y.R[x;y]  ⇐⇒ ∃cs:T List. ((as ≡(T) cs) ∧ cs bs upto {x,y.R[x;y]}))))

Lemma: cons_functionality_wrt_permr_upto
T:Type. ∀R:T ⟶ T ⟶ ℙ.
  (EquivRel(T;x,y.R[x;y])
   (∀a,b:T. ∀as,bs:T List.  (R[a;b]  as ≡ bs upto x,y.R[x;y]   [a as] ≡ [b bs] upto x,y.R[x;y] )))



Home Index