Phase I: (Due: 18 March, 2012 - Sunday)
Electronic submission under phase2
Implement the following semantic checks on the input query:
Here is a sample run on some input queries:
[raj@tinman phase2]$ java DLOG movies
type "help;" for usage...
Message: Database Provided: Database Directory is ./movies
DLOG> @q2;
----------INPUT QUERY----------------
APERSON(A) :-
ACTOR(T,A).
R(A,D) :-
ACTOR(T,A),
DIRECTOR(T,D).
ANSWER(D) :-
ACTOR([*]:ACTOR(*,_),X).
------------------------------------
SEMANTIC ERROR: Head predicate contains variable not found in regular body predicate in Rule 3.
DLOG> @q3;
----------INPUT QUERY----------------
ANSWER(X,Y) :-
ACTOR(X,Y),
not MOVIE(Y).
P(X,Y) :-
DIRECTOR(X,Y).
------------------------------------
NO SEMANTIC ERROR
DLOG> @q13;
----------INPUT QUERY----------------
APERSON(A) :-
ACTOR(T,A).
R(A,D) :-
ACTOR(T,A),
DIRECTOR(T,D).
ANSWER(X) :-
ACTOR([*]:ACTOR(*,X),[*]:ACTOR(*,_)),
APERSON(X).
------------------------------------
SEMANTIC ERROR: Complex Predicate cannot have variables - Rule 3
DLOG> x;
Exiting...
[raj@tinman phase2]
[raj@tinman phase2]$ java DLOG company
type "help;" for usage...
Message: Database Provided: Database Directory is ./company
DLOG> @q1;
----------INPUT QUERY----------------
TEMP2(X,Y) :-
WORKS_ON(X,Y,_).
ANSWER(F,M,L) :-
EMPLOYEE(F,M,L,S,_,_,_,_,_,5),
WORKS_ON(S,P,H),
TEMP2(X,Y,Z),
ANSWER('ProductX',P,_,_),
H >= 10.
------------------------------------
SEMANTIC ERROR: ANSWER predicate should not appear in rule body.
DLOG> @q4;
----------INPUT QUERY----------------
TEMP1(S,P) :-
EMPLOYEE(_,_,_,S,_,_,_,_,_,_),
PROJECTS(_,P,_,_).
TEMP2(S,P) :-
WORKS_ON(S,P,_).
TEMP3(S) :-
TEMP1(S,P),
not TEMP2(S,P).
ANSWER(F,M,L) :-
EMPLOYEE(F,M,L,S,_,_,_,_,_,_),
not TEMP3(S).
------------------------------------
NO SEMANTIC ERROR
DLOG> @q5;
----------INPUT QUERY----------------
TEMP1(S,P) :-
EMPLOYEE(_,_,_,S,_,_,_,_,_,_),
PROJECTS(_,P,_,_).
TEMP2(S,P) :-
WORKS_ON(S,P,_).
TEMP3(S) :-
TEMP1(S,P),
not TEMP2(S,P).
ANSWER(F,M,L) :-
EMPLOYEE(F,M,L,S,_,_,_,_,_,_),
not TEMP3(S).
------------------------------------
NO SEMANTIC ERROR
DLOG> @q6;
----------INPUT QUERY----------------
ANSWER(X) :-
TEMP(X).
------------------------------------
SEMANTIC ERROR: Predicate TEMP not present in head of query rule or in database.
DLOG> @q7;
----------INPUT QUERY----------------
TEMP1(S) :-
WORKS_ON(S,P,_),
PROJECTS(_,P,'Houston',_).
TEMP2(S) :-
EMPLOYEE(_,_,_,S,_,_,_,_,_,D),
not DEPT_LOCATIONS(D,'Houston').
ANSWER(F,M,L,A) :-
EMPLOYEE(F,M,L,S,_,A,_,_,_,_),
TEMP1(S).
ANSWER(F,M,L,A) :-
EMPLOYEE(F,M,L,S,_,A,_,_,_,_),
TEMP2(S).
------------------------------------
NO SEMANTIC ERROR
DLOG> @q8;
----------INPUT QUERY----------------
ANSWER(X,Y) :-
WORKS_ON(X,Y,Y).
------------------------------------
NO SEMANTIC ERROR
DLOG> @q9;
----------INPUT QUERY----------------
TEMP1(S) :-
WORKS_ON(S,P,_),
PROJECTS(_,P,'Houston',_).
TEMP2(S) :-
EMPLOYEE(_,_,_,S,_,_,_,_,_,D),
not DEPT_LOCATIONS(D,'Houston').
ANSWER(F,M,L,A) :-
EMPLOYEE(F,M,L,S,_,A,_,_,_,_),
TEMP1(S).
ANSWER(F,M,L,A) :-
EMPLOYEE(F,M,L,S,_,A,_,'1',_,_),
TEMP2(S).
------------------------------------
SEMANTIC ERROR: Data Type Mismatch in Body Predicate EMPLOYEE: Found 1 in place of NUMBER
DLOG> @q10;
----------INPUT QUERY----------------
ANSWER(X,Z) :-
WORKS_ON(X,Y,_),
Z = 10.
------------------------------------
NO SEMANTIC ERROR
DLOG> @q11;
----------INPUT QUERY----------------
ANSWER(X,Z) :-
WORKS_ON(X,Y,U),
Z = 1.
------------------------------------
NO SEMANTIC ERROR
DLOG> @q12;
----------INPUT QUERY----------------
ANSWER(X,V) :-
WORKS_ON(X,Y,U),
Z = 10.
------------------------------------
SEMANTIC ERROR: Head predicate contains variable not found in regular body predicate in Rule 1.
DLOG> exit;
Exiting...
[raj@tinman phase2]$
[raj@tinman phase2]$ java DLOG erf
type "help;" for usage...
Message: Database Provided: Database Directory is ./erf
DLOG> @q15;
----------INPUT QUERY----------------
ANSWER(X,Y) :-
R(X,Y,[*,*]:F(_,*,*),_).
------------------------------------
SEMANTIC ERROR: Data Type of */# in Complex Predicate F does not match type in parent predicate: Found STRING in place of NUMBER
DLOG> exit;
Exiting...
[raj@tinman phase2]
The program should also build a data structure to capture the essential information in a query. Here is my design of the data structure:
public class Program {
private Vector<Rule> rules;
// Phase 2 Variables
private HashMap<String,IDBPredicate> idbPredicateData;
private Vector<String> idbPredicateNamesOrderedByStrata;
}
public class Rule {
private Predicate headPredicate;
private Vector<Predicate> bodyPredicates;
// Phase 2 Variables
private Vector<Predicate> regularBodyPredicates;
private Vector<Predicate> comparisonBodyPredicates;
}
public class Predicate {
private String predName;
private Vector<Argument> arguments;
private boolean isNegated;
private boolean isComparison;
private Argument leftOperand;
private String comparisonOperator;
private Argument rightOperand;
}
public class Argument {
private boolean isConstant = false; // true if constant argument
private boolean isUnderscore = false; // true if _ argument
private String argDataType; // data type for argument : "NUMBER" or "STRING"
private String argName; // name of argument - if variable or if "*" or "#"
private String argValue; // value of argument in case of constant argument
private boolean isComplex; // true for complex arguments
private Predicate complexPredicate; // stores predicate after : in complex argument; may be null
private int numberOfStarsOrHashes; // Store the number of stars or hashes in complex argument
}
The following will replace the above class for Datalog (to be used by undergraduates):
public class Argument {
private boolean isConstant = false; // true if constant argument
private boolean isUnderscore = false; // true if _ argument
private String argDataType; // data type for argument : "NUMBER" or "STRING"
private String argName; // name of argument if variable
private String argValue; // value of argument in case of constant argument
}
// Phase 2 Class
// comparison is done on stratum value
public class IDBPredicate implements Comparable {
String predicateName;
Vector<Rule> rules;
Vector<String> argDataType;
int stratum;
}