Comment: sqequal_com
Here are the essentials:
    1. For any two terms and b, we intend 'a b' to be type (in U{1})
    2. For any term a, 'a a'
    3. For two terms and b, 'a b' if computes to (normal
       direct computation)
    4. For any of the following types T, and two terms a, in T, we
           have 'a in => b'
       a. int
       b. Atom
       c. any equality type (such as Unit)
    5. Two terms 'opid1{params1}(a1, ..., an)' and 'opid2{params2}(b1, ..., bn)'
       are squiggle equal if opid1 and opid2 are the same,
       params1 and params2 are the same, the arity of the terms is
       the same, and 'a1 b1', ..., 'an bn'
       -- This rule is not strictly necessary, given the substitution
       rule, and the reflexive rule, but it is pretty useful in any case.
    6. Substitution: if 'T[a]' is hypothesis or conclusion in a
       sequent, and 'a b', then 'T[a]' can be replaced by 'T[b]'
       (and there is no need to prove functionality).

We don't have rule for proving when two squiggle types are equal, so
we can't use the squiggle type as hypothesis.  If we had one, the
rule would be something like this:
    'a in U1'
if 'a b <=> d' and all free variables in a, b, c, and belong to
"canonical" types (T is canonical type if
'all a, b: T. in => b').

Note added May 2010:
  There are, in fact, rules for proving when two squiggle types are equal. They are
sqequalExtensionalEquality and sqequalIntensionalEquality.
Neither of these allows one to prove that |- (a b) \in ℙ unless
 the free varaibles in and are bound in to "squiggle" types, T, that satisfy
SQType(T).  
This is crucial, as demonstrated by the following example:

Base is the type of all closed term with as its equality relation, so Base is sqiggle type.
The rule Error :equalityEqualityBase lets us prove that (x \in T) is type provided
that is type and and are in Base.
If we simply define ⌜b⌝ to be \in ⌜Base⌝then we can prove \in ℤ as follows:
Substitute the easily proved equation \in Top, to get two subgoals, in ℤ (which is
trivial) and  x:Top |- (x \in ℤ\in ℙOn the second subgoal use Error :equalityEqualityBase
to reduce to proving ⌜ℤ ∈ ℙ⌝, ⌜x ∈ Base⌝and ⌜1 ∈ Base⌝The second of these is not true
because (x:Top |- \in Base) implies that ⌜Top ⊆Base⌝ which is false.
But if ⌜x ∈ Base⌝ can simply "fold" to ⌜x⌝ then it can be proved
using the rule sqequalReflexivityand we have proved False!!
 




Comment: sq_type_com
There are other types in Nuprl that we can consider first order types.
Each of these types has canonical members.  For example, ⌜𝔹⌝ is type with
canonical memebers because there is only one representativ for ⌜tt⌝ and
one representative for ⌜ff⌝.  We package this concept in the ⌜SQType(T)⌝
predicate, which states that equal terms in are also sqequal.  This
is used by MemCD, so that these types sre treated as first-order types.

Definition: sq_type
SQType(T) ==  ∀x,y:T.  ((x y ∈ T)  {x y})

Lemma: base_sq
SQType(Base)

Lemma: sqequal-wf-base
[x,y:Base].  (x y ∈ ℙ)

Lemma: istype-sqequal
[x,y:Base].  istype(x y)

Lemma: baseof_sq
[T:Type]. SQType(baseof(T))

Lemma: subtype_base_sq
[A:Type]. SQType(A) supposing A ⊆Base

Comment: case_ite_com
In the reset of this library, we develop tactics to break apart
if test then truecase else falsecase fi ⌝ terms.  Since we have sqequality,
on test, it is possible to break apart these terms without generating
well-formedness subgoals on the ⌜truecase⌝ and ⌜falsecase⌝ subterms, even if
term is hypothesis.

Lemma: ycomb_wf_trivial
Y ∈ Void ⟶ Void

Lemma: ycomb-unroll
[f:Top]. (Y (Y f))

Comment: vr-list-of-added-rules
sqequalnIntensionalEquality
sqlenIntensionalEquality
sqlenSubtypeRel
sqequalnSqlen
sqlenSqequaln
sqequalnSymm


Lemma: sqle-wf
[x,y:Base].  (x ≤ y ∈ Type)

Lemma: sqequal_zero
[x,y:Top].  (x ~0 y)

Lemma: sqle_trans
a,b,c:Base.  ((a ≤ b)  (b ≤ c)  (a ≤ c))

Lemma: pair-eta
[p:Top × Top]. (p ~ <fst(p), snd(p)>)

Lemma: sq_stable__sqequal
x,y:Base.  SqStable(x y)

Lemma: not_zero_sqequal_one
(0 1)  False

Lemma: not_all_sqequal
(∀[a,b:Base].  (a b))  False

Lemma: false-sqequal
[a,b:Base].  ((¬(a b))  ((a b) (0 1) ∈ Type))

Lemma: decidable__less_than'
i,j:ℤ.  Dec(less_than'(i;j))

Lemma: decidable__lt
i,j:ℤ.  Dec(i < j)

Lemma: decidable__le
i,j:ℤ.  Dec(i ≤ j)

Lemma: less-trichotomy
a,b:ℤ.  (a < b ∨ b < a ∨ (a b ∈ ℤ))

Lemma: add-comm
x,y:ℤ.  ((x y) (y x) ∈ ℤ)

Lemma: add-monotonic
a,b,c,d:ℤ.  (a <  ((c d ∈ ℤ) ∨ c < d)  c < d)



Home Index