2
我正在學習這段代碼,並且在顏色函數中有+,我不知道它在做什麼。我很困惑,因爲我無法理解它的作用。 Prolog在做什麼?
/* prolog tutorial 2.9 Map coloring redux */
adjacent(X,Y,Map) :- member([X,Y],Map) ; member([Y,X],Map).
find_regions([],R,R).
find_regions([[X,Y]|S], R,A) :-
(member(X,R) ->
(member(Y,R) -> find_regions(S,R,A) ; find_regions(S,[Y|R],A)) ;
(member(Y,R) -> find_regions(S,[X|R],A) ; find_regions(S,[X,Y|R],A))).
color(Map,Colors,Coloring) :-
find_regions(Map,[],Regions),
color_all(Regions,Colors,Coloring),
\+ conflict(Map,Coloring).
color_all([R|Rs],Colors,[[R,C]|A]) :-
member(C,Colors),
color_all(Rs,Colors,A).
color_all([],_,[]).
conflict(Map,Coloring) :-
member([R1,C],Coloring),
member([R2,C],Coloring),
adjacent(R1,R2,Map).
map1([[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[3,4],[4,5]]).
那麼你可以更準確地向我解釋它在那段代碼中的作用嗎?該代碼應該解決圖着色問題,其中沒有2個相鄰節點可以具有相同的顏色。那麼,什麼顏色呢,首先它會得到一個節點列表,然後爲每個節點分配一個顏色,確保顏色之間沒有衝突。 然後在這個代碼上衝突的目的是什麼? –
衝突(地圖,着色)'是**真** **如果着色有衝突。你不需要衝突,所以'color()'需要衝突()'失敗。如你所說,它確保沒有衝突。如果你遺漏了'\ +',它會確保**有**衝突。 – Junuxx
所以基本上它意味着代碼只會解決如果着色不(true)因此是錯誤的? 我可能會在這裏感到困惑,但我認爲有迭代發生,但我無法看到哪裏,這使我感到困惑。 –