% The possible suspects of the crimes are: possible_suspect(fred). possible_suspect(mary). possible_suspect(jane). possible_suspect(george). % The facts about the crimes from the police log. crime(robbery1, john, tuesday, park). crime(assault1, mary, wednesday, park). crime(robbery2, jim, wednesday, pub). crime(assault2, robin, thursday, park). % Tell prolog where the suspects were on % different days. was_at(fred, park, tuesday). was_at(fred, pub, wednesday). was_at(fred, pub, thursday). was_at(george, pub, tuesday). was_at(george, pub, wednesday). was_at(george, home, thursday). was_at(jane, home, tuesday). was_at(jane, park, wednesday). was_at(jane, park, thursday). was_at(mary, pub, tuesday). was_at(mary, park, wednesday). was_at(mary, home, thursday). % Tell prolog who is jealous of who jealous_of(fred, john). jealous_of(jane, mary). % And who owes money to whom owes_money_to(george, jim). owes_money_to(mary, robin). % A Person has a motive against a Victim if % Person is jealous of Victim or % Person owes money to Victim motive_against(Person, Victim) :- jealous_of(Person, Victim); owes_money_to(Person, Victim). % A Person is a prime suspect of a crime if % Person is a possible suspect and the person % was at the time and place of the crime and % the person had a motive against the victim % of the crime. prime_suspect(Person, Crime) :- possible_suspect(Person), was_at(Person, Place, Day), crime(Crime, Victim, Day, Place), motive_against(Person, Victim). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % QUERIES / RESPONSES FOR Q1 % % 1 ?- prime_suspect(fred,robbery1). % % Yes % 2 ?- prime_suspect(george, assault2). % % No % 3 ?- prime_suspect(Prime_Suspect, robbery1). % % Prime_Suspect = fred ; % % No % 4 ?- prime_suspect(Prime_Suspect, robbery2). % % Prime_Suspect = george ; % % No % 5 ?- prime_suspect(Prime_Suspect, assault1). % % Prime_Suspect = jane ; % % No % 6 ?- prime_suspect(Prime_Suspect, assault2). % % No % 7 ?- prime_suspect(fred, Crime). % % Crime = robbery1 ; % % No % 8 ?- prime_suspect(george, Crime). % % Crime = robbery2 ; % % No %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Q2. MISC % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1. Compute the last member of a nonempty list last([X],X). last([_|T],X) :- last(T,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 2. Reverse a list append([],L,L). append([H|T],L2,[H|L3]) :- append(T,L2,L3). reverse([],[]). reverse([H|T],R) :- reverse(T,X), append(X,[H],R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 3. Remove one occurrence of X from list K select(X,K,L) :- append(I,[X|J],K), append(I,J,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 4. X and Y are different members of L member(X,[X|_]). member(X,[_|Yt]) :- member(X,Yt). % X and Y are different members of L if % X is a member of L and Y is a member of % list K where K is list L with X removed. different(X,Y,L) :- member(X,L), select(X,L,K), member(Y,K). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 5. K and L are lists of the same length if % they are both empty after chopping their % heads off the same amount of times. samelength([],[]). samelength([_|K],[_|L]) :- samelength(K,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 6. K and L are lists of the same length and % contain the same elements. same_elements([],[]). same_elements([Kh|Kt],L) :- select(Kh,L,X), same_elements(Kt,X). % List K is similar to list L if % K and L are the same length and % K and L contain the same elements similar([],[]). similar(K, L) :- samelength(K,L), same_elements(K,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % QUERIES / RESPONSES FOR Q2 % % 2 ?- last([a,b,c,d],Last). % % Last = d ;% % % No % 3 ?- reverse([a,b,c,d],Reversed). % % Reversed = [d, c, b, a] ; % % No % 4 ?- select(a,[a,b,c,a],List). % % List = [b, c, a] ; % % List = [a, b, c] ; % % No % 5 ?- different(X,Y,[1,2,3]). % % X = 1 % Y = 2 ; % % X = 1 % Y = 3 ; % % X = 2 % Y = 1 ; % % X = 2 % Y = 3 ; % % X = 3 % Y = 1 ; % % X = 3 % Y = 2 ; % % No % 6 ?- samelength([a,b,c],L). % % L = [_G359, _G362, _G365] ; % % No % 7 ?- samelength(L,[a,b,c]). % % L = [_G359, _G362, _G365] ; % % No % 8 ?- similar([a,b,a],L). % % L = [a, b, a] ; % % L = [a, a, b] ; % % L = [b, a, a] ; % % L = [a, a, b] ; % % L = [b, a, a] ; % % L = [a, b, a] ; % % No % 9 ?- similar(L,[a,b,a]). % % L = [a, b, a] ; % % L = [a, a, b] ; % % L = [b, a, a] ; % % L = [b, a, a] ; % % L = [a, a, b] ; % % L = [a, b, a] ; % % No %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%