2009-12-10 5 views
0

라우팅 기능을 쓰려고하는데 필요한 결과를 얻지 못하는 것 같습니다. 지금까지의 코드입니다. 전임자는 N에 연결된 노드를 찾아 내 traceroute(placeA, Y).이 .. Y = [ (_G575, _G575)|_G579] .프롤로그 라우팅 루틴

는 기본적으로 경로 추적의 첫 줄을 내가이 데이터를 시도하고 반환 실행하면 P.

traceroute(_,L) :- member((A,A),L). 
traceroute(N,L) :- 
    predecessor(N,P), 
    append(N,L,L1), 
    traceroute(P,L1). 

로서 돌려줍니다 임의의 멤버가 그 자체의 전신 인 경우 재귀를 종료합니다. 두 번째 부분은 모든 노드를 순환하여 목록 (L)에 추가해야합니다.

노드

은 [(placeA, placeB), (placeB, placeC)]와 같은 저장되고 목록

나는 이러한 결과를 얻고 이유를 이해할 수 없다 [placeA, placeB, placeC]처럼 저장해야합니다 .

답변

2

이 경우 (잘못된 경우)는 일반적으로 어딘가에 어딘가에 어스를 작성하지 않았 음을 의미합니다.

코드가 작동하는 방법을 완전히 모르겠지만 주요 문제는 traceroute의 두 번째 인수에 nonground 변수를 전달한다는 것입니다.

회원 호출에서 L이 nonground이기 때문에 실제로는 프롤로그가 완전히 인스턴스화되지 않은 목록의 요소 인 양식 (A, A) 항목을 반환하도록 요청하고 있습니다. 이것은 많은 것을 이해하지는 못하지만, 이런 종류의 일을하는 것이 유용 할 때가 있습니다. 그래서 프롤로그는 충실히 준수하고 (역 추적시) nonground의 길이를 지정하지 않았으므로 증가하는 길이의 목록을 생성합니다 어떤 점에서 항목 (A, A)을 갖는 변수. 예 :

당신은 땅이고 Y 값을 전달하거나 더조차 모두 가능하여 술어 내부에 걸리거나 값을 제한하는 하나 필요
?- traceroute(placeA, Y). 
Y = [ (_G271, _G271)|_G275] ; 
Y = [_G274, (_G271, _G271)|_G278] ; 
Y = [_G274, _G277, (_G271, _G271)|_G281] ; 
Y = [_G274, _G277, _G280, (_G271, _G271)|_G284] ; 

.

또한 두 번째 절이 실제로 실행되지 않더라도 비슷한 문제가 있습니다. 다시 Nonground 인 N이 N에 추가되어 L1도 생성됩니다. 이 술어는 재귀 적으로이 작업을 수행하므로 최종 목록은 항상 항상 비 연속적입니다.