level 1
%Rule 1
%嫌犯除了 a b c 没有别人。
suspect(a).
suspect(b).
suspect(c).
gang([Man]):-
suspect(Man).
gang(Gang):-
Gang=[Man|Others],
suspect(Man),
gang(Others).
%Rule 2
%嫌犯(们)是开卡车逃离现场的。
run(Gang):-
member(Man,Gang),
suspect(Man),
\+ can_not_drive(Man).
%Rule 3
%b 不会开卡车。
can_not_drive(b).
%Rule 4
%c 从来不会在 没有 a 犯罪的时候 犯罪。
c_a(Gang):-
member(c,Gang),
member(a,Gang).
c_a(Gang):-
\+ member(c,Gang).
%Goal
%无罪:在所有满足条件的组合里,存在嫌疑人不在内的组合,则嫌疑人无罪。
innocent(Man):-
append(Gang,_,[_,_,_]),
Gang \= [],
subset(Gang,[a,b,c]),
gang(Gang),
run(Gang),
c_a(Gang),
\+ member(Man,Gang).
%有罪:嫌疑人无罪的取反。
guilt(Man):-
\+ innocent(Man).
%Other
%列表
member(A,[A|_]).
member(A,[_|T]):-
member(A,T).
append([], X, X).
append([A|X], Y, [A|Z]) :- append(X,Y,Z).
subset([],Set).
subset(Sub,Set):-
Sub=[Member|Others],
member(Member,Set),
subset(Others,Set),
\+ member(Member,Others).
2017年06月17日 07点06分