このディレクトリの索引
http://www.26dd.cn/go.php?q=nb2hi4b2f4xwiltimf2gk3tbfzxgkltkoaxwq33sovzw6lzsgaydombxga3s6mjrhaztqmrthezdc
#  Baker, Cooper, Fletcher, MillerとSmithは五階建てアパートの異なる階に住んでいる。
#  Bakerは最上階に住むのではない。Cooperは最下階に住むのではない。 Fletcherは最上階にも
#  最下階にも住むのではない。MillerはCooperより上の階に住んでいる。SmithはFletcherの隣の階に
#  住むのではない。
#  FletcherはCooperの隣の階に住むのではない。それぞれはどの階に住んでいるか。

'Baker, Cooper, Fletcher, MillerとSmithは五階建てアパートの異なる階に住んでいる。' :-
        順列([1,2,3,4,5],5,L),
        'Bakerは最上階に住むのではない。'(L),
        'Cooperは最下階に住むのではない。'(L),
        'Fletcherは最上階にも最下階にも住むのではない。'(L),
        'MillerはCooperより上の階に住んでいる。'(L),
        'SmithはFletcherの隣の階に住むのではない。'(L),
        'FletcherはCooperの隣の階に住むのではない。'(L),
        住んでいる階を表示する(L).

'Bakerは最上階に住むのではない。'(L) :-
        何階('Baker',L,Baker),
        \+(最上階(Baker)).

'Cooperは最下階に住むのではない。'(L) :-
        何階('Cooper',L,Cooper),
        \+(最下階(Cooper)).

'Fletcherは最上階にも最下階にも住むのではない。'(L) :-
        何階('Fletcher',L,Fletcher),
        \+(最上階(Fletcher)),
        \+(最下階(Fletcher)).

'MillerはCooperより上の階に住んでいる。'(L) :-
        何階('Miller',L,Miller),
        何階('Cooper',L,Cooper),
        Miller > Cooper.        

'SmithはFletcherの隣の階に住むのではない。'(L) :-
        'SmithはFletcherの上の階に住むのではない。'(L),
        'SmithはFletcherの下の階に住むのではない。'(L).

'SmithはFletcherの下の階に住むのではない。'(L) :-
        何階('Smith',L,Smith),
        何階('Fletcher',L,Fletcher),
        \+(Smith is Fletcher + 1).

'SmithはFletcherの上の階に住むのではない。'(L) :-
        何階('Smith',L,Smith),
        何階('Fletcher',L,Fletcher),
        \+(Smith is Fletcher - 1).

'SmithはFletcherの下の階に住むのではない。'(L) :-
        何階('Fletcher',L,Fletcher),
        何階('Cooper',L,Cooper),
        \+(Fletcher is Cooper - 1).

'FletcherはCooperの隣の階に住むのではない。'(L) :-
        'FlecherはCooperの上の階に住むのではない。'(L),
        'FlecherはCooperの下の階に住むのではない。'(L).

'FletcherはCooperの上の階に住むのではない。'(L) :-
        何階('Fletcher',L,Fletcher),
        何階('Cooper',L,Cooper),
        \+(Fletcher is Cooper + 1).).

'FletcherはCooperの下の階に住むのではない。'(L) :-
        何階('Fletcher',L,Fletcher),
        何階('Cooper',L,Cooper),
        \+(Fletcher is Cooper - 1).

何階('Baker',[Baker,_,_,_,_],Baker).
何階('Cooper',[_,Cooper,_,_,_],Cooper).
何階('Fletcher',[_,_,Fletcher,_,_],Fletcher).
何階('Miller',[_,_,_,Miller,_],Miller).
何階('Baker',[_,_,_,_,Smith],Smith).

最上階(5).

最下階(1).

住んでいる階を表示する(L) :-
        write_formatted('Baker %t階,Cooper %t階,Fletcher %t階,Miller %t階,Smith %t階\n',L).