Prolog is an elegant language for database queries. In fact if one constrains Prolog programs to use only atoms, integers and reals (no lists or complex terms) and disallows recursive definitions, one gets a database language that is equivalent to a powerful subset of SQL. In this section we will see how this is so.
A relation in relational database theory is a set of tuples. A common
example of a database relation is the employee
relation, which
contains a tuple for each employee in a company. Each tuple might
contain fields for: employee number, last name, first name, street
address, city, state, zipcode, department number, hire date, and
salary. It could, of course, contain many more. We can represent a
set of tuples in Prolog as a highly nondeterministic procedure, the
procedure returning every one of the tuples in the relation.
employee(193,'Jones','John','173 Elm St.','Hoboken','NJ', 12345,1,'25 Jun 93',25500). employee(181,'Doe','Betty','11 Spring St.','Paterson','NJ', 12354,3,'12 May 91',28500). employee(198,'Smith','Al','2 Ace Ave.','Paterson','NJ', 12354,3,'12 Sep 93',27000). (and more...)
And we might have a department relation which contains for each department, a tuple that gives its number, name, and employee number of its manager.
department(1,'Grocery',181). department(3,'Deli',193). department(5,'Produce',199). ...
Given these basic relations (also called extensional relations), we can define other relations using Prolog procedure definitions to give us answers to questions we might have about the data. For example, we can define a new relation containing the names of all employees making more than $28,000:
well_paid_emp(First,Last) :- employee(_Num,Last,First,_Addr,_City,_St,_Zip,_Dept,_Date,Sal), Sal > 28000.
As another example, we could ask for the name of the manager of the Deli department:
deli_manager(First,Last) :- department(_Deptno,'Deli',MgrID), employee(MgrID,Last,First,_Addr,_City,_St,_Zip,_Dept,_Date,_Sal).Here we first call the department relation to find the employee number of the manager of the Deli department; then we call the employee relation to find the first and last names of the employee with that number.
(Should we introduce negation here? Without recursion, it is pretty easy. Would have to talk about safety.)