"Prologue" нь програмчлалын хэл буюу хиймэл оюун ухааны үндэс суурь юм. Логик програмчлал. Пролог хэлний үндэс Пролог хаана хэрэглэгддэг вэ?

Тэр яагаад гайхалтай юм бэ? Би хэдэн арван хэл мэддэг бөгөөд өөр нэг хэл сурах нь надад асуудал биш, би одоо хэрэггүй гэж харж байна.

Оршил нь өвөрмөц юм. Энэ нь тунхаглалын програмчлалын парадигмыг илэрхийлдэг цорын ганц хэл юм; энэ нь олон зуун өөр өөр хэрэглүүртэй хэл боловч тэдгээрийг Prolog гэж нэрлэсэн хэвээр байгаа бөгөөд нэрэндээ зөвхөн угтвар болон дагаваруудыг нэмдэг; энэ нь 20 гаруй жилийн хугацаанд мэдэгдэхүйц өөрчлөлт гараагүй амьд хэл юм; Энэ нь магадгүй жинхэнэ програмчлалд ямар ч хэрэглээгүй маш алдартай цорын ганц програмчлалын хэл юм. Яагаад Пролог гэж?

Пролог нь өвөрмөц шинж чанартай бөгөөд аз жаргалтай давхцлын улмаас үүссэн (дэлхийн нууцлаг бүтэц). Нэгэн цагт 60-аад онд автомат теоремыг батлах онол маш хурдацтай хөгжиж байсан бөгөөд Робинсон ямар ч үнэн теоремыг (үүнийг аксиомоос гаргаж авах) хязгаарлагдмал хугацаанд нотлох боломжийг олгодог нарийвчлалын алгоритмыг санал болгосон (энэ нь тийм биш юм). мэдэгдэж байгаа). Хожим нь энэ нь ерөнхий асуудлын хамгийн сайн шийдэл бөгөөд теоремыг хязгаарлагдмал тооны үйлдлээр батлах боломжгүй юм. Энгийнээр хэлбэл, алгоритм нь (ерөнхийдөө хязгааргүй) графын өргөнийг эхний хөндлөн огтлолцол юм. Мэдээжийн хэрэг, алгоритмын үйл ажиллагааны урьдчилан таамаглах чадвар нь 0-тэй тэнцүү байдаг тул энэ нь програмчлалын хэлэнд огт тохиромжгүй юм. Тэр мөчид Калмаров асуудлын гайхалтай нарийсалтыг олсон бөгөөд үүний ачаар зарим теоремуудын баталгаа нь програмын процедурын гүйцэтгэл шиг харагдаж байв. Баталгаажуулж болох теоремуудын ангилал нь нэлээд өргөн бөгөөд програмчлагдах бодлогын ангилалд маш сайн хэрэглэгдэх боломжтой гэдгийг тэмдэглэх нь зүйтэй. Ингээд л 1972 онд Пролог бий болсон.

Энэ нийтлэлд би ерөнхий логик асуудлыг шийдвэрлэх хэрэгсэл болох Prolog-ийн талаар ярихыг хичээх болно. Энэ сэдэв нь Прологийн синтаксийг аль хэдийн мэддэг бөгөөд үүнийг дотроос нь ойлгохыг хүсдэг хүмүүст, мөн тухайн хэлний синтаксийг огт мэддэггүй боловч нэмэлт цаг зарцуулахгүйгээр түүний "амтыг" ойлгохыг хүсдэг хүмүүст сонирхолтой байх болно. синтаксийн бүтцийг сурах.


Prolog-ийн гол онцлог нь уншихад хялбар боловч бичихэд маш хэцүү, бичих нь бүр ч хялбар болсон гэж хэлдэг нийтлэг хэлнүүдээс үндсээрээ ялгаатай, дахиад нэг алхам, таблет дээр чирж бичих боломжтой. Google+ дээрх найзууд шиг модулиуд ажиллаж байгаа тул кодын чанар өөрөө үүнээс ихээхэн хохирол амсдаг гэдгийг бид бүгд мэднэ. Мөр бүр нь ойлгомжтой мэт боловч систем хэрхэн ажилладаг талаар Хиндустан хэлснээр хөгжүүлэгчид хүртэл ойлгодоггүй. Пролог заах бүх номонд тэд ижил алдаа гаргаж, баримт, харилцаа холбоо, асуулгын тухай түүхийг эхлүүлж, тухайн хэлийг шинжээчийн систем эсвэл мэдээллийн сан болгон төлөвшүүлдэг гэж надад санагддаг. Хөтөлбөрийг хэрхэн зөв уншиж, хэдэн арван програмыг нь уншиж сурах нь илүү чухал юм :)

Оршил хөтөлбөрүүдийг хэрхэн зөв унших вэ

Хэл нь маш цөөхөн тусгай тэмдэгт, түлхүүр үгтэй тул тэдгээрийг байгалийн хэл рүү амархан орчуулдаг тул програмуудыг уншихад маш хялбар байдаг. Программист хүний ​​гол алдаа бол тэр программ хэрхэн ажилладагийг шууд төсөөлөхийг хүсдэг бөгөөд тухайн программын дүрсэлсэн зүйлийг уншихыг хүсдэггүй тул энгийн хүний ​​тархийг сургах нь програмистаас хамаагүй хялбар юм шиг санагддаг.
Үзэл баримтлал
Энэ хэлэнд 2 ойлголт байдаг предикатууд(нөхцөл) ба объектууд(тэд мөн хувьсагч ба нэр томъёо). Предикатуудтодорхой нөхцөлийг илэрхийлэх, жишээлбэл, ногоон объект эсвэл анхны тоо; нөхцөл нь оролтын параметртэй байх нь зүйн хэрэг юм. Жишээлбэл ногоон_объект(объект), анхны_тоо(тоо). Предикат дахь параметрийн тоо нь предикатын аритетийг тодорхойлдог. Объектууд- нэр томъёо, тогтмол ба хувьсагч юм. Тогтмолууд- эдгээр нь тоонууд ба мөрүүд, хувьсагч- үл мэдэгдэх объектыг, магадгүй хайж буй объектыг илэрхийлж, шугамаар тэмдэглэнэ томүсэг. Нөхцөлүүдийг одоохондоо үлдээж, хамгийн энгийн програмыг авч үзье.
Програм
Програм нь маягтын дүрмийн багц юм Нөхцөл1 ба нөхцөл2 ба... бол нөхцөл үнэн байна.Албан ёсоор эдгээр дүрмүүдийг AND-аар нэгтгэдэг боловч Prolog-д логик үгүйсгэл байхгүй бөгөөд That холбогч нь зөвхөн нэг предикат (нөхцөл) байж болох тул зөрчилдөөнийг олж авах боломжгүй юм.

