2010-12-04 5 views

답변

14

술어 IFF 인수는 정수입니다. 용어 truncate(sqrt(9)) 정수 하지 때문에, 술어는   하지 보류을 수행하고, 따라서 이   용어에 대한 실패합니다.

해결 방법 1 : 신속하고

당신은 다른 수의 표현 사이의 변환을 위해 술어 (is)/2을 사용할 수 있습니다 깨진

은 당신이 원하는 것을 얻기 위해 적어도 두 가지 방법이 있습니다. 특히 산술  round, truncateceiling을 확인하십시오. 예를 들어 :

 
?- X is round(sqrt(9)). 
X = 3. 

그러나, 부동 소수점 숫자를 사용하여 항상 매우 문제가입니다 있습니다. 예 :

 
?- X is sqrt(2^10000). 
ERROR: is/2: Arithmetic: evaluation error: `float_overflow' 

반올림 오류 및 언더 플로우 가능성과 같은 다른 문제가 있습니다.

해결 방법 2 : 부동 소수점 숫자를 고유의 단점을 빠르고

일반적으로, 나는 강력하게 보다 일반적인 메커니즘를 대신 사용하는 것이 좋습니다. 예를 들어, 몇 가지 Prolog 시스템은의 의 유리수와 무한 정밀도의 정수를 지원하지만 부동 소수점은 항상 기계 정밀도로 제한됩니다.

정수 제곱근이 필요한 경우 유한 도메인 제약을 사용합니다. 큰 정수의

 
?- X*X #= 9, X #>= 0. 
X = 3. 

또한이 작품 :

 
?- X*X #= 2^10000, X #>= 0. 
X = 1412467032...(1496 digits omitted) 

를 참조 제약, 그것은 가 긍정적 인 정사각형   루트를 나타냅니다 정수   X에 대한을 보유하고 어떤 상태로 충분하다 자세한 정보.

관련 문제