このディレクトリの索引

隣接(1,2).
隣接(1,3).
隣接(2,4).
隣接(3,4).

塗り分け(_色ならび,_塗り分けならび) :-
        領域名ならび(_領域名ならび),
        length(_領域名ならび,Len),
        length(LL1,Len),
        findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび).

全色塗り分け(_色ならび,_塗り分けならび) :-
        領域名ならび(_領域名ならび),
        length(_領域名ならび,Len),
        length(LL1,Len),
        findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび).

塗り分け(_領域名ならび,_色ならび,LL) :-
        領域名と色の対ならび(_領域名ならび,_色ならび,LL),
        色を割り振る(_色ならび,LL),
        色検査(LL).

全色塗り分け(_領域名ならび,_色ならび,LL) :-
        領域名と色の対ならび(_領域名ならび,_色ならび,LL),
        色を割り振る(_色ならび,LL),
        forall(member(_色,_色ならび),member([_,_色],LL)),
        色検査(LL).

領域名ならび(_領域名ならび) :-
        findall(A,隣接(A,_),L1),
        findall(B,隣接(_,B),L2),
        append(L1,L2,L3),
        sort(L3,_領域名ならび).

領域名と色の対ならび(_領域名ならび,_色ならび,LL) :-
        findall([_領域名,_色],(
                    nth1(N,_領域名ならび,_領域名),
                    nth1(N,LL,_色)),
                LL).

色を割り振る(_,[]).
色を割り振る(_色ならび,[[_,_色]|R]) :-
        member(_色,_色ならび),
        色を割り振る(_色ならび,R).

色検査(L) :-
        forall((member([A,C],L),隣接(A,B)),\+(member([B,C],L))).