2011-11-26 5 views
0

프롤로그에 어려움이 있습니다. 무한 루프에서 찾은 첫 번째 경로를 반환하는 순간에도 두 도시 간의 모든 경로를 반환하는 조건부를 작성하려고합니다. 내가 어디로 잘못 가고 있는지 확실하지 않지만 하루 종일 알아 내려고 노력 중이며 어디에도 없습니다.프롤로그의 재귀 문제

제공되는 도움을 주시면 감사하겠습니다.

go:- 
    repeat, 
    f([],0,lon,spa,OP,OD), 
    write(OP), 
    write(OD), 
    fail. 

city(lon). 
city(ath). 
city(spa). 
city(kol). 

path(lon,1,ath). 
path(ath,3,spa). 
path(spa,2,kol). 
path(lon,1,kol). 

joined(X,Y,D):- 
    path(X,D,Y);path(Y,D,X). 

f(Ci_Vi,Di,De,De,PaO,Di):- 
    append([De],Ci_Vi,PaO), 
    !. 
f(Cities_Visited,Distance,Start,Destination,Output_Path,Output_Distance):- 
    repeat, 
    city(X), 
    joined(Start,X,D), 
    not_member(X,Cities_Visited), 
    New_Distance is Distance + D, 
    f([Start|Cities_Visited],New_Distance,X,Destination,Output_Path,Output_Distance). 

not_member(X,List):- 
    member(X,List), 
    !, 
    fail. 
not_member(X,List). 

내가 기대하는 출력은 [온천, ath, lon] 4 [온천, 콜, 론] 3입니다.

다시 한번 도움을 주시면 감사하겠습니다.

미리 감사드립니다.

답변

1

귀하의 솔루션은 본질적으로 정확합니다. f([],0,lon,spa,OP,OD)을 입력하면 예상대로 첫 번째 경로가 표시됩니다. 내가 볼 수있는 유일한 오류는 귀하가 검색 술어 내에서 repeat을 사용하고 있다는 것입니다. 이것이 동일한 솔루션을 계속 계산하는 이유입니다. repeat은 비즈니스 논리에서 거의 필요하지 않습니다. 솔루션의 백 트랙킹은 이미 REP 루프에 내장되어 있습니다. 그것을 꺼내면 예상대로 두 번째 경로를 얻은 다음 실패합니다.

+0

나는 반복을 꺼내려고했지만 나는 여전히 내 첫 번째 대답을 무한 반복했다. –

+0

메인 루프 ('go' 지시어)에 또 다른'repeat'가 있기 때문입니다. 'f ([], 0, lon, spa, OP, OD)'목표를 직접 사용하고 첫 번째 해결책 뒤에';'를 누르면 두 번째 것을 보여줍니다. 프로그래밍 방식으로 솔루션을 열거하려면'repeat'가 아니라'findall/3'을 사용해야합니다. –

+0

아, 알겠습니다. 도움을 주셔서 대단히 감사합니다. 당신은 좋은 사람입니다. –