2008-11-12 37 views
3

我在prolog的初级水平课程中做着地图着色问题。这是我的代码。序言列表中的尾随变量

col(Colors,Map,Coloring) :- 
    checkMap(Colors,Map,Coloring). 
checkMap(Colors,[Country1:Country2],Coloring) :- 
    goodColor(Country1:Country2,Coloring,Colors). 
checkMap(Colors,[Country1:Country2|Rest],Coloring) :- 
    goodColor(Country1:Country2,Coloring,Colors), 
    checkMap(Colors,Rest,Coloring). 
goodColor(Country1:Country2,Coloring,Colors) :- 
    mem(Country1:Color1,Coloring),!, 
    mem(Country2:Color2,Coloring),!, 
    mem(Color1,Colors), mem(Color2,Colors), 
    not(Color1=Color2). 
mem(Var,[Var|_]). 
mem(Var,[_|Rest]) :- 
    mem(Var,Rest). 

我的输出是这样的:

?- col([a,b,c],[1:2,1:3,2:3],X). 
X = [1:a, 2:b, 3:c|_G332] ; 
X = [1:a, 2:c, 3:b|_G332] ; 
X = [1:b, 2:a, 3:c|_G332] ; 
X = [1:b, 2:c, 3:a|_G332] ; 
X = [1:c, 2:a, 3:b|_G332] ; 
X = [1:c, 2:b, 3:a|_G332] ; 
fail. 

任何人都知道我怎样才能摆脱后的变量?我知道这主要是化妆品,但我不明白为什么它在那里。

回答

1

使用不完整的数据结构是一种有效的Prolog编程技术。如果你的意图是使用一个不完整的数据结构,那么一个解决方案是:

ground_terms([H|T1],[H|T2]) :- ground(H), !, ground_terms(T1,T2). 
ground_terms(_,[]). 

和变化山口如下:

col(Colors,Map,Coloring) :- 
    checkMap(Colors,Map,Coloring1), 
    ground_terms(Coloring1,Coloring). 
+0

什么是谓词地面/ 1在那里?感谢您的答案:) – Pjotrovitz 2008-11-14 09:03:30

0

尾随变量是存在的,因为mem(Var,[Var|_])结合未结合的Coloring变量[Var|_]。避免它

的方法之一是积累地图着色如(非常快,非常脏):

col(Colors,Map,Coloring) :- 
    check(Colors,Map,[],Coloring). 

check(Colors,[],Coloring,Coloring). 

check(Colors,[Country1:Country2 | T],[],L) :- 
    member(Color1,Colors), 
    member(Color2,Colors), 
    Color1 \== Color2, 
    check(Colors,T,[Country1:Color1,Country2:Color2],L). 

check(Colors,[Country1:Country2 | T],Coloring,L) :- 
    member(Country1:Color1,Coloring), 
    member(Country2:Color2,Coloring),!, 
    check(Colors,T,Coloring,L). 

check(Colors,[Country1:Country2 | T],Coloring,L) :- 
    member(Country1:Color1,Coloring),!, 
    member(Color2,Colors), 
    not(member(_:Color2,Coloring)), 
    check(Colors,T,[Country2:Color2|Coloring],L). 

check(Colors,[Country1:Country2 | T],Coloring,L) :- 
    member(Country2:Color2,Coloring),!, 
    member(Color1,Colors), 
    not(member(_:Color1,Coloring)), 
    check(Colors,T,[Country1:Color1|Coloring],L). 

它比你更加“程序”的做法虽然:-(有可能是一个更。优雅的方式...