%Solutions for Problem 1
%-----------------------

q1a(X) :- parts(_,X,_,P,_), P < 20.
answer1a(L) :- setof([X],q1a(X),L).

q1b(X,Y) :- employees(E,X,Z,_),
            orders(O,_,E,_,_),
            odetails(O,P,_),
            parts(P,_,_,N,_), N > 50,
            zipcodes(Z,Y).
answer1b(L) :- setof([X,Y],q1b(X,Y),L).

q1c(X,Y) :- customers(X,_,_,Z,_), customers(Y,_,_,Z,_), X < Y.
answer1c(L) :- setof([X,Y],q1c(X,Y),L).

q1d(X) :- customers(C,X,_,_,_),
          orders(_,C,E,_,_),
          employees(E,_,Z,_),
          zipcodes(Z,'Wichita').
answer1d(L) :- setof([X],q1d(X),L).

q1e_temp1(X) :- orders(_,X,_,_,_).
q1e_temp2(X) :- employees(E,_,Z,_),orders(_,X,E,_,_),zipcodes(Z,C),
                C \== 'Wichita'.
q1e(X) :- customers(C,X,_,_,_), q1e_temp1(C), not q1e_temp2(C).
answer1e(L) :- setof([X],q1e(X),L).

q1f_temp1(X,Y) :- customers(X,_,_,_,_), parts(Y,_,_,P,_), P < 20.
q1f_temp2(X,Y) :- orders(O,X,_,_,_),odetails(O,Y,_),parts(Y,_,_,P,_), P < 20.
q1f_temp3(X) :- q1f_temp1(X,Y), not q1f_temp2(X,Y).
q1f(X) :- customers(C,X,_,_,_), not q1f_temp3(C).
answer1f(L) :- setof([X],q1f(X),L).

q1g_temp1(X) :- customers(C,_,_,Z,_), employees(X,_,Z,_), orders(_,C,X,_,_).
q1g_temp2(X) :- orders(_,_,X,_,_).
q1g_temp3(X) :- q1g_temp2(X), not q1g_temp1(X).
q1g(X,Y) :- employees(X,Y,_,_), q1g_temp3(X).
answer1g(L) :- setof([X,Y],q1g(X,Y),L).

output([]) :- !.
output([X|L]) :- write(X), nl, output(L).

go1 :- tell(f1),
answer1a(L1),write('Answer to Q1'), nl,output(L1), nl,
answer1b(L2),write('Answer to Q2'), nl,output(L2), nl,
answer1c(L3),write('Answer to Q3'), nl,output(L3), nl,
answer1d(L4),write('Answer to Q4'), nl,output(L4), nl,
answer1e(L5),write('Answer to Q5'), nl,output(L5), nl,
answer1f(L6),write('Answer to Q6'), nl,output(L6), nl,
answer1g(L7),write('Answer to Q7'), nl,output(L7), nl,
told.


%Solution for Question2

%a
   answer2a(X) :- setof([N],ans2a(N),X).
   ans2a(N) :- security(_,N,CP,_,_), CP>100.

%b
   answer2b(X) :- setof([F,L],ans2b(F,L),X).
   ans2b(F,L) :- member(M,_,F,L,_,_,_),
   transaction(M,'ORCL',_,'buy',_,_,_,_).

%c
   answer2c(X) :- setof([F,L],ans2c(F,L),X).
   q2c_temp1(M) :- transaction(M,'ORCL',_,'buy',_,_,_,_).
   q2c_temp2(M) :- transaction(M,'SYBS',_,'buy',_,_,_,_).
   ans2c(F,L) :- member(M,_,F,L,_,_,_), q2c_temp1(M), not q2c_temp2(M).

%d
   answer2d(X) :- setof([F,L],ans2d(F,L),X).
   q2d_temp1(M) :- transaction(M,'ORCL',_,'buy',_,_,_,_).   
   q2d_temp2(M) :- transaction(M,S,_,'buy',_,_,_,_), S \== 'ORCL'.
   ans2d(F,L) :- member(M,_,F,L,_,_,_), q2d_temp1(M), not q2d_temp2(M).

%e
   answer2e(X) :- setof([N],ans2e(N),X).
   q2e_temp1(M,S) :- member(M,_,_,_,_,_,_), security(S,_,_,_,_).
   q2e_temp2(M,S) :- transaction(M,S,_,'buy',_,_,_,_).
   q2e_temp3(S) :- q2e_temp1(M,S), not q2e_temp2(M,S).
   ans2e(N) :- security(S,N,_,_,_), transaction(_,S,_,'buy',_,_,_,_),
                  not q2e_temp3(S).

%f
   answer2f(X) :- setof([F,L],ans2f(F,L),X).
   q2f_temp1(M,S) :- transaction(M,_,_,'buy',_,_,_,_),
   transaction(11000,S,_,'buy',_,_,_,_).
   q2f_temp2(M,S) :- transaction(M,S,_,'buy',_,_,_,_).
   q2f_temp3(M) :- q2f_temp1(M,S), not q2f_temp2(M,S).
   q2f_temp4(M) :- transaction(M,_,_,'buy',_,_,_,_), not q2f_temp3(M).
   ans2f(F,L) :- member(M,_,F,L,_,_,_), q2f_temp4(M), M \== 11000.

%g
   answer2g(X) :- setof([F,L],ans2g(F,L),X).
   q2g_temp1(S) :- transaction(11000,S,_,'buy',_,_,_,_).
   q2g_temp2(M) :- transaction(M,S,_,'buy',_,_,_,_), not q2g_temp1(S).
   q2g_temp3(M) :- transaction(M,_,_,'buy',_,_,_,_), not q2g_temp2(M).
   ans2g(F,L) :- member(M,_,F,L,_,_,_), q2g_temp3(M), M \== 11000.

%h
   answer2h(X) :- setof([F,L],ans2h(F,L),X).
   temp1(M,S) :- transaction(M,_,_,'buy',_,_,_,_),
                 transaction(11000,S,_,'buy',_,_,_,_).
   temp2(M,S) :- transaction(M,S,_,'buy',_,_,_,_).
   temp3(M) :- q2f_temp1(M,S), not temp2(M,S).
   temp4(M) :- transaction(M,_,_,'buy',_,_,_,_), not temp3(M).
   temp5(M,F,L) :- member(M,_,F,L,_,_,_), temp4(M).

   temp6(S) :- transaction(11000,S,_,'buy',_,_,_,_).
   temp7(M) :- transaction(M,S,_,'buy',_,_,_,_), not temp6(S).
   temp8(M) :- transaction(M,_,_,'buy',_,_,_,_), not temp7(M).
   temp9(F,L) :- member(M,_,F,L,_,_,_), temp8(M).
   ans2h(F,L) :- temp5(M,F,L), temp9(F,L), M \== 11000.

printAnswer([]).
printAnswer([X|L]) :- write(X),nl,printAnswer(L).

go2 :- 
answer2a(X1), write('Answer to query2a is:'), nl, printAnswer(X1), nl, nl,
answer2b(X2), write('Answer to query2b is:'), nl, printAnswer(X2), nl, nl,
answer2c(X3), write('Answer to query2c is:'), nl, printAnswer(X3), nl, nl,
answer2d(X4), write('Answer to query2d is:'), nl, printAnswer(X4), nl, nl,
answer2e(X5), write('Answer to query2e is:'), nl, printAnswer(X5), nl, nl,
answer2f(X6), write('Answer to query2f is:'), nl, printAnswer(X6), nl, nl,
answer2g(X7), write('Answer to query2g is:'), nl, printAnswer(X7), nl, nl,
answer2h(X8), write('Answer to query2h is:'), nl, printAnswer(X8), nl, nl.