2011-03-02 3 views
1

이 작업에는 Prolog 데이터베이스가 있습니다. 에지 (1,0) 에지 (2,0) 에지 (1,3)프롤로그 컷과 관련하여 조언이 필요하십니까?

에지 두 지점이 결합 된 것을 의미한다.

reach (i, j, k)라는 함수를 작성해야합니다. 여기에서 i는 시작점이고 j는 끝점이며 k는 사용할 수있는 단계의 수입니다. 반복 루핑을 멈추기 위해 K가 필요하다.

내가 가진 유일한 단점은 1에서 3으로 가고, 나는 6이 되려고한다는 것을 가정 해 봅시다. 그러면 한 번에 1to6에서 나올 수 없습니다. 그래서 나는 내가 갈 수있는 곳을 찾고, 거기에서 6을 얻을 수 있는지 알아 보겠습니다. 내가 한 번에 갈 수있는 첫 번째 장소는 3이므로, 거기서부터 6까지 가려고 노력할 것입니다.

내가 그래서 이런 짓을했는지 :이 작품

%% Can you get there in one step (need two rules because all links are 
%% from smaller to greater, but we may need to get from greater to smaller. 

reach1(I, J,_K) :- 
    edge(I, J). 
reach1(I, J,_K) :- 
    edge(J, I). 
%% Chhose somewhere you can get to in one step: can you get from there 
%% to your target? 
reach1(I,J,K) :- 
    K>1, 
    edge(I, B), 
    K1 is K-1, 
    reach1(B,J,K1). 

reach1(I,J,K) :- 
    K>1, 
    edge(B, I), 
    K1 is K-1, 
    reach1(B,J,K1). 

그러나 나는 우리가 K를 사용하지만이 작업을 수행하기 위해 "컷"을 사용을 요구하는 두 번째 부분에 붙어있다.

누구든지이 작업을 수행하는 방법을 알고 있습니까? 아니면 저에게 몇 가지 포인터를 줄 수 있습니까?

+2

그래프의 탐색에 대해 설명하는 http://stackoverflow.com/questions/3970977/traverse-undirected-graph-in-prolog/3971936#3971936을 살펴볼 수 있습니다. 거기에 해결책은 중 하나를 사용하지 않지만 어느 것이 훨씬 더 우아하다고 생각합니다. 물론 이미 방문한 노드에 도달하면 역 추적 트리를 제거하기 위해 해당 솔루션을 다시 작성할 수 있습니다. – gusbro

+0

필자는 ** "reach1/3 **"사양의 일부를 구성하기 때문에 "이것을하기"는 의미는 있지만 K는 사용하지 않을 것입니다. 또한 첫 번째 두 가지 규칙 인 "단일 단계"의 경우에는 ** reach1 **의 세 번째 인수로 '_K'가 아닌 '1'이 있어야합니다. 경로를 찾는 일반적인 문제는 끝없는 재귀를 피하는 방법입니다. 실제 목표를 향한 진전없이 1에서 2로, 1에서 2로, 등등으로 진행됩니다. 아마도 원래의 운동은 그러한 반복을 방지하는 다양한 방법을 모색하기위한 것이 었습니다. 현재 요청에서 알기가 어렵습니다. – hardmath

답변

0

목표가 한 번 해결되면 다른 방법을 찾지 않습니다.

예 :

reach(I, J,_K) :- 
    edge(I, J). 

더 컷 - 어떤 이유로 프롤로그가 백 트럭 경우,이 J로 I에서 다른 방법을 모두 사용하기 위해 노력합니다. 당신은 간단한 가장자리가 작동하는 경우이 노드 다른 방법에 도달 아무 소용이 없다 느낄 수 있으며 그 경우에 당신이 할 수있는이 목표에 대한 대안을 "인하"

reach(I, J,_K) :- 
    edge(I, J), 
    !. 

을하지만, 하나의 프롤로그가 발견했다.