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

  1. /*
  2.    Turbo Prolog 2.0 Chapter 15, Example Program 5
  3.    
  4.    Copyright (c) 1986, 88 by Borland International, Inc
  5.    
  6. */
  7.       /* Logging database opertations */
  8.       
  9. domains 
  10.    logdom = insert(relation,dbdom,ref);
  11.            replace(relation,dbdom,ref,dbdom);
  12.            erase(relation,ref,dbdom)
  13.  
  14. predicates
  15.    logdbchange(logdom)              
  16.  
  17. clauses
  18.    logdbchange(Logterm):-
  19.       chain_insertz(logdba,logchain,logdom,Logterm,_),
  20.       db_flush(logdba).
  21.  
  22.  
  23.                 /* ch15ex05.pro */
  24.  
  25. domains
  26.    dbdom = city(zipcode, cityname);
  27.    person(firstname, lastname, street, zipcode, code)
  28.    zipcode, cityname, firstname, lastname = string
  29.    street, code = string
  30.    indexName = person_name; person_adr; city_no
  31.    relation  = city; person
  32.    db_selector = dba; logdba
  33.  
  34. database
  35.    indices(IndexName, bt_selector)     /* This takes and index name (a key) that
  36. is a person's name or address or a city number; it also takes a B+ tree selector
  37.                                           */
  38. predicates
  39.    xname(FirstName, LastName, string)    /* This predicate creates an index name
  40.             from a last name (20 characters) and a first name (10 characters) */
  41. clauses
  42.    xname(F, L, S) :-
  43.       str_len(L, LEN), LEN>20, !,
  44.       frontstr(20, L, L1, _),
  45.       format(S, "%-20%", L1, F).
  46.  
  47.    xname(F, L, S) :-
  48.       format(S, "%-20%", L, F).
  49.  
  50. predicates
  51.    dba_insert(relation, dbdom)
  52.    dba_replace(relation, dbdom, Ref)
  53.    dba_erase(relation, Ref)
  54.  
  55. clauses
  56.    dba_insert(person, Term) :- !,
  57.       break(OldBreak),
  58.       break(off),
  59.       indices(person_name, I1),
  60.       indices(person_adr, I2), !,
  61.       Term = person(Fname, Lname, Adr, _, _),
  62.       xname(Fname, Lname, Xname),
  63.       chain_insertz(dba, person, dbdom, Term, Ref),
  64.       key_insert(dba, I1, Xname, Ref),
  65.       key_insert(dba, I2, Adr, Ref),
  66.       db_flush(dba),
  67.       logdbchange(insert(person, Term, Ref)),
  68.       break(OldBreak).
  69.  
  70.    dba_insert(city, Term) :-
  71.       break(OldBreak),
  72.       break(off),
  73.       indices(city_no, I), !,
  74.       Term = city(ZipCode, _),
  75.       chain_insertz(dba, city, dbdom, Term, Ref),
  76.       key_insert(dba, I, ZipCode, Ref),
  77.       db_flush(dba),
  78.       logdbchange(insert(city, Term, Ref)),
  79.       break(OldBreak).
  80.  
  81.    dba_replace(person, NewTerm, Ref) :- !,
  82.       break(OldBreak),
  83.       break(off),
  84.       indices(person_name, I1),
  85.       indices(person_adr, I2), !,
  86.       ref_term(dba, dbdom, Ref, OldTerm),
  87.       OldTerm = person(OldFname, OldLname, OldAdr, _, _),
  88.       xname(OldFname, OldLname, OldXname),
  89.       key_delete(dba, I1, OldXname, Ref),
  90.       key_delete(dba, I2, Oldadr, Ref),
  91.       NewTerm = person(NewFname, NewLname, NewAdr, _, _),
  92.       xname(NewFname, NewLname, NewXname),
  93.       term_replace(dba, dbdom, Ref, NewTerm),
  94.       key_insert(dba, I1, NewXname, Ref),
  95.       key_insert(dba, I2, NewAdr, Ref),
  96.       db_flush(dba),
  97.       logdbchange(replace(person, NewTerm, Ref, OldTerm)),
  98.       break(OldBreak).
  99.  
  100.    dba_replace(city, NewTerm, Ref) :- !,
  101.       break(OldBreak),
  102.       break(off),
  103.       indices(city_no, I), !,
  104.       ref_term(dba, dbdom, Ref, OldTerm),
  105.       OldTerm = city(OldZipCode, _),
  106.       key_delete(dba, I, OldZipCode, Ref),
  107.       NewTerm = city(ZipCode, _),
  108.       term_replace(dba, dbdom, Ref, NewTerm),
  109.       key_insert(dba, I, ZipCode, Ref),
  110.       db_flush(dba),
  111.       logdbchange(replace(city, NewTerm, Ref, OldTerm)),
  112.       break(OldBreak).
  113.  
  114.    dba_erase(person, Ref) :- !,
  115.       break(OldBreak),
  116.       break(off),
  117.       indices(person_name, I1),
  118.       indices(person_adr, I2), !, 
  119.       ref_term(dba, dbdom, Ref, OldTerm),
  120.       OldTerm = person(OldFname, OldLname, OldAdr, _, _),
  121.       xname(OldFname, OldLname, OldXname),
  122.       key_delete(dba, I1, OldXname, Ref),
  123.       key_delete(dba, I2, OldAdr, Ref),
  124.       term_delete(dba, person, Ref),
  125.       db_flush(dba),
  126.       logdbchange(erase(person, Ref, OldTerm)),
  127.       break(OldBreak).
  128.  
  129.    dba_erase(city, Ref) :-
  130.       break(OldBreak),
  131.       break(off),
  132.       indices(city_no, I), !,
  133.       ref_term(dba, dbdom, Ref, OldTerm),
  134.       OldTerm = city(OldZipCode, _),
  135.       key_delete(dba, I, OldZipCode, Ref),
  136.       term_delete(dba, city, Ref),
  137.       db_flush(dba),
  138.       logdbchange(erase(city, Ref, OldTerm)),
  139.       break(OldBreak).
  140.