2013-02-14 2 views
1

Prolog에서 시작 번호부터 끝 번호까지 순서를 찾는 방법은 무엇입니까? 내 기능은종료 번호로 시작

findSequence(-4,-6,Z)---> Z=-4;Z=-5;Z=-6 
+0

나는 다음과 같은 두 줄을 썼다. 내가 예상 한대로 추적하고 있지만 최종 값을 인쇄하고있다.

+0

다음 두 줄은 어디에 있는가? –

+0

@DanieLyons와 Alejandro : 다음 findSequence (X, X, X)를 썼습니다. findSequence (X, Y, Z) : - Y> X, X1은 X + 1, findSequence (X1, Y, Z)입니다. 여기서 문제는 최종 값을 인쇄한다는 것입니다. 재귀에서 X의 모든 값에 대해 인쇄하고 싶습니다. –

답변

2

between/3이 작동 할 수 있는지 확인해야 어떤 실제적인 사용을 위해 간단한 마음 절차

findSequence(N, N, N) :- !. 
findSequence(S, E, N) :- 
    S < E, (N = S ; T is S + 1, findSequence(T, E, N)). 
findSequence(S, E, N) :- 
    S > E, (N = S ; T is S - 1, findSequence(T, E, N)). 

.

+0

완벽한 답변. –

0

최종 값 (-6)에 시작 값 (-4)의 값을 (목록에서) 당신이 축적되는 재귀 술어를 사용하는 것을 고려 보일 것입니다.

0

이렇게하면됩니다. 여기에는 < =부터.

?-findSequence(1,3,List). 
List=[1,2,3]. 
yes 
+0

'? - findSequence (-4, -6, S) .' 루프. – false

+0

여기서 문제는 -4> -6 ... 역순으로 바꾸려면 From + 1에서 From-1로 변경하십시오. 그래서 이것을 호출하는 올바른 방법은 findSequence (-6, -4, S)입니다. – Alejandro

+0

자를 잘못 사용하는 것이 문제입니다. 'findSequence (1,3, [_, _, _, _ | _])'시도해보십시오. '-4'의 경우'-6' 실패 (자신을 제한하는 경우) 또는 성공이 예상됩니다. 그러나 반복하지 마라. – false

0

이 무엇을 요구하는지하는 것은 특히 어려운 일이 아니다 재미있는 경우는 다음과 같습니다 당신이

findSequence(X,X,[X]):-!. 
findSequence(From,To,[From|Rest]):-SuccFrom is From +1, findSequence(SuccFrom ,To, Rest). 

이것은 목록, 즉 반환하는 경우 확인하려면 조금 더 복잡한 쓸 수있다 그러나 당신은 우리가 당신이 원했던 것을 이해하려고 많은 시간을 보냈다. 순서 (즉, 목록)를 원하지 않으면 연속적인 답을 원합니다. 그리고 자연수가 아닌 모든 정수로 작업하기를 원합니다. 이것은 귀하의 예에서는 함축되어 있지만 명시되지 않았습니다. 또한 -4는 -6보다 큽니다. 이는이 술어가 일반적으로 쓰여지는 것과 반대입니다. 바로 찾을 수

min(X, Y, Z) :- X < Y -> Z = X ; Z = Y. 
max(X, Y, Z) :- X < Y -> Z = Y ; Z = X. 

이 :

:- use_module(library(clpfd)). 

우리는 몇 가지 도우미 술어가 필요합니다

이 모든 처리하기 위해

, 나는 확신 해요 가장 간단한 것은 라이브러리 clpfd이 필요 최소 및 최대; 나는 보통 두 줄씩 쓴다.하지만 이것이 더 편리하다. 이제 해결책 :

findSequence(X, Y, Z) :- 
    min(X, Y, Low), 
    max(X, Y, High), 
    Z in Low..High, 
    label([Z]). 

이것은 유스 케이스와 명백한 문제를 처리합니다. 여기

관련 문제