2017-11-22 9 views
1

저는 프롤로그와 함께 작업하고 있습니다. 나는 거대한 숫자 값을 처리해야합니다. (프롤로그는 원래 숫자를 처리하도록 설계되지 않았습니다.) 이클립스 6.1 fd_global:ordered_sum\2 등의 조건에 내장 된 일부 문서를 사용하고 말한다 :거대한 숫자 값을 프롤로그로 처리하십시오.

이미 유한 경계가없는 모든 입력 변수가 10000000

에의 -10000000 기본 범위를 받게됩니다 10000000보다 큰 값을 처리하려면 어떻게해야합니까? (일반적으로, 반드시 ECLiPSe는 필요하지 않음). 당신이 library(ic)를 사용하는 경우

+2

을 – Fatalize

+1

@Fatalize (... 당신은 물론 충분한 메모리가 가정) :'X #> = 0'과 같은 표현식은'X '위의 * 모든 숫자를 포함합니다. – false

답변

2

은 다음 일반적으로 변수는 기본적으로 무한 경계를 취득, 기본 제약 조건에 사용했을 때

?- lib(ic). 
Yes (0.13s cpu) 

?- sum([X,Y,Z]) #= 0. 
X = X{-1.0Inf .. 1.0Inf} 
Y = Y{-1.0Inf .. 1.0Inf} 
Z = Z{-1.0Inf .. 1.0Inf} 
There is 1 delayed goal. 
Yes (0.00s cpu) 

그러나, 글로벌 제약 구현의 일부의 알고리즘 무한 경계를 처리 할 수 ​​없습니다, 따라서 기본 경계를 부과 당신이 언급 :

?- ic_global:ordered_sum([X,Y,Z], 0). 
X = X{-10000000 .. 0} 
Y = Y{-5000000 .. 5000000} 
Z = Z{0 .. 10000000} 
There are 5 delayed goals. 
Yes (0.06s cpu) 

이러한 문제가 발생하지 않도록하려면 더 큰 유한 경계 을 가진 변수를 초기화 할 수 있습니다 전에 전역 제약 호출 : 숫자 임의로 클 수있다 (그 CLP (FD) 라이브러리 포함) 등 SWI-프롤로그와 같은 다른 시스템에서 잘

?- [X,Y,Z] :: -1000000000000000..1000000000000000, ic_global:ordered_sum([X,Y,Z], 0). 
X = X{-1000000000000000 .. 0} 
Y = Y{-500000000000000 .. 500000000000000} 
Z = Z{0 .. 1000000000000000} 
There are 5 delayed goals. 
Yes (0.00s cpu) 
+2

좋고 명확한 설명. 따라서 사용 가능한 경우'fd_global'이나'fd'가 아닌'ic_global'의 술어를 사용할 것을 제안합니까? 몇 가지 큰 차이점이 있습니까? – damianodamiano

+0

@damianodamiano : 그 답이 맞는다면, 체크 표시를 체크하여 확인하고 받아 들여야합니다. – false

+2

네, 도서관의''ic''과''ic_xxx'' 계열을 사용해야합니다. ''fd'' 패밀리는 구형 구현체입니다. – jschimpf