Х:- B_1, B_2. % дүрэм нь: Хэрэв B_1 ба B_2 бол А
сондгой_анхны (Тоо) :- анхны (Тоо), сондгой (Тоо).
% Хэрэв "Тоо" нь анхны ба сондгой бол "Тоо" нь сондгой_анхны тоо болно

Таны харж байгаагаар хувьсагчийн нэр нь хамрах хүрээтэй байдаг - энэ бол дүрэм юм. Математикийн хувьд зөв, дүрэм сонсогдож байна: дурын хувьсагчийн хувьд - "Тоо", хэрэв энэ нь анхны ба сондгой бол анхны_сондгой байна. Үүний нэгэн адил үүнийг дараах байдлаар өөрчилж болно: Хэрэв сондгой ба анхны "Тоо" байвал сондгой_анхны тоо байна. Тиймээс хувьсагчийн нэр маш чухал юм! Хэрэв зүүн талд (өмнө:-) Тоо-г 2-оор солих юм бол дүрэм нь утгыг нь өөрчилнө: Дурын 2 ба Тооны хувьд хэрэв Тоо энгийн ба сондгой байвал 2-р тоо энгийн сондгой байна. Бүх тоо анхны_сондгой байна! Энэ бол Prolog-ийн хамгийн нийтлэг алдаа юм.

Х:- B_1, B_2. % дүрэм нь: Хэрэв B_1 ба B_2 бол A сондгой_анхны тоо(Тоо) :- анхны(Тоо), сондгой(Тоо). % Хэрэв "Тоо" нь анхны ба сондгой бол "Тоо" нь сондгой_анхны тоо болно

Жишээ - төгс тоо
төгс_тоо(N) :- тоо(N), тоогүй_хуваагчийн_нийлбэр(N, Хуваагчдын нийлбэр), тэнцүү(Хуваагчийн_нийлбэр, H). төгс_тоо(1). тэнцүү (объект, объект). (1, 1)-гүй_хуваагч_нийлбэр. Тоо_гүй_хуваагч_нийлбэр(Тоо, Нийлбэр) :- өмнөх_тоо(Тоо, Өмнөх), тоог_тоонд_хуваагч_нийлбэр (Тоо, Нийлбэр, Өмнөх). тоонд_хуваагч_тооны_нийлбэр(Тоо, 1, 1). нийлбэр_тоо_хуваагч_тоо (Тоо, нийлбэр, хуваагч) :- хуваагдах (Тоо, нийлбэр, хуваагч), өмнөх_тоо (Хуваагч, өмнөх), тоо_хуваагч_тоо_тоо (Тоо, нийлбэр, өмнөх), нэмэх (нийлбэр, хуваагч). тоонд_хуваагч_нийлбэр (Тоо, нийлбэр, хуваагч) :- хуваагдахгүй (тоо, хуваагч), өмнөх_тоо(хуваагч, өмнөх), тоонд_хуваагч_нийлбэр (тоо, нийлбэр, өмнөх).

Эхлээд дүрмүүд ямар утгатай болохыг албан ёсоор уншъя:

  1. Хэрэв “H” нь тоо бөгөөд “H” болон “SumDivisors”-ын хувьд тоогүй нийлбэр хуваагч байх нөхцөл хангагдсан бол өөрөөр хэлбэл “H” тоон хуваагчдын нийлбэр нь “H” нь “Нийлбэрийн хуваагч”-тай тэнцүү байна. , тэгвэл "H" нь төгс тоо юм.
  2. 1 бол төгс тоо. Дүрэм журамд нөхцөл байхгүй байж болох бөгөөд энэ тохиолдолд тэдгээрийг баримт гэж нэрлэдэг.
  3. "O" объект бүр "O"-той тэнцүү байна. Зарчмын хувьд "=" гэсэн стандарт предикат байдаг, гэхдээ та үүнийг өөрийнхөөрөө бүрэн сольж болно.
  4. 1-гүй_хуваагч_нийлбэр нь 1-тэй тэнцүү байна.
  5. Өмнөх "Тоо" хүртэлх "Тоо" хуваагчдын нийлбэр нь "Нийт"-тэй тэнцүү бол энэ нь тоогүй хуваагчдын нийлбэр болно. Ийнхүү X-ийн хуваагчдын нийлбэр нь Y-ээс бага буюу тэнцүү байна гэж илэрхийлэгддэг, учир нь X нь X-д хуваагддаг тул бид Y = X - 1-ийг авна.
  6. Дараа нь 3 предикат нь Y-ээс бага буюу тэнцүү хуваагчийн нийлбэрийг тодорхойлно (Хуваагч), 1-р тохиолдол Y нь 1-тэй тэнцүү, 2-р тохиолдол Тоо нь Y-д хуваагдана, дараа нь хуваагчдын нийлбэр (X, Y) = хуваагчдын нийлбэр (X, Y-) байна. 1) + Y , ба 3-р тохиолдол Тоо нь Y-д хуваагддаггүй, тэгвэл хуваагчдын нийлбэр(X, Y) = хуваагчдын нийлбэр(X, Y-1).
Хөтөлбөр нь тодорхойлолтуудын багцтай адил юм
Эдгээр дүрмийг "тодорхойлолт" дээр үндэслэсэн математик багатай, байгалийн жамаар унших хоёрдахь арга бий. Prolog-ийн зүүн талд байгаа бүх дүрмүүд (тэр үеийн хэсэгт) зөвхөн нэг нөхцөлийг агуулж байгааг анзаарч болно, энэ нь үндсэндээ энэ нөхцлийн "тодорхойлолт" юм.
Жишээлбэл, 1-р дүрэм бол төгс тооны тодорхойлолт юм. "H" нь тоо бөгөөд "H"-ийн хуваагчдын нийлбэр нь "H"-тэй тэнцүү байх үед "H" нь төгс тоо юм. Ижил предикатуудыг "эсвэл" нөхцөлийг ашиглан нэрээр нь бүлэглэнэ. Өөрөөр хэлбэл, та тодорхойлолтонд нэмж болно: "H" нь .., эсвэл "H" нь 1 байх үед төгс тоо юм.

Энэхүү унших аргыг өргөн хэрэглэгддэг бөгөөд энэ нь предикатуудыг нэгэн төрлийн бүлэгт нэгтгэх боломжийг олгодог бөгөөд тайлбарлагч предикатуудыг ямар дарааллаар задалж байгааг ойлгоход тусалдаг.
зарим мэдэгдлийн үнэн эсэхийг шалгах. Жишээлбэл, хэрэв предикат нь нэг тодорхойлолтгүй бол түүгээр өгүүлбэрийн үнэнийг батлах боломжгүй гэдэг нь ойлгомжтой. 1-р жишээн дээр "хуваагдсан" предикат ямар ч тодорхойлолтгүй байна.

