You are on page 1of 28
XVIII = 1 "trace “print fora' CHAPTER 18 ‘THE THREE DIAGNOSTIC PRIMITIVES (PF, TW, TF) WHY THE DIAGNOSTIC PRIMITIVES ARE NEEDED The three diagnostic primitives are used to help find what 1s wrong When 2 TRAC language script does not work the way we expect it to. Ry neans of the PF prinitve, we can print out all the details of a forn: the segment gap nunbers and the form pointer, as well as the text string which makes up the form, By means of the two ‘trace’ prinitives, TN and TF, is is possible to make the processor pause before the execution of each prinitive and print out the arguments of the primitive emctly as they will be used in its execution. These three primitives provide enormous assistance in getting a complex script to work correctly. ‘THE PRINT FORK PRIMITIVE (FF) ‘The ‘print form! primitive, with mnenonie PF, is the sixplest of the three diagnostic primitives. This primitive takes the naze of the form to be printed out as its only added argument, With the print form PF primitive, the text of the form ia printed out exactly as it ia recorded in forms store, with the exception that segment gaps and the form pointer ate explicitly shown in their locations in the text. The text of the form is not scanned befare it is printed out, The print forn primitive is mainly used to examine forms in main storage to determine whether the text of the form 1s correct and whether the segment gaps are in fact located where they were intended to be, It also verifies the current location of the form pointer, Copyright (@) 1972 Rockford Research, Inc. AM rtchte reemrved - <> ‘angle brackets" t ‘up arrow! XVIII - 2 ‘trace on ‘The PF primitive fs a mull-valued primitive, so it can be inserted almost anywhere in a TRAC language script, However, it is ordinarily uaed fron the keyboami while a script te being developed, or while the script 4s being corrected by means of the procedure FIX (descrited in Chapter 11). The use of the print form primitive is illustrated by the following example, with a form named 422 1 4(PF,A22)"THE QUICK¢T> <3> 41> JUMPS AT THE <2> ‘The lccation cf the segnent gaps in the form te indicated by the numerical digits enclosed in the ‘angle brackets’ < and > . The nuxbar inside the angle brackets gives the ordinal number of the fomal variable for the segment gape Tho location ef the form pointer is shown by the 'up arrow’, which 4s also enclosed in angle brackets, , We see that the form pointer stands just after the ninth character of the form. The form pointer fight have been brought to this location as a consequence of action of the CN call Ni prinitive #(CN,A22,9)" Because of limitation on available characters for sone reactive typewriters, which may not have the up arrow or angle brackets, other characters my be used instead in the print form primitive. ‘THE TWO TRACE FRIMITIVES (TN, TF) ‘The trace facility, which is controlled by the two trace primitives TN and TF, makes visible at the reactive typewriter the step-by-step evaluation of each primitive as the processor carries out a complex seript. ‘The two trace primitives are ‘trace on’ with mnemonic TN, and XVIII - 3 ‘trace offt ‘trace mode" "trace off! with mnenonic TF, ‘Thess primitives take no additional argunents, They are mull valued, so they can be inserted alnost anywhere in a script. when the trace state of the processor is turned "on" by the trace en TN prinitive, the processor goes into a ‘trace mode’, and it begins to give trace indications. It continues to do so without further comand until the trace node is turned off. The trace mode is turned "off" by execution of the trace off TF primitive. The processor stays in the normal or off state until it is turned on again, As ve have learned, the action of the TRAC processor depends on the scanning and formation of the arguments of each primitive in tum, ‘The arguments as they are scanned are put into the neutral string area, When a close parenthesis, indicating completion of the arguments of a primitive, is encountered, the prinitive is executed, It is executed using the arguments held in the neutral string area. For exanple, a primitive about to be executed might be diagramed by the execution diagram: a — (ps ape CREFS(ps,caT) / The arguments held in the neutral string area aro: 3s ABC ‘CREF#(PS, CAT) Execution of the prinitive takes place using these arguments. if we can see what arguments are to be used, we will know exactly how the primitive will behave in execution. The trace facility displays these argunents. XVIII + & What the trace facility does, when it is tured on, is to print out on the typewriter the arguments of each primitive just before the primitive is executed. In the example, the following would be printed out ty the trace facility: : #/DS*ABC* #(PS, CAT) / Note that the fornat characters GR and EF are shown only through thelr format action, that is, they return the carriage and give a new Line. In the output from the trace facility, the arguments are shown separated by asterisks * , and the beginning and end of the primitive is marked by the slant or "solidus" character / . A null string argument is indicated by one of the foms: * /* or +/ . The single or double sharp character of the primitive is shown ty a single or double sharp prefix before the first slant character. The trace facility printout shows only the arguments which have een found while scanning the primitive. The trace does net indicate how many arguments the primitive should have, Thus the representation ‘in trace node for the expression #(DS) ist #/0s/ Only one argument Was found, However, in the expression #(25,) there are two arguments, of which the second 4s a null string. The representation by trace ist +/nse/ Finally, the trace representation: tH xvIIr = 5 ‘abortive stop* shows a valid expression. It represents a default call to a form having ‘the mill string as its name, After the trace representation of a primitive has been printed out, the processor pauses. The pause gives us a chance to study the printout. If the arguments appear to be correct, we then tell the processor to go on to the next step of the script. This is done ty pressing the RETURN key for the CR character.* The processor then evaluates the primitive Just displayed, and goes on to sean and display the arguments of the next primitive to be evaluated, If an error appears in the argunents just displayed by trace, it is usually desirable to stop the execution of the script so that it can be corrected. Execution of the script is stopped by touching any other key on the typewriter, and then by pressing the RETURN key. This stops ‘the execution of the script. The workspace is cleared, and the trace node is automatically turned off, It is called an ‘abortive stop’. USE OF THE READ STRING PRIMITIVE WHEN IN TRACE Operation of the read string primitive, including the acceptance of typed-in matter, provides a minor complication while in the trace moda, Input strings can be typed inj however, a particular sequence of stepa must be used, otherwise the trace action will stop and execution of the script will be aborted, Assume that the next primitive in the seript is ##(RS) . The processor will print out the trace indication: 4/8 / In order to continue the action of the script, we must provide an * Some computers may require another character, See Appendix C. XVIII - 6 input string. However, wa cannot merely type in the string at this tine, because that would abort the trace operation. What we must do first is to signify to the processor that the argunents displayed for the read string primitive are satisfactory, and that the primitive should be evaluated. To do this, we press the RETURN key, ‘The processor will go to a new line and stop, It is now waiting for the input string. The input string should be typed, followed by the TRAC meta character (usually the apostrophe ' ), and ty an enter character for certain computers.* At this point, the primitive will execute. Hy using this sequence of steps, the read string primitive will take in the typed string, the primitive will execute, and the precessor will go on to scan and disply the next primitive in sequence. USING THE TRACE FACILITY The trace facility has many uses, and permits of a nunber of tricks to speed up diagnostic operations. ‘One of the s of the trace facility is to provide a vivid means for demonstrating the sequence of evaluative steps, primitive by primitive, which takes place in a TRAC language processor, Such a desonstration may be helpful in showing beginners the operation of a TRAC proc or. In a long script, having many loops and primitives, it may be tedious to display all the prinitives of a procedure, Often the difficulty is known to be limited to a few troublesome spots, In such a case, the trace on expression #(TN) may be inserted in the seript just before the troublesome spot, and the trace off expression #(IF) may be inserted just after the troublesome spot. Then the processor will speed * See Appendix ¢. XVIII = 7 through the script, stopping to print out the arguments only for the prinitives in the troublesome sections, In a variant of this method, segnent gap markers, each with a different ordinal mumber, can be strategically placed in a long script. ‘Then when the script is called into execution, the protested strings (#CTN)) and (#(TF)) can be used as arguments of the call to the procedure, This will cause the trace action to be turned on and off depending upon where the expressions have been inserted in the script. In another variant, the seript of the procedure may be modified by means of the FIX procedure (described in Chapter 11), with the insertion of the trace expressions at the appropriate places. In sumaty, the trace facility for diagnostic trouble shooting showld be used when the trouble seems to be in the operating behavior of a seript, while the print form primitive stould be used when trouble is suspected in problems with form pointer, seguent gaps, or the text of the forms used in a script. mx -1 "Boolean" CHAPTER 19 ‘THE BOOLEAN PRIMITIVES (BU, BI, BC, BS, BR) WHAT THEY ARE There are five ‘Boolean’ primitives which are a part of TRAC 1-64 language. Those prinitives provide a capability for efficiently working with certain complex "logical" problems. For the most part, only the advanced users of TRAC language will work with these primitives. On the other hand, the primitives are not difficult to understand, even for « beginner, Since it is desirable that this Manual for TRAC language be conplete, the prinitives are now described. The Boolesh prinitives are named in honor of George Boole, # British mathematician end philosopher whose contritutions were little appreciated in 1641 when he first wrote about them (in The Mathematical Analysis cf Logic and later in An Investigation of the [awe of Thought). Boole Presented a notational systen and « plen for its use which permitted « symbolic expression of logical problems and verbal syllogiems, The TRAC Boolean primitives can bé related to Bocle's ideas. It is « good exercise for those readers who might be interested in elenentary mathematical logic to study Boole's writings and to draw parallels between Boole's ideas and these primitives. However, for the purposes of this Manual, we don't really want to get into « detailed study of Bool 8 ideas, or to undertake @ tutorial in mathematical logic. All we want to learn is how these TRAC language primitives work. Copyright (G) 1972 Rockford R. All rights reserved. arch, Inc. ‘eotal’ "binary" "Logical" STRINGS OF OCTAL CHARACTERS The Boolean primitives, like all the TRAC language prinitives, work upon strings of characters. We saw that the arithmetic primitives have ‘aruet stnlee xx -2 @ Special way of treating character strings. They look for decimal digits (the digits from cero to nine) at the tail end of the argument string of the second and third argments of the arithmetic prinitives. The Boolean primitives behave in much the sane way, except that they look for ‘octal' digits at the tail end of certain of the Boolean prinitive argument strings. ‘Octal' digits are the numeric digits in the range from sero to seven. There are eight of these digits, and thus they are called ‘octal’. ‘The reason for using octal digits in the Boolean primitives is that the octal digits provide compressed notation for the so-called ‘binary! digits. The two binary digits are the digits for sero and one: § and 1, Sueh binary digits are often used in "logical! notations because they can be nicely associated with the two logical distinctions of "true! and + Usually "true! is associated with 1 , and ‘false! is associated + Here we shall dedge the mind-boggling discussions of what "true" really means, and many other fascinating but distracting philesophical excursions. For the most part, the users of the TRAC Boolean primitives will not be working with the notions of true or false, but will instead be concerned with the sequences of strings of binary @igits, like: oi aga ina 11d gid aaa tig ft Space characters have been inserted inte this string in order to enhance At would be very difficult to read or to copy the 2+ binary digits without making a mistake. the readability of the string. Without the spac "Boolean vector" oUt = ‘component * 3 “pinary nunbers" jie will now learn why the use of octal digits is se handy. Using the octal digit notation, the leng binary string shown above is exactly represented by the following octal string: 15760761 Bach group of three binary digits is represented by one oatal digit, in a manner which will be described in the next paragraph. For most purposes, such short octal strings are much easier to type or to copy than « longer binary string. Consequently, the Boolean primitives, although they are ultimately concerned with binary digits, are defined so that they use octal digits in their arguments. In TRAC language work, such « string of zero and one digits is called a "Hoolean vector’ in analogy to mathematical terminology. In mathematics, @ vector can be thought of as a list of numbers, with each number being a 'component' of the vector. In Boolean vector, the components are the individual binary digits. The correspondence between the binary digit groups and the cotal digits is given by the following table: Binary Grou —getal Digit oe wn fag gu isd agi ug Mae FUN & aia The readers who have learned ‘binary nunbers! and their arithnetic will] recognize that the sequence of digit groups in the left-hand column ‘Boolean unton* case pun *union* ds the #, 1, 2,3, ++. counting sequence of the binery nunber system. However, this information is extraneous te our purposes here, since with the TRAC language primitives, we don't need to know anything about binary counting or binary aritimetic. The Soolean prinitives really depend upon comparisons of strings of zeroes and ones of the Boolean vectors, as represented in the octal notation. THE BOOLEAN UNION == LOGICAL ‘oR’ (2U) The first Boolean prinitive is the "Boolean union’ with mnemonic BU . ‘A simple example of its use is: #(BU1,3)13 The second and third arguments are octal digits, and the result is expressed in an ectal digit. The operation of Boolean union ie really defined in terms of the binary digits represented by these octal digits, in a fashion ‘that will be deseribed in detail in the next paragraph. Another example of the use of BU is: #(BU,LSREDZDL HOw ARE YoU 96)'237 4s with the arithmetic primitives, only the tail-end octal digits are used in forming the result string. It 1s called the ‘octal part! of the string, The prefix part of the string for both the second and third arguments, including any + or - sign, is lgnered entirely after Scanning. The digit-by-digit rule for forming the value tring for the BU primitive is a new kind of computation, In order to explein this new rule of computation, we go back to the binary digit representation, and show how the ‘union' of binary digits 4s defined, Instead of the rule 1+1= 2, as in ordinary XIX = 5 "Boolean union table’ numerical arithmetic, in the Boolean logic we have the following rules for union: i $ 444 There 4s no "carry" as in numerical arithmetic. Using these rules, and i 1 Hee 1 by writing out octal digits as groups ef three binary digits, we can work out the Boolean union strings of octal digits. The following example for the Boolean union of 443 and 1526 shows how to do it: 493 }is the 1d dig fat 326} same as: $i if. Ay octal haga GIF Lar answer: 1527 when ene ef the octal strings in Boolean union is not as long as the other, the shorter string of octal digits is filled in at the left-hand end with seroes until the two strings are the same length, and then the Boolean union computation is performed, If the octal part of the second or third argument is a null etring, then a null string of no octal digita is taken as the default argument. If both the second and third argunents are mill strings, then the result string is a null string, In the sane way that a multiplication table can be developed for showing the result fron multiplying any two decimal digits, it is possible to develop a "Boolean union table! te show the result fron forming the Boolean union of ary two binary digits. The Boolean union table for the binary digits looks like this: first argument second 8 4 1 answer argunent ‘truth table" "Logical OR" ‘Boolean intersection" XO = 6 “Logical AND* People working with mathematical logic have « special nase for a table of this kind. They call it a 'truth table’ for the Boolean union. Such a table is a compact way to express the four rules for Boolean union which were given previously. A similar, but larger ‘multiplication table’ can be worked out for expressing the foolean union of the various conbinations of the octal digits, The making of such an octal table is left as an exercise for the reader. ‘Tne Boolean union is also called the ‘logical OR! expression. ‘The reason for this terminology 1s easy to see if we refer back to the colunn=ty=colimh development of the binary digit computation for ‘the Boolean union, In each case, we put a 1 dn the result line when either the first OR the second binary digit in the eoluan 4s a1 . In other words, the result line is the "oR" of the two digit: THE BOOLEAN INTERSECTION -- LOGICAL ‘ANDY (BI) ‘The Boolean intersection’ primitive with the mnemonic BI is similar in fora to the Boolean union primitive. However, it has a different rule for its computation. A simple example of ite use isi #(BE,L,3)"2 Another example is: #(BI,ASRED231,,HOW ARE YOU~f6)* pf Again the prefix strings with signs are ignored after scanning. The formation of the Hoolean intersection value string is again defined by reference to the equivalent groups of binary digits. The xm - 7 "Logical AND* rule for the 'intersection' of binary digits isi 1 1 # 4 ‘ +444 ‘The equivalent ‘truth table' for the intersection looks like this: first argument from these rules, we can work out the Boolean intersection for 43 and 1526, as follows: 493 4s the 166 dod aL A 1 1g26 si s aA a ig etal mee 1 “poner ge As in this example, when the octal parts of the second and third arguments of the Boolean intersection primitive do not have the sane number of digits, the digits of the left-hand ond of the longer string are ignored when there is no corresponding octal digit in the shorter part, Again a mull string is taken as the computational default value of the octal part when the octal part after seanning 19 found to be a null string. The Boolean intersection is also called the ‘logical AND' because 4n the cplunn—ty-colunn development of the computation with the binary digits, ve place a 1 4n the bottom line when both the first AND the Second binary digit in the column is ai. In other words, the result is the "AND" of the two binary digits, An octal “multiplication table" can also be developed for the ectal digit representation of the Boolean intersection. "Boolean complenent' "Logical NOT* x= 8 “truth table’ THE BOOLEAN COMPLEMENT -- LOGICAL *NOT* (BC) ‘The "Boolean complement" primitive, with the mnemonic BC , provides a method for changing the i's to $'s, and conversely, for all the binary digits represented by the octal string. Thus the Boolean cosplenent of the binary string fiff 1s iff! . Two examples of the KC primitive are: #(BC 3) 4 #(BC HOW ARE YOU+#6)"71 ‘Again the prefix part is ignored, and any mull string octal part results in a null string result, The Boolean complenent takes only one ectal string argurent, in the second argument position, The rule for computing the complenant of the binary digits is given by: digit resul: The ‘truth table’ is: As before, a truth table expressed in octal digits can be developed. As an example, the formation of the Boolean complement of 1526 As new computed: 526 is the same ast octal 11p fig 161 answert 6251 ‘The result string of the Zoolean complement has the same nunber of octal “Logical NT xX -9 ‘negation® ‘Boolean shift’ "Boolean rotate! @igite as the ausber of digits in the octal part used for computations ‘The Boolean complezent 4s also called the logical conplenent, or "Logical NOT', from the relationship of the digits { and f to the notions of "true" and “false”. The logical NOT or 'negation" of “true” is "false", Also, the negation of “false™ is "true". Furthermore, the negation of the negation of “true“ ie “true”, and so on. ‘THE BOOLZAN SHIPT AND ROTATS PRIMITIVES (BS, BR) ‘The last two Boolean prinitives provide the ability to nove the binary seroes and ones either to the left or to the right, These primitives are called "Boolean shift' BS, and "Boolean rotate’ BR. In these primitives, the number of places the binary digits are to be noved is specified by a signed @ecimal number found at the tail end of the ‘second argunent of the primitive. The Beclean vector to be operated upon is specified ty the octal digits found at the tail end of the third arguent of the primitive. If the octal part of the third argument is & mull string, the mull string is used in the computation. For beth primitives, the result string has the same number of octal digits as the octal part used in the computation, The movement of the binary digits may be either to the left or to the right. If the sign of ‘the decimal number is positive, the binary digits are moved to the left, If the sign is negative, they are moved to the right. The Boolean shift primitive HS moves the binary digits down the line, and when eny binary digit comes to the end of the line, it vanishes. At the other end of the line, where the empty positions appear, the expty Positions are filled in with binary rerces. Two exanples of dcolean shift are: "Boolean rotate’ XIX = 10 #(BS,2,56)'78 #(BS,CATS-5,D0GS 56) "#1 These examples can be verified by writing out the binary equivalent of the octal parts, and performing the specified shift: 4s the shift by fia the 56 same as: ft 119 42: 111 @ff = same as: 78 is the art as the 56 “Sene'ass aft tid “ty ts: $66.61 “sume as: Gt It is seen that when the mmber of places in the shift becomes greater than the total muber of binary places, the result from the Boolean shift will be all zerces. The 'Bpplean rotate! with the mnemonic BK , is a variation on the Boolean shift. With the ER primitive, when a digit cones to the end of the Line at one end, it ds moved over to the empty position at the other end of the line, This is why it is called "rotate". The digits rotate out from one end and inte the other, Taking some examples, we have: #CBR2, 56) 172 #(RR,CATS=5,00G8 56)'65 ‘The prefix parts in the second and the third arguments are ignored, as with the Boolean shift. The results can be verified in the sane way! the tate as the poh as: iff 11 oy 42: 111 gig ome 56 7 is the rotate is the 56 same as: ifi Lif by 5 Lig 1g same as: 65 ‘artificial intelligence xm - it “Adentities' We notice that when there are six binary digits (two cotal digits) as shown here, a rotation of -5 places is the sane as a rotation of + place. Similar relationships wi11 be found in all other instances of the Boolean rotate primitive, Tt is unfortunate that this Beginner‘s Manual is not the best place to delve deeply into the many fascinating things that can be done with the Boolean primitives by advanced users, One of these uses is to perfora certain kinds of experiments with ‘artificial intelligence’ -- yhich is concerned with trying to show seemingly intelligent behavior in a machine, By “intelligent tehavior* is meant behavior more complex than that which san be sectired with TRAC expressions involving only one, two, or a dozen EQ or GR primitives for making decisions, With the Boolean primitiv dozens or hundreds of binary decisions can te made with each primitive expression, EXERCISES 1. Where “first” and “second” represent any two octal strings, verify by hand and ty reactive typewriter with examples that: #(BU,"first",“second”)* has the sane string value asi #(30,#(BI,#(BC,"first") ,#(30,"second")))* Also verify that these two expressions have the same values when they are written with BU and BI interchanged. Expressions of this kind, which are identical, are called *identit: + This particular identity is called the “De Morgan identity*, named after Augustus De Morgan (1806-1876), an eminent English mathematician, (Statenents 2 Be ae xm = 12 of De Morgan's identity in other notation may be found in “History of Symbolic Logic", by Clarence Irving Lewis and Cooper Harold langford, which 1s reprinted in The World of Mathematics, James R. Newman, eds, Simon and Schuster, New York, 1955, Vol. 3, Part XII13, pages 1863-5, and in Introdustion to Logie, by Alfred Tareki, Oxford University Press, Naw York, 1942, 1946, page 52.) Write a procedure using EQ which will experimentally test and will print a YES or NO answer as to whether the octal string represented by "first" is the same as the string produced by the expression #(5C,#(BC,"firet”))" . Where "first" represents any octal string, verify that the expression #(BU,"firet",#(BC,"firet"))' consists of an octal string of all 7's, vith the same number of octal digits as there are in "first", Tt 15 somatines handy to be able to work directly with the binary digits f and 1, rather than with their octal representation. This can be done rather simply. Instead of using an octal representation, ‘use only the octal digits f and 1 , ignoring the digits 2 through 7. Howaver, to obtain the Boolean complement, the result string aust ‘be intersected with a string of octal i's . For axampls, the Boolean complezent of 1f can be computed by #(BI,111111#(BC,16))" , which produces the correct result #1. With the shift and rotate primitives, ‘the numerical value of the shift in terme of the "new" binary places aust be three times larger, Thus in order to shift one place to the left, we use #(BS,3,$18)" , which produces iff. By means of examples, verify these rules with various combinations of Boolean Primitives. met “halt! CHAPTER 20 ‘THE TWO HOUSEKEEPING PRIMITIVES (HL, MO) WHAT THEY ARE ‘TRAG language has two housekeeping primitives, HL and MO. Ina sense, these prinitives are not a part of TRAC language at all, since they have nothing to de with the actual manipulations on strings carried out in TRAC language. Instead, their purpose is to give special kinds of commands to the computer. In this respect, the housekeeping primitives are somewhat like the diagnostic primitives -= which also are not really used in TRAC language manipulations of strings, ‘THE HALT PRIMITIVE (HL) ‘The first of the two housekeeping primitives is halt! with the mnemonic KL. Its purpose is to enable us to disconnact fron the computer. The halt HL primitive 1s a mull This diagnostic means that the processor is operating with the standard TRAC 1-64 language, and with all the 34 prinitives conforming exactly to TRAC standards, when the TRAC processor contains an extended set of prinitives, in addition to the 34 standard primitives, execution of the mode primitive #(¥0) has the important effect of tenporarily disconnecting or disabling these prinitives, thoreby making the processor into a stondard TRAG Tal processor, ‘Then, in order to show that the processor is now in a standard condition, it prints out the diagnostic 4s therefore your guarantee that each of the primitives in the proceasor works exactly as desoribed in this Manual, The great advantage of a standard TRAC processor is that scripts which work on one standard processor can be expected to work with minimal trouble on any other standard TRAC processor. ‘Thus an interchange of useful seripts between workers in various fields of endeavor can be expected to take place. Fortunately this kind of rigorous standerdization of TRAC language does not prevent the TRAC processor from incorporating other primitives of @ special nature which may be useful for local situations and problens. Aa we have seen, these extended primitives can be activated or not, as desired, from the typewriter keyboard. Thus the choice of a standard or nonstandard processor is left open to the user of the system. Ordinarily, the TRAC processor, when it first starts up, will be dn the standard T-64 level of the language. Tt is the intent, in future developments and future releases of TRAC language facilities, to provide well-thought-out standard groups of primitives which will extend TRAC processors in special directions. Such extensions will ba announced in TRAC publications, EPILOG TO THE READER From the reading of these twenty chapters of this Manual, you are now in full knowledges of how to use TRAC language and all its primitives. ‘The language you have learned is the standard TRAC T=6h level of the language. Yor your reference purposes, a precise, technical description and definition of the TRAC T-6 language 1s provided in Appendix A. from this point on, the things that you can do in TRAC language with scripts and proceduras 1s limited only ty your inagination and skill, Good luck, and may you have a rewarding and exciting time!