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