2010-12-04 17 views

उत्तर

14

विधेय integer/1 है कि आप का इस्तेमाल किया सच है iff अपने तर्क एक पूर्णांक है। चूंकि शब्द truncate(sqrt(9))नहीं एक पूर्णांक है, विधेय   नहीं पकड़ करता है और इसलिए इस   अवधि के लिए विफल रहता है।

समाधान 1:: त्वरित और टूट

आप अलग अलग संख्या अभ्यावेदन के बीच रूपांतरण के लिए विधेय (is)/2 उपयोग कर सकते हैं

वहाँ आप क्या चाहते हैं पाने के लिए कम से कम दो तरीके हैं। विशेष रूप से, अंकगणित   फ़ंक्शंसround, truncate और ceiling देखें। उदाहरण के लिए:

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

हालांकि, ध्यान दें कि चल बिन्दु संख्या का उपयोग हमेशा अत्यधिक समस्याग्रस्त है। उदाहरण के लिए:

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

भी इस तरह के गोलाई त्रुटियों और संभव अधःप्रवाह के रूप में अन्य मुद्दों कर रहे हैं।

समाधान 2: त्वरित और सामान्य

चल बिन्दु संख्या के निहित कमियों के कारण, मैं दृढ़ता से आप अधिक सामान्य तंत्र बजाय का उपयोग करें। उदाहरण के लिए कई प्रोलॉग सिस्टम तर्कसंगत संख्या और असंबद्ध परिशुद्धता वाले पूर्णांक का समर्थन करते हैं, जबकि फ्लोट हमेशा मशीन परिशुद्धता तक ही सीमित होते हैं।

आप पूर्णांक वर्ग जड़ों की जरूरत है, उदाहरण के परिमित डोमेन की कमी के लिए इस्तेमाल करते हैं।

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

यह भी बड़ा पूर्णांक के लिए काम करता है:

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

के लिए देखें की कमी के साथ, यह राज्य के लिए क्या एक पूर्णांक   X कि सकारात्मक वर्ग   जड़ को दर्शाता है के लिए रखती है पर्याप्त होता अधिक जानकारी।

संबंधित मुद्दे

 संबंधित मुद्दे