% TIME PERIODS time(0..4). next(T1,T2) :- time(T1), time(T2), T2=T1+1. % OBJECTS OF OUR UNIVERSE (including fluents) agent(jill). agent(gwen). agent(ben). agent(marshall). agent(erica). object(bat). object(glove). truth_value(1). truth_value(0). fluent(i, owns(A,O)) :- agent(A),object(O). fluent(i, stolen(A,O)) :- agent(A),object(O). fluent(i, missing(O)) :- object(O). fluent(n,at_practice(A)) :- agent(A). fluent(i,opportunity(A,O)) :- agent(A),object(O). fluent(n,noticed(missing(O))) :- agent(A),object(O). fluent(i, weak_suspect(A,O)) :- agent(A), object(O). fluent(i, strong_suspect(A,O)) :- agent(A), object(O). fluent(i, suspect(A,O)) :- agent(A),object(O). fluent(i,strong_suspect_exists). %INTEGRITY CONSTRAINTS :- fluent(X,F), time(T), holds(F,T,1), holds(F,T,0). % INERTIA RULES holds(F,T2,1) :- next(T1,T2), fluent(i,F), holds(F,T1,1), not holds(F,T2,0). holds(F,T2,0) :- next(T1,T2), fluent(i,F), holds(F,T1,0), not holds(F,T2,1). % Close World Assumption holds(stolen(A,O),0,0) :- agent(A),object(O),not holds(stolen(A,O),0,1). holds(missing(O),0,0) :- object(O),not holds(missing(O),0,1). holds(owns(A,O),0,0) :- agent(A),object(O),not holds(owns(A,O),0,1). holds(suspect(A,O),0,0) :- agent(A),object(O),not holds(suspect(A,O),0,1). holds(at_practice(A),0,0):-agent(A),not holds(at_practice(A),0,1). holds(opportunity(A,O),0,0):-agent(A),object(O),not holds(opportunity(A,O),0,1). holds(noticed(missing(O)),0,0):-object(O),not holds(noticed(missing(O)),0,1). holds(weak_suspect(A,O),0,0):-agent(A),object(O),not holds(weak_suspect(A,O),0,1). holds(strong_suspect(A,O),0,0):-agent(A),object(O),not holds(strong_suspect(A,O),0,1). holds(strong_suspect_exists,0,0):-not holds(strong_suspect_exists,0,1). % MAIN PROGRAM holds(owns(jill,bat),0,1). holds(owns(gwen,glove),0,1). holds(at_practice(jill),1,1) :- time(T). holds(at_practice(gwen),1,1) :- time(T). holds(at_practice(ben),1,1) :- time(T). holds(at_practice(marshall),1,1) :- time(T). holds(opportunity(A,O),T,1):- agent(A), object(O), time(T), holds(at_practice(A),T,1), holds(noticed(missing(O)),T,1). holds(opportunity(A,O),T,0):- agent(A), agent(A2), object(O), time(T), not holds(stolen(A,O),T,1), holds(stolen(A2,O),T,1). holds(missing(O),T,0):- agent(A), object(O), time(T), holds(stolen(A,O),T,1). holds(weak_suspect(A,O),T,1) :- agent(A), object(O), time(T), holds(opportunity(A,O),T,1), holds(missing(O),T,1), not holds(strong_suspect(A,O),T,1), not holds(owns(A,O),T,1). holds(weak_suspect(A,O),T,0) :- agent(A), object(O), time(T), holds(missing(O),T,0). holds(strong_suspect(A,O),T,1) :- agent(A), object(X), object(O), time(T), holds(opportunity(A,O),T,1), holds(missing(O),T,1), holds(stolen(A,X),T,1), not holds(owns(A,O),T,1). holds(strong_suspect_exists,T,1) :- agent(A), object(O), time(T), holds(strong_suspect(A,O),T,1). holds(suspect(A,O),T,1) :- agent(A), object(O), time(T), holds(weak_suspect(A,O),T,1), not holds(strong_suspect_exists,T,1). holds(suspect(A,O),T,1) :- agent(A), object(O), time(T), not holds(stolen(A,O),T,1), holds(strong_suspect(A,O),T,1). holds(suspect(A,O),T,0) :- agent(A), %agent(A2), object(O), time(T), holds(strong_suspect_exists,T,1), %holds(stolen(A2,O),T,1), not holds(strong_suspect(A,O),T,1). % EXECUTION-1 % NOTHING IS MISSING, SO IF WE RUN ONLY THIS EXECUTION, % WE DO NOT FIND ANYONE AS A SUSPECT. % EXECUTION-2 % AT TIME=1, BAT IS MISSING WHICH IS OWNED BY JILL. holds(missing(bat),1,1). % ONCE WE NOTICE THAT THE BAT IS MISSING AT TIME=1, EVERYONE WHO % IS AT PRACTICE HAD THE OPPORTUNITY TO STEAL THE BAT. THIS EXCLUDES % THE BAT'S OWNER 'JILL'. % BECAUSE 'ERICA' IS NOT PRESENT AT PRACTICE AT THIS TIME, SHE IS NOT % CONSIDERED AS A SUSPECT holds(noticed(missing(bat)),1,1). % EXECUTION-3 % AT TIME=3, GLOVE (OWNED BY 'GWEN') IS MISSING AND EVERYONE INCLUDING % 'JILL' HAD AN OPPORTUNITY. holds(missing(glove),2,1). holds(at_practice(erica),2,1). holds(at_practice(jill),2,1). holds(at_practice(gwen),2,1). holds(at_practice(ben),2,1). holds(at_practice(marshall),2,1). % NOW THAT 'ERICA' IS ALSO PRESENT AT PRACTICE, SHE AUTOMATICALLY BECOMES % THE SUSPECT FOR THE GLOVE BUT NOT THE BAT. holds(noticed(missing(glove)),2,1). % EXECUTION-4 % ONCE MARSHALL IS CAUGHT FOR STEALING THE GLOVE, HE BECOMES THE "ONLY" SUSPECT % FOR STEALING THE BAT. BEFORE CONCLUDING THIS, IT IS VERIFIED THAT MARSHALL % HAD AN OPPORTUNITY TO STEAL THE BAT(PRESENT AT PRACTICE). NOW THAT MARSHALL HAS % HISTORY OF STEALING, MAKES US CONCLUDE DECISIVELY THAT HE IS THE ONLY SUSPECT. holds(stolen(marshall,glove),3,1).