Lemma: decidable__equal_product
[A:Type]. ∀[B:A ⟶ Type].
  ((∀a,b:A.  Dec(a b ∈ A))  (∀a:A. ∀u,v:B[a].  Dec(u v ∈ B[a]))  (∀x,y:a:A × B[a].  Dec(x y ∈ (a:A × B[a]))))

Lemma: decidable__equal_nat_plus
x,y:ℕ+.  Dec(x y ∈ ℕ+)

Lemma: decidable__equal_nat
x,y:ℕ.  Dec(x y ∈ ℕ)

Lemma: member-decide-assert
[x:𝔹]. (if then tt else inr x.⋅)  fi  ∈ Dec(↑x))

Definition: deq
EqDecider(T) ==  {eq:T ⟶ T ⟶ 𝔹| ∀x,y:T.  (x y ∈ ⇐⇒ ↑(eq y))} 

Lemma: deq_wf
[T:Type]. (EqDecider(T) ∈ Type)

Lemma: deq_subtype
[T:Type]. (EqDecider(T) ⊆(T ⟶ T ⟶ 𝔹))

Lemma: deq_subtype2
[T:Type]. (EqDecider(T) ⊆(∀x,y:T.  Dec(x y ∈ T)))

Lemma: deq_functionality_wrt_ext-eq
[A,B:Type].  EqDecider(A) ≡ EqDecider(B) supposing A ≡ B

Definition: eqof
eqof(d) ==  d

Lemma: eqof_wf
[T:Type]. ∀[d:EqDecider(T)].  (eqof(d) ∈ T ⟶ T ⟶ 𝔹)

Lemma: deq_property
[T:Type]. ∀[d:EqDecider(T)]. ∀[x,y:T].  uiff(x y ∈ T;↑(d y))

Lemma: deq_property2
[T:Type]. ∀[d:EqDecider(T)]. ∀[x,y:T].  uiff(x y ∈ T;↑(d y))

Lemma: deq-implies
[T:Type]. (EqDecider(T)  {∀x,y:T.  Dec(x y ∈ T)})

Lemma: assert-deq
[T:Type]. ∀[d:EqDecider(T)]. ∀[x,y:T].  uiff(↑(d y);x y ∈ T)

Lemma: safe-assert-deq
[T:Type]. ∀[d:EqDecider(T)]. ∀[x,y:T].  uiff(↑(eqof(d) y);x y ∈ T)

Definition: mk_deq
mk_deq(p) ==  λx,y. isl(p y)

Lemma: mk_deq_wf
[T:Type]. ∀[p:∀x,y:T.  Dec(x y ∈ T)].  (mk_deq(p) ∈ EqDecider(T))

Lemma: mk_deq-subtype
[T,S:Type].  ∀[p:∀x,y:S.  Dec(x y ∈ S)]. (mk_deq(p) ∈ EqDecider(T)) supposing strong-subtype(T;S)

Lemma: assert-pair-blex
[A,B:Type].
  ∀eq:EqDecider(A). ∀Ra:A ⟶ A ⟶ 𝔹. ∀Rb:B ⟶ B ⟶ 𝔹. ∀x,y:A × B.
    (↑(pair-blex(eq;Ra;Rb) y) ⇐⇒ pair-lex(A;λa,a'. (↑(Ra a'));λb,b'. (↑(Rb b'))) y)

Definition: deq-witness
deq-witness(eq) ==  λx,y. if eq then inl Ax else inr z.Ax)  fi 

Lemma: deq-witness_wf
[T:Type]. ∀[eq:EqDecider(T)].  (deq-witness(eq) ∈ ∀x,y:T.  Dec(x y ∈ T))

Lemma: decidable-equal-deq
[T:Type]. (EqDecider(T)  (∀x,y:T.  Dec(x y ∈ T)))

Lemma: deq-exists
[T:Type]. (EqDecider(T) ⇐⇒ ∀x,y:T.  Dec(x y ∈ T))

Lemma: eqof_eq_btrue
[A:Type]. ∀[d:EqDecider(A)]. ∀[i:A].  (eqof(d) tt)

Lemma: eqof_equal_btrue
[A:Type]. ∀[d:EqDecider(A)]. ∀[i,j:A].  eqof(d) tt supposing j ∈ A

Definition: sq-decider
sq-decider(eq) ==  ∀[x,y:Base].  ((∃z:Base. (eq inl z))  (x y))

Lemma: sq-decider_wf
[eq:Base]. (sq-decider(eq) ∈ ℙ)

Lemma: strong-subtype-deq
[A,B:Type]. ∀[d:EqDecider(B)].  d ∈ EqDecider(A) supposing strong-subtype(A;B)

Lemma: strong-subtype-deq-subtype
[A,B:Type].  EqDecider(B) ⊆EqDecider(A) supposing strong-subtype(A;B)

Lemma: nat-deq-aux
[a,b:ℕ].  uiff(a b ∈ ℕ;↑(a =z b))

