このディレクトリの索引

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

色(赤).
色(青).
色(緑).


塗り分けならび(_塗り分けならび) :-
        findall(_塗り分けならび,塗り分け(_塗り分けならび),_塗り分けならび).

全色塗り分けならび(_塗り分けならび) :-
        findall(_塗り分けならび,全色塗り分け(_塗り分けならび),_塗り分けならび).

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

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

領域名と色の対ならび(_色ならび,_塗り分けならび) :-
        領域名ならび(_領域名ならび),
        色ならび(_色ならび),
        対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび).

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

色ならび(_色ならび) :-
        findall(_色,色(_色),_色ならび).

対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび) :-
        length(_領域名ならび,Len),
        length(_塗り分けならび,Len),
        findall([_領域名,_色],(
                    nth1(N,_領域名ならび,_領域名),
                    nth1(N,_塗り分けならび,_色)),
                _塗り分けならび).

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

色検査(_塗り分けならび) :-
        forall((member([A,C],_塗り分けならび),領域が隣接している(A,B)),\+(member([B,C],_塗り分けならび))).

領域が隣接している(A,A) :- 領域が孤立している,!,fail.
領域が隣接している(A,B) :-
        隣接(A,B).

領域が孤立している.