Сонирхолтой баримт бол Prolog-д ямар ч гогцоо, хувьсагчийн хуваарилалт, төрлийн мэдэгдэл байхгүй бөгөөд хэрэв бид нэр томъёо, хайчлах талаар санаж байвал хэл нь алгоритмын хувьд бүрэн төгс болно.

Дулааны банн
Дулааны банннэрлэгдсэн объектуудын цуглуулга гэж рекурсив тодорхойлолттой байна. Нэр томъёо = "нэр"(объект, объект, ...), жишээ хүн("Нэр", "Овог"), "+"(1, 2), хүн(хаяг("Зарим хаяг"), овог("Овог"), утас("Утас")). Хэрэв бид нэр томьёог математикийн ойлголт гэж үзвэл энэ нэр томьёо нь функц, бүр тодруулбал функтор, өөрөөр хэлбэл “+”(1, 2) нь 1+2-тэй тэнцүү объект байгааг илтгэнэ. Энэ нь 1+2 = 3 гэсэн үг огтхон ч биш; Пролог дээр энэ илэрхийлэл үнэн биш, модуль 2-ын үлдэгдлийн бүлэгт 3 огт байдаггүйтэй адил. Дахин хэлэхэд, математикийн үүднээс хувьсагчдыг For All гэсэн үгээр холбодог бөгөөд хэрэв өгүүлбэрт энэ үг байгаа бол энэ зорилгоор нэр томьёо (функтор) ашигладаг. Аливаа тооны хувьд хүчин зүйлийн тоо байдаг: факториал(X, факт(X)).

Програмчлалын үүднээс нэр томъёог илүү энгийнээр тайлбарлаж болно: нэр томьёо нь олон тооны шинж чанаруудтай объект, шинж чанарууд нь бусад нэр томъёо эсвэл тогтмол эсвэл хувьсагч байж болно (өөрөөр хэлбэл тодорхойлогдоогүй). Гол ялгаа нь Prolog дахь бүх объектууд өөрчлөгддөггүй, өөрөөр хэлбэл та тэдгээрийн шинж чанаруудыг өөрчлөх боломжгүй, гэхдээ хувьсагч гэсэн тусгай төлөв байдаг.

Жишээ - Бүхэл тоон арифметик
nat(0). nat(тоо(Тоо)) :- nat(Тоо). нэмэх(0, Тоо, Тоо). нэмэх(тоо(N1), N2, тоо(Res)) :- нэмэх(N1, N2, Res). үржүүлэх(0, Тоо, 0). үржүүлэх(тоо(Ch1), Ch2, Res2) :- үржүүлэх(Ch1, Ch2, Res), нэмэх(Res, Ch2, Res2).
  1. nat шинж чанарын тодорхойлолт (натурал тоо). 0 нь натурал тоо, хэрэв Тоо нь натурал бол объектын дугаар (Тоо) байдаг бөгөөд энэ нь мөн натурал тоо юм. Математикийн хувьд "тоо" гэсэн нэр томъёо нь +1 функцийг илэрхийлдэг; програмчлалын үүднээс "тоо" нь рекурсив өгөгдлийн бүтэц бөгөөд түүний элементүүд: тоо (0), тоо (тоо (0)), тоо (тоо) (тоо (0))).
  2. Нэмэх харьцаа нь 0 + Тоо = Тоо. Хэрэв Ch1 + Ch2 = Res бол (Ch1+1) + Ch2 = (Res+1).
  3. Үржүүлэх харьцаа нь 0 * Тоо = 0. Хэрэв Ch1 * Ch2 = Res, Res + Ch2 = Res2 бол (Ch1+1) * Ch2 = Res2.
Эдгээр мэдэгдлүүд нь энгийн арифметикийн хувьд үнэн байх нь ойлгомжтой, гэхдээ бид яагаад Тоо + 0 = Тоотой ижил тодорхой зүйлийг оруулаагүй юм бэ? Хариулт нь энгийн: илүүдэл нь ямар ч тодорхойлолтоор маш муу юм. Тийм ээ, энэ нь тооцоололд тустай, нэг төрлийн дутуу оновчлол боловч гаж нөлөө нь тодорхойлолтын зөрчилдөөн, мэдэгдлийн тодорхой бус гаралт, орчуулагчийн гогцоо байж болно.

Пролог предикатуудыг хэрхэн ойлгож, мэдэгдлийг хэрхэн нотлодог

Мэдээжийн хэрэг, унших програмууд нь Прологийн хэв маягийг мэдрэхэд тусалдаг боловч эдгээр тодорхойлолтыг яагаад, хэрхэн ашиглаж болохыг тодорхой тайлбарладаггүй. Дээр дурдсан жишээнүүдийг бүрэн хэмжээний програм гэж нэрлэх боломжгүй, учир нь нэвтрэх цэг хангалтгүй. Prolog руу нэвтрэх цэг нь SQL мэдээллийн баазын эсрэг асуулга эсвэл функциональ програмчлалын үндсэн функцийг дуудахтай ижил төстэй асуулга юм. Асуулгын жишээ: nat(Тоо) - натурал тоог олох, нэмэх(0, 0, Үр дүн) - Үр дүн хувьсагчид 0 ба 0-ийг нэмсний үр дүнг олох, nat(0) - 0 натурал тоо эсэхийг шалгах гэх мэт. .

Мэдээжийн хэрэг, асуулгын үр дүнг логик үндэслэлээр урьдчилан таамаглахад хэцүү биш боловч програм үүнийг хэрхэн олж авсаныг ойлгох нь маш чухал юм. Эцсийн эцэст Prolog нь хар хайрцаг биш, харин програмчлалын хэл бөгөөд SQL төлөвлөгөөг бүтээж, өөр өөр өгөгдлийн сан дээр хайлтыг өөр өөрөөр гүйцэтгэх боломжтой мэдээллийн сангаас ялгаатай нь Prolog нь маш тодорхой гүйцэтгэх дараалалтай байдаг. Баримт нь мэдээллийн санд бид хүснэгтэд байгаа өгөгдлүүд дээр үндэслэн ямар хариулт авахыг хүсч байгаагаа бүрэн мэддэг бөгөөд харамсалтай нь програмын Прологийг харахад аль мэдэгдлүүдийг логикийн хувьд дүгнэлт хийх боломжтой гэж хэлэхэд хэцүү байдаг тул энэ нь илүү хялбар байдаг. Prolog орчуулагч хэрхэн ажилладагийг ойлгох.

