# புரொலாக்



**புரோலாக்**(Prolog) என்பது நிரலிகள் (programs) எழுத பயன்படும் ஒரு கணினி மொழியாகும். குறிப்பாக, ஏரணத்தை (ஏரணம் - logic ) அடிப்படையாக வைத்து இந்த நிரலிகள் படுகின்றன. இந்த மொழி முதலில் **செயற்கை அறிவு**த் துறையில் (செயற்கை அறிவு - artificial intelligence) ஆராய்ச்சிக்காகப் பயன் படுத்தப் பட்டது. இப்பொழுது, இது மற்ற கணிப்பியல் மொழி போலவே பல பயன்பாட்டுக்கும் உதவி உள்ளதாக இருக்கின்றது.  

ஒவ்வொரு மொழிக்கும் ஒரு அடிப்படைக் கோட்பாடு உண்டு. எடுத்துக் காட்டாக, ஜாவா (Java) என்ற கணினி மொழி செயல்முறை (procedural programming) என்ற அடிப்படைக் கருத்தை வைத்து உருவாக்கப் பட்டுள்ளது. அது போலவே, புரோலாக் என்ற மொழியும் ஏரணம் (logic) என்பதை  
அடிப்படைக் கோட்பாடாக வைத்து உருவாக்கப் பட்டது. எனவே, புரொலாக் ஒரு ஏரண மொழியாகும். கீழே ஒரு எடுத்துக்காட்டு கொடுக்கப் பட்டுள்ளது.  

விளக்கங்கள் /* */ என்ற குறியீட்டுக்குள் கொடுக்கப்பட்டுள்ளன.  

(அ) **மாட்டுக்கு நான்கு கால்கள்.** /*விளக்கம்: அதாவது, ஒவ்வொரு மாட்டுக்கும் நான்கு கால்கள். */  

(ஆ) **செவலை என்பது எங்கள் மாடு.**  

வினவல்: **செவலைக்கு எத்தனை கால்கள்?** /* விளக்கம்: வினவல் - query */  

இந்தக் கேள்விக்கு விடை காண, ஏரணத்தில் ஒரு சிறு நிரலி எழுதலாம்.  
கீழே உள்ள நிரலியில், இரண்டு வரிகள் உள்ளன. ஒவ்வொரு வரியும் ஒரு (ஏரணத்தில் எழுதப்பட்ட) தொடர் (statement) ஆகும். ஒவ்வொரு வரியையும் வலது புறத்தில் இருந்து இடது புறமாகப் படிக்க வேண்டும்.  

<blockquote>  
/* ஏரண நிரலி #1 - logic program #1 */  

/* விளக்கம்: X என்பது ஒரு மாடு என்று வைத்துக்கொண்டால், X-க்கு 4 கால்கள். */  

(1) **கால்கள்(X , 4) :- மாடு(X).**  

/* செவலை என்பது ஒரு மாடு. */  

(2) **மாடு(செவலை).**  
</blockquote>  

வினவல்: **?கால்கள்(செவலை, Y)** /* செவலைக்கு Y கால்கள் என்றால், Y-இன் மதிப்பு என்ன? */  

இந்த வினவலுக்கு விடைகாண, **கால்கள்(செவலை,Y)** என்பதை எடுத்து நிரலியில் ஒவ்வொரு வரியின் இடப் புறத்திலும் பொறுத்திப் பார்க்க வேண்டும். நிரலியில் இரண்டு வரிகள் உள்ளன. (2)-ஆம் வரியில் **கால்கள்(செவலை, Y)** என்பது பொருந்தாது. ஆனால், இது (1)-ஆம் வரியில் பொருந்துவதுபோல் தெரிகின்றது. X-இன் மதிப்பு **செவலை** என்றும், Y-இன் மதிப்பு **4** என்று வைத்துக் கொண்டால், **கால்கள்(X, 4)** என்பதற்கும் **கால்கள்(செவலை, Y)** என்பதற்கும் முழுப் பொருத்தம் கிடைத்து விடுகின்றது. அதாவது, **கால்கள்(X, 4)** என்பது **கால்கள்(செவலை, 4)** என்றும், **கால்கள்(செவலை, Y)** என்பது **கால்கள்(செவலை, 4)** என்றும் ஆகின்றன. பொருத்தம் நிறைவடைகின்றது. இதில், நமக்குக் கிடைத்த சமன்பாடுகள்: X = **செவலை**, Y = **4**. **செவலை**க்கு 4 கால்களானால், (1)-ஆம் வரியின் படி, **செவலை** ஒரு மாடு என்று மெய்ப்பிக்க வேண்டும். அதாவது, **மாடு(செவலை)** என்பதை அடுத்த வினவலாக எடுத்துக் கொண்டு, நிரலியில் அது எங்கே பொருந்துகின்றது என்று பார்க்க வேண்டும். **மாடு(செவலை)** என்பது (1)-ஆம் வரியின் இடப்புறத்தில் பொருந்த வில்லை. ஆனால், நல்ல வேளையாக, (2)-ஆம் வரியில் பொருந்துகின்றது. இத்துடன் நிரலியின் செயல்பாடு (execution) முடிவடைகின்றது. நமக்கு வேண்டிய விடை முன் கூறிய சமன்பாட்டில் உள்ளது: X = செவலை, Y = 4. அதாவது, **கால்கள்(செவலை, Y)**-யில், Y-இன் மதிப்பு 4. அதாவது, செவலைக்கு 4 கால்கள்.  

ஒரு ஏரண நிரலி (logic program) இவ்வாறுதான் செயல்படுத்தப் படுகின்றது. மேல் கண்ட நிரலியை ஆங்கிலத்தில் எழுதினால், புரோலாக் நிரலி கிடைக்கும்:  

<blockquote>  
(1) legs(X,4) :- cow(X).  

(2) cow(sevalai).  
</blockquote>  

Query: ?-legs(sevalai,Y)  

எனவே, புரோலாக் (Prolog) என்ற இந்த மொழியின் அடிப்படைக் கோட்பாடுகள் (அதாவது, வேர்கள் - roots) ஏரணத்தில் உள்ளது சொல்லலாம். மேலும் பல பிற நிரலாக்க மொழிகளைப் (programming languages) போலன்றி, புரோலாக் மொழியில் ஒவ்வொரு தொடரும் (தொடர் - statement ) **மெய்** என்ற தன்மை உடையது. எடுத்துக் காட்டாக, மேலே குறிப்பிடப்பட்டுள்ள ஏரண நிரலி #1 -இல் , **மாடு(செவலை)** என்பது ஒரு மெய்யான கூற்று. அதாவது, **செவலை என்பது ஒரு மாடு** என்பது உண்மை. இது போல, புரோலாக் மொழியில் ஒவ்வொரு தொடரும் ஒரு மெய்யான கூற்று; அதாவது, மெய்யான ஒரு கூற்றைச் சாற்றுகின்றது (சாற்று - declare). அதனால், புரோலாக் மொழியை ஒரு **மெய் சாற்று மொழி** (declarative language) என்று அழைக்கலாம். இந்த நிரலியைச் செயலாற்ற (செயலாற்று - execute ) வேண்டுமாயின், நாம் ஒரு வினாவைக் கேட்க வேண்டும். இந்த வினா **வினவல்** (query ) என்று அழைக்கப் படும். எனவே, நாம் ஒரு வினவலைக் கேட்டால், புரோலாக் அந்த வினவலை ஏற்றுக் கொண்டு அதற்கு விடை கண்டு பிடிக்க முயற்சி செய்கின்றது. முயற்சியில் வெற்றி பெற்றால், விடை கொடுக்கப்படும். முயற்சி தோல்வி அடைந்தால், **தோல்வி** என்று பதில் கொடுக்கப் படும். ஏரண நிரலி #1 -இல், **?கால்கள்(செவலை, Y)** என்ற வினவலுக்கு விடை கிடைத்துள்ளது; அதாவது Y=4 என்பதுதான் அந்த விடை. ஆனால், **?கால்கள்(கன்றுக்குட்டி , Y)** என்ற வினவல் வெற்றி அடையாது. எனவே,**தோல்வி** என்று பதில் கிடைக்கும்.  

புரோலாக் என்ற இந்த ஏரண நிரலாக்க மொழி (logic programming language) முதலில் அலைன் கோல்மரார் (Alain Colmerauer) என்பவரின் குழுவால் பிரான்சிலுள்ள மார்செல் (Marseille) என்ற ஊரில் 1970களின் முற்பகுதியில் உருவாக்கப்பட்டது, மேலும் முதல் புரோலாக் அமைப்பு 1972 இல் அலைன் கால்மராவர் மற்றும் ஃபிலிப் ரௌசல் ஆகியோரால் உருவாக்கப்பட்டது.  

முதல் தர்க்க நிரலாக்க மொழிகளில் புரோலாக் ஒன்றாகும், மேலும் அதுவே அதுபோன்ற மிகவும் பிரபலமான மொழிகளில் ஒன்றாக இன்றும் விளங்குகிறது. மேலும் அதனுடன் பல இலவச மற்றும் வணிகரீதியான செயல்படுத்தல்களும் கிடைக்கின்றன. தொடக்கத்தில் இயல்பான மொழி செயலாக்கத்தையே குறிக்கோளாகக் கொண்டிருந்த இந்த மொழி, அப்போதிலிருந்து தேற்ற நிரூபணம், வல்லுநர் முறைமைகள், கேம்கள், தானியக்க பதிலளிப்பு முறைமைகள், மெய்ப்பொருள் மூல ஆராய்ச்சி மற்றும் நுண்ணிய கட்டுப்பாட்டு முறைமைகள் போன்ற பிற பகுதிகளுக்கும் விரிவாக்கப்பட்டது. தற்கால புரோலாக் சூழல்கள் வரைவியல் பயனர் இடைமுகங்கள், நிர்வாக மற்றும் நெட்வொர்க் பயன்பாடுகள் உருவாக்கத்தை ஆதரிக்கின்றன.  

