This congruence relation between terms could only be directly represented in the Nuprl language itself if terms were. And while reflecting term structure is possible, it has not been implemented in the extant system. (Some theoretical work on reflection may be found in [Allen,Constable,Howe and Aitken 1987] (postscript) . Barzilay is working on newer practical methods; see [Barzilay and Allen 2002] )
However, a partial reflection of the squiggle relation between terms can be easily implemented, and exploited to allow limited reasoning about rewriting expressions in a few types that are used a lot in Nuprl. Because of this limited applicability, it is not clear how theoretically significant this partial reflection is.
The type
Then various rewrites can be justifed by arguments about
inferring "1. x : H B(x; r(x))" from "1. x : H B(x; t(x))" and "1. x : H r(x) ~ t(x)"
or
inferring "1. x : H 2. B(x; r(x)) C(x)" from "1. x : H 2. B(x; t(x)) C(x)" and "1. x : H .
2. B(x; r(x))
r(x) ~ t(x)"
Of course, we need to get our
Def SQType(T) == x,y:T. x = y {x ~ y}
Thm* SQType() Thm* SQType() Thm* SQType() Thm* SQType(Unit) Thm* SQType(Atom)
But there are common types that do not have this property:
Thm* (n.n<0) = (n.false)
Thm* ((n.n<0) ~ (n.false))
And many ways one might chooose to represent classes of values lead to types that violate this property. For example, you might choose to represent
So perhaps it is best to consider the use
About: