Comment: core_1_summary
Display forms for primitive terms of type-theory. Abstractions for 
propositions-as-types correspondence. Parenthesization control. 

Comment: core_1_intro
Defines display forms for primitive terms of Nuprl's type
theory, and introduces abstractions for propositions-as-types
correspondence. Also contains precedence objects that control
parenthesization of displays.  

Comment: graphic chars A0-AF
These are all the current nuprl graphic characters,
sorted by icode.

0x80 (128): ℙ|ℝ|ℕ|ℂ|ℚ|ℤ|𝕌||=||⌜|⌝|⊢|∫|⋅|↓
0x90 (144): α|∧|∈|↑|⊕|∞|∂|⊂|⊃
0xa0 (160): ⋂|⋃|∀|∃|⊗|||& #x2192|≠|∼|≤|≥|≡|∨|←|─
0xb0 (176): →|+|-|o|⊆|⊇|0|1|2|3
0xc0 (192): 𝔹|a|q|b|z|c

Comment: EndExtendedTermDForms
 


Comment: prec_com
Suggested uses for generic precedences are:
(examples given in ()'s)

In main_prec:
  preop     arg term with prefix text    (not, minus, squash)
  postop   arg term with postfix text   (pi1, pi2)
  inop      arg term with infix text     (compose, append)
  wk_preop  term with prefix and maybe infix text (mon_reduce) 
  wk_postop term with postfix and maybe infix text 
  bd_preop  term with prefix and maybe infix text (exists, for, lambda)
  bd_postop term with postfix and maybe infix text 

  The bd_*op are intended for terms that bind or more variables in their
  rightmost argument. Having these weak precedences corresponds with 
  the convention that common binding terms have maximal scope.

  The exposed slot of pre and postop terms (including wk_* and bd_*) should 
  have paren control so that ops can be stacked without adding 
  parenthesization.

  terms that use inop should use the infix_df_gen display form generator from
  the boot theory. This uses iteration control to suppress parenthesization of
  right associated term rather than paren control, since then multiple
  dfs can use inop and will always be parenthesized when nested inside 
  one another.

In logic_prec:

  atomrel: atomic relations with infix and maybe postfix text (equal, member, lt)


good place to add pointers to new auxiliary precedence objects is
in parallel with *arith_prec*.



Comment: PRIM_DISPS
display forms for primitive terms


Definition: computed_display def
=d ==
  if is pair then let x,y 
                      in if x="display-as"
                         then if is pair then let u,v 
                                                  in if u="decimal-rational" then fst(v) else fi  otherwise b
                         else b
                         fi  otherwise b

Definition: axiom def
Ax ==  PRIMITIVE

Definition: equal def
t ∈ ==  PRIMITIVE

Definition: sqequal def
This is Doug Howe's computational bi-simulation relation on terms.
We call if "squiggle" equality or `sqequal`.
It is equivalent to the conjunction of the comutational simulation
relations ⌜s ≤ t⌝ and ⌜t ≤ s⌝(see: sqequalSqle)

The simulation ⌜s ≤ t⌝ is coinductive relation 
on terms that says (essentially) that for any canonical form X, 
if computes to ⌜X[a1; a2; ...]⌝ 
then there exist terms b1, b2,... such that 
computes to ⌜X[b1; b2; ...]⌝
and ⌜a1 ≤ b1⌝,⌜a2 ≤ b2⌝,...

Using "Howe's trick" this relation is extended to open terms 
(i.e. terms with free variables) 
and proved to be "contexual congruence relation".

It is an invariant of the Nuprl type system that all types are closed under
t⌝This justifies the rules for sqequal substitution
sqequalSubstitution
sqequalHypSubstitution 
 ⋅

==  PRIMITIVE

Definition: sqequal_n def
~n ==  PRIMITIVE

Definition: sqle def
This is Doug Howe's computational simulation relation on terms.
We call if "squiggle" less-or-equal or `sqle`.

The simulation ⌜s ≤ t⌝ is coinductive relation 
on terms that says (essentially) that for any canonical form X, 
if computes to ⌜X[a1; a2; ...]⌝ 
then there exist terms b1, b2,... such that 
computes to ⌜X[b1; b2; ...]⌝
and ⌜a1 ≤ b1⌝,⌜a2 ≤ b2⌝,...

See also the documentation for ⌜t⌝.⋅

s ≤ ==  PRIMITIVE

Definition: sqle_n def
s ≤==  PRIMITIVE

Definition: universe def
Type ==  PRIMITIVE

Definition: void def
Void ==  PRIMITIVE

Definition: atom def
Atom ==  PRIMITIVE

Definition: base def
Base ==  PRIMITIVE

Definition: token def
"$token" ==  PRIMITIVE

Definition: int def
ℤ ==  PRIMITIVE

Definition: object def
Object ==  PRIMITIVE

Definition: natural_number def
$n ==  PRIMITIVE

Definition: minus def
-n ==  PRIMITIVE

Definition: add def
==  PRIMITIVE

Definition: subtract
==  (-m)

Definition: multiply
==  PRIMITIVE

Definition: divrem def
divrem(n; m) ==  PRIMITIVE

Definition: divide def
n ÷ ==  let q,r divrem(n; m) in q

Definition: remainder def
rem ==  let q,r divrem(n; m) in r

Definition: ind def
I(v) where I(α
  when = α < 0,  I(α+1).  d[x; y]
  when α 0.  b
  when  = α > 0,  I(α-1).  u[w; z]
end where  ==
  PRIMITIVE

Definition: union def
left right ==  PRIMITIVE

Definition: inl def
inl ==  PRIMITIVE

Definition: inr def
inr x  ==  PRIMITIVE

Definition: decide def
case of inl(x) => s[x] inr(y) => t[y] ==  PRIMITIVE

Definition: product def
x:A × B[x] ==  PRIMITIVE

Definition: pair def
<a, b> ==  PRIMITIVE

Definition: spread def
let x,y in B[x; y] ==  PRIMITIVE

Definition: function def
x:A ⟶ B[x] ==  PRIMITIVE

Definition: isect def
The intersection of family of types is new primitive type.
Its partial equivalence relation is the intersection of all the
partial equivalence relations in the family.

Thus,  in ⋂x:A. B[x] just when  in B[x] for every ⌜x ∈ A⌝.

Viewed proposition, the intersection type can be seen as
"uniform" universal quantification, ⌜∀[x:A]. B[x]⌝⋅

x:A. B[x] ==  PRIMITIVE

Definition: lambda def
λx.A[x] ==  PRIMITIVE

Definition: fix def
fix(F) ==  PRIMITIVE

Definition: apply def
==  PRIMITIVE

Definition: set def
This primitive Nuprl type is essentially the same as ⌜Image((x:A × B[x]),(λp.(fst(p))))⌝
So its members are the members of for which B[x] is true, but the evidence
for B[x] is not kept.

The elimination rule for this type is setElimination
From hypothesis u:{x:A| B[x]}  we get u:A and "hidden" B[u] that becomes
unhidden when we are proving subgoal of the form equality or member. ⋅

{x:A| B[x]}  ==  PRIMITIVE

Definition: atom_eq def
if a=b then else fi  ==  PRIMITIVE

Definition: int_eq def
In Nuprl the integers are primitive (rather than constructed inductively).
Therefore the basic arithmetic operations are implemented in the computation
system (using LISP bignum package) and axiomatized in the rules.

The operation
   if a=b then else 
is the primitive equality test on integers and b,
returning when a=b and otherwise.

The only rules we need for this are:
int_eqReduceTrueSq  which says:
H  ⊢ if a=b then else u

  BY int_eqReduceTrueSq ()
  
  H  ⊢ u
  H  ⊢ b

and 
int_eqReduceFalseSq which says:
H  ⊢ if a=b then else u

  BY int_eqReduceFalseSq ()
  
  H  ⊢ u
  H  ⊢ (a b) ⟶ Void⋅

if a=b then else ==  PRIMITIVE

Definition: less def
if (a) < (b)  then c  else ==  PRIMITIVE

Definition: rec_ind def
letrec x(y) B[x; y] in x(A) ==  fix((λx,y. B[x; y])) A

Definition: rec def
rec(x.A[x]) ==  PRIMITIVE

Comment: LOGIC_ABS1
Basic Logic Abstractions


Definition: member
t ∈ ==  t ∈ T

Definition: unit
Unit ==  0 ∈ ℤ

Definition: true
True ==  0 ∈ ℤ

Definition: false
False ==  Void

Definition: and
P ∧ ==  P × Q

Definition: or
P ∨ ==  Q

Definition: implies
 ==  P ⟶ Q

Definition: rev_implies
 ==   P

Definition: squash
==  Image(T,(λx.Ax))

Definition: oldsquash
oldsquash(T) ==  {True| T} 

Definition: not
¬==   False

Definition: nequal
a ≠ b ∈ T  ==  ¬(a b ∈ T)

Definition: iff
⇐⇒ ==  (P  Q) ∧ (P  Q)

Definition: exists
x:A. B[x] ==  x:A × B[x]

Definition: sq_exists
x:A [B[x]] ==  {x:A| B[x]} 

Definition: all
x:A. B[x] ==  x:A ⟶ B[x]

Comment: INT_ABS1



Definition: le
A ≤ ==  less_than'(B;A)) ∧ (A ∈ ℤ) ∧ (B ∈ ℤ)

Definition: ge
i ≥ j  ==  j ≤ i

Definition: gt
i > ==  j < i

Comment: subtype_com
Basic primitive for subtyping. Intended meaning is:

subtype iff
  1. Every element of is also an element of T
  2. If x,y are equal elements of S, they are also equal
     elements of t.

Definition: image-type_def
There are four rules about this primitive type.
imageEquality
    which implies that Image(A,f) is type if A ∈ Type and f ∈ Base; 
imageMemberEquality
    which implies that the terms ⌜a⌝a ∈ are members of Image(A,f);
imageElimination  says that these are the only members of Image(A,f)
    so ⌜x ∈ Image(A,f)⌝ can be replaced by ⌜a⌝ for "hiddden" a ∈ A;
imageEqInduction
   If forall a,b ∈ Base. (f a ∈ T  and a=b ∈ A  implies f(a)=f(b) ∈ T) then
   the equivalence class of t1 in Image(A,f) contains  
   the equivalence class of t1 in T⋅

Image(T,f) ==  PRIMITIVE

Comment: about directed_Auto_additions
"directed" auto addition is tactic, tac,  together with
  1) an opid (token) that says the tactic should only be tried when the
     concl has that opid.
  2) another token, that is its "key" that we can print out for debugging and
     use to update the table with different tactic.
  3) boolean that (when true) says that any subgoals left by the tactic
     that have the label `must complete`
     must complete using weakened Auto
  We organize the directed auto additions into lookup table using the 
  opid as the first key, and then the other token as the second key. 
⋅⋅

Comment: about labeled_Auto_additions
Some additions to Auto are controlled by the proof label
 (the label like `wf` or `aux` that tactics can add to subgoals
  with AddHiddenLabel `xxx`).
Such an addition is pair `xxx` tac and the intent is that
Auto should try tactic tac on (and only on) goals with label `xxx`.

If we keep these additions on list that is not Auto_additions
or directed_Auto_additiions, then we can avoid trying (`xxx`, tac)
at all (even to just Fail if the label is not `xxx`) on goals
with label not equal to `xxx`.

We also assume that at most one tactic is triggered by each label
because we use this method for special purposes where the controlling
tactic (such as the congruence closure procedure) can choose unique
labels for steps that it wants Auto to handle with these additions.

Thus, the labeled_Auto_additions are simple (tok tactic) list,
 (an alist).

 
⋅⋅



Home Index