home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l210 / 1.ddi / EXAMPLES.ARC / CH12EX12.PRO < prev    next >
Encoding:
Prolog Source  |  1988-06-21  |  3.7 KB  |  120 lines

  1. /*
  2.    Turbo Prolog 2.0 Chapter 12, Example Program 12
  3.    
  4.    Copyright (c) 1986, 88 by Borland International, Inc
  5.    
  6. */
  7.    
  8. domains
  9.    file      = datafile; indexfile
  10.    name, address = string
  11.    age          = integer
  12.    sex          = m or f
  13.    interest      = symbol
  14.    interests     = interest*
  15.  
  16.   /* record        = person(name, address, age, sex, interests) */
  17.    
  18.    filename = string
  19.    filepos = real
  20.  
  21. database - record
  22.    person(name, address, age, sex, interests)
  23.    
  24. predicates
  25.    dbassert(record)         % user-defined assert
  26.    dbretract(record)        % user-defined retract
  27.    dbread(record)        % User defined database acces
  28.  
  29.    dbass(record, filename, filename)
  30.    dbaaccess(record, filepos)
  31.    dbret(record, filename, filename)
  32.    dbret1(record, filepos)
  33.    dbrd(record, filename, filename)
  34.  
  35. clauses
  36. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  37.  * Entry routines. These can be changed to fit the actual      *
  38.  * application: for example, extended to a pool of open files  *
  39.  * in order to access several databases at a time, or to allow *
  40.  * more than one data file.                                    *
  41.  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  42.    dbassert(Term) :- dbass(Term, "dba.ind", "dba.dat").
  43.    dbretract(Term) :- dbret(Term, "dba.ind", "dba.dat").
  44.    dbread(Term) :- dbrd(Term, "dba.ind", "dba.dat").
  45.  
  46.    /* dbass appends a term to the data file and updates the index file  */
  47.  
  48.    dbass(Term, IndexFile, DataFile) :-
  49.       existfile(DataFile), existfile(IndexFile), !,
  50.       openappend(datafile, DataFile),
  51.       writedevice(datafile),
  52.       filepos(datafile, Pos, 0),
  53.       write(Term), nl,
  54.       closefile(datafile),
  55.       openappend(indexfile, IndexFile),
  56.       writedevice(indexfile),
  57.       writef("%7.0\n", Pos),
  58.       closefile(indexfile).
  59.  
  60.    dbass(Term, IndexFile, DataFile) :-
  61.       openwrite(datafile, DataFile),
  62.       writedevice(datafile),
  63.       filepos(datafile, Pos, 0),
  64.       write(Term), nl,
  65.       closefile(datafile),
  66.       openwrite(indexfile, IndexFile),
  67.       writedevice(indexfile),
  68.       writef("%7.0\n", Pos),
  69.       closefile(indexfile).
  70.  
  71.   /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  72.    * dbrd returns terms from the database. The files are     *
  73.    * closed after the database has been read.                *
  74.    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  75.  
  76.    dbrd(Term, IndexFile, DataFile) :-
  77.       openread(datafile, DataFile),
  78.       openread(indexfile, IndexFile),
  79.       dbaaccess(Term, -1).
  80.  
  81.    dbrd(_, _, _) :-
  82.       closefile(datafile), closefile(indexfile), fail.
  83.  
  84.    dbaaccess(Term, Datpos) :-
  85.       Datpos >= 0,
  86.       filepos(datafile, Datpos, 0),
  87.       readdevice(datafile),
  88.       readterm(record, Term).
  89.  
  90.    dbaaccess(Term, _) :-
  91.       readdevice(indexfile),
  92.       readreal(Datpos1),
  93.       dbaaccess(Term, Datpos1).
  94.  
  95.   /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  96.    * dbret retracts terms from the database. A term is         *
  97.    * retracted by writing a negative number in the index file. *
  98.    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  99.  
  100.    dbret(Term, Indexfile, Datafile) :- 
  101.       openread(datafile, DataFile),
  102.       openmodify(indexfile, IndexFile),
  103.       dbret1(Term, -1).
  104.  
  105.    dbret1(Term, Datpos) :- 
  106.       Datpos >= 0,
  107.       filepos(datafile, Datpos, 0),
  108.       readdevice(datafile),
  109.       readterm(record, Term), !,
  110.       filepos(indexfile, -9, 1),
  111.       flush(indexfile),
  112.       writedevice(indexfile),
  113.       writef("%7.0\n", -1),
  114.       writedevice(screen).
  115.  
  116.    dbret1(Term, _) :-
  117.       readdevice(indexfile),
  118.       readreal(Datpos1),
  119.       dbret1(Term, Datpos1).
  120.