2012-05-18 11 views
5

में वैश्विक चर बनाने के लिए एक सूची है कि मैं इस प्रकार बनाने:मैं कैसे prolog

tab([(top,left),(top,middle),(top,right),(center,left),(center,middle), 
    (center,right),(bottom,left),(bottom,middle),(bottom,right)]). 

मैं एक वैश्विक चर AllPosition एक टैब है कि बनाना चाहते हैं। तो मैंने निम्नलिखित किया:

tab(AllPos). 

क्या यह सही है?

फिर मुझे समस्या का पालन करना होगा: मेरे पास एक ऐसा फ़ंक्शन है जो टैब में से एक जोड़ी प्राप्त करता है। मैं हटाना चाहता हूँ। तो मैं इस किया था:

place(Line, Column, Tab) :- 
AllPos \== [_,_] /*while AllPos isn't empty - not sur if this is done this way*/ -> (member((Line,Column), AllPos) -> (erase(AllPos, (Line,Column), AllPos)). 

जहां erase(List, Element, NewList) सूची से तत्व तत्व मिटा देता है और एक नई सूची NewList सूची के बराबर लेकिन तत्व के बिना पैदा करता है। दोनों कार्य member और erase काम कर रहे हैं।

बात यह है कि ... जैसा कि आपने देखा होगा कि मैं हर जगह AllPos का उपयोग करता हूं। ऐसा इसलिए है क्योंकि मैं चाहता हूं, मैं इसे संशोधित करना चाहता हूं ताकि मैं बाद में इसका उपयोग कर सकूं (इसके कुछ तत्व हटा दिए जाने के बाद), किसी अन्य फ़ंक्शन में। क्या मेरा तर्क सही है? क्या मैं किसी अन्य फ़ंक्शन में संशोधित AllPos का उपयोग करने में सक्षम हूं? धन्यवाद

+0

कृपया यह भी देखें कि कैसे [** वैश्विक चर से बचें **] (http://stackoverflow.com/questions/19005042/how-to-avoid-using-assert-and-retractall-in प्रोलॉग में -प्रोजेन-टू-कार्यान्वयन-वैश्विक-या-राज्य)। – mat

उत्तर

0

संक्षेप में: नहीं, आपका तर्क सही नहीं है। आपके कोड के साथ कई मामूली समस्याएं और बग हैं, लेकिन बड़ी समस्या बुनियादी आधार है। ऐसा लगता है जैसे आप समस्या को गलत तरीके से सोच रहे हैं। आम तौर पर, यदि आप प्रोलॉग प्रोग्राम में वैश्विक स्थिति को अपडेट करने का प्रयास कर रहे हैं तो आपको अपने डिज़ाइन पर पुनर्विचार करना होगा। place/4 के शरीर में AllTabs को एकजुट करने के बजाय, तर्कों के रूप में पारित होने के लिए वर्तमान में Tabs के सेट की अपेक्षा की जाती है। यदि आप वास्तव में अपने प्रोग्राम की वैश्विक स्थिति अपडेट करना चाहते हैं, तो आपको assert और retract भविष्यवाणी करने की आवश्यकता है।

कुछ विशिष्ट अंक:

tab(AllPos). 

इस सिर में एक अबाध चर के साथ एक विधेय की घोषणा की। यह अधिक या कम अर्थहीन है (आप पढ़ सकते हैं "यह मामला है कि tab कुछ के बारे में सच है, लेकिन हमारे पास इस बारे में कोई जानकारी नहीं है कि यह क्या सच है")।

AllPos \== [_,_] 

AllPos का यह प्रयोग tab/1 के लिए एक अलग दायरे में है, चर नाम में वर्णों की उसी क्रम को साझा करने से इसलिए अलग, AllPos के दो का उपयोग करता है कोई रिश्ता नहीं बिल्कुल भी नहीं है।

1

इयान के जवाब में जोड़ने से:

आम तौर पर ज़ोर/वापस लेना का उपयोग कर धीमी है।कई prolog कार्यान्वयन अगर आप एक अपरिवर्तनीय वैश्विक चर है कि लगभग की तरह तुमने किया था इनकोडिंग जा सकता है, अब परिवर्तनशील वैश्विक चर के लिए और अधिक कुशल तरीके

(उदाहरण के जांच SWI-prolog के lib के लिए) है, आप इसे myvar(42). के रूप में "घोषित" लेकिन यह उपयोग करने के लिए यह करने के लिए करना होगा:

foo:- 
    myvar(Var), 
    do_something(Var). 

फिर, परिवर्तनशील वैश्विक चर का उपयोग कर वास्तव में सुझाव नहीं है और बहुत, बहुत बुरा है और बग का पता लगाने के लिए कड़ी मेहनत करने के लिए नेतृत्व कर सकते हैं बैकट्रैकिंग के कारण।

+0

[इस उत्तर में लिंक] (http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%276.3%27,swi%28%27/doc/Manual/gvar.html% 27% 2 9% 2 9) टूटा हुआ प्रतीत होता है। –

+0

@ एंडरसनग्रीन चीयर्स, तय! –

4

एसडब्ल्यूआई-प्रोलॉग में आप इसका उपयोग कर सकते हैं: b_setval(name, value) और b_getval(name, value)। और यदि आप नहीं चाहते हैं कि बैकट्रैकिंग के मामले में मान वापस आ जाएंगे, तो आप उन्हें उपयोग करके वास्तविक वैश्विक बना सकते हैं: nb_setval(name, value) और nb_getval(name, value)

इस प्रकार उदाहरण के लिए यदि आप एक प्रोग्राम है और आप कितनी बार यह एक निश्चित पथ के माध्यम से चला गया जाँच करना चाहते हैं, तो आप उपयोग कर सकते हैं:

recursive(100). 
recursive(X) :- add, Y is X + 1, recursive(Y). 

add :- nb_getval(counter, C), CNew is C + 1, nb_setval(counter, CNew). 

testRecursion 
:- 
    % Set counter to zero 
    nb_setval(counter, 0), 

    % Run some code with 'add' 
    recursive(0), !, 

    % Print the results 
    nb_getval(counter, CounterValue), 
    write('Steps: '), writeln(CounterValue). 

यह, कुछ प्रयोगात्मक मामलों के लिए अच्छा है, लेकिन सामान्य रूप में आप करेंगे प्रोलॉग में वैश्विक चर से बचना चाहते हैं क्योंकि प्रोलॉग का तर्क तर्क में प्रोग्रामिंग है।

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