मूल्यांकन द्वारा सामान्यीकरण: Difference between revisions
No edit summary |
No edit summary |
||
(6 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
[[प्रोग्रामिंग भाषा]] में [[प्रोग्रामिंग भाषाओं के औपचारिक शब्दार्थ]] | [[प्रोग्रामिंग भाषा]] में [[प्रोग्रामिंग भाषाओं के औपचारिक शब्दार्थ]] मूल्यांकन द्वारा सामान्यीकरण (एनबीई) लैम्ब्डा कैलकुलस में शब्दों के [[बीटा सामान्य रूप]] को प्राप्त करने की एक शैली है। एक शब्द को पहले λ-अवधि संरचना के एक सांकेतिक मॉडल में व्याख्या किया जाता है और फिर एक विहित (β-सामान्य और η-लॉन्ग) प्रतिनिधि को पुनर्स्थापना द्वारा निरूपित किया जाता है। इस तरह के एक अनिवार्य रूप से सिमेंटिक पराभव-मुक्त दृष्टिकोण अधिक पारंपरिक सिंटैक्टिक कमी-आधारित सामान्यीकरण के वर्णन से भिन्न होता है जो एक शब्द पुनर्लेखन प्रणाली में कमी के रूप में होता है जहां λ-नियमो के अंदर β-कटौती की अनुमति होती है। | ||
एनबीई को पहली बार केवल टाइप किए गए लैम्ब्डा कैलकुस के लिए वर्णित किया गया था।<ref name="berger schwichtenberg lics-91">{{cite journal|author=Berger, Ulrich|author2=[[Helmut Schwichtenberg|Schwichtenberg, Helmut]] |year=1991|title=An inverse of the evaluation functional for typed λ-calculus|journal=[[Logic in Computer Science|LICS]]}}</ref> इसके बाद से इसे | एनबीई को पहली बार केवल टाइप किए गए लैम्ब्डा कैलकुस के लिए वर्णित किया गया था।<ref name="berger schwichtenberg lics-91">{{cite journal|author=Berger, Ulrich|author2=[[Helmut Schwichtenberg|Schwichtenberg, Helmut]] |year=1991|title=An inverse of the evaluation functional for typed λ-calculus|journal=[[Logic in Computer Science|LICS]]}}</ref> इसके बाद से इसे अशक्त प्रकार की प्रणालियों जैसे कि [[अनटाइप्ड लैम्ब्डा कैलकुलस]] दोनों में विस्तारित किया गया है<ref name="filinski rohde fossacs-05">{{cite conference|last1=Filinski|first1=Andrzej|last2=Rohde|first2=Henning Korsholm|year=2005|title=मूल्यांकन द्वारा अनटाइप्ड नॉर्मलाइजेशन का एक डेनोटेशनल अकाउंट|url=https://tidsskrift.dk/brics/article/view/21870|book-title=Foundations of Software Science and Computation Structures (FOSSACS)|volume=10|issue=40|doi=10.7146/brics.v12i4.21870}}</ref> एक [[डोमेन सिद्धांत]] दृष्टिकोण का उपयोग करना और मार्टिन-लोफ प्रकार सिद्धांत के कई रूपों जैसे समृद्ध प्रकार की प्रणालियों के लिए है ।<ref name="coquand dybjer mscs-97">{{cite journal|last1=Coquand|first1=Thierry|last2=Dybjer|first2=Peter|journal=Mathematical Structure in Computer Science|year=1997|volume=7|issue=1|pages=75-94|title=Intuitionistic model constructions and normalization proofs}}</ref><ref name="abel aehlig dybjer mfps-07">{{cite journal|author=Abel, Andreas|author2=Aehlig, Klaus |author3=Dybjer, Peter |year=2007|title=Normalization by Evaluation for Martin-Löf Type Theory with One Universe|url=http://www.tcs.informatik.uni-muenchen.de/~abel/nbemltt.pdf|journal=[[Mathematical Foundations of Programming Semantics|MFPS]]}}</ref><ref name="abel coquand dybjer lics-07">{{cite journal|author=Abel, Andreas|author2=Coquand, Thierry |author3=Dybjer, Peter |year=2007|title=Normalization by Evaluation for Martin-Löf Type Theory with Typed Equality Judgements|url=http://www.cse.chalmers.se/~peterd/papers/NbeMLTTEqualityJudgements.pdf|journal=[[Logic in Computer Science|LICS]]}}</ref><ref name="gratzer sterling birkedal icpf-19">{{cite journal|author=Gratzer, Daniel|author2=Sterling, Jon |author3=Birkedal, Lars |year=2019|title=एक मोडल डिपेंडेंट टाइप थ्योरी को लागू करना|url=https://jozefg.github.io/papers/2019-implementing-modal-dependent-type-theory.pdf|journal=[[International Conference on Functional Programming|ICFP]]}}</ref> | ||
== रूपरेखा == | == रूपरेखा == | ||
बस टाइप किए गए लैम्ब्डा कैलकुस पर विचार करें | बस टाइप किए गए लैम्ब्डा कैलकुस पर विचार करें जहां प्रकार τ मूल प्रकार (α), कार्य प्रकार (→), या उत्पाद (×) हो सकते हैं जो निम्न बैकस-नौर फॉर्म व्याकरण द्वारा दिए गए हैं (→ सदैव की तरह दाईं ओर संबद्ध): | ||
:( | :: (Types) τ ::= α | τ<sub>1</sub> → τ<sub>2</sub> | τ<sub>1</sub> × τ<sub>2</sub> | ||
इन्हें मेटा-लैंग्वेज में [[ डेटा प्रकार |डेटा प्रकार]] के रूप में | इन्हें मेटा-लैंग्वेज में [[ डेटा प्रकार |डेटा प्रकार]] के रूप में प्रयुक्त किया जा सकता है; उदाहरण के लिए [[मानक एमएल]] के लिए हम इसका उपयोग कर सकते हैं: | ||
<syntaxhighlight lang="sml"> | <syntaxhighlight lang="sml"> | ||
datatype ty = Basic of string | datatype ty = Basic of string | ||
Line 15: | Line 15: | ||
| Prod of ty * ty | | Prod of ty * ty | ||
</syntaxhighlight> | </syntaxhighlight> | ||
नियमो को दो स्तरों पर परिभाषित किया गया है।<ref name="danvy popl 96">{{cite journal|first=Olivier |last=Danvy |author-link=Olivier Danvy |title=टाइप-निर्देशित आंशिक मूल्यांकन|url=ftp://ftp.daimi.au.dk/pub/empl/danvy/Papers/danvy-popl96.ps.gz|format=[[gzip]]ped [[PostScript]]|year=1996|pages=242–257|journal=[[Principles of Programming Languages|POPL]]}}</ref> निचला सिंटैक्टिक स्तर (कभी-कभी गतिशील स्तर कहा जाता है) वह प्रतिनिधित्व है जिसे सामान्य बनाना चाहता है। | |||
:( | :: (Syntax Terms) ''s'',''t'',… ::= '''var''' ''x'' | '''lam''' (''x'', ''t'') | '''app''' (''s'', ''t'') | '''pair''' (''s'', ''t'') | '''fst''' ''t'' | '''snd''' ''t'' | ||
यहाँ 'lam'/'app' (resp. 'pair'/'fst','snd') → (resp. ×) के लिए | यहाँ 'l '''lam'''/'''app''' (resp. '''pair'''/'''fst''','''snd''') → (resp. ×) के लिए परिचय [[उन्मूलन नियम]] रूप हैं और x [[ चर (प्रोग्रामिंग) |चर (प्रोग्रामिंग)]] हैं। इन नियमो को मेटा-भाषा में प्रथम-क्रम तर्क | प्रथम-क्रम डेटा प्रकार के रूप में प्रयुक्त करने का उद्देश्य है: | ||
<syntaxhighlight lang="sml"> | <syntaxhighlight lang="sml"> | ||
Line 26: | Line 26: | ||
| pair of tm * tm | fst of tm | snd of tm | | pair of tm * tm | fst of tm | snd of tm | ||
</syntaxhighlight> | </syntaxhighlight> | ||
मेटा-लैंग्वेज में (क्लोज्ड) | मेटा-लैंग्वेज में (क्लोज्ड) नियम का डेनोटेशनल सिमेंटिक्स मेटा-लैंग्वेज की विशेषताओं के संदर्भ में सिंटैक्स के निर्माण की व्याख्या करता है; इस प्रकार लैम की व्याख्या अमूर्त के रूप में की जाती है ऐप को एप्लिकेशन आदि के रूप में निर्मित शब्दार्थ वस्तुएँ इस प्रकार हैं: | ||
:( | :: (Semantic Terms) ''S'',''T'',… ::= '''LAM''' (λ''x''. ''S'' ''x'') | '''PAIR''' (''S'', ''T'') | '''SYN''' ''t'' | ||
ध्यान दें कि शब्दार्थ में कोई चर या उन्मूलन रूप नहीं हैं | ध्यान दें कि शब्दार्थ में कोई चर या उन्मूलन रूप नहीं हैं उन्हें सिंटैक्स के रूप में दर्शाया जाता है। इन सिमेंटिक वस्तु को निम्न डेटाटाइप द्वारा दर्शाया गया है: | ||
<syntaxhighlight lang="sml"> | <syntaxhighlight lang="sml"> | ||
Line 37: | Line 37: | ||
| SYN of tm | | SYN of tm | ||
</syntaxhighlight> | </syntaxhighlight> | ||
टाइप-इंडेक्स्ड | टाइप-इंडेक्स्ड फलन की एक जोड़ी है जो सिंटैक्टिक और सिमेंटिक लेयर के बीच आगे और पीछे चलती है। पहला कार्य सामान्यतः ↑<sub>τ</sub> लिखा जाता है सिंटैक्स शब्द को शब्दार्थ में दर्शाता है जबकि दूसरा शब्दार्थ को वाक्य-विन्यास के रूप में दर्शाता है (↓<sup>τ</sup> के रूप में लिखा गया है) उनकी परिभाषाएँ पारस्परिक रूप से पुनरावर्ती हैं: | ||
<math> | |||
\begin{align} | \begin{align} | ||
\uparrow_{\alpha} t &= \mathbf{SYN}\ t \\ | \uparrow_{\alpha} t &= \mathbf{SYN}\ t \\ | ||
Line 53: | Line 53: | ||
\mathbf{pair}\ (\downarrow^{\tau_1} S, \downarrow^{\tau_2} T) | \mathbf{pair}\ (\downarrow^{\tau_1} S, \downarrow^{\tau_2} T) | ||
\end{align} | \end{align} | ||
</math | </math> | ||
इन परिभाषाओं को मेटा-भाषा में आसानी से कार्यान्वित किया जाता है: | इन परिभाषाओं को मेटा-भाषा में आसानी से कार्यान्वित किया जाता है: | ||
Line 81: | Line 81: | ||
| reify (Basic _) (SYN t) = t | | reify (Basic _) (SYN t) = t | ||
</syntaxhighlight> | </syntaxhighlight> | ||
प्रकार की संरचना पर [[गणितीय प्रेरण]] द्वारा | प्रकार की संरचना पर [[गणितीय प्रेरण]] द्वारा यह इस प्रकार है कि यदि सिमेंटिक वस्तु ''S'' टाइप τ के एक अच्छी तरह से टाइप किए गए शब्द को दर्शाता है तो वस्तु को संशोधित करना (अर्थात ↓<sup>τ</sup> S) s का β-सामान्य η-लंबा रूप उत्पन्न करता है। इसलिए जो कुछ बचा है वह प्रारंभिक शब्दार्थ व्याख्या S को एक वाक्यात्मक शब्द s से बनाना है। यह ऑपरेशन ∥''s''∥<sub>Γ</sub> लिखा गया है जहां Γ बाइंडिंग का संदर्भ है केवल शब्द संरचना पर प्रेरण द्वारा आगे बढ़ता है: | ||
<math> | |||
\begin{align} | \begin{align} | ||
\| \mathbf{var}\ x \|_\Gamma &= \Gamma(x) \\ | \| \mathbf{var}\ x \|_\Gamma &= \Gamma(x) \\ | ||
Line 97: | Line 97: | ||
T \text{ where } \|t\|_\Gamma = \mathbf{PAIR}\ (S, T) | T \text{ where } \|t\|_\Gamma = \mathbf{PAIR}\ (S, T) | ||
\end{align} | \end{align} | ||
</math | </math> | ||
कार्यान्वयन में: | कार्यान्वयन में: | ||
Line 122: | Line 122: | ||
PAIR (S, T) => T) | PAIR (S, T) => T) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
ध्यान दें कि कई गैर-संपूर्ण | ध्यान दें कि कई गैर-संपूर्ण स्थिति हैं; चूँकि यदि एक बंद अच्छी तरह से टाइप किए गए शब्द पर प्रयुक्त किया जाता है तो इनमें से कोई भी अनुपस्थित स्थिति कभी सामने नहीं आता है। बंद नियमो पर एनबीई ऑपरेशन तब होता है: | ||
<syntaxhighlight lang="sml"> | <syntaxhighlight lang="sml"> | ||
Line 128: | Line 128: | ||
fun nbe a t = reify a (meaning empty t) | fun nbe a t = reify a (meaning empty t) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
इसके उपयोग के उदाहरण के रूप में | इसके उपयोग के उदाहरण के रूप में वाक्य-विन्यास शब्द <code>SKK</code> पर विचार करें नीचे परिभाषित: | ||
<syntaxhighlight lang="sml"> | <syntaxhighlight lang="sml"> | ||
Line 135: | Line 135: | ||
val SKK = app (app (S, K), K) | val SKK = app (app (S, K), K) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यह [[संयोजन तर्क]] में [[पहचान समारोह]] का प्रसिद्ध एन्कोडिंग है। पहचान प्रकार पर इसे सामान्यीकृत करने से यह उत्पन्न होता है: | यह [[संयोजन तर्क]] में [[पहचान समारोह|पहचान कार्य]] का प्रसिद्ध एन्कोडिंग है। पहचान प्रकार पर इसे सामान्यीकृत करने से यह उत्पन्न होता है: | ||
<syntaxhighlight lang="sml"> | <syntaxhighlight lang="sml"> | ||
Line 141: | Line 141: | ||
val it = lam ("v0",var "v0") : tm | val it = lam ("v0",var "v0") : tm | ||
</syntaxhighlight> | </syntaxhighlight> | ||
परिणाम वास्तव में η-लंबे रूप में है | परिणाम वास्तव में η-लंबे रूप में है जैसा कि इसे एक अलग पहचान प्रकार पर सामान्यीकृत करके आसानी से देखा जा सकता है: | ||
<syntaxhighlight lang="sml"> | <syntaxhighlight lang="sml"> | ||
Line 151: | Line 151: | ||
== विविधताएं == | == विविधताएं == | ||
अवशिष्ट सिंटैक्स में नामों के | अवशिष्ट सिंटैक्स में नामों के अतिरिक्त डी ब्रुजन स्तरों का उपयोग करना<code>reify</code> एक विशुद्ध रूप से कार्यात्मक बनाता है जिसमें <code>fresh_var</code>की कोई आवश्यकता नहीं है<ref name="filinski ppdp-99">{{cite conference|title=टाइप-डायरेक्टेड आंशिक मूल्यांकन का सिमेंटिक खाता|last1=Filinski|first1=Andrzej|book-title=Principles and Practice of Declarative Programming|url=https://tidsskrift.dk/brics/article/view/20074|doi=10.7146/brics.v6i17.20074}}</ref>। | ||
अवशिष्ट शर्तों का डेटा प्रकार सामान्य रूप में अवशिष्ट शर्तों का डेटा प्रकार भी हो सकता है। <code>reify</code>का प्रकार (और इसलिए <code>nbe</code>का) तब यह स्पष्ट करता है कि परिणाम सामान्यीकृत है। और यदि सामान्य रूपों का डेटाटाइप टाइप किया जाता है, तो <code>reify</code>का प्रकार (और इसलिए <code>nbe</code>का) यह स्पष्ट करता है कि सामान्यीकरण टाइप संरक्षित है।<ref name="danvy rhiger rose jfp-01">{{cite journal|last1=Danvy|first1=Olivier|last2=Rhiger|first2=Morten|last3=Rose|first3=Kristoffer|journal=[[Journal of Functional Programming]]|year=2001|volume=11|issue=6|pages=673-680|title=टाइप किए गए सार सिंटेक्स के साथ मूल्यांकन द्वारा सामान्यीकरण|url=https://tidsskrift.dk/brics/article/view/20473}}</ref> | |||
== यह भी देखें == | मूल्यांकन द्वारा सामान्यीकरण भी [[सीमांकित निरंतरता]] ऑपरेटरों <code>shift</code> और <code>reset</code> का उपयोग करके रकम (<code>+</code>)<ref name="danvy popl 96" /> के साथ सरल रूप से टाइप किए गए लैम्ब्डा कैलकुलस को मापता है।<ref name="danvy filinski lfp-90">{{cite conference|title=अमूर्त नियंत्रण|last1=Danvy|first1=Olivier|last2=Filinski|first2=Andrzej|book-title=LISP and Functional Programming|year=1990|pages=151–160|isbn=0-89791-368-X|doi=10.1145/91556.91622|s2cid=6426191|doi-access=free }}</ref> | ||
== यह भी देखें == | |||
* [[MINLOG]], एक प्रमाण सहायक जो | * [[MINLOG|मिनलॉग]], एक प्रमाण सहायक जो एनबीई को अपने पुनर्लेखन इंजन के रूप में उपयोग करता है। | ||
== संदर्भ == | == संदर्भ == | ||
Line 166: | Line 164: | ||
{{reflist}} | {{reflist}} | ||
{{DEFAULTSORT:Normalisation By Evaluation}} | {{DEFAULTSORT:Normalisation By Evaluation}} | ||
[[Category:Created On 18/05/2023|Normalisation By Evaluation]] | |||
[[Category:Machine Translated Page|Normalisation By Evaluation]] | |||
[[Category: Machine Translated Page]] | [[Category:Pages with script errors|Normalisation By Evaluation]] | ||
[[Category: | [[Category:Templates Vigyan Ready]] | ||
[[Category:प्रोग्रामिंग भाषा शब्दार्थ|Normalisation By Evaluation]] | |||
[[Category:लैम्ब्डा कैलकुलस|Normalisation By Evaluation]] |
Latest revision as of 14:53, 12 June 2023
प्रोग्रामिंग भाषा में प्रोग्रामिंग भाषाओं के औपचारिक शब्दार्थ मूल्यांकन द्वारा सामान्यीकरण (एनबीई) लैम्ब्डा कैलकुलस में शब्दों के बीटा सामान्य रूप को प्राप्त करने की एक शैली है। एक शब्द को पहले λ-अवधि संरचना के एक सांकेतिक मॉडल में व्याख्या किया जाता है और फिर एक विहित (β-सामान्य और η-लॉन्ग) प्रतिनिधि को पुनर्स्थापना द्वारा निरूपित किया जाता है। इस तरह के एक अनिवार्य रूप से सिमेंटिक पराभव-मुक्त दृष्टिकोण अधिक पारंपरिक सिंटैक्टिक कमी-आधारित सामान्यीकरण के वर्णन से भिन्न होता है जो एक शब्द पुनर्लेखन प्रणाली में कमी के रूप में होता है जहां λ-नियमो के अंदर β-कटौती की अनुमति होती है।
एनबीई को पहली बार केवल टाइप किए गए लैम्ब्डा कैलकुस के लिए वर्णित किया गया था।[1] इसके बाद से इसे अशक्त प्रकार की प्रणालियों जैसे कि अनटाइप्ड लैम्ब्डा कैलकुलस दोनों में विस्तारित किया गया है[2] एक डोमेन सिद्धांत दृष्टिकोण का उपयोग करना और मार्टिन-लोफ प्रकार सिद्धांत के कई रूपों जैसे समृद्ध प्रकार की प्रणालियों के लिए है ।[3][4][5][6]
रूपरेखा
बस टाइप किए गए लैम्ब्डा कैलकुस पर विचार करें जहां प्रकार τ मूल प्रकार (α), कार्य प्रकार (→), या उत्पाद (×) हो सकते हैं जो निम्न बैकस-नौर फॉर्म व्याकरण द्वारा दिए गए हैं (→ सदैव की तरह दाईं ओर संबद्ध):
- (Types) τ ::= α | τ1 → τ2 | τ1 × τ2
इन्हें मेटा-लैंग्वेज में डेटा प्रकार के रूप में प्रयुक्त किया जा सकता है; उदाहरण के लिए मानक एमएल के लिए हम इसका उपयोग कर सकते हैं:
datatype ty = Basic of string
| Arrow of ty * ty
| Prod of ty * ty
नियमो को दो स्तरों पर परिभाषित किया गया है।[7] निचला सिंटैक्टिक स्तर (कभी-कभी गतिशील स्तर कहा जाता है) वह प्रतिनिधित्व है जिसे सामान्य बनाना चाहता है।
- (Syntax Terms) s,t,… ::= var x | lam (x, t) | app (s, t) | pair (s, t) | fst t | snd t
यहाँ 'l lam/app (resp. pair/fst,snd) → (resp. ×) के लिए परिचय उन्मूलन नियम रूप हैं और x चर (प्रोग्रामिंग) हैं। इन नियमो को मेटा-भाषा में प्रथम-क्रम तर्क | प्रथम-क्रम डेटा प्रकार के रूप में प्रयुक्त करने का उद्देश्य है:
datatype tm = var of string
| lam of string * tm | app of tm * tm
| pair of tm * tm | fst of tm | snd of tm
मेटा-लैंग्वेज में (क्लोज्ड) नियम का डेनोटेशनल सिमेंटिक्स मेटा-लैंग्वेज की विशेषताओं के संदर्भ में सिंटैक्स के निर्माण की व्याख्या करता है; इस प्रकार लैम की व्याख्या अमूर्त के रूप में की जाती है ऐप को एप्लिकेशन आदि के रूप में निर्मित शब्दार्थ वस्तुएँ इस प्रकार हैं:
- (Semantic Terms) S,T,… ::= LAM (λx. S x) | PAIR (S, T) | SYN t
ध्यान दें कि शब्दार्थ में कोई चर या उन्मूलन रूप नहीं हैं उन्हें सिंटैक्स के रूप में दर्शाया जाता है। इन सिमेंटिक वस्तु को निम्न डेटाटाइप द्वारा दर्शाया गया है:
datatype sem = LAM of (sem -> sem)
| PAIR of sem * sem
| SYN of tm
टाइप-इंडेक्स्ड फलन की एक जोड़ी है जो सिंटैक्टिक और सिमेंटिक लेयर के बीच आगे और पीछे चलती है। पहला कार्य सामान्यतः ↑τ लिखा जाता है सिंटैक्स शब्द को शब्दार्थ में दर्शाता है जबकि दूसरा शब्दार्थ को वाक्य-विन्यास के रूप में दर्शाता है (↓τ के रूप में लिखा गया है) उनकी परिभाषाएँ पारस्परिक रूप से पुनरावर्ती हैं:
इन परिभाषाओं को मेटा-भाषा में आसानी से कार्यान्वित किया जाता है:
(* fresh_var : unit -> string *)
val variable_ctr = ref ~1
fun fresh_var () =
(variable_ctr := 1 + !variable_ctr;
"v" ^ Int.toString (!variable_ctr))
(* reflect : ty -> tm -> sem *)
fun reflect (Arrow (a, b)) t =
LAM (fn S => reflect b (app (t, (reify a S))))
| reflect (Prod (a, b)) t =
PAIR (reflect a (fst t), reflect b (snd t))
| reflect (Basic _) t =
SYN t
(* reify : ty -> sem -> tm *)
and reify (Arrow (a, b)) (LAM S) =
let val x = fresh_var () in
lam (x, reify b (S (reflect a (var x))))
end
| reify (Prod (a, b)) (PAIR (S, T)) =
pair (reify a S, reify b T)
| reify (Basic _) (SYN t) = t
प्रकार की संरचना पर गणितीय प्रेरण द्वारा यह इस प्रकार है कि यदि सिमेंटिक वस्तु S टाइप τ के एक अच्छी तरह से टाइप किए गए शब्द को दर्शाता है तो वस्तु को संशोधित करना (अर्थात ↓τ S) s का β-सामान्य η-लंबा रूप उत्पन्न करता है। इसलिए जो कुछ बचा है वह प्रारंभिक शब्दार्थ व्याख्या S को एक वाक्यात्मक शब्द s से बनाना है। यह ऑपरेशन ∥s∥Γ लिखा गया है जहां Γ बाइंडिंग का संदर्भ है केवल शब्द संरचना पर प्रेरण द्वारा आगे बढ़ता है:
कार्यान्वयन में:
datatype ctx = empty
| add of ctx * (string * sem)
(* lookup : ctx -> string -> sem *)
fun lookup (add (remdr, (y, value))) x =
if x = y then value else lookup remdr x
(* meaning : ctx -> tm -> sem *)
fun meaning G t =
case t of
var x => lookup G x
| lam (x, s) => LAM (fn S => meaning (add (G, (x, S))) s)
| app (s, t) => (case meaning G s of
LAM S => S (meaning G t))
| pair (s, t) => PAIR (meaning G s, meaning G t)
| fst s => (case meaning G s of
PAIR (S, T) => S)
| snd t => (case meaning G t of
PAIR (S, T) => T)
ध्यान दें कि कई गैर-संपूर्ण स्थिति हैं; चूँकि यदि एक बंद अच्छी तरह से टाइप किए गए शब्द पर प्रयुक्त किया जाता है तो इनमें से कोई भी अनुपस्थित स्थिति कभी सामने नहीं आता है। बंद नियमो पर एनबीई ऑपरेशन तब होता है:
(* nbe : ty -> tm -> tm *)
fun nbe a t = reify a (meaning empty t)
इसके उपयोग के उदाहरण के रूप में वाक्य-विन्यास शब्द SKK
पर विचार करें नीचे परिभाषित:
val K = lam ("x", lam ("y", var "x"))
val S = lam ("x", lam ("y", lam ("z", app (app (var "x", var "z"), app (var "y", var "z")))))
val SKK = app (app (S, K), K)
यह संयोजन तर्क में पहचान कार्य का प्रसिद्ध एन्कोडिंग है। पहचान प्रकार पर इसे सामान्यीकृत करने से यह उत्पन्न होता है:
- nbe (Arrow (Basic "a", Basic "a")) SKK;
val it = lam ("v0",var "v0") : tm
परिणाम वास्तव में η-लंबे रूप में है जैसा कि इसे एक अलग पहचान प्रकार पर सामान्यीकृत करके आसानी से देखा जा सकता है:
- nbe (Arrow (Arrow (Basic "a", Basic "b"), Arrow (Basic "a", Basic "b"))) SKK;
val it = lam ("v1",lam ("v2",app (var "v1",var "v2"))) : tm
विविधताएं
अवशिष्ट सिंटैक्स में नामों के अतिरिक्त डी ब्रुजन स्तरों का उपयोग करनाreify
एक विशुद्ध रूप से कार्यात्मक बनाता है जिसमें fresh_var
की कोई आवश्यकता नहीं है[8]।
अवशिष्ट शर्तों का डेटा प्रकार सामान्य रूप में अवशिष्ट शर्तों का डेटा प्रकार भी हो सकता है। reify
का प्रकार (और इसलिए nbe
का) तब यह स्पष्ट करता है कि परिणाम सामान्यीकृत है। और यदि सामान्य रूपों का डेटाटाइप टाइप किया जाता है, तो reify
का प्रकार (और इसलिए nbe
का) यह स्पष्ट करता है कि सामान्यीकरण टाइप संरक्षित है।[9]
मूल्यांकन द्वारा सामान्यीकरण भी सीमांकित निरंतरता ऑपरेटरों shift
और reset
का उपयोग करके रकम (+
)[7] के साथ सरल रूप से टाइप किए गए लैम्ब्डा कैलकुलस को मापता है।[10]
यह भी देखें
- मिनलॉग, एक प्रमाण सहायक जो एनबीई को अपने पुनर्लेखन इंजन के रूप में उपयोग करता है।
संदर्भ
- ↑ Berger, Ulrich; Schwichtenberg, Helmut (1991). "An inverse of the evaluation functional for typed λ-calculus". LICS.
- ↑ Filinski, Andrzej; Rohde, Henning Korsholm (2005). "मूल्यांकन द्वारा अनटाइप्ड नॉर्मलाइजेशन का एक डेनोटेशनल अकाउंट". Foundations of Software Science and Computation Structures (FOSSACS). Vol. 10. doi:10.7146/brics.v12i4.21870.
- ↑ Coquand, Thierry; Dybjer, Peter (1997). "Intuitionistic model constructions and normalization proofs". Mathematical Structure in Computer Science. 7 (1): 75–94.
- ↑ Abel, Andreas; Aehlig, Klaus; Dybjer, Peter (2007). "Normalization by Evaluation for Martin-Löf Type Theory with One Universe" (PDF). MFPS.
- ↑ Abel, Andreas; Coquand, Thierry; Dybjer, Peter (2007). "Normalization by Evaluation for Martin-Löf Type Theory with Typed Equality Judgements" (PDF). LICS.
- ↑ Gratzer, Daniel; Sterling, Jon; Birkedal, Lars (2019). "एक मोडल डिपेंडेंट टाइप थ्योरी को लागू करना" (PDF). ICFP.
- ↑ 7.0 7.1 Danvy, Olivier (1996). "टाइप-निर्देशित आंशिक मूल्यांकन" (gzipped PostScript). POPL: 242–257.
- ↑ Filinski, Andrzej. "टाइप-डायरेक्टेड आंशिक मूल्यांकन का सिमेंटिक खाता". Principles and Practice of Declarative Programming. doi:10.7146/brics.v6i17.20074.
- ↑ Danvy, Olivier; Rhiger, Morten; Rose, Kristoffer (2001). "टाइप किए गए सार सिंटेक्स के साथ मूल्यांकन द्वारा सामान्यीकरण". Journal of Functional Programming. 11 (6): 673–680.
- ↑ Danvy, Olivier; Filinski, Andrzej (1990). "अमूर्त नियंत्रण". LISP and Functional Programming. pp. 151–160. doi:10.1145/91556.91622. ISBN 0-89791-368-X. S2CID 6426191.