Жишээ хүсэлтийг авч үзье нэмэх(0, 0, Үр дүн) :
1. Бид энэ хүсэлтийн нэг дүрмийн зүүн талтай таарч тохирохыг (загвар тааруулах, шийдвэрлэх нэг төрөл) олдог. Энэ асуулгын хувьд нэмэх (0, Тоо, Тоо). Асуулгын бүх аргументуудыг дүрэмтэй нэг нэгээр нь хамааруулж аваад: 0 = 0, 0 = Тоо, Үр дүн = Тоо. Эдгээр тэгшитгэлд 2 хувьсагч (Тоо ба Үр дүн) багтдаг бөгөөд тэдгээрийг шийдээд бид Тоо = Үр дүн = 0 гэсэн утгатай болно. Энэ дүрэмд нөхцөл байхгүй тул бид асуусан асуултын хариултыг авсан. Хариулт: тийм ба Үр дүн = 0.

Хүсэлт nat(тоо) :
1. Бид nat(0) дүрэмтэй 1-р тохирлыг тэгшитгэлүүдийг харгалзах замаар шийдэж, өөрөөр хэлбэл нарийвчлалыг олсноор Тоо = 0. Хариулт: тийм, Тоо = 0.

Хүсэлт нэмэх(Үр дүн, 0, тоо(0)) :
1. Нэмэх(0, Тоо, Тоо) дүрмээр тогтоолыг ол: Үр дүн = 0, 0 = Тоо, тоо(0) = Тоо, гэхдээ (!) Тоо = 0 = тоо(0) - 0 бол боломжгүй. ижил тоо (0). Иймд бид дараах дүрэмтэй тогтоолыг хайж байна.
2. Дүрмийг нэмэх(тоо(N1), Ch2, тоо(Res)), тоо(N1) = Үр дүн, Ch2 = 0, тоо(Res) = тоо(0) гэсэн дүрмээр тогтоолыг ол, эндээс Res = 0 болно. . Энэ дүрэмд бид нягтлан бодох бүртгэлийн үр дүнг (хувьсагчийн утгууд), нэмэх(Ch1, Ch2, Res) -> нэмэх(Ch1, 0, 0) зэргийг харгалзан шалгах ёстой нөхцөлүүд байдаг. Бид стек дээрх хувьсагчдын утгыг санаж, шинэ хүсэлт үүсгэнэ нэмэх(H1, 0, 0)
3*. Нэмэх(Х1, 0, 0) асуулгыг шийдэж бид нэмэх(0, Тоо, Тоо) бүхий нарийвчлалыг олж, Х1 = 0, Тоо = 0 болно.
4. Бид стекийн дагуу өмнөх хувьсагчид руу буцна Үр дүн = тоо (N1) = тоо (0). Хариулт нь тоо (0) олдсон. Үүний дагуу пролог машин одоо X + 0 = 1 тэгшитгэлийг шийдсэн.

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

Жишээ хүсэлт нэмэх(тоо, тоо, тоо) : хариулт нь тийм, Тоо = 0.

Жишээ хүсэлт нэмэх(0, 0, 0) : хариулт нь үгүй, эхний оролдлого дээр бүх шийдвэр биелээгүй.

Жишээ хүсэлт нэмэх(Тоо, Тоо, тоо(Тоо)) : Хариулт нь тийм, Тоо = 1. X + X = X + 1 тэгшитгэлийг шийдэж байна.

Үржүүлэх(Тоо, тоо(0), тоо(0))-ыг гаргаж үзээрэй, энэ нь хувьсагчдыг стек дээр 2 удаа түлхэж, шинэ хайлтыг тооцоолох шаардлагатай. Prolog машины мөн чанар нь та 1-р үр дүнг хаяж болно, дараа нь Prolog өмнөх төлөв рүү буцаж, тооцоогоо үргэлжлүүлнэ. Жишээ нь хүсэлт nat(тоо) , эхлээд 1-р дүрмийг хэрэглэж, 0-ийг гаргасны дараа 2-р дүрмийг + 1-р дүрмийг хэрэгжүүлээд (0) тоог гаргаснаар та бүх натурал тоонуудын хязгааргүй дарааллыг давтаж авах боломжтой. Өөр нэг жишээ, хүсэлт нэмэх(Тоо, тоо(0), Тоо2) , X + 1 = Y тэгшитгэлийн бүх хос шийдүүдийн дарааллыг гаргана.

Дүгнэлт

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

Дараагийн өгүүллээр би эрэмбэлэх асуудлыг хэрхэн шийддэг, цус сэлбэх дараалал, Miss Manners болон бусад алдартай логик асуудлуудын талаар ярихыг хүсч байна. Сэтгэл хангалуун бус байгаа хүмүүст би санал болгохыг хүсч байна дараагийн даалгавар (шагналыг хамгийн түрүүнд шийдсэн хүн):
Предикат бич, энэ нь 3-аас эхлэн натурал тоонуудын хязгааргүй дарааллыг үүсгэх болно. Эдгээр нь Prolog дахь стандарт тоонууд байх ёстой бөгөөд эдгээр үйлдлүүд нь is predicate ашиглан хийгддэг: X нь 3 + 1 => X=4.

Олон мянган жилийн турш хүн төрөлхтөн мэдлэгийг хуримтлуулж, боловсруулж, дамжуулсаар ирсэн. Эдгээр зорилгын үүднээс шинэ арга хэрэгслийг байнга зохион бүтээж, хуучныг нь сайжруулж байна: хэл яриа, бичих, шуудан, телеграф, утас гэх мэт. Компьютер бий болсон нь мэдлэг боловсруулах технологид томоохон үүрэг гүйцэтгэсэн.

1981 оны 10-р сард Японы Олон улсын худалдаа, аж үйлдвэрийн яам судалгааны байгууллага болох Шинэ үеийн компьютерийн технологийн судалгааны төвийг байгуулснаа зарлав. Энэхүү төслийн зорилго нь мэдлэгт суурилсан мэдээлэл боловсруулах системийг бий болгох явдал байв. Эдгээр системүүд нь хэрэглэгчидтэй байгалийн хэлээр харилцах чадвартай тул менежментийн хялбар байдлыг хангана гэж таамаглаж байсан. Эдгээр системүүд нь бие даан суралцах, санах ойд хуримтлагдсан мэдлэгээ янз бүрийн асуудлыг шийдвэрлэхэд ашиглах, хэрэглэгчдэд мэргэжилтний зөвлөгөө өгөх, компьютерийн шинжлэх ухааны чиглэлээр мэргэшсэн байх албагүй байх ёстой байв. Хүн зурагт, дуу хураагуур, тоос сорогч гэх мэт гэр ахуйн цахилгаан хэрэгсэлтэй адил тав дахь үеийн компьютерийг хялбархан ашиглах боломжтой гэж таамаглаж байсан. Японыхоос хойш удалгүй Америк, Европын төслүүд эхэлсэн.

