2012-05-23 35 views
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]]). 

回答

3

這是一個否定,請參閱here的例子進行詳細解釋。基本上你可以把它理解成相當於'不',或者更準確地說,'不可證明'。

+0

那麼你可以更準確地向我解釋它在那段代碼中的作用嗎?該代碼應該解決圖着色問題,其中沒有2個相鄰節點可以具有相同的顏色。那麼,什麼顏色呢,首先它會得到一個節點列表,然後爲每個節點分配一個顏色,確保顏色之間沒有衝突。 然後在這個代碼上衝突的目的是什麼? –

+0

衝突(地圖,着色)'是**真** **如果着色有衝突。你不需要衝突,所以'color()'需要衝突()'失敗。如你所說,它確保沒有衝突。如果你遺漏了'\ +',它會確保**有**衝突。 – Junuxx

+0

所以基本上它意味着代碼只會解決如果着色不(true)因此是錯誤的? 我可能會在這裏感到困惑,但我認爲有迭代發生,但我無法看到哪裏,這使我感到困惑。 –

2

「在序言標準操作+表示否定爲失敗」

北京時間有一個很好的教程發現here