व्याकरण के माध्यम से गणना के कौन से मॉडल व्यक्त किए जा सकते हैं?


18

क्या यह व्याकरण कार्यक्रमों का सुधार है ? पिछले Vag और टिप्पणीकारों से कई सुझावों के साथ पूछा ।

किस तरह से एक व्याकरण को गणना के मॉडल को निर्दिष्ट करने के रूप में देखा जा सकता है? यदि, उदाहरण के लिए, हम एक सरल संदर्भ-मुक्त व्याकरण लेते हैं

G ::= '1' -> '0' '+' '1'
      '1' -> '1' '+' '0'
      '2' -> '2' '+' '0'
      '2' -> '1' '+' '1'
      '2' -> '0' '+' '2'
      '3' -> '3' '+' '0'
      '3' -> '2' '+' '1'
      '3' -> '1' '+' '2'
      '3' -> '1' '+' '2'

यह मानते हुए कि पार्सर टर्मिनल और नॉनटर्मिनल प्रतीकों के बीच अंतर नहीं करता है जैसा कि मैंने यहां प्रदर्शित किया है, फिर 3 तक की संख्या के लिए सरल अंकगणितीय प्रदर्शन करना संभव है।

उदाहरण के लिए, स्ट्रिंग लें

"2 + 0 + 1"

इस स्ट्रिंग पर एक LR (1) पार्सर को चलाने से हमें निम्नलिखित ठोस सिंटैक्स ट्री देना चाहिए जहां गणना का परिणाम पेड़ की जड़ में जमा होता है:

           '3'
         /  |  \
        /   |   \
      '2'  '+'  '1'
     / | \
    /  |  \
  '2' '+' '0' 

इस प्रकार, यदि हम एक प्रोग्रामर होने के लिए एक व्याकरण लेते हैं और कंपाइलर होने के लिए एक पार्सर जनरेटर है , तो क्या हम व्याकरण विनिर्देश भाषा को प्रोग्रामिंग भाषा के रूप में देख सकते हैं ?

इसके अलावा, क्या हम व्याकरण को निर्दिष्ट करके ट्यूरिंग-पूर्ण कार्यक्रम बना सकते हैं, जैसे आप सेलेर ऑटोमेटा या लैम्ब्डा कैलकुलस के साथ ट्यूरिंग पूर्ण कार्यक्रम कैसे बना सकते हैं ?

दूसरे शब्दों में, यह ज्ञात है कि किसी भाषा को पहचानने के संदर्भ में , नियमित भाषाएं राज्य ऑटोमेटा के अनुरूप होती हैं , संदर्भ-मुक्त भाषाएं ऑटोमेटा को धक्का देती हैं , और संदर्भ-संवेदनशील भाषाएं रैखिक बाउंड ऑटोमेटा के अनुरूप होती हैं । हालाँकि, अगर हम व्याकरण को कम्प्यूटेशनल डिवाइस के रूप में देखते हैं (अर्थात उपरोक्त उदाहरण के अर्थ में कार्यक्रम ), तो हम चॉम्स्की पदानुक्रम में व्याकरण के प्रत्येक वर्ग की कम्प्यूटेशनल ताकत को कैसे वर्गीकृत करते हैं?

इसके अलावा, व्याकरण जैसे कम ज्ञात उपवर्गों के बारे में कैसे

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

G ::= S -> R0 '$'
      S -> R1 '$'
      S -> R2 '$'
      R0 -> '0'
      R0 -> R0 '+' '0'
      R1 -> '1'
      R1 -> R0 '+' '1'
      R1 -> '1' '+' R0
      R1 -> R0 '+' '1' '+' R0
      R2 -> '2'
      R2 -> R0 '+' '2'
      R2 -> '2' '+' R0
      R2 -> R0 '+' '2' '+' R0
      R2 -> R1 '+' '1'
      R2 -> R1 '+' '1' '+' R0

... ऐसा नहीं है कि यह वास्तव में कुछ भी बदलता है, लेकिन मुझे लगा कि मुझे इसका उल्लेख करना चाहिए।