## சொற்றொடர் இலக்கணம் & சொற்பொருள்

"செவலை என்பது ஒரு மாடு" என்பதைப் பல வகையாகக் குறிக்கலாம். எடுத்துக்காட்டாக, செவலை-மாடு அல்லது (செவலை)மாடு என்று குறிக்கலாம். ஏரணத்தில் மாடு(செவலை) என்று குறிக்கப்படும். எனவே, புரோலாக் மொழியிலும் மாடு(செவலை) என்றே குறிக்கப்படுகின்றது. (மாடு(செவலை) என்பதைச் செவலை ஒரு மாடு என்று படித்துக் கொள்ள வேண்டும்.) செவலை என்பது ஒரு குறிப்பிட்ட மாட்டைக் குறிக்கின்றது. அதுபோலவே, "செவலை என்பது ஒரு ஆடு" என்பதை ஆடு(செவலை), "செவலை என்பது ஒரு பன்றி" என்பதை பன்றி(செவலை) என்றும் குறித்துக் கொள்ளலாம். இனி, "X என்ற ஒன்று மாடு" என்பதை மாடு(X) என்றும், "X என்ற ஒன்று பன்றி" என்பதை பன்றி(X) என்றும் குறிக்கலாம். "ஒவ்வொரு மாட்டுக்கும் நான்கு கால்கள்" என்பதைக் குறிக்க "X என்பது ஒரு மாடு என்று ஆனால், X-க்கு 4 கால்கள்" என்று மாற்றி எழுதி, பிறகு "மாடு(X) என்பது உண்மையானால் கால்கள்(X,4)" என்று குறிக்கலாம். இதையே ஏரணத்தில் "மாடு(X) => கால்கள்(X,4)" என்று குறிப்பர். இதைக் கொஞ்சம் மாற்றி, "கால்கள்(X,4) <= மாடு(X)" என்று குறிக்கலாம். புரோலாக் மொழியில் இதை "கால்கள்(X,4) :- மாடு(X)" என்று குறிப்பர். இதை, "X-க்கு 4 கால்கள், X என்பது மாடானால்" என்று படிக்க வேண்டும். இத்துடன் செவலை என்பது ஒரு மாடு என்பதையும் சேர்த்து, ஒரு புரோலாக் நிரலி (program) தமிழில் எழுதலாம்.  

<blockquote>  
**கால்கள்(X,4) :- மாடு(X).**  

**மாடு(செவலை).**  

இதுவே ஆங்கிலத்தில்:  

**legs(X,4) :- cow(X).**  

**cow(sevalai).**  
</blockquote>  

இது போலவே, இன்னொரு நிரலியையும் எழுதலாம்:  

<blockquote>  
/* X என்பவர் Y என்பவரின் தாத்தா; X என்பவர் Z-இன் தந்தை என்றும், Z என்பவர் Y-இன் தந்தை என்றும் ஆனால். */  

**தாத்தா(X,Y) :- தந்தை(X,Z), தந்தை(Z,Y).**  

/* இடும்பன் அறிவுமணியின் தந்தை */  

**தந்தை(இடும்பன், அறிவுமணி).**  

/* அறிவுமணி எழினியின் தந்தை */  

**தந்தை(அறிவுமணி,எழினி).**  
</blockquote>  

மேற்கண்ட நிரலியில், தாத்தா, தந்தை என்பவை உறவு முறையைக் (relation) குறிக்கும் சொற்கள். இவற்றை நாம் புரோலாக் மொழியில் தொடர்பு முறை என்று சொல்கின்றோம். அதாவது, **தந்தை(இடும்பன், அறிவுமணி)** என்பதில், **தந்தை** என்பது இடும்பன் என்பவர்க்கும் அறிவுமணி என்பவர்க்கும் உள்ள தொடர்பைக் குறிப்பது. அது போலவே, **கால்கள்(X,4)** என்பதில், **கால்கள்** என்பது X-க்கும் 4-க்கும் உள்ள தொடர்பைக் குறிப்பது. எனவே, **தாத்தா**, **தந்தை**, **கால்கள்** ஆகியன தொடர்புகள் (relations) என்றழைக்கப் படும்.  

புரோலாகில், நிரல் தர்க்கமானது தொடர்புகளாகக் குறிப்பிடப்படுகின்றன, இந்த தொடர்புகளின் மீது ஒரு *வினவலை* நிகழ்த்துவதன் மூலம் ஒரு கணக்கீடு தொடங்கப்படுகிறது. தொடர்புகளும் வினவல்களும் புரோலாகின் ஒற்றைத் தரவு வகையான *உறுப்பின்* மூலம் கட்டமைக்கப்படுகின்றன. தொடர்புகள் *உட்கூறுகளால்* (க்ளாஸ்) வரையறுக்கப்படுகின்றன. ஒரு வினவல் கொடுக்கப்பட்டால், புரோலாக் எஞ்சின் புறம்பான வினவலின் ஒரு தீர்மான நிராகரிப்பைக் கண்டுபிடிக்க முயற்சிக்கும். புறம்பான வினவல் நிராகரிக்கப்படலாம் எனில், அதாவது உட்கூறுகளினை ஒன்றாக்கும் மற்றும் புறம்பான வினவலைக் கொண்டுள்ள ஒற்றைத் தொகுப்பை தவறு எனக் குறிக்கும், அனைத்து எளிய மாறிகளுக்குமான குறிப்பிடுதல் ஒன்று கண்டறியப்படுகிறது, கண்டறியப்பட்ட குறிப்பிடுதல் பயன்படுத்தப்பட்டபிறகான உண்மையான வினவலே நிரலின் தர்க்கரீதியான விளைவு என அது பின்பற்றுகிறது. இதனால் புரோலாக் (மற்றும் பிற தர்க்க நிரலாக்க மொழிகள்) குறிப்பாக தரவுத்தளம், குறிப்பியல் கணிதவியல் மற்றும் மொழி பாகுபடுத்திப் பயன்பாடுகள் ஆகியவற்றுக்கு பயன்மிக்கதாகிறது. புரோலாக் தூய்மையல்லாத பயனிலைகளை அனுமதிப்பதால், குறிப்பிட்ட சிறப்புப் பயனிலைகளின் உண்மை மதிப்பைச் சொதித்தல் என்பது, ஒரு மதிப்பை திரையில் அச்சிடுதல் போன்ற சில குறிப்பிடத்தக்க பக்க விளைவுகளை உடையதாக இருக்கலாம். இதனால், தர்க்கரீதியான நெறிமுறை வசதிப்படாத போது, நிரலாக்குநர் ஓரளவுக்கு மரபான கட்டளையிடு நிரலாக்கத்தைப் பயன்படுத்த முடிகிறது. இதில் "தூய புரோலாக்" என்னும் முழுக்க முழுக்க தர்க்கரீதியான துணைக்குழு உள்ளது, மேலும் எண்ணற்ற கூடுதல் தர்க்க அம்சங்களையும் கொண்டுள்ளது.  

### தரவு வகைகள்

புரோலாகின் ஒற்றைத் தரவு வகை *உறுப்பாகும்* . உறுப்புகள் என்பவை *அணுக்கள்* , *எண்கள்* , *மாறிகள்* அல்லது *கூட்டு உறுப்புகள்* என்பவையாக இருக்கலாம்.  

- ஓர் **அணு** என்பது எந்த பொருளுமற்ற ஒரு பொது-தேவைப் பெயராகும். <code>x</code>, <code>நீலம்</code>, <code>'டாக்கோ'</code> மற்றும் <code>'சில அணு'</code> போன்றவை அணுக்களுக்கு எடுத்துக்காட்டுகளாகும்.
- **எண்கள்** தசம எண்களாகவோ அல்லது முழு எண்களாகவோ இருக்கலாம்.
- **மாறிகள்** எழுத்துகள், எண்கள் மற்றும் அண்டர்ஸ்கோர் எழுத்துக்குறிகள் போன்றவற்றைக் கொண்ட ஒரு சரமாகக் குறிப்பிடப்படுகின்றன, இவற்றின் பெயரின் முதல் எழுத்து பேரெழுத்தில் எழுதப்படுகிறது அல்லது அண்டர்ஸ்கோரில் தொடங்குகிறது. இந்த மாறிகள் ஏதேனும் உறுப்புகளுக்கான பதிலிடங்களாக விளங்குகின்றன என்ற அம்சத்தில் இவை தர்க்கத்திலுள்ள மாறிகளைப் போலவே உள்ளன எனலாம்.
- ஒரு **கூட்டு உறுப்பு** என்பது "ஃபன்க்ட்டர்" எனப்படும் ஓர் அணு மற்றும் எண்ணற்ற "அளவுருக்கள்" ஆகியவற்றைக் கொண்டுள்ளது, அவையும் உறுப்புகளே ஆகும். கூட்டு உறுப்புகள் வழக்கமாக ஃபன்க்ட்டராக பிறை அடைப்புக்குறிக்குள் எழுதப்படுகின்றன, அவற்றையடுத்து அளவுரு உறுப்புகளின் காற்புள்ளியால் பிரிக்கப்பட்ட ஒரு பட்டியல் எழுதப்படுகிறது. அளவுருக்களின் எண்ணிக்கை உறுப்பின் எண் எனப்படுகிறது. ஓர் அணுவை எண் பூச்சியம் உள்ள கூட்டு உறுப்பாகக் கருதலாம். எடுத்துக்காட்டுகள் கூட்டு உறுப்புகளுக்கு எடுத்துக்காட்டுகள்: <code>truck_year('Mazda', 1986)</code> மற்றும் <code>'Person_Friends'(zelda,[tom,jim])</code>.

