# புரொலாக்

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

### மதிப்பீடு

ஒரு புரோலாக் நிரலின் செயல்படுத்தல் என்பது, பயனர் வினவல் என்னும் ஓர் ஒற்றைக் குறிக்கோளை இடுவதிலிருந்து தொடங்குகிறது. தர்க்கரீதியாக, புரோலாக் எஞ்சின் ஒரு புறம்பான வினவலின் தீர்மான நிராகரிப்பைக் கண்டறிய முயற்சிக்கிறது. புரோலாக் பயன்படுத்தும் தீர்மான முறை 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> என்ற வினவலும் வெற்றியடைகிறது. ஒருவர் விரும்பினால் தொடர்புடைய வரம்புகளை விவரிக்க கூடுதல் குறிக்கோள்களையும் செருகலாம்.