Showing posts with label утга учрын уялдаа. Show all posts
Showing posts with label утга учрын уялдаа. Show all posts

2010/05/03

Аниагийн дөрвөн асуулт ба нэг сэтгэгдэл

Нөхрийн гарын үзүүрээр сараачиж шийдсэн бодлогыг уншаад Anonymous буюу нэгэн аниа ийнхүү асуусан байв.
- логик болон функционал програмчлал гэдгээ дэлгэрэнгүй тайлбарлавал?
- юуг програмчлах гэж байгаа юм бэ?
- юунд хэрэгтэй эд вэ?
- боломжууд нь?

надад сонирхолтой байна л даа
Аниагийн тун товч дөрвөн асуулт нэг сэтгэгдлийг уншаад уг хариулах зүйтэй хүн маань завгүй үе нь таарч, угийн тавтиргүй миний завтай үе таарч хариулах гэж оролдсон чинь үгийн тоо нь хэтэрч гурван хэсэг салсан юм болсон бөгөөд нөхөр үзээд тусад нь тэрлэ гэж зөвлөсний дагуу үүнийг бичив.
Уг бодлогыг нөхөр цахим заавар бичиж тавин таван мөрөнд багтааж шийдсэн байгаа юм. Тэрнээс арван мөр нь тайлбар, таван мөр нь сул зай бөгөөд тэднийг хасаж тооцохоор цаана нь ердөө гучин есөн мөрөнд л шийджээ. Дөчин нэг ч юмуу,,

Би энэ бодлогыг шийдэх гэж оролдсон бол лав түүнээс хэд дахин богино мөрөнд багтааж болох ч баталгаатай хэд дахин худлаа шийдэх нь найдвартай :). Уул нь ингээд логик програмчлалын талаарх бүх асуултанд хариулчихаж болохоор боловч уншигч авхайг уйдаахгүйн үүднээс хэдэн мөр нэмье. Эхний асуултанд энэ бичлэгээр хариулахыг оролдоё. Хоёр дахь асуултын хариу нь энэ тэрлэлд өөрт нь байх шиг байна гэж би бодож байна. Уг даалгаварыг та хэрэв цахим заавар (код) бичдэг бол өөр хэл дээр бичих гээд үзэх хэрэгтэй. Жишээ нь жаава, с, с++, с# дээр ч юм уу. Бичиж чадаад амжилттай шийдсэн бол тэрэнд зарцуулсан өдөр хоног, бичвэрийн мөрийн дугаар бас хэр их хөлс дуслуулсан бэ гэсэн харьцуулалт хийх нь зүйтэй. Ингэвэл бараг гурав дахь асуултанд нь хариулчих байх.

Гэхдээ их зан гаргалгүйгээр нэг, гурав болон дөрөвдүгээр асуултанд нь тодорхой хариулахыг хичээе. Цэнхэр гариг дээр хэрэглэгдэж байгаа програмын хэлүүдийг өөр өөр өнцгөөс нь харж янз янзаар ангилсан байдаг.
Жишээ нь C, Java, Python, гэсэн хэлүүд бол imperative буюу тушааж захирсан бичлэгтэй програмын хэлний төрөлд орно. Эдгээр хэл дээр та нэг үйлдэл хийдэг функц бичсэн байг гэж бодоход, хэрэв уг функц өөрт нь дамжуулж өгсөн өгөгдөлтэй хамтарч өөр үйлдэл хийх, эсвэл тэр өгөгдлөө өөрчлөх, шинэ юм гаргах, цааш нь дамжуулах гэх мэт дурын юм хийж болно. Гэвч зарим хүмүүс ингэж "дурын өөрчлөлт хийдэг" функцэд дургүй байдаг. Ийм дурын өөрчлөлтийг гол чухал юманд дээрээ хийвэл улс ч гэсэн эвгүй байдалд орж байгааг бидний монголчууд хангалттай амсаж байгаа байх. Тэдгээр дурын өөрчлөлтөнд дургүй хүмүүс уг функцийг тодорхой дүрмийн дагуу бичдэг. Жишээ нь Эрланг хэмээх функциональ хэл дээр ямар нэгэн хувьсагчид нэг л утга өгсөн бол тэрний утгыг хэзээ ч өөрчилж болдоггүй. Ингэснээр энэ хувьсагч ийм л утгыг насаараа тээж явна гэдэгт цахим заавар бичигч хүн итгэлтэй байдаг. Тийм хэл дээр функц бичсэн бол тэр функц нь ийм утга оруулахаар ийм утга буцааж өгнө гэсэн дүрмээ яс барьдаг. Ийм функцийг өөр функцтэй давхар залгаж бас нэг функц үүсгэж болдог. Энэ нь яг математикийн томъёогоор бичсэн юм шиг л ажилладаг. Нэгж функц нь нэг үүргээ л яг биелүүлдэг бол бичиж байгаа хүн нь уг функцдээ тэгтлээ итгэлтэй байдаг учраас өөр функцтэй дуртайяа хольж, нийлүүлж, хавсарч, тэр байтугай өөр функцийн оролт болгож дагуулж өгч болдог. Ингэж ажиллаж байгаа хэл бол функционал хэлний нэг гол шинж.

Тушааж захирсан хэл нь дуртай тушаалаараа дурын өөрчлөлт хийдэг байхад, функционал хэл нь юмнаас ирсэн юмыг өөрчилж юм болгоод цааш нь дамжуулдаг байх жишээтэй. Тушааж захирсан ууртай хэлэн дээр ч функционал маягаар бичиж болно. Гэхдээ дунд нь та нэг тушаагаад өөрчлөгдөх ёсгүй юмыг өөрчилчих юм бол цаашаагаа дамжигдахдаа асар их өөрчлөлт үзүүлэх нөлөө үүсгэж байгаа юм. Хамгийн гоё нь тушаасан хэл дээрх функц нь зөвхөн тэр тушаалдаа л таарсан гүйцэтгэл хийдэг учраас, хэрэв та өөр тушаал хийх болохоороо нөгөө функцээ дахиж ашиглах боломж тун бага, заримдаа бүр боломжгүй болдог. Функциональ хэлний функц гаднах орчноосоо тэгж их хамаардаггүй болохоор оруулах гаргах хоёр нь таарч байвал хаана ч хамаагүй , хэд ч хамаагүй дуудаж хэрэглэж болдог учраас энэ хэл дээр бичигдсэн бичлэг нь ууртай хэлнээсээ хэд дахин цөөхөн бичлэг агуулж байдаг нь бараг ёс болчихсон билээ. Логик хэлний бүтэц нь энэ хоёроос арай өөр. Гэхдээ логик хэлээр функционал бичиж болдог. Логик хэлийг тоглоом бичиж байгаа хүмүүс ар талын шийд гаргах, бяцхан тархи бэлдэх, хэцүү бүтцийг задлаж салгаж хувиргах зэрэгт маш их хэрэглэдэг. Байгаа бүх бодит нөхцлүүдийг нь бэлдэж өгөөд дараа нь хүнээс асууж байгаа юм шиг асуух юмуу шийдэл шаардахад нөгөөх нь олон дахин туршиж үзсэн хүн шиг яг сайхан хариулт өгдөг энэ хэрэглээ нь логик хэлний хамгийн том хүч нь юм.

Ийм шийдлийг тоглоомны завсар нөхцөл байдлаасаа хамаараад янз бүрээр асуух хэрэг гарна, тэр болгоныг та ууртай хэлэн дээр бичих гээд үз л дээ? мянга дахин их болно, мянга дахин хүч зарна, аягүй бол сэтгэлээр унана, тэгээд архинд орж ч магадгүй. Магадгүй нэг сульдаа болсон нөхөр цагаан мах нь гараад цагиралсан нүүртэй юм "би чадчихлаа" гэж дуугарч болох л юм, тэгэхээр нь асуултандаа нэг үг нэмсэн нөхцөл өөрчлөөд чадах уу гээд асуугаад царайг нь ажиглавал цайж ирж ажилласнаа цаашаагаа пид гээд унах вий :).
Логик болон функциональ хэлүүдийн боломж нь тус тусын салбартаа янз бүр. Эрланг хэлэн дээр хийгдсэн системдээ байгууллага нь ерэн ес гэж таслал тавиад ард нь долоон ширхэг есийн тоо тавьсан найдварын баталгаа гаргаж өгдөг байхад ууртай хэлэн дээр тийм баталгаа хийх нь бүү хэл алдаа бол програмын нэг сайжруулах үндэс гэж бараг найз маягийн юм ярьж явдаг онолтонгууд хүртэл байна. Алдаатай бичигдсэн функционал хэлэн дээр алдаа олох хугацаа нь ууртайгаас маш хурдан. Ууртай хэлэн дээр алдаа олох хэцүү. Яагаад гэвэл функц болгон нь ууртай догшин юм болгоныг эвдэлж нураачих гээд байдаг болохоор. Чингисийн үед монгол улс функционал байсан гэж ойлгож болно :).
Мэдээж шал хэрэггүй ууртай хэл оршиж байгаа бус, дошин дээрээ томордог үе уг хэлэнд бас бийг бодох хэрэгтэй. За ингээд хувийн хүндрэл, хүчтэй суутнуудын үгийг өөрийн юм шиг хольж хутгаад байтал анхны сэдвээсээ халихаас гадна бичсэн тэрлэлээсээ тэнэсэн урт болох аюултай болчихлоо.