Ийм систем бий болсноор мэдлэгийн бааз, шинжээчдийн системийг ашиглах замаар технологийг өөрчлөх боломжтой. Тав дахь үеийн компьютерт чанарын шилжилтийн гол мөн чанар нь өгөгдөл боловсруулахаас мэдлэг боловсруулахад шилжих явдал байв. Япончууд компьютерийн фон Нейманы архитектураас холдож, хүний ​​сэтгэхүйг компьютерийн үйл ажиллагааны зарчимд тохируулж чадахгүй, харин компьютерийн ажиллагааг хүний ​​сэтгэдэгт ойртуулна гэж найдаж байсан. 1991 онд тав дахь үеийн компьютерийн анхны загварыг бүтээхээр төлөвлөж байсан.

Зорилгодоо хэзээ ч бүрэн хүрч чадаагүй нь одоо тодорхой болсон боловч энэ төсөл нь хиймэл оюун ухааны чиглэлээр шинэ судалгааг хөгжүүлэхэд түлхэц болж, логик програмчлалын сонирхлыг төрүүлэв. Фон Нейманы уламжлалт архитектур нь үр дүнтэй хэрэгжүүлэхэд тохиромжгүй байсан тул PSI болон PIM логик програмчлалын тусгай компьютеруудыг бүтээсэн.

Тав дахь үеийн компьютерийн төслийн программ хангамжийг боловсруулах үндсэн аргачлалаар дараахь зүйлийг сонгосон. логик програмчлал, түүний томоохон төлөөлөгч нь Пролог хэл юм. Одоогийн байдлаар Prolog нь Япон, Европ дахь хамгийн алдартай хиймэл оюун ухааны хэл хэвээр байгаа юм шиг санагдаж байна (АНУ-д уламжлалт байдлаар хиймэл оюун ухааны өөр хэл илүү өргөн тархсан байдаг - функциональ програмчлалын хэл Lisp).

"Пролог" хэлний нэр нь үгнээс гаралтай ЛОГИК ПРОГРАМЧЛАЛТ(Франц хэл дээрх PROgrammation en LOGique, англи хэл дээр LOGic хэл дээрх програмчлал).

Пролог нь математик логикийн ийм салбар дээр суурилдаг предикатын тооцоо. Илүү нарийн, түүний үндэс нь теоремуудыг батлах журам юм шийдвэрлэх аргаУчир нь Эвэр заалтууд. Дараагийн лекцийг энэ сэдэвт зориулах болно.

Пролог хэл үүсч хөгжсөн түүхэнд дараах үе шатуудыг ялгаж салгаж болно.

1965 онд МУЗ-ийн сэтгүүлийн 12 дахь дугаарт хэвлэгдсэн "Тусгай байдлын зарчимд суурилсан машинд суурилсан логик" хэмээх нийтлэлдээ Ж.Робинсон нэгдүгээр эрэмбийн предикатын тооцоонд теоремын баталгааг автоматаар олох аргыг танилцуулсан. " шийдвэрлэх зарчим". Энэ ажлыг орчуулан уншиж болно: Robinson J. Машинд суурилсан логик дээр суурилсан тогтоолын зарчим// Кибернетик цуглуулга. - Боть. 7 (1970). Үнэн хэрэгтээ энэ аргын санааг 1931 онд компьютер байхгүй үед Хербранд санал болгосон (Herbrand, “Une methode de demonstration”, Эдгээр, Парис, 1931). Робинсон энэ аргыг өөрчилсөн бөгөөд ингэснээр автомат, компьютер ашиглахад тохиромжтой болсон бөгөөд үүнээс гадна түүний аргын үндэс болсон үр дүнтэй нэгтгэх алгоритмыг боловсруулсан.

1973 онд Ален Колмеро тэргүүтэй "хиймэл оюун ухааны бүлэг" Марселийн их сургуульд теоремуудыг батлах хөтөлбөрийг бүтээжээ. Энэхүү программыг байгалийн хэл дээрх текст боловсруулах системийг бий болгоход ашигласан. Теоремыг батлах программыг Prolog (Programmation en Logique) гэж нэрлэсэн. Энэ нь Prologue-ийн прототип болсон. Энэ нэрийг зохиогч нь Алан Колмерогийн эхнэр байсан гэж домогт өгүүлдэг. Програм нь Фортран хэл дээр бичигдсэн бөгөөд нэлээд удаан ажилласан.

Роберт Ковальскийн ажил нь логик програмчлалыг хөгжүүлэхэд чухал ач холбогдолтой байв. Предикат логикХэрхэн програмчлалын хэл"(Kowalski R. Predicate Logic as Programming Language. IFIP Congress, 1974), тэрээр үр ашгийг дээшлүүлэхийн тулд олонлогийн хэрэглээг хязгаарлах ёстойг харуулсан. Эвэр заалтууд. Дашрамд хэлэхэд, Ковальски, Колмеро нар нэг зуны турш хамт ажиллаж байсан нь мэдэгдэж байна.

1976 онд Ковальски өөрийн хамтран зүтгэгч Маартен ван Эмдентэй хамтран логик програмын текстийг унших хоёр аргыг санал болгов: процедур ба тунхаглал. Эдгээр аргуудыг гурав дахь лекц дээр авч үзэх болно.

1977 онд Эдинбург хотод Уоррен, Перейра нар DEC-10 компьютерт зориулсан маш үр дүнтэй Prolog хөрвүүлэгчийг бүтээсэн бөгөөд энэ нь Prolog-ийн дараагийн олон хэрэгжилтийн прототип болсон юм. Сонирхолтой нь,

Лекц нь төлөвийн орон зайн график ашиглан асуудлыг шийдвэрлэхэд зориулагдсан болно. Төлөвийн орон зайг төлөв байдлын багц хэлбэрээр дүрсэлсэн байдаг - графын оройнууд, төлөвөөс төлөвт шилжих шилжилтийн багц - график нумууд, анхны төлөвүүдийн багц ба эцсийн төлөвүүдийн багц. Асуудлын шийдэл нь анхны төлөвийг эцсийн төлөвтэй холбосон төлөвийн орон зайн график дээрх зам хэлбэрээр дүрслэгдсэн болно. Хэрэв асуудлын төлөвийн орон зай бага бол гүнээс эхлээд хайлтыг ашиглан бүх оновчтой шийдлийг олох болно. Том төлөвийн орон зайтай асуудлуудад зөвхөн нэг оновчтой шийдлийг өргөнөөр хайх замаар тооцоолно. Бүх нийтийн шийдлүүдийг асуудалд ашигладаг. Янз бүрийн даалгаварт байгаа мужууд өөр өөр домэйнд харьяалагдаж болно. Олдсон хамгийн сайн шийдлүүдийг санахын тулд "хувьсагч" varM ашигладаг. Хөрвүүлэгч өөрөө шаардлагатай төрлүүдийг олдог. Visual Prolog хувилбар 7.5, хараахан хэвлэгдээгүй байна. Түүнийг 2014 онд хэвлүүлэхээр төлөвлөж байгаа ч яг огноо нь тодорхойгүй байна. Visual Prolog 7.4 одоо хүн бүрт боломжтой.

