The following output illustrates such a coupling.{foot The output is from the Lunar Sciences Natural Language Information System developed for the NASA Manned Spacecraft Center by William A. Woods of Bolt Beranek and Newman Inc., Cambridge, Mass. }{comment endfootnote} {Label L!50} {lispcode **SETQ(ALTFORM (MAPCONC NASDIC (F/L (GETP X 'ALTFORMS]{codetag 1} =NASDICT (AL26 BE7 CO56 CO57 CO60 C13 H3 MN54 NA22 SC46 S34 TI44) **(GIVE ME LINES CONTAINING COBALT){codetag 2} SAMPLE PHASE CONSTIT. CONTENT UNIT CITATION TAG S10002 OVERALL C056 40.0 DPM/KG D70-237 0 C13 8.8 DEL D70-228 0 H3 314.0 DPM/KG MN54 28 **GETP(COBALT ALTFORMS){codetag 3} (CO56 CO57 CO60 C13 H3 MN54 NA22 SC46 S34 T144) **UNDO MAPCONC{codetag 4} SETQ UNDONE. **REDO GETP{codetag 5} (CO56 CO57 CO60) **REDO COBALT{codetag 6} SAMPLE PHASE CONSTIT. CONTENT UNIT CITATION TAG S10002 OVERALL CO57 40.0 DPM/KG D70-237 0 S10003 OVERALL CO 15.0 D70-203 0 14.1 D70-216 CO56 43.0 DPM/KG D70-237 0 CO57 43.0 D70-241 0 CO60 1.0 **USE MANGANESE FOR COBALT } The user is running under his own executive program which accepts requests in the form of sentences, which it first parses and then executes. The user first "innocently" computes a list of all {lisp ALT}ernative-{lisp FORM}s for the elements in his system {codetag 1}. He then inputs a request in sentence format {codetag 2} expecting to see under the column {lisp CONSTIT}. only cobalt, {lisp CO}, or its alternate forms, {lisp CO56}, {lisp CO57}, or {lisp CO60}. Seeing {lisp C13}, {lisp H3}, and {lisp MN54}, he aborts the output, and checks the property {lisp ALTFORMS} for {lisp COBALT} {codetag 3}. The appearance of {lisp C13}, {lisp H3}, {lisp MN54} et al, remind him that the {fn MAPCONC} is destructive, and that in the process of making a list of the {lisp ALTFORMS}, he has inadvertently strung them all together. Recovering from this situation would require him to individually examine and correct the {lisp ALTFORM}s for each element in his dictionary, a tedious process. Instead, he can simply type {lisp UNDO MAPCONC} {codetag 4}, check to make sure the ALTFORM has been corrected {codetag 5}, then redo his original request {codetag 6} and continue. The {pacom UNDO} is possible because the first input was executed by {index LISPX}{fn LISPX}; the {lisp (GIVE ME LINES CONTAINING COBALT)} is possible because the user defined {index LISPXUSERFN PAV}{var LISPXUSERFN} appropriately; and the {pacom REDO} and {pacom USE} are possible because the {lisp (GIVE ME LINES CONTAINING COBALT)} was stored on the history list before it was transmitted to {var LISPXUSERFN} and the user's parsing program. Thus in the above example, {var LISPXUSERFN} would be defined as: {lispcode [LAMBDA (X LINE) (COND ((AND (NULL LINE) (LISTP X)) (SETQ LISPXVALUE (PARSE X)) T]}