2011-08-24 3 views
6

범위 :프롤로그 - 번호 생성 목록은 주어진 피팅 내가 좋아하는 술어를 사용하고 싶습니다

range(X,0,5) :- member(X,[0,1,2,3,4,5]). 
range(X,4,200) :- member(X,[4,5,6...198,199,200]). 
range(X,-1000000,1000000) :- member(X,[-1000000,...,1000000]). 
dom_range(X,-1000000,1000000) :- domain(X, [-1000000,...,1000000]). 

어떻게 잘 (로 솔루션의 성능을 복용 프롤로그에서 그것을 코드 : 의미

range(X,0,5) 
range(X,4,200) 
range(X,-1000000,1000000) 
dom_range(X,-1000000,1000000) 

계정 - 재귀 수준 등)?

해결책은 GNU-Prolog에서 실행될 것으로 예상됩니다.

P. 질문은 this question에서 영감을 얻었습니다.

답변

11

SWI-Prolog에는 술어 between/3이 있습니다. 그래서 위에서 (0,5, X)와 같이 호출하면 위에 나온 결과를 얻을 수 있습니다. 이 술어는 C에서 구현 된 것처럼 보입니다.

우리가 순수 프롤로그로 작성해야한다면 (그리고 속도는 &입니다) 공란은 다음을 시도 할 수 있습니다. 은 GNU - 프롤로그에서

range(Low, Low, High). 
range(Out,Low,High) :- NewLow is Low+1, range(Out, NewLow, High). 
+0

도메인()에 해당합니까? –

+0

정확히 도메인이란 무엇입니까? 나는 위의 시나리오에서 dom_range가 할 것으로 예상되는 것을 말할 수 없었다. 범위에 인수를 전달하는 또 다른 방법일까요? dom_range (Out, [Low, High]) : - 범위 (Out, Low, High)입니다. – DaveEdelstein

+0

[이 튜토리얼] (http://wazniak.mimuw.edu.pl/index.php?title=Sztuczna_inteligencja/SI_Modu%C5%82_3_-_Wnioskowanie_w_PROLOG-u)에서 "도메인"에 대해 읽었습니다. 세부 사항에 대한 확신이 없으므로 나는 Prolog 초보자이다. [fd_domain (+ fd_variable_list_or_fd_variable, + 정수, + 정수)로 지정된 [fd_domain/3] (http://www.gprolog.org/manual/gprolog.html#htoc321)을 발견 한 Gnu-Prolog 매뉴얼을 확인하는 동안, ] (http://www.gprolog.org/manual/gprolog.html#htoc321) - 어떻게 생각하세요? 다른 해결책일까요? –

0

range 내가 dom_range(X,L,H) :- fd_domain(X,L,H) 경우를 모르는 유한 도메인

range(X,Low,High) :- fd_domain(X,Low,High). 

으로 해결 될 수있다.

P. 한정 도메인으로 게임을 할 때 fd_set_vector_max/1

9

Dave의 대답은 거의 완벽합니다. 낮은 수치 인 경우에는 체크하지 않습니다. <. 조건을 추가했는데 이제는 제대로 작동합니다 (그렇지 않으면 숫자가 낮은 것부터 무한대까지 생성됩니다).

range(Low, Low, High). 
range(Out,Low,High) :- NewLow is Low+1, NewLow =< High, range(Out, NewLow, High). 

희망이 있습니다.