संपादित करें: जब मैं गैसचे का जवाब पढ़ता हूं तो कुछ और बात सामने आती है, मेरे उदाहरण में पेड़ की प्रत्येक शाखा एक उप-संकलन का प्रतिनिधित्व करती है। यदि आप प्रत्येक उत्पादन नियम को एक फ़ंक्शन के रूप में देखते हैं जहां एलएचएस परिणाम का प्रतिनिधित्व करता है और आरएचएस अपने तर्कों का प्रतिनिधित्व करता है, तो व्याकरण की संरचना यह निर्धारित करती है कि कार्यों की रचना कैसे की जाती है।

दूसरे शब्दों में, पार्सर के संदर्भ में इसके लुकहेड तंत्र के साथ न केवल यह निर्धारित करने में मदद मिलती है कि कौन से फ़ंक्शंस ('थोरा' जैसे पैरामीट्रिक पॉलीमॉर्फिज़्म) लागू होते हैं बल्कि नए कार्यों को बनाने के लिए उन्हें एक साथ कैसे बनाया जाना चाहिए।

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


3
आप इस तरह के एक प्यारे और होनहार उपकरण, विज़ुअली पुशडाउन ऑटोमेटन (नेस्टेड वर्ड्स) का उल्लेख करना भूल गए! यह महत्वपूर्ण है क्योंकि यह लोकप्रिय प्रोग्रामिंग भाषाओं में लिखे गए कार्यक्रमों को पार्स करने में सक्षम होने के लिए rexxps पर न्यूनतम सुधार प्रतीत होता है। ( cis.upenn.edu/~alur/nw.html )
Vag

1
धन्यवाद, यह बहुत दिलचस्प है, मैंने इसे देखा नहीं है! वहाँ दूसरों के एक जोड़े मैं भी नियतात्मक संदर्भ मुक्त, पेड़ से सटे, अनुक्रमित और इतने पर की तरह छोड़ दिया है, मुझे लगा कि यह एक सवाल के लिए थोड़ा बहुत हो सकता है ... लेकिन शायद मैं उन्हें जोड़ दूंगा
रेहो लिंडेक

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

1
@ मिज़ ईमानदार होने के लिए मैं वास्तव में अनुक्रमित व्याकरण से परिचित नहीं हूं, मैंने केवल उन्हें एक विचार के रूप में जोड़ा।
रेहो लिंडके

1
मुझे लगता है कि यह विचार करने के लिए एक अच्छा विचार हो सकता है शुरू कर दिया है इस सवाल को शांत विचार-विमर्श को देखने के बजाय LtU मंच पर पोस्ट करें: P। Btw @imz, शायद इस सवाल को पढ़ना सबसे अच्छा होगा कि "व्याकरण के कौन से वर्ग किस वर्ग के साथ मेल खाते हैं, जो मार्क हम्मन के जवाब में जुका द्वारा वर्णित 'कार्यात्मक' अर्थों में कार्यक्रमों के वर्ग हैं"। शायद मुझे इसे और अधिक स्पष्ट करना चाहिए ...
रेहो लिंडके

जवाबों:


10

चॉम्स्की टाइप -0 व्याकरण और ट्यूरिंग मशीनों के बीच एक-से-एक पत्राचार होता है ।

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

अपडेट करें:

थाउ की तरह गूढ़ "ट्यूरिंग टार-पिट" भाषाओं के अलावा, विभिन्न सामान्य प्रयोजन की भाषाएं जो प्रोग्रामर को अपने स्वयं के सिंटैक्स का विस्तार करने की अनुमति देती हैं, पार्सिंग-संकलन चरण के दौरान ट्यूरिंग-पूर्ण गणना करने के लिए उपयोग किया जा सकता है।

लिस्प परिवार में, विशेष रूप से कॉमन लिस्प में भाषाएं , शायद सबसे स्पष्ट उदाहरण हैं, लेकिन यह भी, मोटे तौर पर, स्थैतिक प्रकार की जांच वाली भाषाएं जिन्हें हमेशा रोकने की आवश्यकता नहीं होती है, जैसे कि सी ++ के साथ टेम्पलेट्स , स्काला और क्यूई


