home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / languags / prolog / epro23.ark / EPRO.DOC < prev    next >
Text File  |  1986-11-02  |  12KB  |  378 lines

  1.  
  2. E-PROLOG
  3. --------            (ver. 2.3 -- August 1, 1985)
  4.  
  5. This is a small Prolog system for CP/M-80 Z-80 computer.  The
  6. current code occupies less than 6K bytes of space, so that
  7. there is a lot of space left over for the database and for the
  8. VERY deep subroutine stack.  The executable version of E-Prolog
  9. is called EPRO.COM.  This version was prepared under CP/M
  10. 2.2, but if you do not use APPEND, it should run under CP/M
  11. 1.4.
  12.  
  13. The source code is intended for Microsoft's Macro-80
  14. compiler.  The source files are:  EPRO.Z80, CLASS.Z80,
  15. SYMB.Z80, HEAP.Z80, DATBADD.Z80, UNIFY.Z80, CMD.Z80,
  16. PROVE.Z80, INPUT.Z80, OUTPUT.Z80, ERROR.Z80, ASSEM.Z80,
  17. INIT.Z80 .
  18.  
  19. Some E-Prolog sample programs are included on the disk, also:
  20.     STD.PRO        some standard connectives
  21.     SAMPLE.PRO    a sample database - see below
  22.     SCIAM.PRO    a logic puzzle from Scientific American
  23.     VALGOL.PRO    a compiler written in Prolog
  24.             (from May, 1985, Dr. Dobb's Journal)
  25. ---------------------------------------------------------------
  26.  
  27. EXPLANATION
  28. -----------
  29.  
  30. This DOC file DOES NOT teach Prolog.  See the appropriate books
  31. for that.
  32.     1.  W. F. Clocksin & C. S. Mellish, Programming in Prolog,
  33.     Springer-Verlag, 1981.
  34.     2.  K. L. Clark and F. G. McCabe, Micro-PROLOG:
  35.     Programming in Logic, Prentice-Hall, 1984.
  36.  
  37. E-Prolog does not have the special features of the large
  38. systems described in these books, but neither does it have the
  39. large price tags of those systems.
  40.  
  41. Here are the peculiarities of E-Prolog.  (Mostly things were
  42. done this way to save space.)  TOKENS are the smallest elements
  43. recognized by the language.  They are used to identify
  44. individuals (constants) and relations (predicate symbols), and
  45. some of them have special uses as well.  The most common tokens
  46. are strings consisting of letters (upper and lower case are
  47. different), digits, and the characters '-', '_' , and '?' .
  48. Most other printable characters usually represent tokens of
  49. a single character.  Exceptions to this can be enforced by
  50. enclosing a string in quotation marks (either " or ' ).
  51. Inside such a string, control characters are indicated as
  52. usual with the escape character '^'.  Text enclosed in square
  53. brackets [ and ] is a comment, and is ignored.  Space, Tab,
  54. Carriage return, Linefeed and comments separate one token from
  55. the next.  Examples:  Here there is one token on each line:
  56.     ken
  57.     Ken
  58.     /
  59.     "A long string with spaces."
  60. But this line has eight tokens:
  61.     How-to-tell.where one/token[really]ends.
  62. They are:
  63.     How-to-tell
  64.     .
  65.     where
  66.     one
  67.     /
  68.     token
  69.     ends
  70.     .
  71.  
  72. VARIABLES are represented as strings beginning with the
  73. character '?'.  Examples:
  74.     ?X
  75.     ?who
  76.     ?mother-in-law
  77.  
  78. LISTS are represented by placing the items of the list between
  79. a pair of parentheses.  Examples:
  80.     (A B C D E)        a list with 5 items
  81.     ()            the empty list
  82.     (A (B C D E))        a list with 2 items
  83.     (LOAD A:SAMPLE.PRO)    a list with 6 items
  84.     (LOAD A : SAMPLE . PRO)    the same list
  85.  
  86. PAIRS are represented using the vertical '|'.  Example:
  87.     (A | B)
  88.  
  89. Technically, lists are built from the empty list up as pairs.
  90. The list (A B C D) is (A | (B | (C| (D | ())))) .  Example: if
  91.     (?X | ?Y)
  92. matches
  93.     (first second third fourth)
  94. then ?X must be first and ?Y must be
  95.     (second third fourth)
  96. This idea is extended to work with longer lists, too:  If
  97.     (?a ?b ?c | ?d)
  98. matches
  99.     (alpha beta gamma)
  100. then ?a is alpha, ?b is beta, ?c is gamma, and ?d is ().
  101.  
  102. NUMBERS are not really implemented in E-Prolog.  Numbers from
  103. 0 to about 5500 can be used.  They can be compared using LESS,
  104. but no arithmetic has been implemented.
  105.  
  106. ATOMS  are what Prolog asserions and rules are built from.
  107. They are lists:  the first item in the list is the "predicate
  108. symbol" or "relation name", the others are the arguments.
  109. Example:  (father jack ken) means that the relation "father"
  110. holds between the individuals "jack" and "ken".  In Clocksin &
  111. Mellish, this is written:  father(jack,ken).  It might have
  112. the interpretation (if we choose) that Jack is the
  113. father of Ken.  CLAUSES are lists of atoms.  This is how
  114. Prolog rules are stored in the database.  The first atom is
  115. the conclusion, and the others are the conditions.  Example:
  116.     ((grandparent ?A ?C) (parent ?A ?B) (parent ?B ?C))
  117. This clause represents the Prolog rule:    A is the grandparent of
  118. C if A is the parent of B and B is the parent of C.  In
  119. Clocksin & Mellish it would be:
  120.     grandparent(A,C) :- parent(A,B) , parent(B,C).
  121.  
  122. ---------------------------------------------------------------
  123.  
  124. BUILT-IN PREDICATES
  125. -------------------
  126.  
  127. Certain predicates are built into E-Prolog.  These have to be
  128. special so that they can have "side effects", such as printing
  129. out information to the outside world.  Here are brief
  130. descriptions of these special predicates.
  131.  
  132. LESS  This compares two strings (or two numbers).  Examples:
  133.     (LESS help hurt)    succeeds
  134.     (LESS help help)    fails
  135.  
  136. LIST  This sends the entire database to the console (or other
  137. current output device).  Example:
  138.     (LIST)
  139.  
  140. READ  This is used to input a token from the console (or the
  141. current input file).  Example:  (READ ?X)  will read one
  142. token and unify it with ?X.
  143.  
  144. READLIST  This is used to input a list from the console
  145. (or the current input file).  Examples:  (READ ?X), where
  146. ?X is a variable that does not have a current value,
  147. will read one item from the console, and assign it to ?X.  But
  148. (READ (?X A : C)) will read one item from the console, and
  149. attempt to unify it with the list (?X A : C).  Try it!
  150.  
  151. READCHAR  This inputs one character, which is treated
  152. internally as a number between 0 and 255.  Example:
  153.     (READCHAR ?x)
  154.  
  155. WRITE  This writes items to the console (or other output
  156. device).  Examples:
  157.     (WRITE ?X ?Y ?Z)
  158.     (WRITE "Now is the time.")
  159.     (WRITE "The father's name is " ?father ".^M^J")
  160.  
  161. WRITECHAR  This outputs as one character a number between
  162. 0 and 255.  This number presumably was obtained using a
  163. READCHAR.  Example:
  164.     (WRITECHAR ?x)
  165.  
  166. OPEN  This opens a file for input.  After an OPEN atom is
  167. verified, input is taken from that file instead of from the
  168. console.  Any remaining input in the previous input file
  169. (or the input line from the console) is ignored.  When EOF is
  170. reached, input reverts to the console.  The input device may
  171. also be altered by a LOAD or OPEN command in the file.
  172. This command requires a file name.  The name may be CON for
  173. the console.  Examples:
  174.     (OPEN A:FILE.INP)
  175.     (OPEN CON)
  176.  
  177. CREATE  This opens a previously nonexistent file for output.
  178. (If the file already exists, then it will be deleted, and a new
  179. file opened with the same name.)  After a CREATE atom is
  180. verified, output goes to the file instead of to the console.
  181. To end output to the file, use CLOSE, or CREATE another file.
  182. This command requires a file name, as in OPEN.  The file name
  183. may be CON for the console, or NULL for Never-Never Land.
  184. Examples:
  185.     (CREATE A:FILE.OUT)
  186.     (CREATE | ?file)    the variable should be matched
  187.                 before this is attempted
  188.  
  189. APPEND  This is used to open an existing file for output.
  190. It is like CREATE, except that output starts at the end of
  191. the existing information.  Requires a file name.  Examples:
  192.     (APPEND A:SAMPLE.PRO)
  193.     (APPEND FAM)            no filetype
  194.  
  195. CLOSE  This closes the output file.  Further output will go to
  196. the console.  Output sent to a file that is never closed will
  197. probably be lost.  Example:
  198.     (CLOSE)
  199.  
  200. SAVE  This writes the current database to a file.  Requires a
  201. file name.  The default file type is 'PRO'.  Example:
  202. (SAVE A) is roughly equivalent to the following commands, in
  203. order: (CREATE A.PRO) (LIST) (CLOSE).
  204.  
  205. LOAD  This loads input from a given file.  Usually used to add
  206. to the database.  Use this only at command level, not from a
  207. program.  (Use OPEN to get commands from a file.)
  208. Requires a file name.  When EOF is reached, the input device
  209. reverts to the console.  Loading may also be prematurely
  210. terminated with another LOAD or OPEN command in the file.
  211. Requires a file name.  The file type 'PRO' is the default.
  212.  
  213. /  This is the CUT.  It prohibits backtracking of the current
  214. predicate past the point it marks.  See example below.
  215.  
  216. ---------------------------------------------------------------
  217.  
  218. SAMPLE SESSION
  219. --------------
  220.  
  221. In the sample session below, the comments are written flush
  222. left, and the actual input and output is indented.  We will use
  223. the sample database SAMPLE.PRO.  If you have a working
  224. E-Prolog, follow along yourself.  Begin from CP/M.
  225. The tail of the command line is the first input to E-Prolog.
  226. (Remember that CP/M converts the command line to upper case.)
  227.  
  228.    A> EPRO (LOAD SAMPLE)
  229.  
  230.    E-Prolog    ver. 2.3    (August 1, 1985)
  231.    >
  232. This is the E-Prolog prompt.  It is only shown when the input
  233. device is the console.  To ask E-Prolog to attempt to prove
  234. a statement, just enter the atom.
  235.    > (father jack ken)
  236.    Yes.
  237.    >
  238. The statement was proved.  (The 'Yes' response is shown only
  239. when the input and output devices are both the console.)
  240.    > (mother jack ken)
  241.    >
  242. If the statement was not proved, no response is printed.
  243. Now let's try one with variables.
  244.    > (father jack ?who)
  245.    Yes.       ?who = ken
  246. One solution was found.  E-Prolog asks whether to try for
  247. other solutions:
  248.    More?> y
  249.    Yes.       ?who = karen
  250.    More?> y
  251.    >
  252. The commands are entered just like other atoms.
  253.    > (LIST)
  254.  
  255.    ((father jack ken))
  256.    ((father jack karen))
  257.  
  258.    ((grandparent ?grandparent ?grandchild)
  259.        (parent ?grandparent ?parent)
  260.        (parent ?parent ?grandchild))
  261.  
  262.    ((mother el ken))
  263.    ((mother cele jack))
  264.  
  265.    ((parent ?parent ?child)
  266.        (mother ?parent ?child))
  267.    ((parent ?parent ?child)
  268.        (father ?parent ?child))
  269.  
  270.    Yes.
  271.    >
  272. Let's try something more difficult to solve:
  273.    > (grandparent ?001 ?002)
  274.    Yes.       ?001 = cele
  275.        ?002 = ken
  276.    More?> y
  277.    Yes.       ?001 = cele
  278.        ?002 = karen
  279.    More?> y
  280.    >
  281. Here is another variation.  Try this one on your expensive
  282. Prolog system!
  283.    > (?relation jack karen)
  284.    Yes.       ?relation = father
  285.    More?> y
  286.    Yes.       ?relation = parent
  287.    More?> y
  288.    >
  289. To add to the database, enter a clause in the form of a list
  290. of atoms.
  291.    > ((father carl jack))
  292.    > (LIST)
  293.  
  294.    ((father jack ken))
  295.    ((father jack karen))
  296.    ((father carl jack))
  297.  
  298.    ((grandparent ?grandparent ?grandchild)
  299.        (parent ?grandparent ?parent)
  300.        (parent ?parent ?grandchild))
  301.  
  302.    ((mother el ken))
  303.    ((mother cele jack))
  304.  
  305.    ((parent ?parent ?child)
  306.        (mother ?parent ?child))
  307.    ((parent ?parent ?child)
  308.        (father ?parent ?child))
  309.    Yes.
  310.    >
  311. Now let's add a rule to the database.  (The prompt '1>'
  312. indicates that there is one open parenthesis that has not been
  313. closed.)
  314.    > ((z ?x ?y)
  315.    1> (father jack ?x)
  316.    1> (father jack ?y)
  317.    1> )
  318. This one illustrates backtracking.
  319.    > (z | ?u)
  320.        ?u = (ken ken)
  321.    More?> y
  322.    Yes.       ?u = (ken karen)
  323.    More?> y
  324.    Yes.       ?u = (karen ken)
  325.    More?> y
  326.    Yes.       ?u = (karen karen)
  327.    More?> y
  328.    >
  329. Here is one with a cut to prohibit backtracking.
  330.    > ((zz ?x ?y) (father jack ?x) (/) (father jack ?y))
  331.    > (zz | ?v)
  332.    Yes.       ?v = (ken ken)
  333.    More?> y
  334.    Yes.       ?v = (ken karen)
  335.    More?> y
  336.    >
  337. Isn't the next one interesting:
  338.    > ?x
  339.    Yes.       ?x = (father jack ken)
  340.    More?> y
  341.    Yes.       ?x = (father jack karen)
  342.    More?> y
  343.    Yes.       ?x = (grandparent cele ken)
  344.    More?> y
  345.    Yes.       ?x = (grandparent cele karen)
  346.    More?> y
  347.    Yes.       ?x = (grandparent carl ken)
  348.    More?> n
  349.    >
  350. If we didn't cut it off, it would go ahead and list all the
  351. facts that can be deduced from these rules!  Some standard
  352. connectives are in the file STD.PRO.  (Currently  EQ , AND ,
  353. OR , NOT, IF, IFF .)
  354.    > (LOAD STD)
  355.  
  356.    > (EQ 3 6)
  357.    > (EQ 3 3)
  358.    Yes.
  359.    > (AND (parent ?x ?y)(parent ?y ?z))
  360.    Yes.       ?x = cele
  361.        ?y = jack
  362.        ?z = ken
  363.    More?> y
  364.    Yes.       ?x = cele
  365.        ?y = jack
  366.        ?z = karen
  367.    More?> n
  368.    > ^C
  369. This is the way to leave E-Prolog.  Don't forget to (CLOSE)
  370. first if you have been writing to the disk.
  371.  
  372. ---------------------------------------------------------------
  373.  
  374. G. A. Edgar            CompuServe 70715,1324
  375. 107 W. Dodridge St.
  376. Columbus, OH 43202
  377.  
  378.