12 prolog part 2 - department of computer sciencecannata/cs345/class notes/12 prolog...dr. philip...
TRANSCRIPT
Dr. Philip Cannata 1
Programming Languages
Logic Programming – Prolog Part 2
Dr. Philip Cannata 2
Standard Oracle emp / dept Database
Dr. Philip Cannata 3
Oracle Sqldeveper
http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html
Dr. Philip Cannata 4
Oracle Sqldeveper
Dr. Philip Cannata 5
Oracle Sqldeveper
Dr. Philip Cannata 6
Oracle Sqldeveper
Dr. Philip Cannata 7
Oracle Sqldeveper
Cut and Paste this into here and press
Dr. Philip Cannata 8
Oracle Sqldeveper
Dr. Philip Cannata 9
Oracle Sqldeveper
This database is for this book. But, the book is old and assumes
you’re using sqlplus not sqldeveloper. So, ignore all of the formatting examples in the
book and just do the sql.
Dr. Philip Cannata 10
emp(7839, king, president, 0, 17-nov-81, 5000, 0, 10).emp(7698, blake, manager, 7839, 01-may-81, 2850, 0, 30).emp(7782, clark, manager, 7839, 09-jun-81, 2450, 0, 10).emp(7566, jones, manager, 7839, 02-apr-81, 2975, 0, 20).emp(7788, scott, analyst, 7566, 09-dec-82, 3000, 0, 20).emp(7902, ford, analyst, 7566, 03-dec-81, 3000, 0, 20).emp(7369, smith, clerk, 7902, 17-dec-80, 800, 0, 20).emp(7499, allen, salesman, 7698, 20-feb-81, 1600, 300, 30).emp(7521, ward, salesman, 7698, 22-feb-81, 1250, 500, 30).emp(7654, martin, salesman, 7698, 28-sep-81, 1250, 1400, 30).emp(7844, turner, salesman, 7698, 08-sep-81, 1500, 0, 30).emp(7876, adams, clerk, 7788, 12-jan-83, 1100, 0, 20).emp(7900, james, clerk, 7698, 03-dec-81, 950, 0, 30).emp(7934, miller, clerk, 7782, 23-jan-82, 1300, 0, 10).
dept(10, accounting, new_york).dept(20, research, dallas).dept(30, sales, chicago).dept(40, operations, boston).
select 'emp(' || empno || ', ' || lower(ename) || ', ' || lower(job) || ', ' || nvl(mgr, 0) || ', ' || lower(hiredate) || ', ' || sal || ', ' || nvl(comm, 0) || ', ' || deptno || ').' from emp
select 'dept(' || deptno || ', ' || lower(dname) || ', ' || lower(loc) || ').' from dept
emp / dept Database in Prolog
Dr. Philip Cannata 11
Haskell> [(empno, ename, job, sal, deptno) | (empno, ename, job, _, _, sal, deptno) <- emp]
| ?- emp(Empno, Ename, Job, _, _, Sal, _, Deptno).
Deptno = 10Empno = 7839Ename = kingJob = presidentSal = 5000 ? ;
Deptno = 30Empno = 7698Ename = blakeJob = managerSal = 2850 ?
. . .
emp / dept Database in Prolog
Dr. Philip Cannata 12
Haskell> [(empno, ename, job, sal, deptno) | (empno, ename, job, _, _, sal, deptno) <- emp, deptno == 10]
| ?- emp(Empno, Ename, Job, _, _, Sal, _, 10).
Empno = 7839Ename = kingJob = presidentSal = 5000 ? ;
Empno = 7782Ename = clarkJob = managerSal = 2450 ? ;
Empno = 7934Ename = millerJob = clerkSal = 1300
yes| ?-
emp / dept Database in Prolog
Dr. Philip Cannata 13
Main> [(empno, ename, job, sal, dname) | (empno, ename, job, _, _, sal, edeptno) <- emp, (deptno, dname, loc) <- dept, edeptno == deptno ]
| ?- emp(Empno, Ename, Job, _, _, Sal, _, D), dept(D, Dname, _).
D = 10Dname = accountingEmpno = 7839Ename = kingJob = presidentSal = 5000 ? ;
D = 30Dname = salesEmpno = 7698Ename = blakeJob = managerSal = 2850 ? ;
D = 10Dname = accountingEmpno = 7782Ename = clarkJob = managerSal = 2450 ?
emp / dept Database in Prolog
Dr. Philip Cannata 14
ename(7839, king).ename(7698, blake).ename(7782, clark).ename(7566, jones).ename(7788, scott).ename(7902, ford).ename(7369, smith).ename(7499, allen).ename(7521, ward).ename(7654, martin).ename(7844, turner).ename(7876, adams).ename(7900, james).ename(7934, miller).
job(7839, president).job(7698, manager).job(7782, manager).job(7566, manager).job(7788, analyst).job(7902, analyst).job(7369, clerk).job(7499, salesman).job(7521, salesman).job(7654, salesman).job(7844, salesman).job(7876, clerk).job(7900, clerk).job(7934, clerk).
hiredate(7839, 17-nov-81).hiredate(7698, 01-may-81).hiredate(7782, 09-jun-81).hiredate(7566, 02-apr-81).hiredate(7788, 09-dec-82).hiredate(7902, 03-dec-81).hiredate(7369, 17-dec-80).hiredate(7499, 20-feb-81).hiredate(7521, 22-feb-81).hiredate(7654, 28-sep-81).hiredate(7844, 08-sep-81).hiredate(7876, 12-jan-83).hiredate(7900, 03-dec-81).hiredate(7934, 23-jan-82).
salary(7839, 5000).salary(7698, 2850).salary(7782, 2450).salary(7566, 2975).salary(7788, 3000).salary(7902, 3000).salary(7369, 800).salary(7499, 1600).salary(7521, 1250).salary(7654, 1250).salary(7844, 1500).salary(7876, 1100).salary(7900, 950).salary(7934, 1300).
mgr(7839, 0).mgr(7698, 7839).mgr(7782, 7839).mgr(7566, 7839).mgr(7788, 7566).mgr(7902, 7566).mgr(7369, 7902).mgr(7499, 7698).mgr(7521, 7698).mgr(7654, 7698).mgr(7844, 7698).mgr(7876, 7788).mgr(7900, 7698).mgr(7934, 7782).
deptno(7839, 10).deptno(7698, 30).deptno(7782, 10).deptno(7566, 20).deptno(7788, 20).deptno(7902, 20).deptno(7369, 20).deptno(7499, 30).deptno(7521, 30).deptno(7654, 30).deptno(7844, 30).deptno(7876, 20).deptno(7900, 30).deptno(7934, 10).
emp / dept Database in Prolog as Binary Relations (Triple Store)
Dr. Philip Cannata 15
Haskell> [(empno, ename, job, sal, deptno) |(x0, empno) <- empno, (x1, ename) <- ename, (x2, job) <- job,(x3, sal) <- sal, (x4, deptno) <- deptno, x0 == x1 && x1 == x2 && x2 == x3 && x3 == x4]
| ?- ename(E, Ename), job(E, Job), salary(E, Salary), deptno(E, Deptno).
Deptno = 10E = 7839Ename = kingJob = presidentSalary = 5000 ? ;
Deptno = 30E = 7698Ename = blakeJob = managerSalary = 2850 ? ;
Deptno = 10E = 7782Ename = clarkJob = managerSalary = 2450 ?
emp / dept Database in Prolog as Binary Relations (Triple Store)
Dr. Philip Cannata 16
name = [ (7839, "KING"), (7698, "BLAKE"), (7782, "CLARK"), (7566, "JONES"), (7788, "SCOTT"), (7902, "FORD"), (7369, "SMITH"), (7499, "ALLEN"), (7521, "WARD"), (7654, "MARTIN"), (7844, "TURNER"), (7876, "ADAMS"), (7900, "JAMES"), (7934, "MILLER") ]
name(7839, KING).name(7698, BLAKE).name(7782, CLARK).name(7566, JONES).name(7788, SCOTT).name(7902, FORD).name(7369, SMITH).name(7499, ALLEN).name(7521, WARD).name(7654, MARTIN).name(7844, TURNER).name(7876, ADAMS).name(7900, JAMES).name(7934, MILLER).
(7839, name, KING)(7698, name, BLAKE)(7782, name, CLARK)(7566, name, JONES)(7788, name, SCOTT)(7902, name, FORD)(7369, name, SMITH)(7499, name, ALLEN)(7521, name, WARD)(7654, name, MARTIN)(7844, name, TURNER)(7876, name, ADAMS)(7900, name, JAMES)(7934, name, MILLER)
These are all the same relation
Haskell Prolog RDF *
* seeAlso called Predicates( Predicate Logic – the
science of correct thinking. )
Also called a triple store.
Also a form of a graph.
Dr. Philip Cannata 17
Dr. Philip Cannata 18