கூட்டு உறுப்புகளின் சிறப்பு நிகழ்வுகள்:  

- ஒரு *பட்டியல்* உறுப்புகளின் வரிசையான தொகுப்பாக இருப்பது. இது சதுர அடைப்புகளால் குறிப்பிடப்படுகிறது. அதில் உறுப்புகள் காற்புள்ளிகள் பிரிக்கப்படுகின்றன அல்லது வெற்றுப் பட்டியல் என்னும்பட்சத்தில் சதுர அடைப்புகளால் <code>[]</code> பிரிக்கப்படுகின்றன. எடுத்துக்காட்டுக்கு <code>[1,2,3]</code> அல்லது <code>[red,green,blue]</code>.
- *சரங்கள்* : மேற்கோள் குறிகளால் அடைக்கப்பட்ட தொடர்ச்சியான எழுத்துக்குறிகளின் தொகுப்பு (எண்ணியல்) எழுத்துக்குறிக் குறிகளின் பட்டியலுக்கு சமமாகும். அது பொதுவாக கணினி எழுத்துக்குறி குறியீடாக்கம் அல்லது கணினி யுனிகோடை ஆதரித்தால் யுனிகோடில் இருக்கும். எடுத்துக்காட்டுக்கு, <code>"to be, or not to be"</code>.

### விதிகளும் உண்மைகளும்
புரோலாக் நிரல்கள் உட்கூறுகளால் வரையறுக்கப்படும் தொடர்புகளை விவரிக்கின்றன. தூய புரோலாக் ஹார்ன் உட்கூறுகளுக்கு மட்டுமே என்ற வரம்புடையவை. உட்கூறுகளில் இரு வகைகள் உள்ளன: உண்மைகள் மற்றூம் விதிகள். ஒரு விதியானது இவ்வடிவில் இருக்கும்  

Head :- Body.  

மேலும், அது "Head is true if Body is true" எனப் படிக்கப்படும். ஒரு விதியின் முக்கியப் பகுதியில் பயனிலைகளின் அழைப்புகள் இடம்பெறும், அவை விதியின் **குறிக்கோள்கள்** என அழைக்கப்படுகின்றன. <code>,/2</code> என்ற உட்கட்டமைக்கப்பட்ட பயனிலையானது, (அதாவது <code>,</code> என்ற பெயருடைய ஒரு 2-எண் ஆப்பரேட்டர்) குறிக்கோள்களின் இணைப்பைக் குறிக்கிறது, மேலும் <code>;/2</code> என்பது பிரிப்பைக் குறிக்கிறது. இணைப்புகளும் பிரிப்புகளும் முக்கியப் பகுதிக்குள் மட்டுமே இடம்பெறும், அவை ஒரு விதியின் தலைப்பில் இடம்பெறாது.  

வெற்று முக்கியப் பகுதிகளைக் கொண்ட உட்கூறுகள் **உண்மைகள்** என அழைக்கப்படுகின்றன. ஓர் உண்மைக்கான எடுத்துக்காட்டு பின்வருமாறு:  

கேட்(டாம்).  

இது பின்வரும் விதிக்கு சமமானதாகும்:  

பூனை (டாம்) :- மெய்.  

உட்கட்டமைக்கப்பட்ட பயனிலை <code>மெய்/0</code> என்பது எப்போதுமே மெய்யாகும்.  

மேலே கூறப்பட்ட உண்மையிருக்கும்பட்சத்தில், ஒருவர் இவ்வாறு கேட்கலாம்:  

*டாம் ஒரு பூனையா?*  

?- பூனை (டாம்).  
ஆம்  

*எதெல்லாம் பூனை?*  

?- cat(X).  
X = tom  

பல உட்கட்டமைக்கப்பட்ட பயனிலைகளின் தொடர்புடைய இயல்பினால், வழக்கமாக அவற்றைப் பல திசைகளில் பயன்படுத்தமுடியும். எடுத்துக்காட்டுக்கு, <code>length/2</code> என்பதை ஒரு பட்டியலின் (<code>length(List, L)</code>, <code>List</code> எனும் பட்டியல் கொடுக்கப்பட்ட நிலையில்) நீளத்தைக் கண்டுபிடிக்கப் பயன்படுத்தலாம், அதே போல், கொடுக்கப்பட்ட நீளத்தின் (<code>length(X, 5)</code>) பட்டியல் அடிப்படையமைப்பை உருவாக்கவும் பயன்படுத்தலாம், மேலும் பட்டியல் அடிப்படையமைப்பு பட்டியல் நீளங்கள் ஆகிய இரண்டையும் (<code>length(X, L)</code>) கண்டுபிடிக்கவும் பயன்படுத்தலாம். இதே போல், <code>append/3</code> என்பதை இரண்டு பட்டியல்களை (<code>ListA</code> மற்றும் <code>ListB</code> ஆகியவை கொடுக்கப்பட்ட நிலையில், <code>append(ListA, ListB, X)</code>) இணைக்கவும் கொடுக்கப்பட்ட பட்டியலைப் பிரிக்கவும் (<code>List</code> எனும் ஒரு பட்டியல் கொடுக்கப்பட்ட நிலையில், <code>append(X, Y, List)</code>) பயன்படுத்தலாம். இந்தக் காரணத்தினால், பல புரோலாக் நிரல்களுக்கு ஒப்பீட்டில் சிறிதான ஒரு லைப்ரரி பயனிலை குழு பயன்படுத்தப்படுகிறது.  

ஒரு பொது தேவை மொழியாக, புரோலாக் பல்வேறு உட்கட்டமைக்கப்பட்ட பயனிலைகளையும் கொண்டுள்ளது, அவஒ திரும்பத் திரும்ப நிகழ்வும் செயல்களைச் செய்கின்றன, எ.கா.: உள்ளீடு/வெளியீடு, படங்களைப் பயன்படுத்துதல் மற்றும் இயக்கமுறைமையுடன் தொடர்புகொள்ளுதல். இந்த பயனிலைகளுக்கு தொடர்புடைய பொருள் கொடுக்கப்படுவதில்லை, மேலும் இவை கணினியில் இவை வழங்கும் பக்க விளைவுகளுக்குப் பயன்மிக்கவையாகும். எடுத்துக்காட்டுக்கு, <code>write/1</code> எனும் பயனிலை திரையில் ஓர் உறுப்பைக் காண்பிக்கும்.  

### மதிப்பீடு
ஒரு புரோலாக் நிரலின் செயல்படுத்தல் என்பது, பயனர் வினவல் என்னும் ஓர் ஒற்றைக் குறிக்கோளை இடுவதிலிருந்து தொடங்குகிறது. தர்க்கரீதியாக, புரோலாக் எஞ்சின் ஒரு புறம்பான வினவலின் தீர்மான நிராகரிப்பைக் கண்டறிய முயற்சிக்கிறது. புரோலாக் பயன்படுத்தும் தீர்மான முறை SLD தீர்மானம் என அழைக்கப்படுகிறது. புறம்பான வினவல் நிராகரிக்கப்பட முடியும் எனில், அது, தேவையான சரியான மாறி பிணைப்புகள் உள்ள வினவலே நிரலின் தர்க்கரீதியான விளைவு என்னும் கருத்தைப் பின்பற்றுகிறது. இந்நிகழ்வில், உருவாக்கப்பட்ட அனைத்து மாறி பிணைப்புகள் பயனருக்கு அறிவிக்கப்படுகின்றன, மேலும் அந்த வினவல் வெற்றிபெற்றதாகக் கருதப்படும். செயல்பாட்டியல் ரீதியாக, புரோலாகின் செயல்படுத்தல் உத்தியை பிற மொழிகளில் உள்ள சார்பு அழைப்புகளின் பொதுமையாக்கலாகக் கருதலாம், பல உட்கூறு தலைப்புகள் கொடுக்கப்பட்ட ஒரு அழைப்புடன் பொருந்தக்கூடும் என்பதே ஒரு வேறுபாடாகும். இந்நிகழ்வில், கணினி ஒரு தேர்வு-புள்ளியை உருவாக்குகிறது, முதல் மாற்று வழியுடன் குறிக்கோளை ஒன்றிணைக்கிறது, பின்னர் முதல் மாற்று வழியுடனான குறிக்கோள்களுடன் தொடர்ந்து செயல்படுகிறது. ஏதேனும் ஒரு குறிக்கோள் நிரலை இயக்கும் செயலில் தோல்வியடைந்தால், மிக சமீபத்திய தேர்வு-புள்ளியிலிருந்து உருவாக்கப்பட்ட அனைத்து மாறி பிணைப்புகளும் செயல்தவிர்க்கப்படுகின்றன, மேலும் தேர்வு-புள்ளியின் அடுத்த மாற்று வழியினைக் கொண்டு செயல்படுத்தல் தொடர்கிறது. இந்த செயல்படுத்தல் உத்தி காலவரிசை பின்தடமறிதல் என அழைக்கப்படுகிறது. எடுத்துக்காட்டுக்கு:  

