2010/04/20

Нөгөө нь & Логик програмчлал

Өнөөдөр ажил дээр сууж байтал мессенжерээр доорх масс мессеж цацагдаж байх юм:
Нэг гүүрээр аав, ээж охин, өвөө 4 гарах болжээ. Тэд 17 минутад амжих ёстой байв. Гүүрээр дээд тал нь 2 хүн гарна, дундаа 1 гар чийдэнтэй, гар чийдэнгээ шидэж болохгүй, нэг нэгнээ үүрч явахгүй. Аав 1 минут, ээж нь 2 минут, охин 5 минут, өвөө нь 10 минут тур гүүрийг явж туулна гэвэл 17 минутад яаж бүгдээрээ амжиж гарах вэ?
Сүүлийн гурав дөрвөн хоног Пролог хэмээх логик програмчлалын хэлтэй ноцолдоод сууж байсныг хэлэх үү, дээрх бодлогыг Пролог дээр програмчилж үзэхээр санагдав. Доорх бодолт маань нэлээд болхи бөгөөд гүүрээр гарч болох бүх боломжийг шалгаж үзэх тул олон хүн гол гарах тохиолдолд удаан ажиллах болно. Жишээ нь аав нь гүүрээр нааш цааш 17 удаа гүйж гарах нөхцөлийг хүртэл шалгана. Доорх программыг Пролог дотроос гүүрээр_гарах_боломж([өвөө, аав, ээж, охин, гар_чийдэн], [], 17, Хариу). гэж дуудаарай. Олдсон хариунууд нь Хариу гэсэн хувьсагч дотор хадгалагдана. Цаашаа тайлбарламаар байсан боловч гэрийн зүг гэлдрэх цаг болсон тул ингээд орхиё.


Үүнээс хойш түүнээс цааш би (нөгөө нь) логик болон функционал програмчлал гэх мэт хэнд ч хэрэггүй зүйлсээр та бүхнийг залхааж байх болно оо.

8 comments:

  1. логик болон функционал програмчлал гэдгээ дэлгэрэнгүй тайлбарлавал?

    юуг програмчлах гэж байгаа юм бэ?

    юунд хэрэгтэй эд вэ?

    боломжууд нь?

    надад сонирхолтой байна л даа

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

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

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

    ReplyDelete
  5. Тун сонирхолтой юм.

    Лоом, Могой хоёрыг харьцуулах нь тэнэг хэрэг. Гэхдээ тус тусын давуу талыг ашиглавал тун их үр дүнд хүрч болох мэт...

    ReplyDelete
  6. гайхалтай. Би уг нь энэ хэдэн хэлийг срусан л да. Гэхдээ харахад зүгээр л нэг эрээн юм харагдаад байна БИШИРЧИХЛЭЭ

    ReplyDelete
  7. Ёстой чөтгөр бүү мэд. Логик програмчлалаар Лисп гээд нэг нөхрийг хальт хараад өнгөрсөн санагдана. Яг одоо уламжлалт програмчлалын PHP дээр код бичиж суугаа тул ингээд хоёр мөрөнд хийчихье. Тайлбарлалтгүй. Хаха
    $result=array(1=>'Аав+Ээж+Чийдэн->Тов', 2=>'Aaв+Чийдэн->Эхлэл', 3=>'Өвөө+Охин+Чийдэн->Тов', 4=>'Ээж+Чийдэн->Эхлэл', 5=>'Аав+Ээж+Чийдэн->Тов');
    print_r($result);
    Марзаганах ч яахав. Завтай бол array_walk-р callback-даад үзвэл нэлээн цөөн мөрөнд хусаж магадгүй. Гэхдээ логик хэлийг яаж л гүйцэв гэж. :-)

    ReplyDelete
  8. франк гэдэг нөхөр худлаа цэцэрхэж их юм мэддэг хүний дүр эсгэсэн мэт санагдлаа

    бусад залуучууд нь харин мундаг юм аа, та нарт амжилт хүсье.

    тэр франк гэдэг нөхөрт ч мөн адил.

    ReplyDelete