2011-05-04 5 views
0

나는 다음과 같다 코드가 :이 규칙은 재귀 적으로 호출됩니다Prolog : 사용하기 전에 변수가 초기화되었는지 확인하는 방법은 무엇입니까?

path(Node1, Node2, Distance):- edge(Node1, Node2, Dist), 
    Distance is Dist + Distance, !. 

을; 그러나 내가 그것을 호출하려고 할 때마다 거리가 충분히 초기화되지 않았다는 오류가 발생합니다. 왜 이런 일이 일어나는 걸까요? 나는 거리가 처음에 초기화되었는지 확인하는 것이 해결책이라고 생각한다. 이것을 할 수있는 방법이 있습니까?

답변

1

그것은 당신의 코드 것으로 보인다 :

은 아마 당신이 할하려는 것은

path(Node1, Node2, Distance):- edge(Node1, Node2, Dist), Distance is Dist. 

편집

입력 및 출력 변수를 혼합하지 않고 같은 일을 시도하다 어쨌든 네가하고 싶은 일을하지 않을거야. 그래프에서 노드 사이의 거리를 계산하기로되어 있습니까? 당신이이 코드 조각으로 시작보다 (테스트하지) :

path(Node1, Node2, Dist):-edge(Node1, Node2, Dist), !. (0) 
path(Node1, Node2, Dist):- 
     edge(Node1, NodeBetween, DistToBetween), 
     path(NodeBetween, Node2, DistFromBetween), (1) 
     Dist is DistToBetween + DistFromBetween. (2) 

을 이제 당신이 변수 거리에서 a와 b 사이 당신의 거리를 줄 것이다 path(a,b,Distance) 같은 프롤로그 엔진을 요청하는 경우.

여기에 어떤 일이 일어나는지

조금 비공식적 설명 : 변수는에 '초기화'됩니다 edge(Node1, Node2, Dist), !. (0)와 Node1Node2 사이 프롤로그 평가됩니다 동안 추가됩니다 다른 숫자보다 거리로 초기화됩니다 (1)과 (2)보다.

그러나 논리 프로그래밍은 '일반적인'절차 프로그래밍과 다르므로 조금 다른 생각을해야합니다. 좋은 결과 내길 바랄 게. Btw. SWI 프롤로그는 훌륭한 디버거를 가지고있어, 술어가 평가 될 때 일어나는 일을 이해하는 데 도움이됩니다.

+0

그게 효과가 있어요. 고맙습니다. –

0

Distance is Dist + Distance, !.에 거리를 초기화 할 수 없다고 생각합니다.

거리를 초기화하기 전에 거리에 거리를 추가하려고합니다.

path(Node1, Node2, Distance):- path(Node1, Node2, Distance). 
path(Node1, Node2, InitialDistance, Distance):- edge(Node1, Node2, Dist), 
               Distance is InitialDistance + Dist, !. 
+0

예, 해결책은 초기화되지 않았는지 확인한 다음 0으로 설정하고 그렇지 않으면 추가하는 것입니다. 이것은 프롤로그에서 어떻게 할 수 있습니까? –

+0

저는 프롤로그 전문가는 아니지만 입력 변수와 출력 변수를 섞을 수는 없으며 변수가 초기화되었는지 확인할 수 없습니다. 내 대답을 다른 접근 방식으로 수정하겠습니다. –

+0

나는이 작품을 알고있다; 그러나 이것은 내가하고 싶은 것이 아닙니다. Distance를 직접 Dist로 설정하면 Distance의 누적 값이 손실됩니다. –

관련 문제