mother_child(trude, sally).  

father_child(tom, sally).  
father_child(tom, erica).  
father_child(mike, tom).  

sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).  

parent_child(X, Y) :- father_child(X, Y).  
parent_child(X, Y) :- mother_child(X, Y).  

இது பின்வரும் வினவல் மெய் என வருவிக்க வழிசெய்கிறது:  

?- sibling(sally, erica).  
ஆம்  

இது பின்வருமாறு பெறப்படுகிறது: முதலில், <code>sibling(sally, erica)</code> வினவலுக்கான பொருத்தமான ஒரே உட்கூறு தலைப்பு முதலாவதே ஆகும், ஆகவே வினவலானது அந்த உட்கூறின் தேவையான சரியான மாறி பிணைப்புகளைக் கொண்டுள்ள முக்கியப் பகுதியை நிரூபிப்பதற்கு சமமானதாகும், அதாவது <code>(parent_child(Z,sally), parent_child(Z,erica))</code> என்ற இணைப்பு. இந்த இணைப்புகளில் இடப்புறம் உள்ள ஒன்றே நிரூபிக்கப்பட வேண்டிய அடுத்த குறிக்கோளாகும், அதாவது <code>parent_child(Z, sally)</code> என்பது. இந்த குறிக்கோளுக்கு இரு உட்கூறு தலைப்புகளும் பொருந்தும். கணினி ஒரு தேர்வு-புள்ளியை உருவாக்கி முதல் வழியை முயற்சிக்கிறது, அதன் முக்கியப் பகுதி <code>father_child(Z, sally)</code> என இருக்கும். <code>father_child(tom, sally)</code> என்ற உண்மையைப் பயன்படுத்தி இந்தக் குறிக்கோளை நிரூபிக்க முடியும், ஆகவே <code>Z = tom</code> என்ற பிணைப்பு உருவாக்கப்படுகிறது, பின்னர் மேலே கூறப்பட்ட இணைப்பின் இரண்டாம் பகுதியை நிரூபிப்பது அடுத்த குறிக்கோளாகும்: <code>parent_child(tom, erica)</code>. மீண்டும், அதற்குரிய உண்மையைப் பயன்படுத்தி இதை நிரூபிக்கலாம். அனைத்து குறிக்கோள்களும் நிரூபிக்கப்பட முடியும் என்பதால் வினவல் வெற்றியடைகிறது. வினவல் மாறிகள் எதனையும் கொண்டிருக்கவில்லை என்பதால், பயனருக்கு பிணைப்புகள் எதுவும் அறிவிக்கப்படுவதில்லை. பின்வருமாறு மாறிகளைக் கொண்ட ஒரு வினவல்:  

?- father_child(Father, Child).  

பின் தடமறிதலில் செல்லுபடியாகக்கூடிய அனைத்து பதில்களையும் கண்டறிகிறது.  

மேலே குறிப்பிட்டது போன்ற குறியீட்டுடன், <code>?- sibling(sally, sally).</code> என்ற வினவலும் வெற்றியடைகிறது. ஒருவர் விரும்பினால் தொடர்புடைய வரம்புகளை விவரிக்க கூடுதல் குறிக்கோள்களையும் செருகலாம்.  

### சுழற்சிகளும் மறுநிகழ்வுகளும்
மறுநிகழ் பயனிலைகளைப் பயன்படுத்துவதன் மூலம் மறுநிகழ் வழிமுறைகளைச் செயல்படுத்தலாம்.  

### புறம்பாக்கல்
<code>\+/1</code> என்னும் உட்கட்டமைக்கப்பட்ட புரோலாக் பயனிலை புறம்பாக்கலை தோல்வியாக வழங்குகிறது, அது ஒருபோக்கற்ற பகுத்தறிதலுக்கு அனுமதிக்கப்படுகிறது. legal(X) :- \+ illegal(X) என்னும் விதியிலுள்ள <code>\+ illegal(X)</code> என்பது  

,  

பின்வருமாறு கணக்கிடப்படுகிறது: புரோலாக் <code>illegal(X)</code> ஐ நிரூபிக்க முயற்சிக்கிறது. குறிக்கோளுக்கான நிரூபணம் கண்டறியப்பட முடிந்தால், முதல் குறிக்கோள் (அதாவது, <code>\+ illegal(X)</code>) தோல்வியடைகிறது. நிரூபணம் எதுவும் கிடைக்கவில்லை எனில், முதல் குறிக்கோள் வெற்றியடைகிறது. ஆகவே, குறிக்கோள் நிரூபிக்கப்படாவிட்டால் <code>?- \+ Goal.</code> என்ற வினவல் வெற்றியடைகிறது என்பதால், <code>\+/1</code> என்ற முன்னொட்டு ஆப்பரேட்டர் "நிரூபிக்க முடியாத" ஆப்பரேட்டர் என அழைக்கப்படுகிறது. இவ்வகை புறம்பாக்கலானது அதன் அளவுருக்கள் "உறுதியானதாக" (அதாவது மாறிகள் எதையும் கொண்டிருக்கவில்லை) இருந்தால் உறுதியானதாக இருக்கும். அளவுரு மாறிகளைக் கொண்டிருந்தால் அதன் உறுதித் தன்மை இழக்கப்படுகிறது, மேலும் நிரூபண வழிமுறை முடிகிறது. குறிப்பாக, இப்போது <code>?- legal(X).</code> என்ற வினவலை விதிப்பூர்வமான அனைத்தையும் கணக்கிடப் பயன்படுத்த முடியாது.  

## எடுத்துக்காட்டுகள்

புரோலாகில் எழுதப்பட்ட சில எடுத்துக்காட்டுகள் பின்வருமாறு:  
### Hello world
வினவலுக்கான ஓர் எடுத்துக்காட்டு:  
<source lang="prolog">  
?- write('Hello world!'), nl.  
Hello world!  
true.  

?-  
</source>  

### தொகுப்பி உகந்ததாக்கல்
எந்தக் கணக்கீட்டையும் நிலைமாற்றங்களின் தொடர்ச்சியாக அறிவிப்புத் தன்மையுடன் குறிப்பிட முடியும். எடுத்துக்காட்டாக, மூன்று உகந்ததாக்கல் நிலைகளைக் கொண்ட தொகுப்பியை ஒரு தொடக்க நிரல் மற்றும் அதன் உகந்ததாக்கப்பட்ட வடிவம் ஆகியவற்றுக்கிடையே உள்ள தொடர்பாக செயல்படுத்தலாம்:  

<source lang="prolog">  
program_optimized(Prog0, Prog) :-  
optimization_pass_1(Prog0, Prog1),  
optimization_pass_2(Prog1, Prog2),  
optimization_pass_3(Prog2, Prog).  
</source>  

அல்லது சமமான முறையில் DCG குறிப்பிடலைப் பயன்படுத்தினால்:  

<source lang="prolog">  
program_optimized --> optimization_pass_1, optimization_pass_2, optimization_pass_3.  
</source>  

### குவிக்சார்ட்
குவிக்சார்ட் வரிசைப்படுத்தல் வழிமுறை ஒரு பட்டியலை அதன் வரிசைப்படுத்தப்பட்ட பதிப்புடன் தொடர்புபடுத்துகிறது:  
<source lang="prolog">  
partition([], _, [], []).  
partition([X|Xs], Pivot, Smalls, Bigs) :-  
( X @< Pivot ->  
Smalls = [X|Rest],  
partition(Xs, Pivot, Rest, Bigs)  
; Bigs = [X|Rest],  
partition(Xs, Pivot, Smalls, Rest)  
).  

quicksort([]) --> [].  
quicksort([X|Xs])  
{ partition(Xs, X, Smaller, Bigger) },  
quicksort(Smaller), [X], quicksort(Bigger).  
</source>  

### செயல்மிகு நிரலாக்கம்
பின்வரும் புரோலாக் நிரல், பல்லுறுப்புக்கோவை நேரத்திலுள்ள இரு பட்டியல்களின் நீண்ட பொது துணைத்தொடரைக் கண்டறிய செயல்மிகு நிரலாக்கத்தைப் பயன்படுத்துகிறது. உட்கூறு தரவுத்தளம் நினைவிருத்தலுக்கு பயன்படுத்தப்படுகிறது:  
<source lang="prolog">  
:- dynamic(stored/1).  

memo(Goal) :- ( stored(Goal) -> true ; Goal, assertz(stored(Goal)) ).  

lcs([], _, []) :- !.  
lcs(_, [], []) :- !.  
lcs([X|Xs], [X|Ys], [X|Ls]) :- !, memo(lcs(Xs, Ys, Ls)).  
lcs([X|Xs], [Y|Ys], Ls) :-  
memo(lcs([X|Xs], Ys, Ls1)), memo(lcs(Xs, [Y|Ys], Ls2)),  
length(Ls1, L1), length(Ls2, L2),  
( L1 >= L2 -> Ls = Ls1 ; Ls = Ls2 ).  
</source>  

எடுத்துக்காட்டு வினவல்:  
<source lang="prolog">  
?- lcs([x,m,j,y,a,u,z], [m,z,j,a,w,x,u], Ls).  
Ls = [m, j, a, u]  
</source>  

## தொகுதிக்கூறுகள்
பெரிய நிரலாக்கத்திற்கு, வழங்குகிறது ஒரு தொகுதிக்கூறு முறையை புரோலாக் வழங்குகிறது. தொகுதிக்கூறு முறையானது ISO வினால் தரநிலையாக்கப்பட்டுள்ளது. இருப்பினும், அனைத்து புரோலாக் தொகுப்பிகளும் தொகுதிக்கூறு முறைகளை ஆதரிப்பதில்லை மேலும் பெரிய புரோலாக் தொகுப்பிகளின் தொகுதிக்கூறு முறைகளுக்கிடையே இணக்கத்தன்மை சிக்கல்கள் உள்ளன. இதன் விளைவாக, ஒரு புரோலாக் தொகுப்பியில் எழுதப்பட்ட தொகுதிக்கூறு பிறவற்றில் செயல்பட வேண்டும் என்ற அவசியம் இல்லை.  

## பாகுபடுத்தல்

வரையறுக்கப்பட்ட உட்கூறு இலக்கணங்கள் என அழைக்கப்படும் (DCGகள்) சிறப்பு கருத்துகளும் உள்ளன. <code>:-/2</code> க்கு பதிலாக <code>-->/2</code> என்பதன் மூலம் வரையறுக்கபப்ட்ட ஒரு விதி, சில வெளிப்படையான மீண்டும் எழுதல் விதிகளின்படி முன் செயலாக்கிகளால் (<code>expand_term/2</code>, பிற மொழிகளில் உள்ள மேக்ரோக்களை ஒத்தது) விரிவாக்கப்படுகிறது, இதன் விளைவாக சாதாரண புரோலாக் உட்கூறுகள் உருவாகின்றன. மிகவும் பிரபலமாக, மீண்டும் எழுதல் பயனிலையை இரண்டு கூடுதல் அளவுருக்களுடன் பயன்படுத்துகிறது, அதை வெளிப்படையாக நிலையை தொடரிழையாக்கப் பயன்படுத்தப்படலாம், இது பிற மொழிகளிலுள்ள மோணாட்களைப் போன்றதாகும். DCGகள் இடைமுக வேறுபாடுகளுக்கான வசதியான இடைமுகத்தையும் வழங்குவதால் பெரும்பாலும் பாகுபடுத்திகள் அல்லது பட்டியல் உருவாக்கிகள் ஆகியவற்றை எழுத அவை பயன்படுகின்றன.  

### பாகுபடுத்தி எடுத்துக்காட்டு
ஒரு பெரிய எடுத்துக்காட்டு புரோலாகை பாகுபடுத்தலில் பயன்படுத்துவதன் ஆற்றலைக் காண்பிக்கும்.  

பேக்கஸ்-நார் வடிவத்தில் குறிப்பிடப்பட்டுள்ள சொற்றொடர் கொடுக்கப்பட்டபட்சத்தில்:  

<sentence> ::= <stat_part>  
<stat_part> ::= <statement> | <stat_part> <statement>  
<statement> ::= <id> = <expression> ;  
<expression> ::= <operand> | <expression> <operator> <operand>  
<operand> ::= <id> | <digit>  
<id> ::= a | b  
<digit> ::= 0..9  
<operator> ::= + | - | *  

இதை, DCGகளைப் பயன்படுத்தி புரோலாகில், வைத்ததைப் பொறுத்து ஒரு டோக்கன் அதிகமாக உள்ளபடி முன்கணிப்பு பாகுபடுத்திக்குரிய முறையில் எழுதலாம்:  

sentence(S) --> statement(S0), sentence_r(S0, S).  
sentence_r(S, S) --> [].  
sentence_r(S0, seq(S0, S)) --> statement(S1), sentence_r(S1, S).  

statement(assign(Id,E)) --> id(Id), [=], expression(E), [;].  

expression(E) --> term(T), expression_r(T, E).  
expression_r(E, E) --> [].  
expression_r(E0, E) --> [+], term(T), expression_r(plus(E0,T), E).  
expression_r(E0, E) --> [-], term(T), expression_r(minus(E0, T), E).  

term(T) --> factor(F), term_r(F, T).  
term_r(T, T) --> [].  
term_r(T0, T) --> [*], factor(F), term_r(times(T0, F), T).  

factor(id(ID)) --> id(ID).  
factor(digit(D)) --> [D], { (number(D) ; var(D)), between(0, 9, D)}.  

id(a) --> [a].  
id(b) --> [b].  

இந்தக் குறியீடு (டோக்கன்களின் பட்டியலாகக் கொடுக்கப்பட்ட) ஒரு சொற்றொடருக்கும் அதன் கருத்துச்சுருக்கத் தொடரியல் கிளையமைப்புக்கும் (AST) உள்ள தொடர்பை வரையறுக்கிறது. எடுத்துக்காட்டு வினவல்:  

?- phrase(sentence(AST), [a,=,1,+,3,*,b,;,b,=,0,;]).  
AST = seq(assign(a, plus(digit(1), times(digit(3), id(b)))), assign(b, digit(0))) ;  

உகந்ததாக்கல்களைப் பயன்படுத்த, இது போன்ற கோவைகளை இயந்திரக் குறியீட்டில் தொகுத்தல் அல்லது அது போன்ற கூற்றுகளை நேரடியாக புரிதல் விளக்கம் கொள்ள புரோலாக் உறுப்புகளைப் பயன்படுத்தி குறிப்பிடப்பட்ட ASTகளைப் பயன்படுத்தலாம். பயனிலைகளின் தொடர்புடைய இயல்புக்கு இது பொதுவானதாக இருப்பதால், இந்த சொற்றொடர்களைப் பாகுபடுத்தவும் உருவாக்கவும் ஆகிய இரண்டு தேவைகளுக்குமே வரையறைகளைப் பயன்படுத்தலாம், மேலும் கொடுக்கப்பட்ட ஒரு டோக்கன்களின் பட்டியல் கொடுக்கப்பட்ட ஒரு கிளையமைப்புக்கு உரியதா என சோதிக்கவும் பயன்படுத்தலாம். மறுநிகழ் சராசரி எண்ணிக்கைக்கு, ஒவ்வொரு ஏதேனும் ஒரு அல்லது நிலையான சொற்றொடரும் அதன் விளைவாக அதற்குரிய AST ம் உருவாக்கப்படும்:  

?- length(Tokens, _), phrase(sentence(AST), Tokens).  
Tokens = [a, =, a, (;)], AST = assign(a, id(a)) ;  
Tokens = [a, =, b, (;)], AST = assign(a, id(b))  
இன்னும் பல.  

## உயர்-வரிசை நிரலாக்கம்

முதல் வரிசை தர்க்கம் பயனிலைகளிலான அளவிடலை அனுமதிப்பதில்லை. உயர்-வரிசை பயனிலை என்பது ஒன்று அல்லது மேற்பட்ட பிற பயனிலைகளை அளவுருக்களாகப் பயன்படுத்தும் பயனிலையாகும். தனித்த புரோலாக் குறிக்கோள்களை நிகழ்நேரத்தில் கட்டமைக்கவும் மதிப்பிடவும் முடியும் என்பதால், <code>maplist/2</code> போன்ற உயர்-வரிசை பயனிலைகளை எழுதுவது எளிதாகும், அது கொடுக்கப்பட்ட பட்டியலின் ஒவ்வொரு உறுப்புக்கும் ஒரு தனித்த பயனிலையைப் பயன்படுத்துகிறது, மேலும் கொடுக்கப்பட்ட ஒரு பயனிலையைப் பூர்த்தி செய்யும் கூறுகளை வடிகட்டி அழகுபடுத்தவும் அனுமதிக்கும் <code>sublist/3</code> பயனிலையை எழுதுவதும் எளிதாகும்.  

தீர்வுகளை காலம் சார்ந்த குறிப்பிடுதலிலிருந்து (பின் தடமறிதலின் போதான பதில் பதிலிடல்) வெளிசார்ந்த குறிப்பிடுதலுக்கு (உறுப்புகள்) மாற்ற, புரோலாகில் பல்வேறு அனைத்து தீர்வுகள் பயனிலைகள் உள்ளன, அவை ஒரு பட்டியலில் கொடுக்கப்பட்ட வினவல்களின் பதில் பதிலீடுகள் அனைத்தையும் சேகரிக்கின்றன. இதை பட்டியல் புரிதலுக்கு பயன்படுத்தலாம். எடுத்துக்காட்டுக்கு, முழுமையான எண்கள் அவற்றின் சரியான வகுபடு எண்களின் கூடுதலுக்கு சமமாக இருக்கும்:  

perfect(N) :-  
between(1, inf, N), U is N // 2,  
findall(D, (between(1,U,D), N mod D =:= 0), Ds),  
sumlist(Ds, N).  

முழுமையான எண்களை மதிப்பிட இதைப் பயன்படுத்தலாம், மேலும் ஒரு எண் முழுமையான எண்ணா எனச் சோதிக்கவும் இதைப் பயன்படுத்தலாம்.  

## மெட்டா-புரிதல்விளக்கிகளும் பிரதிபலித்தல்

