2010-09-29 7 views
7
में एक ऑपरेटर को परिभाषित करने की कोशिश कर

मैं निम्नलिखित कोड के साथ एक prolog फ़ाइल को परिभाषित किया है:समस्या जब Prolog

divisible(X, Y) :- 
    X mod Y =:= 0. 

divisibleBy(X, Y) :- 
    divisible(X, Y). 

op(35,xfx,divisibleBy). 

Prolog शिकायत कर रहा है कि

'$ record_clause'/2: करने की अनुमति नहीं static_procedure 'op/3'

मैं क्या गलत कर रहा हूं? मैं एक divisibleBy ऑपरेटर को परिभाषित करना चाहता हूं जो मुझे निम्न जैसे कोड लिखने की अनुमति देगा:

4 divisibleBy 2 

धन्यवाद।

उत्तर

14

उपयोग

:- op(35,xfx,divisibleBy). 

:- बताता को Prolog दुभाषिया का मूल्यांकन अगले अवधि फ़ाइल, (op/3 की एक नई परिभाषा को लोड करते समय यानी एक विधेय कॉल कर इस मामले में बजाय एक परिभाषा के रूप में यह इलाज के,)।

+2

अधिक सटीक, इसे "पूर्वानुमान कॉल" या "अनुमानित मूल्यांकन" के बजाय "निर्देश" कहा जाता है। –

+0

इस भविष्यवाणी के लिए 35 की प्राथमिकता निश्चित रूप से सलाह नहीं दी जाती है। – false

2

answer given by @larsmans आपकी मूल समस्या के बारे में स्पॉट-ऑन है।

हालांकि, पर पुनर्विचार करना चाहिए यदि आपको एक नया ऑपरेटर परिभाषित करना चाहिए।

सामान्य तौर पर, मैं दृढ़ता से निम्नलिखित कारणों के लिए नए ऑपरेटरों को परिभाषित करने के खिलाफ सलाह देंगे:

  • पठनीयता में लाभ अक्सर अहंकारी है।
  • यह उन स्थानों में आसानी से नई समस्याएं पेश कर सकता है जिन्हें आप आमतौर पर छोटी गाड़ी की अपेक्षा नहीं करेंगे।
  • यह "स्केल" अच्छी तरह से नहीं करता है: ऑपरेटरों की एक छोटी संख्या प्रेजेंटेशन स्लाइड्स पर संक्षेप में कोड बना सकती है, लेकिन यदि आप समय के साथ अधिक भेदभावपूर्ण संघ के मामलों को जोड़ते हैं तो क्या होगा? अधिक ऑपरेटर?
+0

कुछ और सलाह: ** यदि ** ऑपरेटरों को परिभाषित किया गया है, तो उन्हें सामान्य प्राथमिकता स्तर का सम्मान करना चाहिए। तो यदि भविष्यवाणी एक तुलना की तरह है, (मैं कहूंगा कि यह उदाहरण है), इसे * सटीक * प्राथमिकता और '(=)/2' की स्थिरता लेनी चाहिए जो 'op (700, xfx, =)' । – false