Lemma: int-deq-aux
[a,b:ℤ].  uiff(a b ∈ ℤ;↑(a =z b))

Definition: int-deq
IntDeq ==  λa,b. (a =z b)

Lemma: int-deq_wf
IntDeq ∈ EqDecider(ℤ)

Lemma: intdeq_reduce_lemma
y,x:Top.  (IntDeq (x =z y))

Lemma: assert-int-deq
[x,y:ℤ].  uiff(↑(IntDeq y);x y ∈ ℤ)

Definition: nat-deq
NatDeq ==  λa,b. (a =z b)

Lemma: nat-deq_wf
NatDeq ∈ EqDecider(ℕ)

Definition: unit-deq
UnitDeq ==  λa,b. tt

Lemma: unit-deq_wf
UnitDeq ∈ EqDecider(Unit)

Lemma: atom-deq-aux
[a,b:Atom].  uiff(a b ∈ Atom;↑=a b)

Definition: atom-deq
AtomDeq ==  λa,b. =a b

Lemma: atom-deq_wf
AtomDeq ∈ EqDecider(Atom)

Lemma: sq-decider-atom-deq
sq-decider(AtomDeq)

Lemma: atomdeq_reduce_lemma
y,x:Top.  (AtomDeq =a y)

Lemma: bool-deq-aux
[a,b:𝔹].  uiff(a b;↑=b b)

Definition: bool-deq
BoolDeq ==  λa,b. =b b

Lemma: bool-deq_wf
BoolDeq ∈ EqDecider(𝔹)

Definition: proddeq
proddeq(a;b) ==  λp,q. ((a (fst(p)) (fst(q))) ∧b (b (snd(p)) (snd(q))))

Lemma: proddeq_wf
[A,B:Type]. ∀[a:EqDecider(A)]. ∀[b:EqDecider(B)].  (proddeq(a;b) ∈ (A × B) ⟶ (A × B) ⟶ 𝔹)

Lemma: proddeq_reduce_lemma
v,u,y,x,b,a:Top.  (proddeq(a;b) <x, y> <u, v> (a u) ∧b (b v))

Definition: product-deq
product-deq(A;B;a;b) ==  proddeq(a;b)

Lemma: product-deq_wf
[A,B:Type]. ∀[a:EqDecider(A)]. ∀[b:EqDecider(B)].  (product-deq(A;B;a;b) ∈ EqDecider(A × B))

Lemma: productdeq_reduce_lemma
v,u,y,x,b,a,B,A:Top.  (product-deq(A;B;a;b) <x, y> <u, v> (a u) ∧b (b v))

Lemma: assert-product-deq
[A,B:Type]. ∀[a:EqDecider(A)]. ∀[b:EqDecider(B)]. ∀[x,y:A × B].  uiff(↑(product-deq(A;B;a;b) y);x y ∈ (A × B))

Definition: sumdeq
sumdeq(a;b) ==
  λp,q. case p
        of inl(pa) =>
        case of inl(qa) => pa qa inr(qb) => ff
        inr(pb) =>
        case of inl(qa) => ff inr(qb) => pb qb

Lemma: sumdeq_wf
[A,B:Type]. ∀[a:EqDecider(A)]. ∀[b:EqDecider(B)].  (sumdeq(a;b) ∈ (A B) ⟶ (A B) ⟶ 𝔹)

Lemma: subtype-deq
[A,B:Type].  (EqDecider(B) ⊆EqDecider(A)) supposing ((∀x,y:A.  ((x y ∈ B)  (x y ∈ A))) and (A ⊆B))

Lemma: subtype_rel-deq
[A,B:Type].  (EqDecider(B) ⊆EqDecider(A)) supposing ((∀x,y:A.  ((x y ∈ B)  (x y ∈ A))) and (A ⊆B))

Definition: union-deq
union-deq(A;B;a;b) ==  sumdeq(a;b)

Lemma: union-deq_wf
[A,B:Type]. ∀[a:EqDecider(A)]. ∀[b:EqDecider(B)].  (union-deq(A;B;a;b) ∈ EqDecider(A B))

Lemma: assert-union-deq
[A,B:Type]. ∀[a:EqDecider(A)]. ∀[b:EqDecider(B)]. ∀[x,y:A B].  uiff(↑(union-deq(A;B;a;b) y);x y ∈ (A B))

Definition: finite-fun-deq
finite-fun-deq(k;eq) ==  λf,g. bdd-all(k;i.eq (f i) (g i))

Lemma: finite-fun-deq_wf
[T:Type]. ∀[k:ℕ]. ∀[eq:EqDecider(T)].  (finite-fun-deq(k;eq) ∈ EqDecider(ℕk ⟶ T))

Lemma: assert-finite-fun-deq
[T:Type]. ∀[k:ℕ]. ∀[eq:EqDecider(T)]. ∀[f,g:ℕk ⟶ T].  uiff(↑(finite-fun-deq(k;eq) g);f g ∈ (ℕk ⟶ T))



Home Index