लेकिन सवाल उन चीजों के बारे में है जो दूसरे तरीके से काम करते हैं: किसी को नियमों के अनुसार प्रतीकों के प्रारंभिक अनुक्रम को फिर से लिखना नहीं बल्कि परिणाम पर पहुंचना चाहिए, लेकिन इस प्रश्न में एक व्याकरण द्वारा परिभाषित अभिकलन का "परिणाम" एक प्रारंभिक है प्रतीक जो व्याकरण के नियमों के अनुसार "इनपुट" अनुक्रम का उत्पादन कर सकता है।
इम्ज़ - इवान ज़खरीशेव

2
सीnसीटी(क्षयूटी(मैंn),यूटी)टी(मैंn)=यूटी

मैं मानता हूं कि टाइप 0 व्याकरण और टीएम के बीच पत्राचार प्रश्न का एक वैध उत्तर है (विशेषकर, यदि हां / नहीं-कार्यों की गणना करने के लिए प्रतिबंधित है)। आगे के सुझाव के लिए एक व्याकरण के साथ एक मनमाना TM को मॉडल बनाने के लिए कुछ सम्मेलन शुरू करने से कि इनपुट-आउटपुट जोड़े का प्रतिनिधित्व कैसे करें मुझे लगता है कि मूल प्रश्न के अभिप्रेरित ब्याज से मेल नहीं खाते: (cont'd होने के लिए)
imz - इवान Zakhrynchev

मैं इसे मौजूदा व्याकरण के ढांचे और संगत प्रदर्शन के लिए संगत पार्सर के दोहन के लिए एक प्रश्न के रूप में समझता हूं, अर्थात, एक फ़ंक्शन च और एक व्याकरण के बीच अनुवाद के अनुमत रूप केवल हो सकते हैं: एक इनपुट I पार्स किया गया था जैसा कि एस का अर्थ है एफ ( मैं) एस =।
इम्ज़ - इवान ज़खरीशेव

1
सतही तौर पर, थ्यू प्रोग्रामिंग भाषा इस तरह के एक व्याकरण ढांचे का उपयोग करने में नहीं लगती है: हालाँकि इसमें व्याकरण जैसे नियम फिर से लिखे गए हैं, एक इनपुट से परिणाम की गणना नियमों की दिशा में जाती है, रिवर्स में नहीं। दिशा, जैसा कि रेहान चाहती है। (लेकिन शायद यह केवल प्रस्तुतियों में तीरों की दिशा बदलने की बात है: "क्यू के रूप में एक प्रतिमान" व्याकरण के रूप में इस क्यू के अर्थ में व्याकरण का अनुवाद करना केवल नियमों की दिशा बदलने के लिए हो सकता है, फिर थंडर कार्यक्रम परिणाम के रूप में शुरू प्रतीकों पर पहुंच जाएगा, यह नहीं होगा? ..)
imz - इवान Zakhryaschev

6

मेरा जवाब औपचारिक, सटीक और बिल्कुल इन-टॉपिक नहीं है। मुझे लगता है कि मार्क हम्मन का जवाब ठोस है, लेकिन आपके सवाल ने मुझे संबंधित विषय के बारे में सोचने पर मजबूर कर दिया।

व्याकरण को घटाए जाने वाले सिस्टम के विशेष मामलों में माना जा सकता है: इनपुट एक निर्णय है, और पार्स ट्री निर्णय की व्युत्पत्ति है, या प्रमाण है कि निर्णय (व्याकरणिक) नियमों के अनुसार मान्य है।

इस अर्थ में, आपका प्रश्न लॉजिक प्रोग्रामिंग / प्रूफ सर्च कम्युनिटी के कुछ हिस्से के दृष्टिकोण से संबंधित हो सकता है (मैं उदाहरण के लिए डेल मिलर के बारे में सोच रहा हूं ), जो कि प्रूफ सर्च में कम्प्यूटेशनल सामग्री है, जैसा कि अधिक क्लासिक के विपरीत है। टाइप / प्रूफ थ्योरी पॉइंट ऑफ़ व्यू जहाँ कम्प्यूटेशन प्रूफ नॉर्मलाइज़ेशन है

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


हालांकि बहुत दिलचस्प टिप्पणी। मेरा मस्तिष्क थोड़ा सा सही प्रतिक्रिया देने के लिए बहुत थक गया है, हालांकि मेरे उदाहरण में पेड़ की शाखाएं अनिवार्य रूप से उप-
संगणनाओं का

6

इसके अलावा, क्या हम व्याकरण को निर्दिष्ट करके ट्यूरिंग-पूरा कार्यक्रम बना सकते हैं ...?

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


1
मैंने निम्नलिखित तरीके से प्रश्न को समझा: रेहो को बूटोम-अप पार्सिंग प्रक्रिया (व्याकरण द्वारा परिभाषित) में रुचि है, जिसे परिणाम की गणना के रूप में देखा जा सकता है। गणना को व्याकरण के उत्पादन नियमों के विपरीत दिशा में जाने वाले भागों से परिणाम का निर्माण करना चाहिए। Refal के पुनर्लेखन नियम (IIUC, जो कि ऊपर उल्लिखित थ्यू प्रोग्रामिंग लैंग्वेज के समान है) दूसरी दिशा में जा रहा है (इनपुट से परिणाम तक)।
imz - इवान ज़खरीशेव

अब जबकि मैं इसके बारे में सोचता हूं, संदर्भ-संवेदी व्याकरण में उत्पादन नियमों के एलएचएस पर एक से अधिक प्रतीक हैं। इसलिए मुझे लगता है कि कोई वास्तविक व्यावहारिक अंतर नहीं है। संदर्भ-संवेदी भाषा के लिए एक पार्सर एक स्ट्रिंग पुनर्लेखन प्रणाली होगी, चाहे आप इसे कैसे भी देखें?
रेहो लिंडके

@ रिम ने रेहन के सवाल पर स्पष्टीकरण के लिए धन्यवाद दिया। @ रेहनो "संदर्भ-संवेदनशील भाषा के लिए एक पार्सर एक स्ट्रिंग पुनर्लेखन प्रणाली होगी, चाहे आप इसे सही तरीके से देखें?" - यह शायद समझ में आता है, हाँ।
आर्टेम पेलेनिट्सिन

लेकिन क्या Refal के पुनर्लेखन नियम गैर-नियतात्मक रूप से व्यवहार किए जाते हैं? (या अलग तरीके से कहें: क्या रिफ़्लेक्टिंग वर्किंग राइटिंग पथ की खोज में बैकट्रैकिंग करेगा?) यदि हम इस "पार्सिंग को कम्प्यूटेशन" के रूप में बदलना चाहते हैं, तो उलटी दिशा में राइटिंग नियमों के साथ दृष्टिकोण, हमें गैर-निर्धारक नियमों की आवश्यकता है; एक व्याकरण की तरह पर विचार करें S -> A a; S -> B b; A -> 0; B -> 0। यदि हम नियमों को उलट कर यह प्रोग्राम करते हैं, तो हमें 0"0a" या "0b" का मूल्यांकन करने के लिए रन टाइम पर प्रोसेसिंग के लिए अलग-अलग नियम चुनने होंगे S
imz - इवान ज़खरीशेव

6

(बस कुछ तुच्छ विचार। टिप्पणी हो सकती है, लेकिन बहुत लंबी।)

वास्तव में, आप जो वर्णन करते हैं , वह एक भाषा क्या है ("भाषा" की मानवीय समझ, इसका उद्देश्य) पर बहुत ही स्वाभाविक दृष्टिकोण के रूप में प्रभाव दिखता है और एक व्याकरण एक भाषा को कैसे परिभाषित करता है।

एक भाषा में (असीम रूप से कई) सही वाक्यात्मक रूप होते हैं जिन्हें अर्थ मान देने के लिए व्याख्या की जाती है

यदि व्याख्या कम्प्यूटेशनल है, तो किसी भाषा के वाक्य-विन्यास रूपों को ऐसे कार्यक्रमों के रूप में देखा जा सकता है जो अर्थ-संबंधी मूल्यों की गणना करते हैं।

यदि हम मानते हैं कि एक भाषा एक परिमित उपकरण के रूप में कार्यान्वित की जाती है, तो हम इस परिमित चित्रण को "व्याकरण" की भाषा कह सकते हैं। इस समझ के अनुसार, एक व्याकरण सिंटैक्स के बारे में परवाह करता है, लेकिन शब्दार्थ के बारे में भी, अर्थात, अपने भागों के मूल्यों (परमाणु भागों और उनके मूल्यों को एक "लेक्सिकॉन" में संग्रहीत) से पूरी अभिव्यक्ति के शब्दार्थक मूल्य की गणना कैसे करें ।

प्राकृतिक भाषा के कुछ सिद्धांतों में एक ऐसा रूप है (वह रूप जो उपरोक्त विचारों के अनुरूप है; यह पहले से ही @ गैसच के उत्तर में यहां उल्लेख किया गया है): एक कटौतीत्मक प्रणाली जो इनपुट की व्युत्पत्ति की खोज करती है (शब्दार्थ की गणना के साथ युग्मित) मूल्य, या प्रमाण शब्द का निर्माण; cf. करी-होर्वर्ड पत्राचार)। इसलिए, अगर हम इस तरह की प्रणालियों को देखते हैं और उन्हें व्याकरण मानते हैं, तो आपका प्रश्न तुच्छ है : ये प्रणालियां आपके द्वारा वर्णित तरीके से गणना करने के लिए बिल्कुल तैयार हैं।

