तार्किक अभिव्यक्ति को सामान्य रूप में परिवर्तित करें


10

लक्ष्य:

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

संयोजक सामान्य रूप निम्नानुसार परिभाषित किया गया है:

  1. कोई भी परमाणु अभिव्यक्ति (सम्‍मिलित और सम्‍मिलित ) सामान्‍य रूप में होती है।
  2. किसी भी पूर्व निर्मित अभिव्यक्ति की उपेक्षा, संयुग्मित सामान्य रूप में है।
  3. किन्हीं दो पूर्व निर्मित अभिव्यक्तियों का विघटन सामान्य रूप में होता है।
  4. किसी भी दो पूर्व निर्मित अभिव्यक्तियों का संयुग्मन सामान्य रूप में होता है।
  5. कोई भी अन्य अभिव्यक्ति सामान्य रूप में नहीं है।

किसी तार्किक अभिव्यक्ति को गैर-विशिष्ट रूप से एक तार्किक रूप से समतुल्य अभिव्यक्ति के रूप में सामान्य रूप में परिवर्तित किया जा सकता है ( यह एल्गोरिथ्म देखें )। आपको उस विशेष एल्गोरिथ्म का उपयोग करने की आवश्यकता नहीं है।

इनपुट:

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

आउटपुट:

किसी भी सुविधाजनक प्रारूप में फिर से सामान्य सामान्य रूप में सूत्र। यह आपके इनपुट के समान प्रारूप में होने की आवश्यकता नहीं है, लेकिन यदि कोई अंतर हो तो आपको समझाना चाहिए।

परीक्षण के मामलों:

P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))

टिप्पणियाँ:

  1. यदि इनपुट एक्सप्रेशन एक टॉटोलॉजी है, तो एक मान्य आउटपुट होगा। इसी तरह, यदि इनपुट अभिव्यक्ति एक विरोधाभास है, तो एक वैध आउटपुट होगा।
  2. आपके इनपुट और आउटपुट प्रारूप दोनों के पास सभी संभावित तार्किक अभिव्यक्तियों को व्यक्त करने में सक्षम संचालन का एक सुव्यवस्थित क्रम होना चाहिए। आपको किसी प्रकार के कोष्ठक की आवश्यकता हो सकती है।
  3. आप तार्किक कार्यों के लिए infix, उपसर्ग या पोस्टफ़िक्स संकेतन के किसी भी अच्छी तरह से परिभाषित विकल्प का उपयोग कर सकते हैं। यदि आपकी पसंद मानक से भिन्न है (नकारात्मकता उपसर्ग है, तो बाकी सब infix हैं), कृपया अपने उत्तर में स्पष्ट करें।
  4. संयोजी सामान्य रूप सामान्य रूप से विशिष्ट नहीं है (पुन: व्यवस्थित होने तक भी नहीं)। आपको केवल एक वैध फॉर्म का उत्पादन करने की आवश्यकता है ।
  5. हालाँकि, आप परमाणु अभिव्यक्तियों का प्रतिनिधित्व करते हैं, वे तार्किक स्थिरांक, ऑपरेटर और समूहन प्रतीकों (यदि आपके पास हैं) से अलग होना चाहिए।
  6. अंतर्निर्मित सामान्य रूप की गणना करने वाले अंतर्निहित इन्स को अनुमति दी जाती है।
  7. मानक खामियों को मना किया जाता है।
  8. यह ; सबसे छोटा जवाब (बाइट्स में) जीतता है।


1
CNF को पुन: क्रमबद्ध करने के लिए अद्वितीय नहीं है: समतुल्य अभिव्यक्तियाँ Pऔर (P ∨ Q) ∧ (P ∨ (¬Q))दोनों सामान्य सामान्य रूप में हैं।
ग्रेग मार्टिन

1
टॉटोलॉजी / विरोधाभास के लिए जाँच करना CNF परिवर्तन से असंबंधित एक दूसरा कार्य है, इसलिए मैं इस आवश्यकता को छोड़ने का सुझाव दूंगा और अपनी चुनौती में डालूँगा।
लैकोनी

@ लायकोनी बहुत सच है। मैंने यह कहने के लिए प्रश्न को अपडेट किया कि वे आवश्यक आउटपुट के बजाय टॉटोलॉजी और विरोधाभास के लिए संभावित आउटपुट हैं।
ngenisis

जवाबों:



8

तुम मुझसे नफरत करने जा रहे हो ...।

गणितज्ञ, 23 बाइट्स

#~BooleanConvert~"CNF"&

इनपुट का उपयोग करेगा Trueऔर Falseके बजाय और बहुत सवाल का अंकन के समान दिखाई देगें, लेकिन अन्यथा: पात्रों के सभी ¬, , , , और मेथेमेटिका (में पहचाने जाते हैं जब साथ UTF-8 वर्णों 00AC, F523, 29E6, 2227 इनपुट , और 2228, क्रमशः), और कोष्ठक आपकी अपेक्षा के अनुरूप काम करते हैं।

डिफ़ॉल्ट रूप से, आउटपुट Mathematica के पसंदीदा प्रतीकों का उपयोग करेगा: उदाहरण के लिए, अंतिम परीक्षण मामले के (! P || ! Q || R) && (! P || Q || ! R)बजाय आउटपुट होगा ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))। हालाँकि, फ़ंक्शन को बदल रहा है

TraditionalForm[#~BooleanConvert~"CNF"]&

उत्पादन बहुत सुंदर लग रहा है और इन सामान्य प्रतीकों के अनुरूप होगा:

पारंपरिक रूप


2

जावास्क्रिप्ट (ईएस 6), 127 बाइट्स

f=(s,t='',p=s.match(/[A-Z]/),r=RegExp(p,'g'))=>p?'('+f(s.replace(r,1),t+'|'+p)+')&('+f(s.replace(r,0),t+'|!'+p)+')':eval(s)?1:0+t

I / O प्रारूप इस प्रकार है (पूर्ववर्ती क्रम में):

  • (: (
  • ): )
  • : 1
  • : 0
  • ¬: !
  • : <=
  • : ==
  • : &
  • : |

उदाहरण:

P&(P<=R) -> ((1)&(0|P|!R))&((0|!P|R)&(0|!P|!R))
P==(!P) -> (0|P)&(0|!P)
(!P)|(Q==(P&R)) -> (((1)&(0|P|Q|!R))&((0|P|!Q|R)&(1)))&(((1)&(1))&((1)&(1)))

इस कार्य को सामान्य रूप से अलग करने के लिए तुच्छ रूप से फिर से लिखा गया है:

f=(s,t='',p=s.match(/[A-Z]/),r=RegExp(p,'g'))=>p?'('f(s.replace(r,1),t+'&'+p)+')|('+f(s.replace(r,0),t+'&!'+p)+')':eval(s)?1+t:0

8 बाइट्स को इस संस्करण से बचाया जा सकता है अगर मुझे आउटपुट पर भी उपरोक्त पूर्वधारणा को स्वीकार करने की अनुमति दी जाती है, जो सभी कोष्ठकों को आउटपुट उदाहरणों से हटा देगा:

P&(P<=R) -> ((1&P&R)|(0))|((0)|(0))
P==(!P) -> (0)|(0)
(!P)|(Q==(P&R)) -> (((1&P&Q&R)|(0))|((0)|(1&P&!Q&!R)))|(((1&!P&Q&R)|(1&!P&Q&!R))|((1&!P&!Q&R)|(1&!P&!Q&!R)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.