/*
Sherlock Homes Case
Backward Chainer makes deductions.
*/
%=====================================
%
%Facts
%
%=====================================
bodyPart(wilson,wilsonsHand1).
bodyPart(wilson,wilsonsHand2).
bodyPart(wilson,wilsonsArm1).
partType(wilsonsHand1,hand).
partType(wilsonsHand2,hand).
partType(wilsonsArm1,arm).
hasTattoo(wilsonsArm1,wilsonsTattoo1).
right(wilsonsHand2).
left(wilsonsHand1).
tattoo(wilsonsTattoo1).
has_color(wilsonsTattoo1,blue).
has_color(wilsonsTattoo1,hunanPink).
larger(wilsonsHand1,wilsonsHand2).
wearing(wilson,shirt1).
wearing(wilson,jacket1).
jacket(jacket1).
cuff(shirt1,shiny).
elbow(jacket1,smooth).
shirt(shirt1).
has(scot,college_diploma).
has(wilson,college_diploma).
%=====================================
%
% Rules of Deduction
%
%=====================================
%*************************************************************
% Given data that we can observe from a suspect's physical
% appearance, we would like to answer questions
% like these:
%
% 1) Where has a suspect been?
% 2) What kind of work has the suspect done?
% 3) Is the suspect literate?
% 4) Does the suspect have a motive?
%
% An important concern is that your reasoning
% can distinguish the semantic difference between
% negation as failure and "real" negation.
%
% A related concern is that rules typically
% represent necessary but not sufficient conditions.
% If no rules for a given conclusion succeed does it
% mean that the conclusion is false. There may be
% other ways to prove the goal.
%
% The system should be able to explain its inferences.
%
%***********************************************************
%========================================
% Where has the suspect been?
%
%========================================
%-------------------------------------------------------
% An agent has been to location if the agent
% has a body part tattooed with tattoo
% that is produced only in that location.
%-------------------------------------------------------
beenAtLoc(Agent,Location) :-
bodyPart(Agent,Part),
hasTattoo(Part,Tattoo),
producedIn(Tattoo,Location),
not((producedIn(Tattoo,OtherLocation),
Location \= OtherLocation)).
%-----------------------------------------------
% Tattoo Produced in china if it has hunanPink in it.
%-----------------------------------------------
producedIn(Tattoo,china) :-
tattoo(Tattoo),
has_color(Tattoo,hunanPink).
/*
%------------------------------------------------------
% An agent has been to location if a reliable
% eye witnesss can confirm
%-------------------------------------------------------
beenAtLoc(Agent,Location) :-
eyeWitnessed(Witness,atLoc(Agent,Location)),
reliable(Witness).
*/
%=======================================
% Performed Manual Labor if one hand is
% "larger" than the other.
%
%=======================================
performed(Agent,manualLabor) :-
opposingHands(Agent,H1,H2),
larger(H1,H2).
%---------------------------------------------------------
% Associate an Agent with Agent's opposing
% body parts.
%---------------------------------------------------------
opposingBodyParts(Agent,P1,P2) :-
bodyPart(Agent,P1),
bodyPart(Agent,P2),
P1 \= P2,
partType(P1,Type),
partType(P2,Type).
%---------------------------------------------------
% Opposing Hands is a specialization
% of opposing body parts.
%---------------------------------------------------
opposingHands(Agent,H1,H2) :-
opposingBodyParts(Agent,H1,H2),
partType(H1,hand).
%=======================================
% An agent is literate if the agent has a college-diploma
% of if the agent writes.
%
%=======================================
literate(Agent) :-
has(Agent,college_diploma).
literate(Agent) :-
writes(Agent).
%=======================================
% An agent writes if the agents cuff is shiny
% and the agents elbow is smooth.
%
%=======================================
writes(Agent) :-
wearing(Agent,Shirt),
shirt(Shirt),
cuff(Shirt,shiny),
wearing(Agent,Jacket),
jacket(Jacket),
elbow(Jacket,smooth).