[Prolog]論理パズル/条件から住人と部屋の位置を推定する問題

【論理パズル4】http://twitter.com/puzzlegiver_bot/status/274468300510089216
ベタ書き。部屋は行列にした方が「右側」などを綺麗に実装できる。

【論理パズル4】http://twitter.com/puzzlegiver_bot/status/274468300510089216
ベタ書き。部屋は行列にした方が「右側」などを綺麗に実装できる。

:- op(700, xfx, ∈).
∈(X, Y) :- contains(Y, X).
contains([Val|_], Val).
contains([_|Tail], Val) :- contains(Tail, Val).
([], _).
([E|L], R) :- E ∈ R, (L, R).
(L, R) :- (L, R), (R, L).
(Room, 0) :- Room ∈ [g, h, i].
(Room, 1) :- Room ∈ [d, e, f].
(Room, 2) :- Room ∈ [a, b, c].
(a, b). (b, c).
(d, e). (e, f).
(g, h). (h, i).
(L, R) :- (R, L).
(X, Y) :- (X, Y) ; (X, Y).
(X, Y) :- X ∈ [a, d, g], Y ∈ [b, c, e, f, h, i].
(X, Y) :- X ∈ [b, e, h], Y ∈ [c, f, i].
(X, Y) :- (Y, X).
(a, d). (b, e). (c, f).
(d, g). (e, h). (f, i).
(D, U) :- (U, D).
(X, Y) :- (X, XRank), (Y, YRank), XRank > YRank.
?- A = [Akamatsu, Aoki, Kihara, Shirasawa, Kuroi, Haitani, Kaneco, Nobody0, Nobody1],
(Haitani, Kuroi),
(Kihara, Aoki),
(Akamatsu, _), (Akamatsu, _),
(Kaneco, Aoki),
(Kihara, Shirasawa),
(Haitani, 2),
(Kuroi, X1),
(Akamatsu, X2),
(Kaneco, X3),
([X1, X2, X3], [Nobody0, Nobody1]),
\+((Aoki, Shirasawa)),
\+((Kihara, Akamatsu)),
\+((Kaneco, Shirasawa)),
\+((Haitani, Shirasawa)),
(A, [a, b, c, d, e, f, g, h, i]).
/*
A:
[h,d,b,c,e,a,i, g,f]
[h,d,b,c,e,a,i, f,g]
[h,d,b,c,e,a,i, g,f]
[h,d,b,c,e,a,i, f,g]
A: , B: , C: ,
D: , E: , F: (),
G: (), H: , I: ,
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX