2017-11-07 9 views
5

में एक ईओटी चरित्र के साथ मैं एक अलग प्रोग्रामिंग भाषा से प्रोलॉग दुभाषिया के लिए एक रैपर लिख रहा हूं। मैं विस्तार से नहीं जाता, लेकिन यह मूल रूप से एक अनुरूप प्रोलॉग प्रोग्राम उत्पन्न करता है और मानक इनपुट से प्रोग्राम को एक दुभाषिया को खिलाता है। मैं प्रोलॉग के लिए अपेक्षाकृत नया हूँ।[उपयोगकर्ता] को समाप्त करना। Prolog

समस्या यह है कि, मुझे [user]. शब्द के लिए विनिर्देश नहीं मिला जो मानक इनपुट से नियम पढ़ता है। विशेष रूप से, यह इनपुट के अंत का पता कैसे लगाता है।

इसे प्राप्त करने का सबसे सहज तरीका एक ईओटी चरित्र (Ctrl-D) भेजना है, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है। नीचे एक उदाहरण उदाहरण है, एक वास्तविक ईओटी चरित्र के साथ^डी को प्रतिस्थापित करें। मान लें कि यह फ़ाइल input.pl में सहेजी गई है। मैं इस तरह के कोड को प्रोग्रामेटिक रूप से उत्पन्न करना चाहता हूं और इसे मानक इनपुट के माध्यम से पृष्ठभूमि प्रोलॉग प्रक्रिया में फ़ीड करना चाहता हूं।

[user]. 
factorial(0,1). 
factorial(N,F) :- (>(N,0),is(N1,-(N,1)),factorial(N1,F1),is(F,*(N,F1))). 
^D 
factorial(3,W). 

जब मैं cat input.pl | <prolog> चलाने जहां <prolog> है जो कुछ Prolog दुभाषिया (swipl, याप, आदि), यह पहचान करने के लिए^डी प्रतीत नहीं होता। यह क्यों है और मैं इसे कैसे हल करूं? टर्मिनल पर^डी ठीक काम करता है।

उदाहरण के ऊपर "डब्ल्यू = 6" वापस जाना चाहिए। एसडब्ल्यूआई Syntax error: illegal_character शिकायत करता है। याप^डी को नजरअंदाज कर रहा है, बस सबकुछ पार्स करें और yes लौटाएं।

बेशक मैं प्रोग्राम को अस्थायी फ़ाइल पर लिख सकता हूं और दुभाषिया को फ़ाइल से परामर्श करने के लिए कह सकता हूं, लेकिन यह धीमा है।

+1

ईओएफ एक ही चीज नहीं है जैसे स्ट्रीम को अंत में फ़ाइल में बंद किया जा रहा है या बंद किया जा रहा है। '[उपयोगकर्ता]। 'प्रोलॉग को तब तक उपयोगकर्ता से पढ़ने के लिए कहता है जब तक कि स्ट्रीम समाप्त न हो या अंत-फ़ाइल का संकेत हो। टर्मिनल उस सिग्नल में उपयोगकर्ता के Ctrl-D को परिवर्तित करता है। यह एक शाब्दिक चरित्र नहीं है जो इनपुट स्ट्रीम में दिखाई देता है। अन्यथा, आप इसमें EOF वर्णों वाली फ़ाइल को 'बिल्ली' कैसे प्राप्त कर पाएंगे? –

+0

देखें [यह उत्तर] (https://stackoverflow.com/a/9091262/812818)। –

+0

ईओएफ, ईओटी नहीं। मुझे उम्मीद नहीं है कि '[उपयोगकर्ता]।' ईओएफ का पता लगा रहा है। –

उत्तर

5

end_of_file.^D के स्थान पर कहें। यह कई प्रोलॉग कार्यान्वयन में काम करता है क्योंकि उनके वास्तविक पढ़ने read/1 के साथ किया जाता है। ऐतिहासिक रूप से, डीईसीसिस्टम 10 प्रोलॉग से, सिस्टम में केवल read/1 था लेकिन at_end_of_stream/0 और संबंधित अंतर्निहित भविष्यवाणियां नहीं थीं। वास्तव में, कुछ प्रोग्रामर प्रोलॉग स्रोत फ़ाइल में मनमाने ढंग से पाठ जोड़ने की अनुमति देने के लिए प्रोलॉग स्रोत फ़ाइल के भीतर end_of_file. का उपयोग करते थे।

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