जीमैं (मैं)=एसमैंएसजी

(वास्तव में, प्रोग्रामिंग भाषाओं के लिए वास्तविक संकलक वाक्य-विन्यास और शब्दार्थ दोनों के साथ एक प्रणाली की तरह दिखते हैं: वे प्रोग्राम के वाक्य-रचना रूप को एक निष्पादन योग्य में बदल देते हैं, जो प्रोग्राम का अर्थ अर्थ है, और केवल एक शुरुआती प्रतीक के लिए नहीं है व्याकरण का)


4

बस जोड़ने के लिए:

एक शुद्ध तर्क कार्यक्रम में घोषणात्मक पठन और प्रक्रियात्मक पठन है। यह रिपोर्ट इस विचार पर चर्चा करती है कि इन्हें एक व्याकरणिक रीडिंग द्वारा पूरक किया जा सकता है, जहाँ खंडों को व्याकरण के नियमों को फिर से लिखना माना जाता है। उद्देश्य यह दिखाना है कि इस दृष्टिकोण से प्रोग्रामिंग भाषाओं पर तर्क प्रोग्रामिंग से लेकर अन्य अनुसंधानों में विशेषज्ञता का स्थानांतरण होता है और इसके विपरीत। इस तरह के हस्तांतरण के कुछ उदाहरणों पर चर्चा की जाती है। दूसरी ओर प्रस्तुत व्याकरणिक दृष्टिकोण शुद्ध तर्क प्रोग्रामिंग के लिए कुछ तदर्थ एक्सटेंशन को सही ठहराता है और ऐसे एक्सटेंशन के लिए सैद्धांतिक नींव के विकास की सुविधा प्रदान करता है।

