Definition: pertype
We only need four rules to reason about ⌜pertype(R)⌝

H  ⊢ pertype(R) pertype(R') ∈ Type

  BY pertypeEquality ()
  
  x:Base, y:Base ⊢ y ∈ Type
  x:Base, y:Base ⊢ R' y ∈ Type
  x:Base, y:Base, z:R y ⊢ R' y
  x:Base, y:Base, z:R' y ⊢ y
  x:Base, y:Base, z:R y ⊢ x
  x:Base, y:Base, z:Base, u:R y, v:R z ⊢ z

H  ⊢ t1 t2 ∈ pertype(R)

  BY pertypeMemberEquality !parameter{i:l}
  
  H  ⊢ pertype(R) ∈ Type
  H  ⊢ t1 t2
  H  ⊢ t1 ∈ Base
  H  ⊢ t2 ∈ Base

x:(t1 t2 ∈ pertype(R)), J ⊢ ext e

  BY pertypeElimination #$n !parameter{i:l} ()
  
  x:(t1 t2 ∈ pertype(R)), [y:R t1 t2], J ⊢ ext e
  H  ⊢ t1 t2 ∈ Type

z:A, J ⊢ ext t

  BY pointwiseFunctionality #$i !parameter{j:l} ()
  
  [a:Base], [b:Base], [c:(a b ∈ A)], J[a/z] ⊢ C[a/z] ext t
  a:Base, b:Base, c:(a b ∈ A), J[a/z] ⊢ C[a/z] C[b/z] ∈ 𝕌{j}⋅

pertype(R) ==  PRIMITIVE

Comment: rules for per type
We only need four rules to reason about ⌜pertype(R)⌝

H  ⊢ pertype(R) pertype(R') ∈ Type

  BY pertypeEquality ()
  
  x:Base, y:Base ⊢ y ∈ Type
  x:Base, y:Base ⊢ R' y ∈ Type
  x:Base, y:Base, z:R y ⊢ R' y
  x:Base, y:Base, z:R' y ⊢ y
  x:Base, y:Base, z:R y ⊢ x
  x:Base, y:Base, z:Base, u:R y, v:R z ⊢ z

H  ⊢ t1 t2 ∈ pertype(R)

  BY pertypeMemberEquality !parameter{i:l}
  
  H  ⊢ pertype(R) ∈ Type
  H  ⊢ t1 t2
  H  ⊢ t1 ∈ Base
  H  ⊢ t2 ∈ Base

x:(t1 t2 ∈ pertype(R)), J ⊢ ext e

  BY pertypeElimination #$n !parameter{i:l} ()
  
  x:(t1 t2 ∈ pertype(R)), [y:R t1 t2], J ⊢ ext e
  H  ⊢ t1 t2 ∈ Type

z:A, J ⊢ ext t

  BY pointwiseFunctionality #$i !parameter{j:l} ()
  
  [a:Base], [b:Base], [c:(a b ∈ A)], J[a/z] ⊢ C[a/z] ext t
  a:Base, b:Base, c:(a b ∈ A), J[a/z] ⊢ C[a/z] C[b/z] ∈ 𝕌{j}⋅

Lemma: pertype_wf
[R:Base ⟶ Base ⟶ ℙ]
  (pertype(R) ∈ Type) supposing ((∀x,y:Base.  (R[x;y]  R[y;x])) and (∀x,y,z:Base.  (R[x;y]  R[y;z]  R[x;z])))

Definition: quotient
The quotient type allows us to change the equality for members of type A
to given equivalence relation B(x,y). 
It is special case of the more general pertype.

When B(x,y) is the trival equivalence relation True, then we display
the quotient x,y:A//B as ⌜⇃(A)⌝We call this the "half squash" of A
since it retains the members of but "squashes" the equality in A.⋅

x,y:A//B[x; y] ==  pertype(λx,y. ((x ∈ A) ∧ (y ∈ A) ∧ B[x; y]))

Definition: usquash
usquash(T) ==  pertype(λx,y. (↓T))

Lemma: usquash_wf
[T:ℙ]. (usquash(T) ∈ Type)

Lemma: implies-usquash
[T:ℙ]. (T  (∀x:Top. (x ∈ usquash(T))))

Lemma: implies-usquash2
[T:ℙ]. (T  usquash(T))

Lemma: member-usquash
[T:ℙ]. (usquash(T)  (∀x:Top. (x ∈ usquash(T))))

Lemma: sq_stable_usquash
[T:ℙ]. SqStable(usquash(T))

Lemma: squash-implies-usquash
[T:ℙ]. ((↓T)  usquash(T))

Lemma: usquash-implies-squash
[T:ℙ]. (usquash(T)  (↓T))

Lemma: usquash-equality
[T:ℙ]. ∀[S:Type].  usquash(T) usquash(S) ∈ Type supposing ↓⇐⇒ ↓S

Lemma: usquash-elim
[T:ℙ]. (SqStable(T)  usquash(T)  T)



Home Index