2011-11-27 14 views
6

पर लिखने के लिए मैं एक सूची के माध्यम से लूप करने और इसे फ़ाइल में लिखने की कोशिश कर रहा हूं, निम्नलिखित क्यों काम नहीं कर रहे हैं?फ़ाइल (Prolog)

loop_through_list(List) :- 
    member(Element, List), 
    write(Element), 
    write(' '), 
    fail. 

write_list_to_file(Filename,List) :- 
    tell(Filename),  % open file to be written 
    loop_through_list(List), 
    told.    % flush buffer 
+1

'write_list_to_file/2' चलाते समय बनाई गई फ़ाइल को देखें! काफी संभावना है कि इसमें न केवल सूची के तत्व होंगे, बल्कि फ़ाइल के अंत में कुछ अन्य अनपेक्षित डेटा भी होंगे। जैसा कि अन्य ने पहले ही टिप्पणी की है, 'ओपन/3' और' क्लोज/1 'का उपयोग करना अधिक सुरक्षित है। – false

+0

मैं उत्सुक हूं कि कहने और बताए जाने की अविश्वसनीयता की जानकारी मिल सकती है, क्या आप कृपया मुझे स्रोत पर इंगित कर सकते हैं? – chutsu

+1

आपको एक स्पष्टीकरण मिलता है [यहां] (http://stackoverflow.com/questions/8269971/prolog-how-to-save-file-in-an-existing-file/8270091#8270091) – false

उत्तर

7

सबसे पहले, क्यों यह विफल रहता है:
आप बैक ट्रैकिंग है, जो एक अच्छी तकनीक हो सकता है भड़काने के लिए असफल उपयोग करें, लेकिन वहाँ नहीं। चूंकि यह सदस्य अंत में गलत साबित कर देगा, जब सदस्य समाधान से बाहर हो गया है। फिर, एक बार loop_through_list गलत है, बताया गया है कि यह नहीं पहुंचा है और लेखन ठीक से नहीं किया गया है (जब मैं इसका परीक्षण करता हूं, फ़ाइल बनाई जाती है लेकिन कुछ भी लिखा नहीं जाता है)।
यदि आप का उपयोग करें:

loop_through_list([]). 
loop_through_list([Head|Tail]) :- 
    write(Head), 
    write(' '), 
    loop_through_list(Tail). 

इसके बजाय, यह काम करता है।

लेकिन, इस कोड के साथ भी, आप खुला (फ़ाइल नाम, लिखना, स्ट्रीम) लिखना, लिखना (स्ट्रीम, एलिमेंट) और बंद करने के बजाय बंद (स्ट्रीम) का उपयोग करना चाहते हैं और लिंक में समझाए गए कारणों के बारे में बताया इस उत्तर के नीचे।
उदाहरण के लिए:

loop_through_list(_File, []) :- !. 
loop_through_list(File, [Head|Tail]) :- 
    write(File, Head), 
    write(File, ' '), 
    loop_through_list(File, Tail). 

write_list_to_file(Filename,List) :- 
    open(Filename, write, File), 
    loop_through_list(File, List), 
    close(File). 

या

loop_through_list(File, List) :- 
    member(Element, List), 
    write(File, Element), 
    write(File, ' '), 
    fail. 

write_list_to_file(Filename,List) :- 
    open(Filename, write, File), 
    \+ loop_through_list(File, List), 
    close(File). 

अपने कोड और joel76 चाल का उपयोग कर।

Prolog how to save file in an existing file
यह एक ही मामले को शामिल करता है।

+0

वैसे, क्या है '\ +'? इसका मतलब यह नहीं है (उदा। 'सी' में)! – chutsu

+1

@chutsu: हाँ, यह करता है। एसडब्ल्यूआई-पीएल में कम से कम (और अन्य आपको अन्य कार्यान्वयन के बारे में बता सकते हैं), ** नहीं/1 ** बहिष्कृत किया गया है और ** [+ + 1 ** ** का उपयोग इस [मैनुअल पेज] (http में कहा गया है) : //www.swi-prolog.org/pldoc/doc_for वस्तु = नहीं/1) – m09

2

विधेय loop_through_list (सूची), हमेशा विफल रहता है, तो succed को आप सिर्फ \ + loop_through_list (सूची) लिखने के लिए है,

3

मैं उपयोग इस विधि करने के लिए एक लिखने के कारण देखने के लिए असफल एक फाइल में सूची।
प्रोलॉग में प्रोग्रामिंग आमतौर पर लूप शामिल नहीं होना चाहिए;
इसके अलावा, यह एक लूप संरचना नहीं है, यह एक हैक (या यहां तक ​​कि दुरुपयोग) की तरह है।
(और अपने मामले की तरह ही अप्रत्याशित बग और समस्याओं की ओर जाता है)

बस प्रत्यावर्तन का उपयोग करें और सूची के तत्वों को मुद्रित:

write_list([]). 
write_list([H|T]):- 
    write(H), 
    write(' '), 
    write_list(T). 

अधिक सुरुचिपूर्ण और भी अधिक कुशल हो सकता है।

इसके अलावा,/1 आदि (एडिनबर्ग आईओ) के बजाय खुले/4 आदि (आईएसओ आईओ) का उपयोग करना आम तौर पर बेहतर होता है; false's post

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