पियरे डेरान्सर्ट और जान मालुसज़िनस्की द्वारा लॉजिक प्रोग्रामिंग का एक व्याकरणिक दृश्य


जाहिर है, प्रोलॉग फीचर व्याकरण से उत्पन्न हुआ, इसलिए यह दृश्य वह है जिसने लॉजिक प्रोग्रामिंग शुरू की है।
रीयरियरपोस्ट

1

क्या कुछ के बारे में Peano नंबर की तरह:

S    -> int
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int

यह इस फॉर्म के किसी भी स्ट्रिंग (संख्या) को पहचान लेगा:

0   // zero
#0  // one
##0 // two

और यह एक नेस्टेड संरचना को वापस करना चाहिए, जिसमें गहराई की संख्या है।

लेकिन यह तब जटिल होने लगता है जब कोई केवल इसके अतिरिक्त लागू करना चाहता है:

S    -> int
int  -> sum
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int
sum  -> int "+" int

यह पूरी तरह से समझ में आता है कि यह केवल इस तरह से अच्छी तरह से गठित की पहचान करेगा:

#####0 + ####0

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

1) Nat = Zero
2) Nat = Succ Nat
3) Sum ( Succ X ) ( Y ) = Succ ( X + Y )
4) Sum Zero X = X

तीसरा नियम स्पष्ट रूप से एक परिवर्तन बताता है। क्या कोई संदर्भ-मुक्त व्याकरण के नियम में समान मात्रा में ले जाने की कल्पना कर सकता है। और यदि हां, तो कैसे?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.