Пролог гарч ирсэн нь логик, математик, програмчлалын хөгжлөөс үүдэлтэй юм. Сүүлийнх нь хамгийн чухал үүрэг гүйцэтгэсэн. Логик, математикийн мэргэжилтнүүд програмчлалыг "зөв замд" оруулах оролдлого хийсэн боловч мэдээллийн технологийн хөгжил тэс өөр үр дүнг харуулсан.

Прагматик императив програмчлал нь илүү ирээдүйтэй болсон. "Пролог" нь програмчлалын хэл болж чадсан боловч хиймэл оюун ухааны үндэс болж чадаагүй юм.

Сонгодог програмчлал ба логик

Хүн хэцүү шийдвэрүүдийг логик, үндэслэлтэй гаргадаг. Бараг бодолгүй хүн ухаантай үйлдэл хийдэг. Хэрэв бид мэдээлэл цуглуулах, дүн шинжилгээ хийх, нарийн төвөгтэй тооцоо хийх шаардлагатай шийдвэрүүдийг анхаарч үзэхгүй бол аливаа үр дүн хурдан, үнэн зөв, үндэслэлтэй байдаг.

Энэ баримт нь шийдвэр гаргах хэрэгсэл бүтээх нь энгийн зүйл гэж үзэх хуурмаг шалтгааныг үргэлж өгдөг. Prologue гарч ирснээр хиймэл оюун ухааны асуудал нь технологийн асуудал мэт санагдаж, Хомо сапиенс робот техникийн гурван хуулийг гаргаж ирэв. Гэсэн хэдий ч хиймэл оюун ухаан нь сүнс хэвээр үлдэж, робот техникийн гурван хууль нь үлгэрээс гардаг байсан - "үүнийг хий, би юу болохыг мэдэхгүй байна."

Сонгодог утгаар нь программчлал ("процедурын", "зайлшгүй" эсвэл "функциональ" гэсэн нэр томъёог ихэвчлэн ашигладаг) тоо томшгүй олон програмчлалын хэлүүд байсан 80-90-ээд оны "зовлонтой үеийг" хөгжүүлж, амжилттай даван туулсан.

"Паскаль" болон "Си" нарын жагсаалын тэмцэл удаан үргэлжилж, харгис хэрцгий байсан ч төвийг сахисан, чимээгүйхэн дуусав. Үлдсэн зүйл бол сайн програмчлалын хэл, түүнийг амжилттай хэрэгжүүлэх санаа юм.

Энэ нь Пролог програмчлалын хэл болж хөгжөөгүй гэсэн үг биш юм. Гэвч тэрээр тавьсан зорилгодоо хүрч чадаагүй. Өнөөдөр бид "Prologue" нь дараахь академик хэл юм гэж хэлэх төдийгүй бас зөвтгөж чадна.

  • Сургалтын зорилго;
  • предикатын логик;
  • математик;
  • нарийн хэрэглээ.

Энэ мэдэгдлийг няцаах нь эргэлзээтэй байна. Хиймэл оюун ухаан нь өргөн хэрэглэгддэг төдийгүй нийгмийн бүтэц, ертөнцийн дүр төрхийг эрс өөрчилдөг маш ноцтой үйл явдал юм.

Хиймэл оюун ухаанд зориулсан пролог хэл дээр програмчлал хийгдээгүй: хэлний дөч гаруй жилийн түүхэнд олон нийтийн ухамсарт хамааралтай эрс шинэ үйл явдал нэг ч удаа гараагүй бөгөөд энэ нь эсрэгээрээ байгааг харуулж байна.

Объектив бодит байдал бол хамгийн хүчтэй нь бус харин эрэлт хэрэгцээтэй, хамааралтай зүйл юм.

"Пролог" нь тунхаглагч програмчлалын хэл юм

Баримт, дүрмийг тайлбарлах хэрэгсэлтэй байх нь сайн хэрэг, гэхдээ ямар учиртай вэ? Баримт, дүрэм журам нь ердийн мэдээллийн санд бүрэн нийцдэг. Мэргэшсэн сонгодог програмист нь хэрэглэгчдэд интерактив харилцан яриа өрнүүлдэг бөгөөд сүүлийнх нь түүний асуудлыг шийддэг.

Шаардлагатай бол программист харилцан яриаг сайжруулж, хэрэглэгч баримт, дүрмийн мэдээллийн санг нөхдөг. Аль хэдийн шийдэгдсэн, шийдвэрлэх боломжтой олон асуудлыг хэрэгжүүлэх үнэхээр ажиллаж, олон арван жил туршсан хувилбар.

Пролог програмчлалын хэлний аливаа хэрэгжилтэд баримт, дүрмийг тунхагласан байдлаар танилцуулах нь конвенц, бодит байдлыг оюуны төлөв байдалд нь албан ёсны болгох оролдлого юм. Уламжлалт програмчлал нь оюун ухаанд нөлөөлдөггүй. Сонгодог програмчлал нь албан тушаалд сэтгэл хангалуун байдаг: өгөгдлийг тайлбарлах, боловсруулах. Энд маш олон асуудал байгаа ч үр дүнд хүрэх гайхалтай шийдэл олон байна.

Програмчлалын хэл болох "Пролог" нь дараахь баримтууд юм.

  • ээж (Мария, Наташа); - Мария - Наташагийн ээж;
  • аав (Евгений, Марина); - Евгений бол Маринагийн аав.

Эндээс харахад "Мария" ба "Марина" нь өөр өөр нэр юм. Баримтыг нэмэхэд юу ч саад болохгүй:

  • аав (Евгений, Мария); - Евгений бол Мариягийн аав.

Эдгээр тодорхойлолтууд нь дүрмүүдэд амьдрал өгдөг:

  • эцэг эх(x,y)<- папа (x, y);
  • эцэг эх(x,y)<- мама (x, y);

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

Үнэн хэрэгтээ програмчлалын хэл болох "Пролог" нь баримт, дүрмийн тунхаглалын жишээ болохоос сонгодог програмист хүний ​​ухамсарт дассан логик биш юм. "Пролог" нь өөрийгөө предикат логик хэл гэж үздэг боловч та тухайн хэлний тодорхой хэрэгжилтийг хөгжүүлэгчдээс жишээ, тайлбараар дамжуулан програмчлалыг сурах боломжтой.

Прологын гэр бүл

Францыг Прологийн төрсөн газар гэж үздэг бөгөөд 1973 онд төрсөн он юм. Хэлний сонирхол үе үе шинэчлэгдэж байсан ч атаархмаар тогтвортой байдал нь буурч байв. Хэлний уриа: "Предикатын логик нь энгийн зүйл юм! Энэ бол сэтгэлгээ хэрхэн ажилладагийг тайлбарлах арга юм” гэж уриа хэвээр үлдээсэн.

