home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l217 / 2.ddi / EXAMPLES / CH12EX16.PRO < prev    next >
Encoding:
Prolog Source  |  1990-03-26  |  3.6 KB  |  117 lines

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