Анхлан сонирхож байгаа хүнд энэ зэргийн хариу барихад болох байх гэж бодов. Түүнээс биш хоосноос гэрэл үүсгэж байгаа юм шиг гэнэт ламбАда функц үүсгээд усан дээр чулуу ойлгож байгаа юм шиг уг функцээ өгөгдлийн цуваан дээр өнхрүүлж бүгдэд нь халдаах гэх мэт сонин хачин мэргэжлийн нэр ус ороод ирэхээр (lambda calculus) би ч гэсэн амьсгаа давчдаад нүд харанхуйлаад явчихдаг юм. Энэ удаад та бага ч гэсэн гэрэл харсан байгаасай гэж найдъя.

2010/04/27

Угз тайлах

Өмнө бичигдсэн Логик програмчлалын жишээг туршиж үзэж байгаад мэдэхгүй хүнд жаахан амтлуулах, өөртөө жаахан сэргээх зорилгоор үүнийг тэрлэе гэж шийдэв.
Би өөртөө энэ логик програмчлалыг эх хэлээрээ Утга Учрын Уялдаа Холбооны Зангилааг Тайлах гэж нэрийдэв (УУУХЗТайлах). "Угз тайлах" гэж байгаа юм шиг уншигдаж байгаа биз?

Би аль болох тун товч цөөхөн үгээр нэг тайлбарлая. Уг хэл дээр програмчлахдаа:

  • эхлээд хөдлөшгүй баримтуудаар юмсын хоорондох уялдааг бэлдэж өгнө. (facts)
  • бэлдсэн баримтуудаараа хооронд нь холбож дүрэм үүсгэнэ ( rules )
  • өгөгдлийн баазаасаа лавлаж асууна ( query)
эхний хоёрыг нь ерөнхийд нь өгөгдлийн бааз гэж нэрлэдэг. Жижиг анхаарах зүйл бол:
  • хувьсагч нар том үсгээр эхэлж бусад нь жижиг үсгээр бичигддэг.
  • лавласан асуулт болон баримтын бичиглэлт бүгд ЦЭГЭЭР дууссан байх ёстой
  • хоёр үнэн юмны хооронд нь таслал тавьсан бол бөгөөд гэсэн утга илэрхийлдэг.
  • аль нэг нь үнэн байхад болно гэсэн бол ; гэсэн цэг таслалаар илэрхийлдэг.

Жишээ авалгүйгээр юм тайлбарлах шиг хэрэггүй юм гэж үгүй бил ээ. Эхлээд хэдэн хөдлөшгүй баримтууд бэлдэе:


Энд би гурван хөдлөшгүй баримт бэлдэж тавив. Энгийн үгээр үүнийг дараах маягаар тайлан уншиж болох юм:
юндэн нансалмаад хайртай.
нансалмаа юндэнд хайртай.
хоролмаа юндэнд хайртай.
уг нотолгоон дээр тулгуурлаад журамт эрийн дүрэм босгоё:


Энэ бичлэгийг тайлбарлахдаа :- гэснээс нь эхлэе. ХЭРЭВ баруун гар тал нь үнэн бол зүүн гар тал нь үнэн гэж тайлж уншиж болно. Тэгэхээр:
ХЭРЭВ юндэн нансалмаад хайртай БӨГӨӨД хуурдаггүй БОЛ юндэн журамтай эр гэж нийтэд нь тайлж унших хэрэгтэй.
not(хуурдаг) гэсэн бичлэгээс та, not гэсэн англи тушаалаар хуурдаг гэсэн дүрмийн эсрэг утгыг нь хэрэглэнэ гэж ойлгоно уу. Мөн хоёр үнэн гэсэн бичлэгийг дунд нь , гэсэн таслалаар тасалж БӨГӨӨД болж байгааг та ойлгосон буй заа.
Мэдээж л дээ, юндэн нансалмаад хайр зарлаж гүйж байснаа гэнэт хоролмаад хайр зарлаад унавал ямар юмных нь журамт эр байхав дээ. За тэгвэл үүнийгээ энэ хэл дээр илэрхийлэх хэрэгтэй болно.