Пролог програмчлалын хэлний аливаа хэрэгжилт нь предикат логикийг чанд баримталдаг боловч процедурын програмчлалын сонгодог санааг үргэлж агуулсан байдаг. Энэ нэр томъёо нь процедур, функциональ, объект хандалт эсвэл бусад зүйлээс илүү албан ёсны байдлаар хэрэглэгддэг тул "зайлшгүй" гэж хэлэх нь илүү зөв юм.

Аливаа програмчлал нь өгөгдөл, түүнийг боловсруулахтай холбоотой байдаг. Хэлний бүтэц нь шийдэж буй асуудлыг аль болох нарийвчлалтай дүрслэх ёстой бөгөөд иймээс Prolog-ийн бүх мэдэгдэж байгаа хэрэгжүүлэлтүүд: Turbo Prolog, Win Prolog, SWI Prolog, GNU Prolog, Visual Prolog болон бусад нь тунхаглалын бүтцээс гадна энгийн императив илэрхийллүүдийг агуулдаг.

Prologue гэр бүл нь эрдэм шинжилгээний болон судалгааны байгууллагуудад бий болсон тул зөвхөн ойлголтын утгаараа нийтлэг хэлээр ярих боломжтой гэж үздэг. Гэсэн хэдий ч "Пролог" гэсэн ойлголт амьд, хөгжиж буйг харгалзан үзэж болно: энэ хэл нь хамрах хүрээтэй бөгөөд тодорхой хүрээнд эрэлт хэрэгцээтэй байдаг.

Хиймэл оюун ухааны үндэс

Хиймэл оюун ухааны сонирхол хэзээ ч буураагүй, тэд дараагийн тохиолдол гарвал энэ тухай ярьж эхэлдэг ч Prolog нь ердийн сонгодог програмчлалын хэл шиг хиймэл оюун ухаантай хэзээ ч холбогдож байгаагүй.

80-аад оны сүүлээр "Зохион бүтээх машин" хэмээх жинхэнэ, хамааралтай, алдартай оюуны төсөл байсан. Шинэ бүтээл, физик, химийн болон бусад хууль тогтоомжийн талаархи асар их практик мэдлэгийн санг (өгөгдөл) албан ёсны болгохын тулд Prolog-ийг ашиглах бодит оролдлого байсан.

Үр дүнд хүрсэнгүй, хэт олон баримт, дүрмийг Пролог хэл дээр програмчлалын хэл болгон бичих шаардлагатай болсон бөгөөд энэ нь зайлшгүй шаардлагатай шинж чанартай байв. Үүний зэрэгцээ олон амжилттай програм хангамжийн бүтээгдэхүүнийг энгийн хэл дээр зэрэгцүүлэн хэрэгжүүлсэн.

90-ээд оны эхээр ЕХ-ны компьютер дээр 3-аас доош насны хүүхдийн зан үйлийг дуурайсан жинхэнэ оюуны системийн төсөл амжилттай хэрэгжсэн! Прологийг ашиглах сонголтыг бүр авч үзээгүй.

Энэхүү оюуны систем нь ээж, аав гэж юу болохыг, Мария Маринагаас юугаараа ялгаатай болохыг "ойлгохоос гадна" эдгээр асуудлын талаархи олж авсан мэдлэгээсээ бие даан, ямар ч хүчин чармайлтгүйгээр бөмбөг, тэдгээрийн шоо дөрвөлжингийн ялгаа, өнгө хүртэл үсэрч байв. объект ба... (!) анхан шатны математикийн хичээлд: энгийн арифметик үйлдлүүд нь огт өөр бодлого шийдвэрлэж олж авсан мэдлэг дээрээ тулгуурлан түүний чадамжид багтах болсон.

Хиймэл оюун ухааны нутаг дэвсгэрийг эзэмших тал дээр сонгодог програмчлал Прологоос түрүүлж байна гэж хэлж болохгүй ч бодит үр дүнгээ өгч байна.

Оюун ухааныг даалгаврын хувьд энд асуулт хэл дээр биш, харин хэрэгжүүлэх санаан дээр байгаа бололтой. Хэрэв 1991 оны ассемблер нь нөхцөл байдлын тагнуулын ухаалаг системийн "үндэс" болж чадах юм бол асуудал хэрэгжүүлэх хэл дээр биш, харин санаандаа байгаа нь тодорхой.

Пролог програмчлалын хэлнь логик програмчлалын тэргүүлэх хэлнүүдийн нэг юм. Үүнийг 1970-аад онд Ален Колмерауэр бүтээжээ. Энэ нь компьютерийн дэлгэцэн дээрх зааврын дагуу юунд хүрэхийг хүсч байгаагаа нарийн зааж өгөхөөс илүүтэй, логикийг илэрхийлэх боломжтой програмчлалын хэлийг анхлан суралцагчдад зориулан бүтээх оролдлого байсан юм.

Prolog нь хиймэл оюун ухааны олон программуудад хэрэглэгддэг боловч синтакс, утга зүй нь маш энгийн бөгөөд ойлгомжтой (анхны зорилго нь компьютерийн бичиг үсэг мэддэггүй хэл шинжлэлийн мэргэжилтнүүдэд зориулсан хэрэглүүр хангах явдал байсан). Пролог нэр нь LOGIC PROGRAMMING гэсэн үгийн товчлол бөгөөд програмчлалын үндсийг заахдаа өргөн хэрэглэгддэг.

Пролог нь предикатын тооцоололд (илүү нарийвчлалтай бол нэгдүгээр эрэмбийн предикатын тооцоо) үндэслэсэн боловч зөвхөн Хорны томъёогоор хязгаарлагддаг. Пролог програмууд нь теоремуудыг эхний ойролцоолсон байдлаар батлахад үр дүнтэй байдаг. Нэгдэх, сүүлний рекурс болон мөрдөх үндсэн ойлголтууд.

Өгөгдлийн төрлүүд

Prolog нь бидний нийтлэг програмчлалын хэлэнд дассан өгөгдлийн төрлүүдийг ашигладаггүй. Бид өгөгдлийн төрлүүдийн оронд Prolog лексик элементүүдийн талаар ярьж болох бөгөөд энэ нь дамми програмчлалд ер бусын юм.

Тогтмол текстийг атом ашиглан оруулна. Атом гэдэг нь жижиг үсгээр эхэлсэн үсэг, тоо, доогуур зураасын дараалал юм. Ихэвчлэн эдгээр нь үсэг, тоон атомууд биш бол тэдгээрийг апострофоор тэмдэглэх шаардлагатай байдаг (жишээлбэл, "+" нь атом, + нь оператор).

