2008-11-12 4 views
3

나는 프롤로그의 초급 단계 코스에서지도 채색 문제를 겪고 있습니다. 여기 내 코드가있다.프롤로그 목록의 후행 변수

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과 같이 mem(Var,[Var|_])[Var|_]에 언 바운드 Coloring 변수를 결합하기 때문에

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

거기에 술어/1 거기에 무엇입니까? 답변을 주셔서 감사합니다 :) – Pjotrovitz

0

후행 변수가있다. 그것을 방지하기

한 가지 방법은 (매우 빠르고 매우 더러운)지도 색칠 예를 축적하는 것입니다

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). 

을 그 :-(하지만 당신보다 훨씬 더 '절차 적'접근 아마 더있다. 우아한 방법 ...