энэ хуурагчийн дүрмийг та бараг надгүйгээр тайлан уншиж байгаа байлгүй дээ: юндэн Х хүнд хайртай БӨГӨӨД тэр Х нь нансалмаа БИШ бол хууралт юм.
Энд Х гэгч тэр нууц амрагийг нь том үсгээр бичсэнийг нь та анзаарч байгаа биз? Яагаад гэдгийг нь та мэдэж байгаа биз дээ? Мэдээж шүү дээ, ийм бузар булай юмыг олны өмнө илчилж дурайтал харуулах гэж том үсгээр тэмдэглэж байхгүй юу.

Тэр Х бол хувьсагч. Пролог ажиллахдаа бэлдэж өгөгдсөн өгөгдлийн баазаас хайртай(юндэн, Х)-д таарах бүх баримт нотолгооноос хайгаад Х-д тэр таарсан нотолгоог нь оноож өгдөг. Жишээ нь та баазаас дараах маягаар лавлаж асууж болно. Эхлээд юуны өмнө ямар ямар хөдлөшгүй баримт болон дүрэмнүүд баазад байгааг хардаг тушаалтай танилцана уу.



эндээс жишээ нь хайртай(юндэн, Х) гэсэн асуултад таарах баримт байвал харуул гэсэн асуулт асууя:


харж байна уу? Х-н оронд нансалмаа гэсэн бичлэг олдож байгааг харуулж байна.
Ингээд одоо байгаа баримт нотолгоон дээрээ тулгуурлаад юндэнг хэр журамтай эр вэ гээд асуугаад үзье.


Асуулт маань "Юндэн журамтай юу?" гэсэн чинь өөдөөс "true" гэж авч байна даа харин ч нэг. Сонин юм даа, юндэнгийн талаар энэ гадаад нөхөр юугаа хийгээд мэдчихсэн бас баталчихсан явж байдаг байна вэ? Юндэн гуайг хилийн чанадад цагаачилж юмуу хараар ажиллаж байгааг нь утга учрын нарийн зангилааг тайлдаг уг програм харь улс уруу нь утасдаж лавлаад уг хэлээр нь хариулж байгаа юм болов уу. За бүү мэд. Ямар ч байсан журамтай гэдгийг нь баттай хэлж байх шиг байна.

Одоо хэдүүлээ хөдлөшгүй хүчтэй үндсэн хуулиа хүртэл хувийн шуналд автаж өөрчилдөг "монгол" "хэнэггүй" "уужим" "балиар бүдүүн" зангаараа түрий барин энд байгаа хөдлөшгүй баримтуудыг өөрчилж нэг үзэх үү? Магадгүй юндэн маань хүний газар хар ажил хийж хоол нойргүй ажиллаж байхдаа эх орондоо үлдсэн хайрт нансалмаагаа хоосон ходоодыг нь тэтгэж хоёр мөөмөөрөө даллан дуудсан хоролмаатай сольж, хормойд шургалсан явдлыг уг нутгийн ардууд нь шөнөөр шургалан гүйж, шуухитнан уухилан, угз тайлах чимээгээр нь мэдээд хайртай(юндэн, хоролмаа) гэсэн sms ч явуулсан байж бас болох юм. За ямар ч байсан



гээд мэдээлэл баттай болсон байг гэж үзье. Ингэхээр журамт эрийн асуудал юрамт эрийн асуудал болон хувирах ёстой доо:


Ааа, ха хаха, ичих нүүрээ элгэндээ наасан юндэн ингэж олны өмнө онигоо болж баригдлаа даа. Энэ гадаад нөхөр шууд хэлж байна ш дээ. FALSE гэж. Би бас муу ч гэсэн худлаа гэдгийг нь ойлгоод байгаа юмаа бас.

За галзуурсан биш ингэж гажиж яанам билээ. Эмакс хэрэглэдэг нөхөр байвал бичсэн файл дээрээ M-x prolog-mode гэж горимыг нь солиод C-c C-l гэж уг файлаа пролог дээр дуудаж хөрвүүлэхээр прологийн асуух самбарыг харуулдаг. Тэндээс та юндэнг журамтай эсэхийг нь асуугаад үз л дээ.