このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1272006124/140
#  <問題> 
#  A,B,Cの3人が100m競争をします。D,Eの2人が予想をしました。 
#  D : 「きっと1等はCで2等はBだ」 
#  E : 「ぼくは1等はAだと思う」 
#   発表された順位を見て,2人はどちらも「まったくはずれた。」と 
#  いいました。発表された順位はどうでしたか。 
#   
#  中学受験用全解シリーズ 「受験全解・算数」日能研発行 の p424 から採りました。 
# 
# 

'A,B,Cの3人が100m競争をします。D,Eの2人が予想をしました。 D : 「きっと1等はCで2等はBだ」。  E : 「ぼくは1等はAだと思う」。 発表された順位を見て,2人はどちらも「まったくはずれた。」といいました。発表された順位はどうでしたか。' :-
        発表された順位(L),
        write_formatted('発表された順位は 1等%t, 2等 %t, 3等 %t, です。\n',L). 

発表された順位(L) :-
        順列(['A','B','C'],3,L),
        '2人はどちらも「まったくはずれた。」'(L).

'2人はどちらも「まったくはずれた。」'(L) :-
        \+('Dの予想'(L)),
        \+('Eの予想'(L)).

'Dの予想'(L) :-
        きっと1等はCで2等はBだ(L).

きっと1等はCで2等はBだ(L) :-
        list_nth(1,L,'C'),
        list_nth(2,L,'B').

'Eの予想'(L) :-
        ぼくは1等はAだと思う(L).

ぼくは1等はAだと思う(L) :-
        list_nth(1,L,'A').
ぼくは1等はAだと思う(L) :-
        list_nth(Nth1,L,'A'),
        list_nth(Nth2,L,'B'),
        Nth1 < Nth2.
ぼくは1等はAだと思う(L) :-
        list_nth(Nth1,L,'A'),
        list_nth(Nth3,L,'C'),
        Nth1 < Nth3.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

順列(Y,0,_,[]).
順列(Y,N,EL,[A|X]) :-
        \+(member(A,EL)),
        del(Z = Y - A),
        M is N - 1,
        順列(Z,M,EL,X).
順列(Y,N,EL,[_|X]) :-
        member(A,EL),
        順列(Z,M,EL,X).

順列(Y,0,[]).
順列(Y,N,[A|X]) :-
        del(Z = Y - A),
        M is N - 1,
        順列(Z,M,X).

del(A,[A|X],X).
del(A,[B|X],[B|Y]) :-
        del(A,X,Y).

del(X = [A|X] - A).
del([B|Y] = [B|X] - A) :-
        del(Y = X - A).

member(A,[A|_]).
member(A,[_|R]) :- member(A,R).