புரோலாக் ஒரு ஹோமோய்கோனிக் மொழியாகும், மேலும் அது பிரதிபலிப்புக்கான பல வசதிகளை வழங்குகிறது. வெளிப்படையல்லாத செயல்படுத்தல் உத்தியால் தூய புரோலாக் குறியீட்டுக்கான ஒரு துல்லியமான மெட்டா-சர்குலர் தீர்மான அம்சத்தை (*மெட்டா-இண்ட்டர்ப்ரெட்டர்* எனவும் அழைக்கப்படுகிறது) எழுதுவது சாத்தியமாகிறது. புரோலாக் நிரல்களே புரோலாக் உறுப்புகளின் தொடராகவே உள்ளது (<code>:-/2</code> என்பது செருகல் ஆப்பரேட்டர்). அவை எளிதாகப் படிக்கத்தக்கவையாகவும் உட்கட்டமைக்கப்பட்ட இயங்குமுறைகளால் (<code>read/1</code> போன்ற) ஆய்வு செய்யத்தக்கவையாகவும் உள்ளன, தனிப்பயனாக்கப்பட்ட இண்ட்டர்ப்ரட்டர்களை எழுதுவது எளிதாகும், அவை புரோலாக் களத்தை குறிப்பிட்ட அம்சங்களைக் கொண்டு மேம்படுத்துகின்றன.  

## உறுதித் தன்மையும் முழுமைத்தன்மையும்

தூய புரோலாக் முதல்-வரிசை பயனிலை தர்க்கத்தின் ஒரு துணைக்குழு, ட்யூரிங்-முழுமையாக உள்ள ஹார்ன் உட்கூறுகள் ஆகியவற்றை அடிப்படையாகக் கொண்டதாகும். புரோலாகை ட்யூரிங் இயந்திரத்தை உருவாக்குவதற்குப் பயன்படுத்துவதன் மூலம் அதன் முழுமைத் தன்மையைக் காண்பிக்கலாம்:  
<source lang="prolog">  
turing(Tape0, Tape) :-  
perform(q0, [], Ls, Tape0, Rs),  
reverse(Ls, Ls1),  
append(Ls1, Rs, Tape).  

perform(qf, Ls, Ls, Rs, Rs) :- !.  
perform(Q0, Ls0, Ls, Rs0, Rs) :-  
symbol(Rs0, Sym, RsRest),  
once(rule(Q0, Sym, Q1, NewSym, Action)),  
action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),  
perform(Q1, Ls1, Ls, Rs1, Rs).  

symbol([], b, []).  
symbol([Sym|Rs], Sym, Rs).  

action(, Ls0, Ls, Rs0, Rs) :- (Ls0, Ls, Rs0, Rs).  
action(stay, Ls, Ls, Rs, Rs).  
action(, Ls0, [Sym|Ls0], [Sym|Rs], Rs).  

([], [], Rs0, [b|Rs0]).  
([L|Ls], Ls, Rs, [L|Rs]).  
</source>  

எளிய ஒரு ட்யூரிங் மெஷின் எடுத்துக்காட்டு பின்வரும் உண்மைகளால் குறிப்பிடப்படுகிறது:  
<source lang="prolog">  
rule(q0, 1, q0, 1, ).  
rule(q0, b, qf, 1, stay).  
</source>  

இந்த இயந்திரம் யூனரி குறியீட்டாக்கத்திலுள்ள எண்களில் ஒன்றின் அளவுக்கு அதிகரிப்பை செய்கிறது: எந்த எண்ணிக்கையுமுள்ள "1" செல்களில் அது மீண்டும் நிகழ்ந்து முடிவில் ஒரு கூடுதல் "1" ஐ சேர்க்கிறது. எடுத்துக்காட்டு வினவலும் அதன் முடிவும்:  
<source lang="prolog">  
?- turing([1,1,1], Ts).  
Ts = [1, 1, 1, 1] ;  
</source>  

ஏதேனும் ஒரு கணக்கீட்டை புரோலாகில் அடுத்தடுத்த நிலைகளுக்கிடையேயான தொடர்பாக செயல்படுத்தப்பட்ட நிலை மாற்றங்களின் தொடர்ச்சியாக அறிவிப்புத் தன்மையுடன் எவ்வாறு குறிப்பிடலாம் என்பதை இது விளக்குகிறது.  

## செயல்படுத்தல்
### ISO புரோலாக்
ISO புரோலாக் தரநிலை: 1995 இல் வெளியிடப்பட்ட ISO/IEC 13211-1, நடைமுறையில் உள்ள புரோலாகின் பிரதான கூறுகளின் பல செயல்படுத்தல்களின் தரநிலையாக்கத்தை நோக்கமாகக் கொண்டதாகும். அது முன்னர் குழப்பமாக இருந்த மொழியின் அம்சங்களைத் தெளிவாக்கியது, இதனால் பெயர்த்தக்க நிரல்கள் உண்டாயின. இந்தத் தரநிலையானது ISO X3J17 ஆணையத்தால் பராமரிக்கப்படுகிறது. இந்த தரநிலை தொகுதிக்கூறுகள், நூலகங்கள் அல்லது DCGகள் ஆகியவற்றுக்குப் பொருந்தாது.  

### தொகுத்தல்
செயல்திறனுக்கு, புரோலாக் குறியீடானது வழக்கமாக சுருக்கமான எந்திரக் குறியீட்டுக்கு தொகுக்கப்படுகிறது, பெரும்பாலும் ரெஜிஸ்டர்-அடிப்படையிலான வாரன் அப்ஸ்ட்ராக்ட் மெஷின் (WAM) வழிமுறைத் தொகுப்பின் தாக்கத்தைக் கொண்டதாக இது உள்ளது. சில செயல்படுத்தல்கள் தொகுத்தல் நேரத்தின் போது பயனிலையின் வகை மற்றும் பயன்முறைத் தகவலைப் பெற சுருக்க புரிதல்விளக்கத்தைப் பயன்படுத்துகின்றன அல்லது அதிக செயல்திறனுக்காக மெய் எந்திர குறியீட்டுக்கு தொகுக்கின்றன. புரோலாக் குறியீட்டுக்கான செயல்திறன் மிக்க செயல்படுத்தல் உத்திகளைக் கண்டுபிடிக்கும் துறையானது தர்க்க நிரலாக்க சமூகத்தின் தற்போது செயல்மிகு ஆராய்ச்சிக்குரியதாக உள்ளது, மேலும் சில செயல்படுத்தல்களில் பல்வேறு பிற செயல்படுத்தல் உத்திகள் பயன்படுத்தப்படுகின்றன. உட்கூற்று இரட்டையாக்கம்(பைனரைசேஷன்) மற்றும் ஸ்டாக்-அடிப்படையிலான கற்பனை இயந்திரங்கள் ஆகியவை இவற்றிலடங்கும்.  

### வால் மறுநிகழ்வு
புரோலாக் முறைமைகள் பொதுவாக ஒரு பிரபலமான உகந்ததாக்கல் உத்தியை செயல்படுத்துகின்றன. அது டெயில் கால் ஆப்டிமைசேஷன் (TCO) என அழைக்கப்படுகிறது. வால் மறுநிகழ்வு அல்லது பொதுவாக வால் அழைப்புகள் என்ற அம்சத்தைக் கொண்டிருக்கும் தீர்மானிக்கும் தன்மையுள்ள பயனிலைகளின் உகந்ததாக்கலுக்குப் பயன்படுவதால் இதற்கு இப்பெயர் வந்தது: வால் அமைப்பு நிலையில் ஓர் அழைப்பை செய்யும்போது ஒரு உட்கூறின் ஸ்டாக் சட்டகமானது அகற்றப்படுகிறது. ஆகவே, தீர்மானிக்கும் தன்மையுள்ள வால்-மறுநிகழ்வு பயனிலைகள் பிற மொழிகளிலுள்ள சுழற்சிகள் (லூப்கள்) போன்ற மாறா ஸ்டாக் வெளிகளுடன் செயல்படுத்தப்படுகின்றன.  

### அட்டவணையாக்கம்
சில புரோலாக் அமைப்புகளான (BProlog, XSB மற்றும் யாப்), *அட்டவணையாக்கம்* எனப்படும் நீட்டிப்பை நிறைவேற்றி, கையேட்டால் சேமிக்கும் பயனாளர்களின் இடைநிலை முடிவுகளிலிருந்து விலக்கு அளிக்கிறது.  

### வன்பொருளில் நடைமுறைப்படுத்துதல்
ஐந்தாம் தலைமுறை கணிப்பொறி அமைப்பு திட்டங்களில், புரோலாக்கை வன்பொருளுடன் இணைத்து விரவல் கட்டமைப்புகளுடன் கூடிய வேகமான நிறைவேற்றத்தைப் பெறும் குறிக்கோளுடன் முயற்சிகள் செய்யப்பட்டன. இணை செயல்படுத்தல் முழுவதும் வேகத்தைக் கூட்ட கூடிய சில பண்புகளை புரோலாக் பெற்றிருந்தது. புல நிரலாக்கதக்க கேட் அணிகளில் வரும்புக்குட்பட்ட புரோலாக் நிரலாக்கங்களை தொகுப்பதே தற்போதைய அணுகுமுறையாகும். எனினும், சில மேம்பட்ட கட்டமைப்புகளை காட்டிலும் இசைவான பொது-தேவை வன்பொருள் அதிவேகமகமாக வளர்ந்துள்ளது.  

## விமர்சனம்
ஆய்வு மற்றும் கல்வியில் புரோலாக் பொதுவாக உபயோகிக்கப்பட்டாலும், புரோலாக் மற்றும் மற்ற தர்க்க நிரலாக்க மொழிகள் கணிப்பொறி துறையில் பொதுவான விளைவை உருவாக்க இயலவில்லை. தொழிலக தரங்களுக்கு சில செயலிகள் குறைவாக இருந்தாலும் ஒரு சில நெறிமுறைகள் 100,000 வரிகளுக்கு அதிகமாக இருக்கும். பெரிய அளவிலான நிரலாக்கமானது தொகுதிக்கூறுகளை ஆதரிக்கும் அனைத்து புரோலாக் தொகுப்பிகளாலும் சிக்கலானதல்ல, மேலும் பெரிய புரோலாக் தொகுப்பிகளின் தொகுதிக்கூறு முறைமைகளிடையே இணக்கத்தன்மை சிக்கல்கள் உள்ளன.  