Ихэнх Пролог программууд нь бодит ба бутархай тоог ялгадаггүй.

Хувьсагч

Хувьсагчдыг том үсгээс эхлэн үсэг, тоо, доогуур зурааснаас бүрдсэн мөрөөр тодорхойлно. Prolog орчинд хувьсагч нь хуваарилагдах боломжтой контейнер биш (процедурын програмчлалын хэлээс ялгаатай). Түүний зан авир нь нэгдэхтэй төстэй загвартай илүү ойр байдаг.

Нэргүй хувьсагч гэж нэрлэгддэг хувьсагчдыг нэг доогуур зураасаар (_) бичнэ.

Пролог нь нарийн төвөгтэй өгөгдлийг төлөөлөх цорын ганц арга зам юм. Энэ нэр томьёо нь функтор (энэ нь атом байх ёстой) болон параметрүүд (төрлөөр хязгаарлагдахгүй) гэж нэрлэгддэг толгойноос бүрдэнэ. Энэ нэр томьёоны arities гэж нэрлэгддэг параметрүүдийн тоо чухал юм. Нэр томьёог толгой ба аритиар нь тодорхойлдог бөгөөд ихэвчлэн функц/аритет гэж бичдэг.
Жагсаалтууд

Жагсаалт нь рекурсив бүтцээр тодорхойлогддог тул бие даасан өгөгдлийн төрөл биш юм (/2 "." гэсэн нэр томъёог ашиглан):

Атом - хоосон жагсаалт

Програмистын тав тухыг хангах үүднээс жагсаалтыг янз бүрийн аргаар үүсгэж, устгаж болно.

Хэрэв L нь жагсаалт, X нь элемент бол "." (X, L) нь жагсаалтын гишүүн юм. Эхний X элемент, дараа нь L контекстийн агуулгыг синтакс хэлбэрээр илэрхийлнэ.

Програмистын тав тухыг хангах үүднээс жагсаалтыг янз бүрийн аргаар үүсгэж, устгаж болно.

Барааны жагсаалт:
Нэг элементийн өмнөх үг:
Урьдчилсан хэд хэдэн элементүүд:
Нэр томъёоны өргөтгөл: "."(abc, "."(1, "."(f(x), "."(Y, "."(g(A, эхний), )))))

Мөрүүдийг ихэвчлэн хашилт доторх тэмдэгтүүдийн дарааллаар бичдэг. Тэдгээрийг ихэвчлэн ASCII тэмдэгтийн кодын жагсаалт хэлбэрээр төлөөлдөг.

PROLOG программчлал нь процедурын хэлтэй ажиллахаас тэс өөр. Prolog-д та баримт, дүрмийн мэдээллийн сантай ажилладаг бөгөөд та мэдээллийн сангийн асуулга ажиллуулж болно. Прологийн үндсэн нэгж нь үнэн гэж тодорхойлсон предикат юм. Предикат нь толгой ба хэд хэдэн аргументаас бүрдэнэ. Жишээлбэл:

Энд "муур" нь толгой, "том" нь аргумент юм. Энэ баримт дээр үндэслэн Prolog орчуулагч ашиглан ажиллуулж болох зарим асуултуудын жишээ энд байна:

Муур (том).
тиймээ.

Муур(X).
X = том;
үгүй.

Предикатууд нь ихэвчлэн программ ертөнцийг мэддэг баримтыг илэрхийлэхийн тулд тодорхойлогддог. Ихэнх тохиолдолд предикатуудыг ашиглах нь тодорхой конвенцуудыг шаарддаг. Дараахь зүйлсийн аль нь Пэт бол Саллигийн аав гэсэн үг вэ?

Аав (салли, пат).
аав (пат, Салли).

Аль ч тохиолдолд "аав" нь толгой, "салли", "пат" нь аргумент юм. Гэсэн хэдий ч эхний тохиолдолд Салли аргументуудын жагсаалтын эхний байранд, харин Пэт хоёрдугаарт, эсрэгээрээ байна. Эхний тохиолдол нь үйл үгийн субьект ба объект гэсэн дарааллаар тодорхойлогдох жишээ юм, харин хоёр дахь жишээнд үйл үгийн объект субьект байна. Пролог англи хэлээр ойлгодоггүй тул хоёр хувилбар хоёулаа сайн, гэхдээ нэг программ бичихдээ конвенц гэж нэрлэгддэг нэг хэв маягийг баримтлах нь сайн програмчлалын хэв маяг гэж тооцогддог, гэхдээ дараахь зүйлийг бичих шаардлагагүй.

Аав (пат, Салли). аав (жессика, Жеймс).

Тодорхой предикатуудыг хэлэнд суулгасан бөгөөд Prolog-д өдөр тутмын үйл ажиллагааны хүндрэлийг багасгах боломжийг олгодог (жишээлбэл, график ашиглан оролт/гаралт болон үйлдлийн системтэй харилцах бусад). Жишээлбэл, бичих предикатуудыг дараах байдлаар харуулахад ашиглаж болно:

Бичих ("сайн уу")

Дэлгэц дээр "Сайн уу" гэсэн үг гарч ирнэ.

Дүрэм

Пролог дахь хоёр дахь төрлийн мэдэгдэл бол дүрэм юм. Жишээ дүрэм:

Гэрэл(асаалттай):- асаах(асаах).

":-" нь "хэрэв" гэсэн үг бөгөөд энэ дүрэм нь асаалттай (асаалттай) бол гэрэл (асаалттай) үнэн (асаалттай), хэрэв унтраалга (асаалт) нь үнэн (эсвэл унтраалга асаалттай байвал гэрэл байна) гэсэн үг юм. Дүрмүүд нь хувьсагчдыг ашиглаж болно; хувьсагч нь том үсгээр эхэлдэг бол тогтмол нь жижиг үсгээр эхэлдэг. Жишээлбэл,

Эцэг(X,Y) :- эцэг эх(X,Y), эрэгтэй(Y).

Энэ нь "Хэрэв хэн нэгэн нь эцэг эх, тэр нь эрэгтэй хүн бол тэр хүн эцэг" гэсэн үг юм. Шалтгаан ба үр дагавар нь урвуу дарааллаар байж болох тул энэ нь энгийн логиктой зөрчилддөггүй. Та үр дагаврын хэсэгт олон предикатуудыг нэгтгэж байрлуулж болно, жишээлбэл:

Энэ нь хэд хэдэн мэдэгдэлтэй тэнцэнэ:

А:- г. б:- г. в:- г.

Гэхдээ зааварчилгаа:

Энэ нь "хэрэв c бол a эсвэл b" гэсэн утгатай тэнцэх юм. Энэ нь Horn-ийн томъёогоор тогтоосон хязгаарлалттай холбоотой юм.