2012-04-21 13 views
5

, मैंने पाया कि प्रोलॉग में कम्यूटिव अभिव्यक्ति काफी सहज नहीं है।प्रोलॉग में "कम्यूटिटीविटी" व्यक्त करने के लिए वैकल्पिक? प्रोलॉग के शुरुआती के रूप में

family(X,Y) :- 
     married(X,Y); 
     relative(X,Y); 
     father_son(X,Y). 

मैं भी परिभाषा के लिए निम्न जोड़ना चाहिए ताकि इसे "विनिमेय" बनाने के लिए:

उदाहरण के लिए अगर मैं व्यक्त करने के लिए एक्स और वाई चाहते की तरह, एक परिवार में हैं

 married(Y,X); 
     relative(Y,X); 
     father_son(Y,X). 

लेकिन हम Prolog का उपयोग करें, क्योंकि हम सुरुचिपूर्ण कोड लिखना चाहते हैं ... हां, तो मैं (ऊपर तीन के बजाय) केवल एक लाइन जोड़ने की आशा करता हूँ मूल करने के लिए:

 family(Y,X). 

यहां POINT है। यह उन्मूलन की ओर जाता है! प्रोलॉग क्यों नहीं है "तार्किक"? और क्या इस साफ-सुथरे एक पंक्ति अभिव्यक्ति का कोई विकल्प है जो असंतोष का कारण नहीं बनता है?

अच्छा सप्ताहांत! वाट

उत्तर

7

शासन के family(X,Y) :- family(Y,X). भाग के साथ समस्या यह है कि हर स्तर पर खुद के साथ बिना शर्त एकीकृत रखता है, और नीचे recursing रहता है; इस रिकर्सन से बाहर निकलने की स्थिति नहीं है।

आप स्तर पर तर्क स्वैप करना चाहिए ऊपर:

family(X,Y) :- 
    is_family(X,Y); 
    is_family(Y,X). 

is_family(X,Y) :- 
    married(X,Y); 
    relative(X,Y); 
    father_son(X,Y). 

वैकल्पिक रूप से, आप सममित नीचे अंतर्निहित नियम बना सकता है जहां यह समझ में आता है:

is_married(X,Y) :- 
    married(X,Y); 
    married(Y,X). 

is_relative(X,Y) :- 
    relative(X,Y); 
    relative(Y,X). 

अब आप कर सकते थे निम्नानुसार अपने family नियम को फिर से लिखें:

family(X,Y) :- 
    is_married(X,Y); 
    is_relative(X,Y); 
    father_son(X,Y); 
    father_son(Y,X). 
+0

मैं देखता हूं, और यह भी स्पष्ट है कि यह क्यों समाप्त हो जाता है। धन्यवाद! – Matt

+0

मैं इसके बजाय अलग-अलग तथ्यों का उपयोग करने का भी सुझाव दूंगा; –

+0

@AlexanderSerebrenik बिल्कुल - मैं मूल की शैली के करीब रहना चाहता था। हालांकि, मेरे प्रोलॉग दिनों में मैंने पठनीयता और डिबगिंग की आसानी के लिए ';' पर कई नियमों को प्राथमिकता दी। – dasblinkenlight

1

कैसे के बारे में:

relatives(X,Y) :- 
    married(X,Y); 
    relative(X,Y); 
    father_son(X,Y). 

family(X,Y) :- 
    relatives(X,Y); 
    relatives(Y,X). 
संबंधित मुद्दे