## நீட்டிப்புகள்
பல்வேறு திசைகளில் ப்ரோலாக்கிலிருந்து நீட்டிக்கப்பட்ட தர்க்க நிரலாக்க திறன்களுக்கு பல்வேறு செயல்படுத்தல்கள் உருவாக்கப்பட்டன. அவை, கட்டுப்பாட்டு தர்க்க நிரலாக்கம் (CLP), இலக்குப்பொருள்-ஒருங்கமைக்கப்பட்ட தர்க்க நிரலாக்கம் (OOLP), ஒருங்கிணைவு, நேரியல் தர்க்கம் (LLP), செயல்பாடு மற்றும் உயர்-வரிசை தர்க்க நிரலாக்கத் திறன்கள், அறிவு அடிப்படையுடன் நேர்மறை இயங்குதிறன் உள்ளிட்டவை:  

### கட்டுப்பாடுகள்
கட்டுப்பாட்டு தர்க்க நிரலாக்கம் என்பது நேர அட்டவணை மற்றும் பிற திட்டமிடல் பணிகள் போன்ற தொழிற்துறை அமைப்புகளில் பல ப்ரோலாக் பயன்பாடுகளுக்கு முக்கியமானது ஆகும். முடிவுறு களங்களுக்கான குறைந்தபட்சம் ஒரு கட்டுப்பாட்டு தீர்வு உடனான பெரும்பாலான ப்ரோலாக் அமைப்புகள் கப்பல் மற்றும் பெரும்பாலும் விகிதமுறு எண்கள் போன்ற பிற களங்களுக்கான தீர்வுகள்.  

### உயர்-வரிசை நிரலாக்கம்
HiLog மற்றும் λProlog ஆகியவை உயர்-வரிசை நிரலாக்க அம்சங்களுடனான ப்ரோலாக் நீட்டிப்பு ஆகும்.  

### இலக்குப்பொருள் ஒருங்கமைவு
லாக்டாக் என்பது பின்புலத் தொகுப்பானாக பெரும்பாலான ப்ரோலாக் செயலாக்கங்கள் பயன்படுத்த முடிந்த இலக்குப்பொருள்-ஒருங்கமைந்த தர்க்க நிரலாக்க மொழியாகும். பல-நெறி மொழியாக, இது நெறி மாதிரிகள் மற்றும் பிரிவுகள், நெறிமுறைகள் (இடைமுகங்கள்), வகை-அடிப்படை தொகுப்பு வாயிலான பகுதி-அடிப்படையான நிரலாக்கம், நிகழ்வு-இயக்க நிரலாக்கம் மற்றும் உயர்மட்ட பல-மரையிடல் நிரலாக்கம் ஆகியவற்றுக்கான ஆதரவைக் கொண்டது.  

ஓப்லாக் என்பது சிறிய, எளிதான, ப்ரோலாக்கிற்கான இலக்கு-ஒருங்கமைந்த நீட்டிப்பு, இது எடின்பர்க் பல்கலைக்கழக எட்கேட்டின் மார்க்கரெட் மேக்டௌகால் அவர்களால் உருவாக்கப்பட்டது.  

### உடன்நிகழ்வு
ப்ரோலாக்-எம்பிஐ என்பது செய்தி அனுப்புதல் இடைமுகம் வழியாக பகிரப்பட்ட கணினி செயலாக்கத்திற்கான ஓப்பன்-சோர்ஸ் SWI-ப்ரோலாக் நீட்டிப்பு ஆகும். மேலும் பல்வேறு உடன்நிகழ்வு ப்ரோலாக் நிரலாக்க மொழிகளும் உள்ளன.  

### மற்றவை
- F-தர்க்கம் என்பது ப்ரோலாக்கை அறிவு விளக்கத்திற்கான பிரேம்கள்/இலக்குப்பொருள்கள் உடன் நீட்டிக்கின்றது.
- OW ப்ரோலாக் ஆனது வரைபடங்கள் மற்றும் இடைமுகம் ஆகியவற்றின் ப்ரோலாக் குறைபாட்டிற்கு பதிலளிக்கும் பொருட்டு உருவாக்கப்பட்டது.

## பிற மொழிகளுக்கான இடைமுகங்கள்
ப்ரோலாக் மற்றும் Java நிரலாக்க மொழி ஆகியவற்றுக்கு இடையேயான ஒரு இணைப்பை வழங்கும்படியாக சட்டகப்பணிகளும் உள்ளன:  
- JPL என்பது இரு-திசை ஜாவா ப்ரோலாக் இணைப்பு ஆகும், இது இயல்பாக SWI-ப்ரோலாக் உடன் அனுப்பபடுகின்றதும், இது Java மற்றும் ப்ரோலாக் ஆகியவை ஒன்றுக்கொன்று முறையே அழைத்துக்கொள்ள அனுமதிக்கின்றது. இது அதன் நல்ல ஒத்திசைவு ஆதரவிற்கு பிரபலமானது, மேலும் இது மேம்பாட்டு செயல்பாட்டின் கீழ் உள்ளது.
- இண்டெர்ப்ரோலாக் , இது ஜாவா மற்றும் ப்ரோலாக் இடையிலான நிரலாக்க நூலக இணைப்பு, இது இரண்டு மொழிகளுக்கிடையே அழைக்கப்படுகின்ற இரு-திசை பயனிலையாக/வழிமுறையாக செயலாக்கப்படுகின்றது. ஜாவா இலக்குப்பொருட்களை ப்ரோலாக் விதிமுறைகளில் வரைபடமிடலாம் மற்றும் அதே போன்று மறுதலையாய் செயல்படுத்தலாம். ப்ரோலாக் அடுக்கில் தர்க்க செயலாக்கத்தை விட்டு நீங்கும் வேளையில் ஜாவாவில் GUIகள் உருவாக்கம் மற்றும் பிற செயல்பாட்டுத்தன்மைகளை அனுமதிக்கின்றது. XSB, SWI-ப்ரோலாக் மற்றும் YAP ஆகியவற்றை ஆதரிக்கின்றது.
- ப்ரோவா ஆனது ஜாவா, முகவர் செய்தியிடல் மற்றும் பதிலளிப்பு விதிகளுடன் இயல்பு தொடரியல் ஒருங்கிணைப்பை வழங்குகின்றது. ப்ரோவா இடைநிலை மென்பொருளுக்கான விதி-அடிப்படை ஸ்கிரிப்டிங் (RBS) அமைப்பாக தன்னகத்தேயான நிலையைக் கொண்டுள்ளது. மொழியானது கட்டளைத் தன்மை கொண்ட மற்றும் அறிவிக்கக்கூடிய தன்மை கொண்ட நிரலாக்க இணைப்பில் புதிய அடிப்படையைத் தகர்க்கின்றது.
- PROL என்பது ஜாவாவிற்கான உட்பொதிக்கப்பட்ட ப்ரோலாக் பொறியாகும். இது சிறிய IDE மற்றும் சில நூலகங்களை உள்ளடக்குகின்றது.

## தொடர்புடைய மொழிகள்
- கோடெல் நிரலாக்க மொழியானது ஒத்த கட்டுப்பாட்டு தர்க்க நிரலாக்கத்தின் வலிமையான-தட்டச்சு செயல்படுத்தலாகும். இது SICStus ப்ரோலாக்கில் கட்டமைக்கப்படுகின்றது.
- விஷூவல் ப்ரோலாக் என்பது முன்னதாக **PDC ப்ரோலாக்** மற்றும் டர்போ ப்ரோலாக் என்றும் அறியப்பட்டது. விஷூவல் ப்ரோலாக் என்பது ப்ரோலாக்கின் வலிமையாக வகையமைக்கப்பட்ட இலக்குபொருள்-சார்ந்த கிளை மொழி வகையாகும், இது தரநிலையான ப்ரோலாக்கிலிருந்து கருதக்கூடிய வகையில் வேறுபட்டது. டர்போ ப்ரோலாக் போன்று இது போர்லேண்டால் சந்தைப்படுத்தப்பட்டது, ஆனால் இப்போது அது உண்மையில் அதை தயாரித்த தனிஷ் நிறுவன PDC (ப்ரோலாக் மேம்பாட்டு மையம்) மூலமாக மேம்படுத்தப்பட்டு சந்தைப்படுத்தப்படுகின்றது.
- டேட்டாலாக் என்பது ப்ரோலாக்கின் துணைக்குழு ஆகும். இது அடுக்கிவைக்கப்படக்கூடிய மற்றும் கூட்டு உறுப்புகளை அனுமதிக்காத தொடர்புகளுக்கு மட்டுமே எனக் கட்டுப்படுத்தப்பட்டுள்ளது. ப்ரோலாகுக்கு மாறாக, டேட்டாலாக் ட்யுரிங் முழுமையானதில்லை.
- CSC GraphTalk என்பது வார்ரென்னின் ஈர்ப்பு இயந்திரத்தின் உடமையுரிமை செயலாக்கம், இது கூடுதல் இலக்குபொருள்-ஒருங்கமைந்த பண்புகளைக் கொண்டுள்ளது.
- சில வழிகளில் ப்ரோலாக் என்பது ப்ளானரின் துணைக்குழு ஆகும். ப்ளானரில் உள்ள கருத்துகள் பின்னர் அறிவியல் சமூக உருவகத்தில் மேலும் மேம்படுத்தப்பட்டது.

