OBJ3 Builtins
The following "standard prelude" defines the
functionality provided by the OBJ3 builtin modules; this code is loaded when
OBJ3 is built, and is therefore already there when you run the binary. Most
of these modules rely on Lisp; for example, the natural numbers defined in
NAT
are the Lisp numbers. You should be able to use this code to
obtain at least a good guess about what each builtin module does, despite the
obscurity of many internal OBJ3 Lisp functions.
--- OBJ standard prelude
ev (setq *obj$include_BOOL* nil)
obj UNIVERSAL is
sort Universal .
endo
ev (progn (obj_UNIVERSAL$install) 'done)
obj ERR is
bsort Err
(obj_ERR$is_Err_token
obj_ERR$create_Err
obj_ERR$print_Err
obj_ERR$is_Err) .
endo
ev (progn (obj_ERR$install) 'done)
obj BUILT-IN is
bsort Built-in
(obj$false_fn
obj$create_error
obj_BUILT-IN$print_built-in
obj$true_fn) .
endo
ev (progn (obj_BUILT-IN$install) 'done)
obj TRUTH-VALUE is
sort Bool .
op false : -> Bool .
op true : -> Bool .
endo
obj TRUTH is
pr TRUTH-VALUE .
pr UNIVERSAL .
op if_then_else_fi : Bool Universal Universal -> Universal
[polymorphic obj_BOOL$if_resolver intrinsic strategy (1 0)
gather (& & &) prec 0] .
op _==_ : Universal Universal -> Bool
[polymorphic obj_BOOL$eqeq_resolver strategy (1 2 0) prec 51] .
op _=/=_ : Universal Universal -> Bool
[polymorphic obj_BOOL$non-eqeq_resolver strategy (1 2 0) prec 51] .
ev (obj_TRUTH$setup)
var XU YU : Universal .
eq if true then XU else YU fi = XU .
eq if false then XU else YU fi = YU .
ev (obj_TRUTH$install)
beq XU == YU =
(obj_BOOL$coerce_to_Bool (term$equational_equal XU YU)) .
beq XU =/= YU =
(obj_BOOL$coerce_to_Bool (not (term$equational_equal XU YU))) .
ev (obj_TRUTH$install)
endo
obj BOOL is
pr TRUTH .
op _and_ : Bool Bool -> Bool [assoc comm idr: true
strat (1 2 0)
gather (e E) prec 55] .
op _or_ : Bool Bool -> Bool [assoc comm idr: false
strat (1 2 0)
gather (e E) prec 59] .
op _xor_ : Bool Bool -> Bool [assoc comm idr: false
strat (1 2 0)
gather (e E) prec 57] .
op not_ : Bool -> Bool [prec 53] .
op _implies_ : Bool Bool -> Bool [gather (e E) prec 61] .
ev (obj_BOOL$setup)
vars A B : Bool .
eq not true = false .
eq not false = true .
eq false and A = false .
eq true or A = true .
eq A implies B = (not A) or B .
eq true xor true = false .
endo
obj IDENTICAL is
pr BOOL .
op _===_ : Universal Universal -> Bool [strategy (0) prec 51] .
op _=/==_ : Universal Universal -> Bool [strategy (0) prec 51] .
var XU YU : Universal .
beq XU === YU =
(obj_BOOL$coerce_to_Bool (term$similar XU YU)) .
beq XU =/== YU =
(obj_BOOL$coerce_to_Bool (not (term$similar XU YU))) .
endo
ev (progn (obj_IDENTICAL$setup) 'done)
obj LAST-TERM is
protecting UNIVERSAL .
protecting TRUTH-VALUE .
op last-term-undefined : -> Universal .
op [term] : -> Universal .
eq [term] = last-term-undefined .
endo
ev (progn (obj_LAST-TERM$install) 'done)
obj NZNAT is
bsort NzNat
(obj_NZNAT$is_NzNat_token obj_NZNAT$create_NzNat prin1
obj_NZNAT$is_NzNat) .
protecting BOOL .
op _+_ : NzNat NzNat -> NzNat [assoc comm prec 33] .
op d : NzNat NzNat -> NzNat [comm] .
op _*_ : NzNat NzNat -> NzNat [assoc comm idr: 1 prec 31] .
op quot : NzNat NzNat -> NzNat [gather (E e) prec 31] .
op _<_ : NzNat NzNat -> Bool [prec 51] .
op _<=_ : NzNat NzNat -> Bool [prec 51] .
op _>_ : NzNat NzNat -> Bool [prec 51] .
op _>=_ : NzNat NzNat -> Bool [prec 51] .
op s_ : NzNat -> NzNat [prec 15] .
vars NN NM : NzNat .
bq NN + NM = (+ NN NM) .
bq d(NN,NM) = (if (= NN NM) 1 (abs (- NN NM))) .
bq NN * NM = (* NN NM) .
bq quot(NN,NM) = (if (> NN NM) (truncate NN NM) 1) .
bq NN < NM = (< NN NM) .
bq NN <= NM = (<= NN NM) .
bq NN > NM = (> NN NM) .
bq NN >= NM = (>= NN NM) .
bq s NN = (1+ NN) .
jbo
obj NAT is
bsort Nat
(obj_NAT$is_Nat_token obj_NAT$create_Nat prin1
obj_NAT$is_Nat) .
protecting NZNAT .
bsort Zero
(obj_NAT$is_Zero_token obj_NAT$create_Zero prin1
obj_NAT$is_Zero) .
subsorts NzNat < Nat .
subsorts Zero < Nat .
op _+_ : Nat Nat -> Nat [assoc comm idr: 0 prec 33] .
op sd : Nat Nat -> Nat [comm] .
op _*_ : Nat Nat -> Nat [assoc comm idr: 1 prec 31] .
op _quo_ : Nat NzNat -> Nat [gather (E e) prec 31] .
op _rem_ : Nat NzNat -> Nat [gather (E e) prec 31] .
op _divides_ : NzNat Nat -> Bool [prec 51] .
op _<_ : Nat Nat -> Bool [prec 51] .
op _<=_ : Nat Nat -> Bool [prec 51] .
op _>_ : Nat Nat -> Bool [prec 51] .
op _>=_ : Nat Nat -> Bool [prec 51] .
op s_ : Nat -> NzNat [prec 15] .
op p_ : NzNat -> Nat [prec 15] .
var M N : Nat .
var NN : NzNat .
*** eq N + 0 = N .
bq sd(M,N) = (abs (- M N)) .
eq N * 0 = 0 .
bq M quo NN = (truncate M NN) .
bq M rem NN = (rem M NN) .
bq NN divides M = (= 0 (rem M NN)) .
eq N < 0 = false .
eq 0 < NN = true .
eq NN <= 0 = false .
eq 0 <= N = true .
eq 0 > N = false .
eq NN > 0 = true .
eq 0 >= NN = false .
eq N >= 0 = true .
eq s 0 = 1 .
bq p NN = (- NN 1) .
jbo
obj INT is
bsort Int
(obj_INT$is_Int_token obj_INT$create_Int prin1
obj_INT$is_Int) .
bsort NzInt
(obj_INT$is_NzInt_token obj_INT$create_NzInt prin1
obj_INT$is_NzInt) .
protecting NAT .
subsorts Nat < Int .
subsorts NzNat < NzInt < Int .
op -_ : Int -> Int [prec 15] .
op -_ : NzInt -> NzInt [prec 15] .
op _+_ : Int Int -> Int [assoc comm idr: 0 prec 33] .
op _-_ : Int Int -> Int [gather (E e) prec 33] .
op _*_ : Int Int -> Int [assoc comm idr: 1 prec 31] .
op _*_ : NzInt NzInt -> NzInt [assoc comm idr: 1 prec 31] .
op _quo_ : Int NzInt -> Int [gather (E e) prec 31] .
op _rem_ : Int NzInt -> Int [gather (E e) prec 31].
op _divides_ : NzInt Int -> Bool [prec 51] .
op _<_ : Int Int -> Bool [prec 51] .
op _<=_ : Int Int -> Bool [prec 51] .
op _>_ : Int Int -> Bool [prec 51] .
op _>=_ : Int Int -> Bool [prec 51] .
op s_ : Int -> Int [prec 15] .
vars I J : Int .
var NJ : NzInt .
bq - I = (- I) .
bq I + J = (+ I J) .
*** bq I - J = (- I J) .
eq I - J = I + (- J) .
bq I * J = (* I J) .
bq I quo NJ = (truncate I NJ) .
bq I rem NJ = (rem I NJ) .
bq NJ divides I = (= 0 (rem I NJ)) .
bq I < J = (< I J) .
bq I <= J = (<= I J) .
bq I > J = (> I J) .
bq I >= J = (>= I J) .
eq s I = 1 + I .
jbo
obj RAT is
bsort Rat
(obj_RAT$is_Rat_token obj_RAT$create_Rat obj_RAT$print
rationalp) .
bsort NzRat
(obj_RAT$is_NzRat_token obj_RAT$create_NzRat obj_RAT$print
obj_RAT$is_NzRat) .
protecting INT .
subsorts Int < Rat .
subsorts NzInt < NzRat < Rat .
op -_ : Rat -> Rat [prec 15] .
op -_ : NzRat -> NzRat [prec 15] .
op _+_ : Rat Rat -> Rat [assoc comm idr: 0 prec 33] .
op _-_ : Rat Rat -> Rat [gather (E e) prec 33] .
op _*_ : Rat Rat -> Rat [assoc comm idr: 1 prec 31] .
op _*_ : NzRat NzRat -> NzRat [assoc comm idr: 1 prec 31] .
op _/_ : Rat NzRat -> Rat [gather (E e) prec 31] .
op _/_ : NzRat NzRat -> NzRat [gather (E e) prec 31] .
op _rem_ : Rat NzRat -> Rat [gather (E e) prec 31] .
op _<_ : Rat Rat -> Bool [prec 51] .
op _<=_ : Rat Rat -> Bool [prec 51] .
op _>_ : Rat Rat -> Bool [prec 51] .
op _>=_ : Rat Rat -> Bool [prec 51] .
vars R S : Rat .
vars NS : NzRat .
bq - R = (- R) .
bq R + S = (+ R S) .
*** bq R - S = (- R S) .
eq R - S = R + (- S) .
bq R * S = (* R S) .
bq R / NS = (/ R NS) .
bq R rem NS = (rem R NS) .
bq R < S = (< R S) .
bq R <= S = (<= R S) .
bq R > S = (> R S) .
bq R >= S = (>= R S) .
jbo
obj ID is
bsort Id (obj_ID$is_Id_token obj_ID$create_Id obj_ID$print_Id
obj_ID$is_Id) .
pr BOOL .
op _<_ : Id Id -> Bool [prec 51] .
var !X !Y : Id .
--- the variable names have been chosen so that they are not Id's
bq !X < !Y = (string< !X !Y) .
endo
obj QID is
--- Quoted IDentifier
--- symbols starting with ' character
bsort Id (obj_QID$is_Id_token obj_QID$create_Id obj_QID$print_Id
obj_QID$is_Id) .
endo
obj QIDL is
protecting QID .
pr BOOL .
op _<_ : Id Id -> Bool [prec 51] .
var X Y : Id .
bq X < Y = (string< X Y) .
endo
th TRIV is
sort Elt .
endth
obj FLOAT is
bsort Float
(obj_FLOAT$is_Float_token obj_FLOAT$create_Float obj_FLOAT$print_Float
obj_FLOAT$is_Float) .
pr BOOL .
op -_ : Float -> Float [prec 15] .
op _+_ : Float Float -> Float [assoc comm prec 33] .
op _-_ : Float Float -> Float [gather (E e) prec 33] .
op _*_ : Float Float -> Float [assoc comm prec 31] .
op _/_ : Float Float -> Float [gather (E e) prec 31] .
op _rem_ : Float Float -> Float [gather (E e) prec 31] .
op exp : Float -> Float .
op log : Float -> Float .
op sqrt : Float -> Float .
op abs : Float -> Float .
op sin : Float -> Float .
op cos : Float -> Float .
op atan : Float -> Float .
op pi : -> Float .
op _<_ : Float Float -> Bool [prec 51] .
op _<=_ : Float Float -> Bool [prec 51] .
op _>_ : Float Float -> Bool [prec 51] .
op _>=_ : Float Float -> Bool [prec 51] .
op _=[_]_ : Float Float Float -> Bool [prec 51] .
vars X Y Z : Float .
bq X + Y = (+ X Y) .
bq - X = (- X) .
bq X - Y = (- X Y) .
bq X * Y = (* X Y) .
bq X / Y = (/ X Y) .
bq X rem Y = (rem X Y) .
bq exp(X) = (exp X) .
bq log(X) = (log X) .
bq sqrt(X) = (sqrt X) .
bq abs(X) = (abs X) .
bq sin(X) = (sin X) .
bq cos(X) = (cos X) .
bq atan(X) = (atan X) .
bq pi = pi .
bq X < Y = (< X Y) .
bq X <= Y = (<= X Y) .
bq X > Y = (> X Y) .
bq X >= Y = (>= X Y) .
bq (X =[ Z ] Y) = (< (abs (- X Y)) Z) .
endo
obj 2TUPLE[C1 :: TRIV, C2 :: TRIV] is
sort 2Tuple .
op <<_;_>> : Elt.C1 Elt.C2 -> 2Tuple .
op 1*_ : 2Tuple -> Elt.C1 .
op 2*_ : 2Tuple -> Elt.C2 .
var e1 : Elt.C1 .
var e2 : Elt.C2 .
eq 1* << e1 ; e2 >> = e1 .
eq 2* << e1 ; e2 >> = e2 .
endo
obj 3TUPLE[C1 :: TRIV, C2 :: TRIV, C3 :: TRIV] is
sort 3Tuple .
op <<_;_;_>> : Elt.C1 Elt.C2 Elt.C3 -> 3Tuple .
op 1*_ : 3Tuple -> Elt.C1 .
op 2*_ : 3Tuple -> Elt.C2 .
op 3*_ : 3Tuple -> Elt.C3 .
var e1 : Elt.C1 .
var e2 : Elt.C2 .
var e3 : Elt.C3 .
eq 1* << e1 ; e2 ; e3 >> = e1 .
eq 2* << e1 ; e2 ; e3 >> = e2 .
eq 3* << e1 ; e2 ; e3 >> = e3 .
endo
obj 4TUPLE[C1 :: TRIV, C2 :: TRIV, C3 :: TRIV, C4 :: TRIV] is
sort 4Tuple .
op <<_;_;_;_>> : Elt.C1 Elt.C2 Elt.C3 Elt.C4 -> 4Tuple .
op 1*_ : 4Tuple -> Elt.C1 .
op 2*_ : 4Tuple -> Elt.C2 .
op 3*_ : 4Tuple -> Elt.C3 .
op 4*_ : 4Tuple -> Elt.C4 .
var e1 : Elt.C1 .
var e2 : Elt.C2 .
var e3 : Elt.C3 .
var e4 : Elt.C4 .
eq 1* << e1 ; e2 ; e3 ; e4 >> = e1 .
eq 2* << e1 ; e2 ; e3 ; e4 >> = e2 .
eq 3* << e1 ; e2 ; e3 ; e4 >> = e3 .
eq 4* << e1 ; e2 ; e3 ; e4 >> = e4 .
endo
ev (setq *obj$include_BOOL* t)
ev (progn (obj$prelude_install) 'done)
To CSE 230 homepage
Maintained by Joseph Goguen
Last modified: Tue Jan 30 11:26:44 PST 2001