## வரலாறு

ஃபிலிப் ரசல் என்பவரால் *புரோலாக்* என்ற பெயர் தேர்வு செய்யப்பட்டது. அது ** (பிரெஞ்சில் *தர்க்கத்திலான நிரலாக்கம்* ) என்பதன் சுருக்கமாகும். இது 1972 ஆம் ஆண்டுவாக்கில் ஃபிலிப் ரசல் மற்றும் அலைன் கால்மெரோரால் உருவாக்கப்பட்டது, அது ராபர்ட் கொவால்ஸ்கியின் ஹார்ன் உட்கூறுகளின் செயல்முறைப் புரிதல்விளக்கத்தின் அடிப்படையில் உருவாக்கப்பட்டது. தர்க்கத்தை, 1960கள் மற்றும் 1970களின் முற்பகுதியில் வட அமெரிக்காவில் மிகப் பிரபலமாக இருந்த செயல்முறையியல் அறிவு விளக்கத்துடன் கூடிய அறிவிக்கும் தன்மையுள்ள அறிவு விளக்க மொழியாகப் பயன்படுத்தும் ஆசையினால் இது பகுதியளவு ஊக்குவிக்கப்பட்டது. ராபர்ட் கொவ்வால்ஸ்கியின் கருத்துப்படி, முதல் புரோலாக் முறைமை 1972 ஆம் ஆண்டில் அலைன் கோல்மெரார் மற்றும் ஃபிலிப் ரசல் ஆகியோரால் உருவாக்கப்பட்டது. புரோலாகின் முதல் செயல்படுத்தல்கள் இண்ட்டர்ப்ரெட்டர்களாகும், இருப்பினும், டேவிட் எச். டி. வாரன் வாரன் அப்ஸ்ட்ராக்ட் மெஷினை உருவாக்கினார். அது முதலில் தோன்றிய மற்றும் சிறந்த தாக்கத்தை ஏற்படுத்திய புரோலாக் தொகுப்பியாகும், அது "எடின்பர்க் புரோலாக்" கிளை மொழியை வரையறுத்தது. அது பெரும்பாலான நவீன செயல்படுத்தல்களின் தொடரியலுக்கு அடிப்படையாக செயல்பட்டது.  

புரோலாகின் நவீன மேம்பாடுகளில் பெருமளவு ஐந்தாம் தலைமுறை கணினி முறைமைகள் பணித்திட்டத்திலிருந்தே (FGCS) தோன்றின, அது புரோலாகின் ஒரு மாற்ற வகையை உருவாக்கியது, அது அதன் முதல் இயக்க முறைமையின் காரணமாக *கெர்னல் மொழி* என அழைக்கப்பட்டது.  

தூய புரோலாக் முதலில், பின்வரும் வடிவத்திலான ஹார்ன் உட்கூறுகளைக் கொண்டுள்ள ஒரு தீர்மான தேற்ற நிரூபிப்பானுக்கு பயன்படுத்த மட்டுமே என்ற வரம்பைக் கொண்டிருந்தது:  

H :- B<sub>1</sub>, ..., B<sub>n</sub>.  

தேற்ற நிரூபிப்பானின் பயன்பாடு இது போன்ற உட்கூறுகளை செயல்முறைகளாகக் கருதிக் கையாள்கிறது:  

H ஐக் காண்பிக்க/தீர்க்க, B<sub>1</sub> மற்றும் ... மற்றும் B<sub>n</sub>ஐக் காண்பிக்க/தீர்க்க வேண்டும்.  

இருப்பினும், தூய புரோலாக் தோல்வியில் புறம்பாக்கல் எனும் அம்சத்தைக் கொண்டிருக்கும் வகையில் விரைவில் விரிவாக்கப்பட்டது, அந்த அம்சத்தில் (B<sub>i</sub>) அல்லாத வடிவத்திலுள்ள எதிர்மறை நிபந்தனைகள் அவற்றுக்குரிய நேர்மறை நிபந்தனைகளான B<sub>i</sub> ஐ முயற்சித்து தோல்வியடைவதன் மூலம் காண்பிக்கப்படுகின்றன.  

அதனையடுத்து செய்யப்பட்ட, முதல் குழுவின் புரோலாக் விரிவாக்கங்கள் கட்டுப்பாட்டு தர்க்க நிரலாக்கத் திறன்களை செயல்படுத்தல்களில் அறிமுகப்படுத்தின.  

## குறிப்புதவிகள்

- வில்லியம் எஃப். க்லாக்சின், கிரிஸ்டோஃபர் எஸ். மெல்லிஷ்: *ப்ரொக்ராமிங் இன் புரோலாக்: யூசிங் த ISO ஸ்டாண்டர்ட்* . ஸ்ப்ரிங்கர், 5ஆம் பதிப்பு, 2003, . *(இந்தப் பதிப்பு ISO புரோலாகுக்கு புதுப்பிக்கப்பட்டது. * *முந்தைய பதிப்புகள் எடின்பர்க் புரோலாகை விவரித்தன.)*
- வில்லியம் எஃப். க்லாக்சின்: *க்ளாஸ் அண்ட் எஃபக்ட். * *புரோலாக் ப்ரொக்ராமிங் ஃபார் த வொர்க்கிங் ப்ரொக்ராமர்* . ஸ்ப்ரிங்கர், 2003, .
- மைக்கேல் ஏ. கவிங்ட்டன், டொனால்ட் நியூட், ஏண்ட்ரி வெல்லினோ, *புரோலாக் ப்ரொக்ராமிங் இன் டெப்த்* , 1996, .
- மைக்கேல் ஏ. கவிங்ட்டன், *நேச்சுரல் லேங்க்வேஜ் இம்ப்ளிமெண்ட்டேஷன் ஃபார் புரோலாக் ப்ரொக்ராமர்ஸ்* , 1994, ISBN 0-13-62921
- ராபர்ட் ஸ்மித், ஜான் கிப்சன், ஏரோன் ஸ்லோமேன்: 'POPLOG'ஸ் டூ-லெவல் விர்ச்சுவல் மெஷின் சப்போர்ட் ஃபார் இண்ட்டெராக்டிவ் லேங்க்வேஜஸ், இன் *ரிசர்ச் டைரக்ஷன்ஸ் இன் காக்னிட்டிவ் சைன்ஸ் தொகுதி 5: ஆர்ட்டிஃபிஷியல் இண்ட்டெலிஜென்ஸ்* , ஆசிரியர்கள் டி. ஸ்லீமேன் மற்றும் என். பெர்ன்சன், லாரன்ஸ் எர்ல்பாம் அசோசியேட்ஸ், ப 203-231, 1992.
- லீன் ஸ்டெர்லிங் மற்றும் இஹட் ஷேப்பிரோ, *த ஆர்ட் ஆஃப் புரோலாக்: அட்வான்ஸ்டு ப்ரொக்ராமிங் டெக்னிக்* , 1994, .
- ஐவன் ப்ரேட்கோ, *புரோலாக் ப்ரொக்ராமிங் ஃபார் ஆர்ட்டிஃபிஷியல் இண்ட்டெலிஜென்ஸ்* , 2000, .
- ராபர்ட் கொவால்ஸ்கி, *த எர்லி இயர்ஸ் ஆஃப் லாஜிக் ப்ரொக்ராமிங்* , CACM ஜனவரி 1988.
- *ISO/IEC 13211: இன்ஃபர்மேஷன் டெக்னாலஜி — ப்ரொக்ராமிங் லேங்வேஜஸ் — புரோலாக்* . இண்டர்நேஷனல் ஆர்கனைசேஷன் ஃபார் ஸ்டாண்டர்டைசேஷன், ஜெனிவா.
- அலைன் கோல்மெரார் மற்றும் ஃபிலிப் ரசல், *த பர்த் ஆஃப் புரோலாக்* : *நிரலாக்க மொழிகளின் வரலாறு பற்றிய இரண்டாவது ACM SIGPLAN மாநாட்டில்* , ப. 37-52, 1992.
- ரிச்சர்டு ஓ'கீஃப், *த க்ராஃப்ட் ஆஃப் புரோலாக்* , .
- பேட்ரிக் ப்ளேக்பர்ன், ஜோஹன் பாஸ், க்ரிஸ்டினா ஸ்ட்ரெக்னிட்ஸ், *லர்ன் புரோலாக் நவ்*
!*, 2006, .*  
- டேவிட் எச் டி வாரன், லூயிஸ் எம். பெரெய்ரா அண்ட் ஃபெர்னாண்டோ பெரெய்ரா, புரோலாக் - த லேங்க்வேஜ் அண்ட் இட்ஸ் இம்ப்ளிமெண்ட்டேஷன் கம்பேர்டு வித் லிஸ்ப். ACM SIGART அறிக்கைக் காப்பகம், வெளியீடு 64. ப்ரொசீடிங்ஸ் ஆஃப் த 1977 சிம்போசியம் ஆன் ஆர்ட்டிஃபிஷியல் இண்ட்டெலிஜென்ஸ் அண்ட் ப்ரொக்ராமிங் லேங்க்வேஜஸ், ப 109 - 115.

<references></references>