UF

 

МАЗМҰНЫ

 

КІРІСПЕ...................................................................................................................2

1. ПРОЛОГ ТІЛІНЕ ЖАЛПЫ ШОЛУ................................................................5

1.1. Бағдарлама мысалы: туыстық қатынастар .............................................5

1.2. Ережелер көмегімен мысал – бағдарламаны кеңейту..........................6

1.3. Ереженің рекурсивті анықтамасы.............................................................8

2. ПРОЛОГ – БАҒДАРЛАМАНЫҢ СИНТАКСИСІ ЖӘНЕ СЕМАНТИКАСЫ...............................................................................................14

2.1. Айнымалылар..............................................................................................14

2.2. Құрылыстар………………………………………………………………..14

2.3. Салыстырулар..............................................................................................15

2.4. Сұрақтар........................................................................................................16

2.5. Фактілер мен ережелер..............................................................................17

2.6. Бағдарламаның орындалуы алгоритмі..................................................18

2.7. Пролог – бағдарламаның декларативті мағынасы (мәні)..................19

2.8. Пролог – бағдарламаның құрылымы.....................................................19

3. РЕКУРСИВТІ ЕСЕПТЕУЛЕР. АРИФМЕТИКАЛЫҚ ӨРНЕКТЕР...........................................................................................................26

3.1. Есептеулерді басқару..................................................................................26

3.2. Рекурсивті есептеулер................................................................................27

3.3. Арифметикалық өрнектер........................................................................30

  1. ТІЗІМДЕР. СТАНДАРТТЫ ПРЕДИКАТТАР..........................................34

4.1. Тізімдер..........................................................................................................34

4.2. Тізбектермен операцияларжүргізу………..…………………………..39

4.3. Стандартты предикаттар………………………………..………………41

ҚОРТЫНДЫ........................................................................................................53

ӘДЕБИЕТТЕР......................................................................................................54

 

 

КІРІСПЕ

 

           Бағдарламалауда процедуралық әдістен басқа, оның өкілдері Бейсик, Паскаль, Си сияқты жоғары дәрежелі әмбебап тілдермен қатар, тағы екі бағыт - функционалдық (қызметтік) және логикалық бағдарламалау жатады.

           Функционалдық бағдарламалау қарапайым идеяға негізделген, бүкіл информацияны өңдеу және соңында алынған нәтиже кейбір қызметтерді орындайтын салымды немесе рекурсивті функцияларды шақыру түрінде көрсетілуі мүмкін, сондықтан бір функцияның мәні екіншісінің аргументі ретінде қолданылады. Функционалдық бағдарламалау тілінің өкіліне  Лисп (Lisp proces – sing – тізімдерді өңдеу) тілі жатады.

            Логикалық бағдарламалау жүйелер, тілдер, тәсілдер, анықтамалар шеңберінен құралған. Оның негізінде қайсыбір логикалық тілде тапсырманы тұжырымдар жиынтығымен шешу идеясы жатыр, және қайсыбір формальды дедуктивті жүйеде логикалық қорытындыны құру жолымен тапсырманың (есептің) шешімін шығару жатыр. Осы түрдегі ең әйгілі жүйелерге Пролог (Program ming in logic – логика жүйесінде бағдарламалау) тілін жүзеге асыру жатады. Пролог тілі Си, Паскаль, Фортран, Бейсик  сияқты, алгоритмдерді жазу үшін арналған дәстүрлі бағдарламалау тілдерімен салыстырғанда, мына ерекшеліктерге ие:

  • Прологтағы бағдарлама алгоритм емес, формальдық логика тілінде есеп шарттарын жазу болып табылады;
  • Пролог тілі есептеу немесе графикалық есептерді шешу үшін емес, логикалық есептерді, адамның логикалық ақылын қорыту процессін моделдеу үшін арналған; есептеулер мен графикалық құрылымдар Прологта логикалық қорытындының қосалқы өнімі ретінде орындалады;
  • Пролог бағдарламашыдан ерекше ойлау қабілетін талап етеді, ал бұл процедуралық бағдарламаларға үйренгендердің оны оқуын қиындатады, сондықтан да маман бағдарламашылар бұл тілге өтуге құмарланбайды, бұл Пролог тілінің дамуына кері әсерін тигізеді; бірақ көптеген елдерде (Жапония, Англия, Франция, Германия, Израиль және т.б.) бағдарламалауды оқытуда бірінші оқытылатын тіл ретінде білім беруде Прологты практикалық қолдану көбейуде, Паскаль типіндегі процедуралық тілдерге көшу бұл жағдайда қиындықтарды туғызбайды.

            Осының барлығы Прологты жоғары дәрежелі тілдерге (тілге) жатқызады. XX – ғасырдың 90 жылдарында 5-ші дәрежелі компьютерлерді (жасанды интелектке ие) құрудың жапондық жобасында Пролог аппаратты ұжымдастыру және бағдарламаны жасау негізі ретінде қолданылған. Қазіргі Пролог, әрине, 5-ші дәрежелі ЭЕМ-дерді бағдарламалау тілінің, соңғы вариантына жатпайды және болашақта мәңгі дамуын алады. Ол дискриптивті бағдарламалауда Бейсик ролін алатын шығар; оның мәні мен даму мүмкіндігі, логикалық бағдарламалау идеясының таралуы өте жоғары.

             Дипломдық жұмыстағы мысалдарда Турбо – Пролог  2.0, версиясында бағдарламалау негізі көрсетілген. Пролог базасы үлгілерді салыстыру, мәліметтерді иерархиялық құрылыста көрсету және автоматты түрде қайтарудан құрылған механизмдердің шектелген тізбегінен тұрады, осы шағын тізбек ғажайып қуатты және икемді бағдарламалық аппаратты құрайды. Пролог тілінің жетістіктері мынаған негізделген, бір жағынан, ондағы логикалық формулаларды қолдану арқылы көптеген практикалық есептерді жазып шығуға болады, ал екінші жағынан қарапайым интерпретациялары формулалардың табылған және логикалық бағдарламалау жүйесін жеткілікті дәрежеде тиімді жүзеге асыру енгізілген, Пролог әсіресе, ішінде объекттері және олардың арасында қатынастары болатын есептерді шешуге жақсы бейімделген. Тіл құрылысында мәліметтер базасымен қарапайым және тиімді жұмыс істеу мүмкіндіктері қарастырылған, бұл оның негізінде әртүрлі типтегі ақпараттық–анықтама және экспертті жүйелерді құруға мүмкіндік береді.

              Жұмыс 4 тараудан құрылған. Әр тарау толық теориялық материал, жұмыс істеуші бағдарламалар мысалдарымен толықтырылған. Бірінші тарауда жанұя қатынастары – бағдарламасының мысалы қарастырылады, Пролог тілінің негізгі барлық түсініктері жазылған.

               Екінші тарауда Пролог тілінің элементтері қарастырылған: айнымалылар, құрылымдар, сұрақтар, салыстырулар, фактілер, ережелер. Сұрақтардың қалай қойылатыны көрсетілген, белгілі фактілер негізінде ережелер қарастырылған. Сұраныстарды бағдарлама ұсыныстарымен салыстыру арқылы бағдарламаның орындалу алгоритмі көрсетілген.  Бағдарлама мысалында: вертикалды кесінділер қатынастары қарастырылған және бағдарлама құрылысының барлық бөлімдері сипатталған.

                Үшінші тарауда рекурсивті функциялар  сұрақтары, қорытынды есептеулер және арифметикалық белгілер қарастырылған. Рекурсивті есептеулер факториалдық есебі мысалында көрсетелген.

                Төртінші тарауда тізімдер, тізімдермен негізгі және қосымша операциялар, стандартты предикаттар, тізім элементерін баспаға шығару бағдарламасының мысалы, және басқа да бағдарлама мысалдары келтірілген.

                 Қарастырылған бағдарлама мысалдары, теориялық материалдар мен функционалдық және логикалық бағдарламалау, мәліметтер базасы және эксперттік жүйелер пәндері  бойынша лабораториялық және курстық жұмыстарды орындауда пайдалы болатынына кәміл сенімде.

                  Жұмыстың мақсаты: Информатика мамандығы студенттері үшін Пролог тілін оқыту әдістемесі технологияларын қолдану

                  Жұмыстың құрылымы: Кіріспеден, 4-тараудан, Қортыныды және қолданылған әдебиеттер тізімінен тұрады.

 

 

  1. ПРОЛОГ ТІЛІНЕ ЖАЛПЫ ШОЛУ

 

  1. Бағдарлама мысалы: туыстық қатынастар

 

 

 
 


Бірінші суреттегі туыстық қатынастардың толық ағашы келесі Пролог – бағдарламасында сипатталған:

 

ата-анасы( пам, боб).

ата-анасы( том, боб).

ата-анасы( том, лиз).

ата-анасы( боб, энн).

ата-анасы( боб, пат).

ата-анасы( пат, джим).

Бұл бағдарлама 6 сөйлемнен құралған, әрбір сөйлем бір ғана ата-ана қатынасы болу фактісін жариялайды (көрсетеді).

Аргумент ретінде бірінші орында ата-анасы, ал екіншісінде – баласы. Бағдарламаны енгізген соң сұрақтар қоюға болады:

? – ата-анасы( боб, пат).

жүйе жауабы: Иә (Yes).

? – ата-анасы( лиз, пат).

жүйе жауабы: Жоқ (No).

? – ата-анасы(X, лиз) / * Лиздің ата-анасы кім ? */

X = том

? -  ата-анасы(боб, X  )/ * Бобтың баласы кім ? * /

X = энн / * Басқа да шешімдерін көру үшін мыналарды енгізіңіз << ; >> * /

X = пам

? – ата-анасы(X, Y) / * қайсысы кімнің ата-анасы ? * /

X = пам, Y = боб

X = том, Y = боб

X = том, Y = лиз

         Бұдан да едәуір күрделі сұрақтарды қоюға да болады: << Джимнің ата-анасының ата-анасы кім ? >>. Бағдарламада ата- анасының ата-анасы қатынасы анықтамасы айтылмаған, осындай сұрақ 2 этапқа бөлінеді:

  1. Джимнің ата-анасы кім ? Y – делік.
  2. Y – тің ата-анасы кім ? X – делік.
  1. және (2) Пролог тілінде былайша жазылады:

? – ата-анасы(Y, джим), ата-анасы( Y, X).

X = боб, Y = пам.

Осы сұрақтарды басқаша да қоюға болады:

«Келесі талаптарды қанағаттандыратын  X  пен  Y – ті табу керек»:

ата-анасы(Y, джим) және ата-анасы(X, Y). Егер олардың орындарын ауыстырсақ, жауабы тура солай шығады:

? – ата-анасы( том, X), ата-анасы(X, Y) % томның немерелері кім ( қайсыбір X – тің баласы, ол томның баласы болып табылады ) ?

 

 

 
 


         

 

 

? – ата-анасы(X, энн), ата-анасы(X, пат)  /* энн мен Патта ортақ ата-ана бар ма ? * /

X = боб

 

1.2. Ережелер көмегімен мысал – бағдарламаны кеңейту

 

              Біздің  мысал – бағдарламаны көптеген тәсілдермен кеңейтуге болады, ата-анасы қатынасына қатысушы адамдар жынысы туралы ақпаратты қосайық:

әйел (пам).

еркек (том).

еркек (боб).

әйел (лиз).

әйел (пат).

әйел (энн).

еркек (джим).

              Бұл ақпаратты басқаша да көрсетуге болады, әйел мен еркек қатынастарының орнына, бір ғана бинарлық қатынас жынысын қолдануға болады. Онда:

        жынысы (пам, әйелдік (ұрғашы)).

        жынысы (том, еркектік).

        жынысы (боб, еркектік).

        және т.б.

              Енді жаңа қатынас ұрпағы (әулеті), ол ата-ана қатынасына кері келеді, мысалы:

ұрпағы(лиз, том).

Бұл қатынас ата-ана қатынасына кері келуін ескерсек, прологтық сөйлем жазуға болады:

         ұрпағы(Х, Х): - ата-анасы(Х, У) /* барлық Х және У үшін, егер Х – У ата-анасы болса, онда У – Х ұрпағы */.

Осындай сөйлем ереже деп аталады, мұндағы (У, Х) ұрпағы – сөйлемнің басы немесе қорытындысы, (Х, У) ата-анасы – шартты бөлігі немесе сөйлем денесі. Мысалы:

? – ұрпағы(лиз, том).

              Бағдарламада ұрпақтар туралы факті жоқ, сондықтан мына ережені қолданамыз:

ұрпағы(лиз, том): - ата-анасы(том, лиз).

Пролог - жүйесі шартты бөлігі (шындыққа жатады ма) орындалады ма, жоқ па, соны тексереді. Ол үшін бастапқы мақсат:

 ұрпағы(лиз, том) % ішкі мақсатпен ауыстырылады:

 ата-анасы(том, лиз).

Осындай фактіні бағдарламада  табу мүмкін болғандықтан, яғни ереже шығысындағы тұжырым шындық, онда жүйе  yes ( иә) деп жауап береді. Шеше қатынасын қосайық:

шеше(X, Y): - ата-анасы(X, Y), әйел(X). / * Барлық X және Y үшін: X  Y – тің шешесі, егер X Y – тің ата-анасы және X - әйел болса. */

         

Үтір – екі шарт арасындағы конъюнкция, яғни олар бір мезгілде орындалуы тиіс. Ата-анасының ата-анасы қатынасын ереже көмегімен былайша жазады:

ата-анасының ата-анасы(X, Z): - ата-анасы(X, Y), ата-анасы(Y, Z). / * әпкесі қатынасы үшін ұқсас: * /.


әпке(X, Y): - ата-анасы(Z, X), ата-анасы(Z, Y), әйел(X).

Әпке қатынасы үшін жетілдірілген ереже:

әртүрлі(X, Y): - X <> Y.

әпке(X, Y): - ата-анасы(Z, X), ата-анасы(Z, Y), әйел(X), әртүрлі(X, Y).

 

1.3. Ереженің рекурсивті анықтамасы

 

Ата-тегі қатынасын анықтайық :

 

 
 


4- сурет ата-тегі қатынасының мысалы.

 

а) X – жақын ата-тегі; 

б) X – Z – тің алыс (арғы) ата-тегі. Бағдарлама:

а) ата-тегі(X, Z): - ата-анасы(X, Z).

б) ата-тегі(X, Z): - ата-анасы(X, Y), ата-анасы(Y, Z).

ата-тегі(X, Z): - ата-анасы(X, Y1), ата-анасы(Х1, Y2), ата-анасы(Y2, Z).

ата-тегі(X, Z): - ата-анасы(X, Y1), ата-анасы(Y1, Y2), ата-анасы(Y2, Y3),  ата-анасы(Y3, Z).

Бұл бағдарлама үлкен және белгілі аумақта жұмыс істейді . Бірақ бұл проблема өзі арқылы ата-тегі қатынасымен шешіледі :

 

 

 
 

 

 

  5- сурет. Қатынастың рекурсивті тұжырымдамасы.   

Екі ережеден тұратын ата-тегі қатынасының толық бағдарламасы: бірінші жақын ата-тегі үшін және екінші, алыс ата-тегі үшін:

ата-тегі(X, Z): - ата-анасы(X, Z).

ата-тегі(X, Z): - ата-анасы(X, Y), ата-тегі(Y, Z).

? – ата-тегі(пам, X). /* Памның ұрпағы кім */.

X = боб;

X = энн;

X = пат;

X = джим .

Туыстық қатынастар туралы бағдарламаның қорытынды түрі :

ата-анасы(пам, боб).

ата-анасы(том, боб).             

ата-анасы(том, лиз).

ата-анасы(боб, энн).

ата-анасы(боб, пат).

ата-анасы(пат, джим).

әйел(пам).

еркек(том).

еркек(боб).

әйел(лиз).

әйел(энн).

әйел(пат).

еркек(джим).

ата-тегі(Y, X):- ата-анасы(X, Y).

шешесі(X, Y): - ата-анасы(X, Y), әйел(X).

ата-анасының ата-анасы(X, Z): - ата-анасы(X, Y), ата-анасы(Y, Z).

әртүрлі(X, Y): - X <> Y .

әпкесі(X, Y): - ата-анасы(Z, X), ата-анасы(Z, Y), әйел(X), әртүрлі(X, Y).

ата-тегі(X, Z): - ата-анасы(Z, X).

ата-тегі(X, Z): - ата-анасы(X, Y), ата-тегі (Y, Z).

 

1. Мысал.  << Сессия >> құрылысын құру, барлық озат оқушыларды (студенттерді) таңдап алу.

 

DOMAINS

  X=symbol

  Y=integer

PREDICATES

  muj(X)

  jen(X)

  fiz(X,Y)

  xim(X,Y)

  mat(X,Y)

  otl(X)

  otl_muj(X)

  otl_jen(X)

CLAUSES

  muj(misha).

  muj(casha).

  muj(dima).

  jen(ira).

  jen(masha).

  jen(lena).

  fiz(lena,5).

  fiz(ira,5).

  fiz(masha,4).

  xim(lena,5).

  xim(ira,5).

  xim(masha,4).

  mat(lena,5).

  mat(ira,5).

  mat(masha,5).

  otl(X):-fiz(X,5),xim(X,5),mat(X,5).

  otl_muj(X):-muj(X),otl(X).

  otl_jen(X):-jen(X),otl(X).

GOAL

  clearwindow,otl_jen(X),write(“отличница: “,X),nl,fail.

 

2. Мысал. Доллар – теңге және теңге – доллар қатынасын анықтау.

 

DOMAINS

 X=real

PREDICATES

 dolar_tenge(X,X)

 tenge_dolar(X,X)

CLAUSES

 dolar_tenge(D,T):-T=D*154,write(T).

 tenge_dolar(T,D):-D=T/154,write(D).

GOAL

 clearwindow, tenge_dolar(300,D), nl, dolar_tenge(2,T)

 

3. Мысал. Зауыт құрылымын құру. Қарым – қатынастарын анықтау: бригадир – жұмысшылар, цех.

 

DOMAINS

 rb=rab(Fam,Name)

 Fam,Name,Br=symbol

PREDICATES

 seh(Br,rb)

CLAUSES

 seh(br1,rab(ivan,serg)).

 seh(br1,rab(sem,serg)).

 seh(br1,rab(ivan,dim)).

 seh(br2,rab(kim,oleg)).

 seh(br2,rab(alma,alia)).

 seh(br2,rab(tim,gul)).

 seh(br3,rab(myn,aig)).

 seh(br3,rab(by,din)).

 seh(br4,rab(amir,tol)).

 seh(br4,rab(tol,nur)).

 seh(br4,rab(ten,ira)).

GOAL

 clearwindow,

 write("Бригадир№1: "),

 seh(br1,Y),nl,write('  ',Y),fail;

 nl,write("Бригадир№2: "),

 seh(br2,Y),nl,write('  ',Y),fail;

 nl,write("цех: "),

 seh(X,Y),nl,write(X,'  ',Y),fail

 

Тапсырмалар

 

1. Ата-ана қатынасы анықталды деп есептей (1- суретте көрсетілгендей), Пролог – жүйесінің келесі сұрақтарға жауаптарының қандай болуын анықтаңыз:

  а) ? – ата-анасы(джим, X)

  б) ? – ата-анасы(X, джим)

  в) ? – ата-анасы(пам, X), ата-анасы(X, пат)

  г) ? – ата-анасы(пам, X), ата-анасы(X, Y), ата-анасы(Y, джим).

  д) Ата, апа қатынасын анықтаңыз.

 2. Прологта ата-ана қатынасы туралы келесі сұрақтарды қарастырыңыз:

  а) Паттың ата-анасы кім?

  б) Лиздің баласы бар ма?

  в) Паттың ата-анасының ата-анасы кім?

  г) Туысқан әпкесі, туысқан ағасы қатынасын анықтаңыз.

  1. Пролог ережесіндегі келесі тұжырымдарды трансляциялаңыз:

  а) Ағасы және әпкесі бар қайсыбіреу – ағасы және әпкесінің болу (қатынасы).

  б) Баласы бар қайсыбір X, оның әпкесі бар, екі баласының болуы (екі балалы болу қатынасы).

  1. Ата-ана қатынасын қолдана, немере баласын, немере қызын, шөбере баласын, шөбере қызын қатынасын анықтаңыз (ата-анасының ата-анасы қатынасына ұқсас).
  2. Ата-анасы және әпкесі қатынастарын қолдана, тәтесі, көкесі қатынасын анықтаңыз.
  3. Ата-тегі қатынасының басқа вариантын қарастырайық:

ата-тегі(X, Z): - ата-анасы(X, Z).

ата-тегі(X, Z): - ата-анасы(Y, Z), ата-тегі(X, Y).

Мына анықтама дұрыс па: Сіз 5 - суреттегі диаграмманы жаңа анықтамаға сәйкес етіп өзгерте аласыз ба? Жақын туысқандары: қатынасын анықтаңыз.

  1. Алыс ағасы, әпкесі қатынасын анықтаңыз.
  2. Өгей әкесі, өгей шешесі қатынасын анықтаңыз.
  3. Немересі бар жиен қатынасын анықьтаңыз.
  4. Ағалы (жақын немесе туысқан) болу қатынасын анықтаңыз.
  5. «Университет» құрылысын құру. Оқутушы-студент қатынасын анықтаңыз.
  6. «Университет» құрылысын құру. Кафедра меңгерушісі қатынасын анықтаңыз.
  7. «Университет» құрылысын құру. Декан қатынасын анықта.
  8. «Университет» құрылысын құру. Ректор қатынасын анықта.
  9. «Сессия» құрылысын құру. Жақсы оқушы студент (екі – ақ төрті бар) қатынасын анықта.
  10. «Сессия» құрылысын құру. Үші жоқ студенттер қатынасын анықта.
  11. «Сессия» құрылысын құру. Бір ғана үші бар студент қатынасын анықта .
  12. «Кәсіпорын» құрылысын құру. Директор қатынасын анықта.
  13. «Кәсіпорын» құрылысын құру. «Қызыметкерлер бөлімінің басшысы» қатынасын анықта.
  14. «Кітапхана» құрылысын құру. Оқырман қатынасын анықта.
  15. «Кітапхана» құрылысын құру. Кітап қарыз студент қатынасын анықта.
  16. «Кітапхана» құрылысын құру. «Кітапханашы» қатынасын анықта.
  17. «Банк» құрылысын құру. «Несие» қатынасын анықта.
  18. «Банк» құрылысын құру. Депозит қатынасын анықта.
  19. «Банк» құрылысын құру. «Валюталық операциялар» қатынасын анықта.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. ПРОЛОГ – БАҒДАРЛАМАНЫҢ СИНТАКСИСІ ЖӘНЕ СЕМАНТИКАСЫ

 

2.1. Айнымалылар

 

Прологта айнымалылар бас әріптен басталады, латын алфавитінің цифрлері мен әріптері қолданылады. Айнымалының ерекше түрі – анонимді айнымалы, айнымалының нақты мәні жоқ кезде предикаттың аргументі ретінде қолданылады. Прологта айнымалы информация қоймасы емес, ол сөйлем қаншалықты болса, соншалықты өмір сүреді. Бағдарламаның орындалуы процесінде айнымалы жаңа мәнге ие бола алады. Айнымалы мысалдары:

X

Нәтиже

Объект 2

Қатысушылар тізімі

Жаңа заттар тізімі.

_X 23

_X 23

баласы бар(X): - ата-анасы(X, Y).

          Бұл жерде баласы бар болу (қасиеті) сипаты баланың атына байланысты емес, сондықтан анонимді айнымалы қолданған жөн:

баласы бар(X): - ата-анасы( _ , _ ).

Атының лексикалық диапазоны – бір.

Сөйлем. Бұл деген сөз, егер, мысалы, X аты екі әртүрлі сөйлемдерден кездессе, онда ол екі әртүрлі айнымалыларды білдіреді. Бірақ бір сөйлемнің ішінде оның әрбір кездесуі бір ғана айнымалыны білдіреді. Константалар үшін жағдай басқаша: бір ғана атом кез – келген сөйлемде бір ғана объектіні білдіреді, басқаша – айтқанда – бүкіл бағдарламада.

 

2.2. Құрылымдар

 

Құрылым – бұл конструкция, ол оның аргументтері тізімінің жақшалары ішіне жазылған және үтірлермен бөлінген құрылымы атынан құралады. Құрылымға компоненттерін біріктіру үшін функтурды таңдап алу қажет.

Мысалы:

      Дата (1, мамыр, 1983)

            Бұл жерде фуктур -* дата. Бұл мысалдағы барлық компоненттер – константалар (екі компонент – бүтін сандар және біреуі - атом). Мамыр айындағы жеке бір күнді 1-суреттегі құрылыммен көрсетуге болады:    

 

 
 


Осындай объекттер, 2-суретте көрсеткендей, келесі пролог терминдерімен көрсетуге болады:                 

 

 

 

 

 

 
 

 

 

Р1=нүкте(2, 4).

Р2=нүкте(5, 2).

S = кесінді (P1, P2) = кесінді (нүкте (2, 4), нүкте (5, 2)).

Т = үшбұрыш (нүкте (2, 4), нүкте (5, 2), нүкте (7, 6)).

 

2.3. Салыстырулар

 

            Пролог тілінде орындалатын негізгі операция – бұл салыстыру операциясы (унификация немесе келісу деп те айтылады). Бұл операция не жемісті, не жеміссіз болуы мүмкін. Айнымалылар өз мәндерін, фактілер және ережелерде константаларды салыстыру нәтижесінде, алады. Айнымалы өз мәніне ие болғанша, ол бос деп аталады. Айнымалы өз жаңа мәнін алған соң, ол байланып қалады. Бірақ ол сұраққа жауап алу үшін қажетті уақыт аралығында ғана байланып (байланысты) тұрады. Бұдан кейін Пролог оны босатады, қайтарады және альтернативті шешімдер іздейді. Айнымалылар салыстыру процесі бөлігінің қызметін атқарады. Салыстыру операциясы былайша анықталады:

  1. Константа тек константамен ғана салыстырылады.
  2. Ұқсас құрылымдар бір - бірімен салыстырылады.
  3. Айнымалы константамен немесе басында белгілі айнымалымен салыстырылады.
  4. Екі бос айнымалылар бір – бірімен байланыса алады және бір – бірімен салыстырылады.

Салыстыру мысалдары:

            5 саны 5-пен ғана салыстырылады.

            «иелену» фактісі <<иелену>>-мен ғана салыстырылады .

            Сергей константасы Юрий константасымен салыстырылмайды.

 

2.4. Сұрақтар

 

          Сұрақ – бұл бағдарламаның орындалуы кезінде болатын логикалық шығыстың жіберуші нүктесі. Кез – келген сұраққа жүйе «Иә» немесе «Жоқ» деп жауап береді.

          Горизонталь және вертикаль кесінділерді тану үшін бағдарлама фрагментін жазайық. Кесінді вертикаль, егер оның нүктелері – соңы координаттары сәйкес келсе; кесіндіге басқа да ешқандай шектеулер қойылмайды. <<Горизонталдық>> сипаты ұқсас келеді, тек X пен Y – тің орындарына ауыстыру қажет. Құрамында осы фактілері болған келесі бағдарлама, мына тұжырымдарды жүзеге асырады: 

 

Осы бағдарламамен мынадай диалог мүмкін:

? – верт (кес. (нүкте (4, 2), нүкте (4, 6))).

      Иә.

? – верт ( кес. (нүкте (1, 1), нүкте (2, Y))).

      Жоқ.

? – гор (кес. (нүкте (1, 1), нүкте (7, Y))).

     Y = 1.

 

 
 


Бағдарламаға қатысты едәуір жалпы сұрақты құрастырайық: <<Басы (2, 3) нүктесінде жатқан, қандай да бір вертикалды кесінділер бар ма ?>>

 

          ? – верт (кес. (нүкте (4, 2), Р))

          Р = нүкте (4, Y)

 

       Келесі сұрақты қояйық: Бір мезгілде горизонталь да, вертикаль да болатын кесінді бар ма?   

      ? – верт (S), гор (S).

      S = кес (нүкте (X, Y), нүкте (X, Y)).

 

2.5. Фактілер мен ережелер

 

       Факті – бұл аргументтері, константалар болатын предикаттар, объекттер арасында немесе объекттер сипаты қатынастарын білдіреді. Фактілер әрдайым шындық және бағдарлама орындалуы кезінде болатын, дәлелдеме қызметін атқарады. Фактілер мысалдары:

       Иванов (сымтетік, Т. 123456).

       Петров (сымтетік, Т. 789012).

 

       Ережелер бар фактілер негізінде объектер арасындағы жаңа қатынастарды анықтауға мүмкіндік береді. Аргументтер ретінде константалар,  айнымалылар қолданылуы мүмкін.

Ереже құрылысы:

<ереже басы>: - <ішкі мақсат 1>, <ішкі мақсат 2>, …. <ішкі мақсат N>.

       Мұндағы << : - >> - егер деп оқылады ; << , >> - және дегенді білдіреді. Фактілер мен ережелер соңында нүкте қойылады. Ереже мысалы:

       Беделді _ жігіт (X) : - жақсы көреді (Х, рэп), киеді (Х, блейзер).

Былайша түсіндіріледі: Қайсыбір Х – беделді жігіт, егер Х рэпті жақсы көрсе және блейзер кисе.

 

2.6. Бағдарламаның орындалуы алгоритмі

 

         Прологта бағдарлама фактілері мен ережелері қандай да бір мәнді облыста объекттер арасындағы байланыстар мен қатынастар сипаттары болып табылады. Факті орындалуы үшін басқа ешнәрсе қажет емес, толық анықталған процедура ретінде қарастыруға болады. Ереже:

 

А1_В1 , В2 , ….. Вn .

 

Бұл ережені А процедурасының анықтамасы ретінде қарастыруға болады. Ол тұжырымдайды, оны анықтау үшін В1, В2, ….., Вn. білу қажет. В1, В2, …, Вn процедуралары белгілі тәртіпте солдан оңға қарай орындалады. Егер кезекті процедура дұрыс орындалса, онда келесі процедураға көшеді, егер дұрыс емес орындалса, онда жоғарыдан – төмен анықталатын, осы процедура жазбасының келесі вариантына көшеді. Білім базасында фактілер мен ережелер бірігуі үшін іздеу жоғарыдан – төмен қарай кезекті жүргізіледі және егер де сәйкес фактілер табылмаса, онда жауабы теріс болады. Мысалы:

          Жақсы көреді (Оля, оқуды).

          Жақсы көреді (Света, бадминтон).

          Жақсы көреді (Лена, жүзуді).

          Жақсы көреді (Лена, оқуды).

          ? – жақсы көреді (Х, оқуды), жақсы көреді (Х, жүзуді) .

         Х = Лена.

 

          Сұрақ оқу мен жүзуді жақсы көретін адамдар бар, жоқ екенін білдіреді. Пролог басында (бірінші) сұрақтың бірінші бөлігі салыстыратын фактіні іздейді – жақсы көреді (Х, оқуды). Х айнымалысы Оля мәнімен байланысады, сонымен қатар Пролог фактілер тізімінде іздеу процедурасы жағдайын көрсететін көрсеткішті белгілеп (есте сақтап) алады. Бұдан кейін Пролог Х=Оля кезінде сұрақтың екінші бөлігін біріктіруге тырысады. Жақсы көреді (Оля, жүзуді) фактісін іздейді. Мұндай факті жоқ және іздеу жеміссіз аяқталады. Осындай жағдайда Пролог іздеудің бірінші бөлігіне оралады – жақсы көреді (Х, оқуды), Х айнымалыны босатады және басында фактілер тізімінде табылған көрсеткіштен бастап іздеуді қайта жүргізеді. Жақсы көреді (Лена, оқуды) фактісі сәйкес келеді. Х айнымалысы Лена мәнімен салыстырылады және бұдан кейін сұрақтың екінші бөлігі жақсы көреді (Лена, жүзуді) фактісімен сәйкес келеді. Сұраққа жауап табылды.

 

2.7. Пролог – бағдарламаның декларативті мағынасы (мәні)

 

           Сөйлемді қарастырайық:

            P: - Q , R 7

             Декларативті интерпретация:

  1. Р – шындық, егер Q, R шындық
  2. Q мен R- ден P шығады

           Процедуралық интерпретация:

  1. Р есебін шешу үшін, Q ішкі есебін шеш, ал кейін R ішкі есебін шешуге көш.
  2. Р – ға жету үшін, алдымен Q – ге жет, содан кейін R – ге жет.

          Мақсаттар арасындағы үтір мақсаттар конъюнкциясын білдіреді: олардың барлығы шындық болуы тиіс. Бірақ – та Прологта мақсаттар дизъюнкциясы да болуы мүмкін: кем дегенде мақсаттардың біреуі шындық болуы тиіс.

          Дизъюнкция нүктелі үтірмен белгіленеді. Мыс:

  1. Р: – Q; R немесе :
  2. P: - Q.

      P: - R.

  1. < = > 2).

          Үтір мақсаттарды нүктелі үтірге қарағанда күштірек байланыстырады. Осылайша, сөйлем:

             P: - Q, R; S,?, V.

Былайша түсіндіріледі: 1)  P: - (Q, R); (S, T, V). немесе

                         2)    P: - Q, R.

                                 P: - S, T, V.

2.8. Прологбағдарламаның құрылымы

 

Бағдарлама құрылысы келесі түрге ие:

/ *  бірнеше жолдарда коментарии  */

%  бір жолда комментарии

CONCTANCTS

% Бұл бөлімде константалар сипатталады.

DOMAINS

% Бұл бөлімде айнымалылар сипатталады.

PREDICATES

% Бұл бөлімде предикаттар анықталады.

CLAUSES

% Бұл бөлімде фактілер мен ережелер анықталады.

DATABASES

% Бұл бөлімде мәліметтердің динамикалық базасының предикаттары анықталады.

GOAL

% Бұл бөлімде сұрақтар, сұраныстар (ішкі) анықталады.

          Домендер қарапайым, құрылымды және стандарт емес болып бөлінеді. Стандартты мәндерге жататындар: symbol, chat, integer, real, string, file.

          Symbol – мәліметтердің символды типі, жазбаның екі формасын иеленеді: 1. Бөлек жолдан басталатын әріптер, цифрлар, сызу белгілерінің тізбегі. 2. Қос тырнақшаларға алынған символдар қатары.

          Chat – бір символ.

          integer –  - 32768 … 32768  диапазонындағы бүтін сандар.

          real – кәдімгі және экспоненциалдық жазба формасында келетін нақты сан.

          string – символдар жолы, екі рет жақшаға алынған кез-келген символдар қатары.

          file – файлдық айнымалы, оның мәні MS DOS – та файлдарға ат беру ережесі бойынша анықталады. Домендерді сипаттау (жариялау) мысалдары:

               DOMAINS

               a = integer

               b = symbol

          Домендердің стандартты типінен басқа, қарапайым және күрделі объектерден тұратын домендер құрылымын қолдануға болады. Бір жарнамада (жариялауда) араларын үтір арқылы бөліп немесе қызметші сөз or арқылы бөліп бірнеше құрылымдарды сипаттауға болады: 

              DOMAINS

              D1, d2, d3 = symbol

              f = fruits (d1, d2, d3); p(d3).

           Предикаттар бөлімінде ереженің сол бөлігі немесе CLAUSES бөлімінен алынған ереже аты жазылады.

           CLAUSES бөлімінде тұжырымдар жазылады. Бір ғана дұрыс предикаты бар фактілер мен ережелер бір блок аумағында жазылады, яғни бірінен соң бірі жазылуы тиіс. Ереже денесінде баспаға шығарылған предикаттардан басқа стандартты предикаттар мен салыстыру операциялары қолданылуы мүмкін. Стандарт предикаттар әртүрлі функцияларды орындайды. Олар: енгізу және шығару, файлдармен жұмыс жүргізу, DOS операциялық жүйесімен жұмыс істеу, жолдарды өңдеу, графикалық режимді қолдап тұру, бағдарламалаудың басқа да жүйелерімен интерфейсті қамтамасыз ету.

         GOAL бөлімі ішкі деп аталатын бағдарламаға сұраныс қоюдан тұрады. Ішкі сұраныс үшін Пролог бірінші лайықты шешімді іздеуге кіріседі, сонымен қатар жүйе, салыстыру кезінде алынған, табылған шешім нәтижелері туралы хабарламайды. Бұл іс - әрекеттер бағдарламалануы тиіс. GOAL сұраныс бөлімі бағдарламада кездеспеуі де мүмкін, онда диалог режимінде бағдарлама қосылған соң сыртқы сұранысты қолдану үшін жүйе шешімінің барлық варианттарын тауып алады, және дәл осы терезеде (окно) айнымалы предикаттар мәндері шығарылады және дұрыс немесе дұрыс емес орындалғаны туралы хабарлайды.

1. Мысал. Пролог тілінде вертикальдық кесінді қатынасының бағдарламасын жазу.

 

DOMAINS

 X=integer

PREDICATES

 point(X,X)

 otr(X,X,X,X)

 vert_otr(X,X,X,X)

CLAUSES

 point(1,4).

 point(1,7).

 point(5,7).

 point(5,4).

 otr(X,Y,X1,Y1):-point(X,Y), point(X1,Y1).

 vert_otr(X,Y,X1,Y1):-otr(X,Y,X1,Y1), X=X1, Y<>Y1.

GOAL

 clearwindow, vert_otr(X,Y,X1,Y1), write(X,Y," ",X1,Y1).

 

2. Мысал. Егер координаттары берілген болса, тең кесінділер қатынасын анықтау.

 

DOMAINS

 X=integer

PREDICATES

 dl(X,X,X,X,X)

 ravn(X,X,X,X,X,X,X,X)

CLAUSES

 dl(X1,Y1,X2,Y2,Z):- Z=sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1)).

 ravn(X1,Y1,X2,Y2,X3,Y3,X4,Y4):-dl(X1,Y1,X2,Y2,Z1),

 dl(X3,Y3,X4,Y4,Z2), Z1=Z2,  write("Кесінділер тең");

 write("Кесінділер тең емес").

GOAL

 clearwindow,  ravn(1,1,1,3,2,1,2,3)

 

3. Мысал. Егер координаттары берілген болса, кесінді ортасы қатынасын анықтау.

 

DOMAINS

 X=integer

PREDICATES

 ravn(X,X,X,X)

CLAUSES

 ravn(X1,Y1,X2,Y2):- X=(X2-X1)/2, Y=(Y2-Y1)/2,

write("Кесінді ортасы: X=",X," Y=",Y);  write("Кесінді ортасы жоқ").

GOAL

 clearwindow,

 ravn(1,5,3,4)

 

 4. Мысал. Үшбұрыш шыңдары берілген болса, медиана координаттарын анықтау.

 

DOMAINS

 X=integer

PREDICATES

 med(X,X,X,X,X,X)

CLAUSES

 med(X1,Y1,X2,Y2,XV,YV):- X=(X2-X1)/2, Y=(Y2-Y1)/2,

 write("Медиана координаттары: X1=", X," Y1=",Y," X2=",XV," Y2=",YV).

GOAL

 clearwindow,  med(1,2,3,4,3,5).

 

Тапсырмалар

 

  1. Келесі салыстыру операциялары дұрыс болады ма, не дұрыс емес болады ма?

а) нүкте (А, В) = нүкте (1, 2).

б) нүкте (А, В) = нүкте (X, Y, Z).

с) қосу (2, 2) = 4.

е) үшбұрыш (нүкте (-1, 0), Р2, Р3) = үшбұрыш (Р1, нүкте (1, 0), нүкте (0, Y)).

         Тұжырымдарды тексеру үшін, бағдарлама жазыңыз. Осы бөлімде қолданған кесінділер көрінісін қолдана, тең қабырғалы үшбұрыш үшін терм жазыңыз.

  1. Осы бөлімде қолданған кесінділер көрінісін қолданып, вертикальды тура Х = 5, горизонталды тура Х = 10 - да кез – келген кесіндіге, сәйкес келетін, терм жазыңыз.
  2. Былай деп ұйғарайық, тікбұрыш (Р1, Р2, Р3, Р4) терм тікбұрышымен көрсетілген, мұнда: Р – тура (оңды) жөнделген тікбұрыш шыңдары. Егер R – тікбұрыш вертикальды және горизонталды жақтарымен болатын болса ғана, орын алатын, регулярлы (R) қатынасын анықтаңыз.
  3. Терм квадрат жазыңыз.
  4. Терм төртбұрыш жазыңыз.
  5. Терм тік бұрышты үшбұрыш жазыңыз.
  6. Келесі бағдарламаны қарастырайық.

f (1, бір).

      f (S (1), екі).     

      f (S(S(1)), үш).

      f (S(S(S(X))),N) : -  f (X, N).

         Пролог – жүйе келесі сұрақтарға қалай жауап береді:

      a)  f (S (1), A).

      b)  f (S(S(1)), екі).

      c)  f (S(S(S(S(S(S(S(1))))))), C).

  1. f (D, үш).
  1. Келесі бағдарламада айтылады, екі адам бір – бірінен туысқан, егер:

а)  біреуі екіншісінің ата – тегі болып табылады, немесе

б)  екеуіне де ортақ ата – тегі бар, немесе

с)  екеуіне де ортақ ұрпағы бар.

     туыстар(Х, Y): - ата-тегі(Х, Y).

     туыстар(Х,Y): - ата-тегі(Y, Х).

          туыстар(Х,Y): - ата-тегі(Z, X), ата-тегі(Z, Y).

          туыстар(Х,Y): - ата-тегі(X, Z), ата-тегі(Y, Z).

          Нүктемен үтірді қолданбай – ақ, сіз мына бағдарламаны қысқарта аласыз ба?

          Келесі бағдарламаны нүкте мен үтірді қолданбай, көшіріп жазыңыз.

              Қайта құру   (Сан, Сөз): -

                         Сан = 1, Сөз = бір;

                         Сан = 2, Сөз = екі;

                         Сан = 3, Сөз = үш.

  1. Бағдарлама берілген:

Үлкен (аю).

Үлкен (піл).

Кішкентай (мышық).

Қоңыр (аю).

Қара (мышық).

Сұр (піл).

Күңгірт (Z): - қара  (Z).

Күңгірт (Z): - қоңыр (Z).

Сұраққа қатысты жауап қалай ізделеді:

? – күңгірт (Х), үлкен (Х). % кім бір мезгілде күңгіртте және үлкен?

? – үлкен (Х), күңгірт (Х). % кім бір мезгілде үлкен және күңгірт?

Осы екі сұрақтың қайсысына қатысты жүйе көбірек жұмыс атқарады? Экранға барлық үлкен, орташа, кішкентай жануарларды, құстарды шығару. Жануарлар мен құстар үлкендігі қатынасын анықтау қажет.

  1.  Ромб қатынасын жазу.
  2.  Жартышеңбер қатынасын жазу.
  3.  Параллелограмм үшін терм жазу.
  4.  Параллельді түзулер қатынасын жазыңыз.
  5.  Қиылысатын түзулер қатынасын жазыңыз.
  6.  Мына қатынастарды анықтаңыз: логикалық операция және, логикалық операция НЕМЕСЕ.
  7.  Мына қатынастарды анықтаңыз: логикалық операция НЕ, логикалық  операция НЕМЕСЕ – ҚОСПАҒАНДА (Исключающее - Или) (Егер сандар сәйкес келмесе, операция нәтижесі 1 – ге тең).
  8.  Мына қатынастарды анықтаңыз: логикалық операция ЭКВИВАЛЕНТТІЛІК (егер сандар бірдей шықса, операция нәтижесі 1 – ге тең), логикалық операция ИМПЛИКАЦИЯ (егер А = 1, В = 0 болса, операция нәтижесі 1 – ге тең).
  9.  0 – ден  9 – ға дейінгі сандарды анықтау үшін қатынастарын анықтаңыз, бірақ клавиатурадан енгізілген әрбір сан экранға жазбаша түрінде түссін.
  10.  Жылды (жазбаша) анықтау үшін қатынасын анықтаңыз.
  11.  Ай қатынасын анықтаңыз, бірақ клавиатурадан енгізілген әрбір ай нөмірі ай атымен жазылсын.
  12.  Оң сандар, теріс сандар қатынастарын анықтаңыз.
  13.  Реттік, ретсіз сандар қатынастарын анықтаңыз.
  14.  Сандар, 3 және 9 еселі қатынастарын анықтаңыз.
  15.  Адам жасын туған жылы бойынша, сонымен қатар жыл аты бойынша анықтау (мыс.: жылан жылы).
  16.  Туылған датасы бойынша жұлдызнама тобын анықтау.      

 

 

  1. РЕКУРСИВТІ ЕСЕПТЕУЛЕР. АРИФМЕТИКАЛЫҚ ӨРНЕКТЕР

 

3.1. Есептеулерді басқару

 

Есептеулерді басқару процесінің  негізгі  құралдарына  стандартты  предикаттар  fail  және !. Fail – дұрыс емес, сәтсіздік, !-өшіріп тастау, Сәтсіздікке душар бағдарламаның  мысалы:

1. Мысал. Екінші курс студенттері туралы мәліметтерді экранға шығару.

 

DOMAINS

  st=student(fam,pr,oc)

  fam,pr=symbol

  num, oc=integer

  g=gr(num,st)

PREDICATES

  kurs_22(g)

CLAUSES

  kurs_22(gr(261,student(“Қалдаров”,”Бағдарламалау тілдері”,5))).

  kurs_22(gr(261,student(“Ашірбеков”,”Операциялық жүйелер”,5))).

  kurs_22(gr(261,student(“Әділбеков”,”Басқару жүйелері”,5))).

  kurs_22(gr(262,student(“Айқынова”,”Бағдарламалау тілдері”,4))).

  kurs_22(gr(261,student(“Бұхарбаев”,”Басқару жүйелері”,4))).

  kurs_22(gr(261,student(“Нүрсейтов”,”Шет тілі”,5))).

  kurs_22(gr(261,student(“Сатымбеков”,”Операциялық жүйелер”,5))).

GOAL

  clearwindow, kurs_22(X), write(X)

 

Мұндағы: Write(X)-жүйе предикаты, экранға айнымалы мәнін шығаруды білдіреді. Осындай сұраныс нәтижесінде бірінші (алғашқы) лайықты шешім табылады.  Пролог, осы сұраныстың барлық мәндерін тауып алу үшін, алтернативті шешімдерді циклді аударуды ұйымдастыру қажет.  Лайықты бірнеше тәсілдер бар, олардың бірі Прологтың мына қасиетін қолданады, яғни күнделікті іздеуді (поиск) сәтсіз қолдану жағдайында, альтернативті шешімді іздеуді жүзеге асыру.  Бұл жағдайда Пролог жақын альтернативаға дейін шегінеді, іздеудің алғы шарттарын қалпына келтіреді және процесс табылған жаңа альтернативадан бастап қайтадан басталады.  Бұл үшін fail-ды қолданады, бірақ ол әрдайым сәтсіз аяқталады және жақын альтернативаға дейін баруды тудырады. GOAL бөлімінде барлық фактілерді қарастыру мақсаты үшін қосымша предикат fail-ды жазамыз:

Clearwindow , kurs_22 (X) , write (X) , nl , fail / * nl – жаңа жолға көшуді білдіреді */

 

  1. Рекурсивті есептеулер

 

Ереженің рекурсивті сипаты өз денесінде тура осы ереже атына қатысты сілтемеден құралған. Және мұнда рекурсияның келесі варианттары болады:

  1. Оң рекурсия

Pr ( ): - pr11 ( ), pr12 ( ), …, pr1 ( ).

  1. Сол рекурсия

Pr1 (1): - pr ( ), …, pr 11 ( ), pr12 ( ).

3.   Жалпы рекурсия

Pr1 ( ): - pr11 ( ), pr12 ( ), …, pr ( ), …, pr 21 ( ), pr22 ( ).

Реккурсивті ережеде орындалуы уақытында тоқтап қалулар болмауы үшін, рекурсияның аяқталу шарттарын қарастыру қажет. Оларды екі тәсілмен жүзеге асыруға болады:

1. Құрамында рекурсиясы жоқ, бағдарламаға альтернативті ереже немесе факторды pr1 ( ) қосу, шығыс тек осы рекурсивті ереже дұрыс аяқталған кезде болады.

  1. Дұрыс аяқталатын, (қандай) бір предикат шығу қалпын қалыптастыру.

рr21 ( ), pr22 ( ) предикаттары рекурсияның орындалуына әсер етпейді. Олар рекурсиядан шыққан соң орындалады стектен айнымалылар мәндерін қабылдайды, стекке олар рекурсия орындалып жатқан уақытта орналасады. Және осындағы жүргізіліп жатқан есептеулер кванттық деп аталады.

1. Мысал. Рекурсивті есептеулерді қолдана, n! факториалды есептеңіз.

 

DOMAINS

Number, Product = integer.

PREDICATES

Fact(Number, Product)

CLAUSES

Fact (1,1):-!.

Fact(N,R):-Next_N=N-1, Fact(Next_N, P), R=N*P.

GOAL

Fact (3,Res),write (“Факториал 3=”, Res), nl.

 

 

Бағдарлама жүрісі барысындағы есептеулер:

 

Предикатты шақыру

Қойылымдар

Есептеулер

Cоңғы есептеулер

Есептеулер нәтижелері

Fact (3 , res)

N = 3 , Res = R

Next_N = N –1 = 2

R = N * P

Res = R =3*2 = 6

Fact (2 , P)

 

N' = 2 , P = R

Next_N = N –1 = 1

R = N * P

P = R = 2 * 1 = 2

Fact (1 , P)

1 = 1 , P = 1

 

 

 

 

Бірінші қадамдар fact (3, Res) мақсатты сұраныс орындалады және шешімдердің   1 -ші варианты таңдалады : fact (1, 1) ережесі fact (3, Res) пен салыстырылады, өйткені 3 ¹ 1 кері қарай қозғалы, екінші ереже таңдалады, бұл кезде оны ереже атауымен салыстыру дұрыс келеді. Және мұнда N=3, Res=3 қойылымы орындалады. Ереже денесі стекке орналасады және дене предикаттары өңделе басталады. Олардың ішіндегі алғашқысы Next _  N = N – 1 = 2 – мен салыстыру, содан соң fact (2, P) – ні шақырады. Қайтадан ереженің бірінші варианты таңдалады. 1 ¹ 2 – ні салыстыру сәтсіздікке ұшырады, бағдарлама кері шегініп, ереженің екінші варианты таңдалады. Бұл кезде ереже атауымен салыстыру дұрыс аяқталады. Және мұнда N = 2, P = R  қойылымы орындалады. Ереженің жаңа көшірмесі стекке орналасады және оның орындалуы басталады. Олардың бірі Next_ N = N = 1 дұрыс аяқталады. Next_N айнымалысының копиясы 1 – ге тең болады . Бұдан кейін fact (1, Р) шақырылады. Тағы да бірінші ережемен салыстыру орындалады және дұрыс аяқталады. Қойылым келесі түрде болады: 1=1, Р = 1. І ережесінің денесі бос, сондықтан ешқандай іс - әрекеттер орындалмайды. Бағдарлама рекурсиядан шыққан соң, соңғы (қорытынды) есептеулер орындалады, яғни екінші ереже көшірмесінен стекте қалған қалдықтар. Осы есептеулер нәтижесінде Res айнымалысы жаңа мән 6 – ға ие болады және ол экранға write (“ Res = “ , Res) предикатымен шығарылады.

Бірінші тұжырымда кесіп тастау бар, ол тек fact (1, Res) сұранысын сұраған кезде, яғни ! есептеген кезде, Res айнымалысы 1 – ге тең болу үшін қолданылады. Және бұл кезде екінші ереже алынып тасталады. Және мұнда бірінші ереже тоқтап қалу және қатеге соқтырмайды. Fast (0, Res) сұранысы үшін бағдарламаны түзету үшін clauses бөліміне тағы бір тұжырымдаманы қосады:

Fаct (0, 1) : - !

 

Тапсырма 1

Рекурсивті процедураны қолдана, тізбектің  n – ші мүшесі мен қосындысын табу:

1.     lg(1)+lg(1/2)+lg(1/4)+lg(1/8)+...

2.     1+1/3+1/5+1/9+...1/(2n-1+1)

3.     1+1/2+1/5+1/10+...1/(n2+1)

4.     1-4+9-16+25-...

5.     tg(1)-tg(1/2)+tg(1/4)-tg(1/8)+...

6.     arcsin(1)-arcsin(1/3)+ arcsin(1/5)- arcsin(1/9)+...

7.     cos(x)+cos(x2)+cos(x3)+...

8.     2+8+54+256+...+2*nn

9.     ln2(2)+ln4(9)+ln6(64)+...+ln2n(n+1)2

10. sin(1)+sin(8)+sin(81)+...sin(nn+1)

11. tg(x)+2tg(x2)+3tg(x3)+...+ntg(xn)

12. 1/cos(x-1)+1/cos(x-2)+1/cos(x-3)+...+1/cos(x-n)

13. 1/(x1+1)+1/(x2+2)+ 1/(x3+3)+...+ 1/(xn+n)

14. 1/(x1+1)-1/(2x2+2)+ 1/(3x3+3)-...

15. 1/sin(x-2)+1/sin(x-4)+1/sin(x-6)+...+1/sin(x-2n)

16. cos(x)-cos2(x2)+cos3(x3)-...

17. sin(x)cos(x)+sin(x)cos2(x)+ sin(x)cos3(x)+...

18. sin(x)cos(x)+sin(x2)cos2(x)+ sin(x3)cos3(x)+...

19. tg(1/x)+2tg(1/2x2)+3tg(1/3x3)+...+ntg(1/nxn)

20. arctg(x)+arctg(2x+1)+ arctg(3x+2)+arctg(4x+3)+...

21. 1/(x-1)+ 1/(x2-1)+ 1/(x3-1)+...

22. x/(x+1)+ x/(x+8)+ x/(x+81)+...+x/(x+nn+1)

23. 1/cos(x+2)+1/cos(x+4)+1/cos(x+6)+...+1/cos(x+2n)

24. 1+x/1!+x2/2!+…+ xn/n!

25. 1+x/2!-3x4/4!+…(-1)n (2n-1)x2n/(2n)!

  1. Арифметикалық өрнектер

 

Арифметикалық формулалар санға немесе құрылымға жатады. Құрылымға бір немесе бірнеше компонент кіре алады, мысалы, сандар, арифметикалық операторлар, арифметикалық тізбек формулалар, айнымалы – арифметикалық формуламен, нақтыланған, унарлы функторлар, қайта құру функторлары және арифметикалық функторлар.

Арифметикалық операторлар: +, -, *, /, mod, div, - прологтың кәдімгі атомдары және көбінесе кез – келген контексте қолданылуы мүмкін.

Салыстыру операциялары: >, <, =, >=, <=, <>, ><.

Функциялары: sin, cos, tan, arctan, ln, log, exp, sqrt, round, brunc, abs.

 

 

2. Мысал. Стандартты предикаттарды қолдана, есептеңіз:

 

 

DOMAINS

X, Y, Z = integer % егер real, онда сұраныста – readreal деп жазылады

PREDICATES

Z(X,Y)

CLAUSES

    Z(X,Y):-Y=X*COS(X), X>=5;

                                     Y=TAN(X).

GOAL

     clearwindow, write(“Input X: ”), readint(X), Z(X,Y), write(“Z(”,X,”)=”,Y)

 

Тапсырма 2

Стандартты предикаттарды қолданып, есепте: 

 

Вариант 1.

Вариант 2.

    

 

Вариант 3.

 

 

Вариант 4

Вариант 5.

 

Вариант 6.

Вариант 7.

Вариант 8.

 

 

Вариант 9.

 

Вариант 10.

 

 

Вариант 11.

 

Вариант 12.

Вариант 13.

 

 

Вариант 14.

 

 

 

Вариант  15.

Вариант 16.

 

Вариант 17.

Вариант 18.

Вариант 19.

Вариант 20.

Вариант 21.

Вариант 22.

Вариант 23.

 

 

Вариант 24.

 

 

 

  1. ТІЗІМДЕР. СТАНДАРТТЫ ПРЕДИКАТТАР

 

4.1. Тізімдер

 

Тізімдер – бұл квадрат жақшаларға енгізілген және бір – бірінен бөлінген, объектің реттелген тізімі немесе тізбек элементтерінің жиыны. Тізім кез – келген элементтер санынан құралады, шектеуге тек компьютер жадысында қалған орын жатады. Элементтері жоқ тізім бос деп аталады және квадрат жақшаға алынады, бірақ ішінде ешнәрсе жоқ болады.

Тізімдерді өңдеу – тізбектің басы мен аяғына бөлу түсінігіне негізделеді. Басы – бұл тізімнің бірінші элементі, аяғы – қалған бөлігі. Прологта тізімді қолдану үшін қажет:

  1. Домендер бөлімінде келесі сөздерді жазады:

< домен аты >=< элемент типі >*

Тізімді жариялау мысалы:

 

               DOMAINS              

               g1=integer*

               g2=symbol*

               PREDICATES

               f[g1]

               l[g2]

 

Тізімдер мысалы:

[10, 5, 7,12]

[1, 1,5, 0,8, 11,5]

[“қаңтар”, ”ақпан”, ”желтоқсан”]

 

Тізімнің басы мен аяғына бөлу операциясы:

 

 

1. Мысал. Тізім элементтерін көрсету бағдарламасы:

 

DOMAINS

  List1 = integer*

  List2 = symbol*

PREDICATES

  name [List1]

  score [List2]

CLАUSES

  name ["Қалдаров","Сатымбеков","Бұхарбаев"].

  score [1,2,3,4].

GOAL

  Name [X],

  Name [ _, Y, _ ],

  Score [Z, _ , F, _ ], write(X,” ”,Y,” ”,Z,” ”,F)

 

Пролог – бағдарламада элементтерінің кез – келген саны кездесетін тізімдерді қолданған кезде тізімді басы мен аяғы бөлу тәсілі қолданылады. Бұл тәсіл тізімді рекурсивті өңдеуді қамтамасыз етеді. Тізімді бөлу операциясы вертикальды сызықпен белгіленеді және келесі түрде жазылады:     

[ Head / Tail ].

 

2. Мысал. Тізім құрамын баспаға шығару бағдарламасы:

 

DOMAINS

  List1=integer*

  List2=symbol*

PREDICATES

  Print _ list (List1)

  Print _ list (List2)

CLAUSES

  Print _ list ([ ]).

  Print _ list ([Head | Tail] ):-write (Head), nl,

  Print _ list (Tail).

GOAL

 Print _ list ( [1,2,3,4] )

 

Берілген бағдарламада мәліметтер символдық немесе бүтін тип түрінде көрсетілуі мүмкін. Бағдарламада тізімдерді өңдеудің рекурсивті тәсілі қолданылады. Бағдарламаның бірінші сөйлемі print_ list ( [ ] ) мынаны білдіреді, бос тізім, екінші сөйлемде қолданылатын, рекурсиядан бағдарламаның шығу шартына жатады. Басында print_ list ([1, 2, 3, 4]) сұранысы print_ list ( [ ] ) бірінші сөйлеммен салыстырылады. Бұл салыстыру сәтсіздікпен аяқталады, яғни  [1, 2, 3, 4] ¹ [ ]. Бұдан соң сұраныс екінші сөйлеммен салыстырылады. Операция дұрыс аяқталды. Тізімнің сол бөлігінде тізімді басы мен аяғына бөлу операциясы жүреді, ал оң бөлігінде – тізімнің басжағына экранға шығарады. Бұдан кейін nl предикаты – келесі жолға көшу орындалады. Содан кейін print _ list ([2, 3, 4]) рекурсивті шақыру қалыптастырылады, ал ол print_ list ( [ ] ) процедурасымен байланысады (хабарласады) және т.б.

 

3. Мысал. X, Y екі тізімді көбейту соммасын есептеу бағдарламасы.

 

DOMAINS

 Vector=integer*

PREDICATES

 prod(Vector,Vector,Vector)

CLAUSES

 prod([ ],[ ],0).

 prod([X|Xs],[Y|Ys],S):-prod(Xs,Ys,Sp), S=X*Y+Sp.

GOAL

 prod([1,2,3],[7,8,9],Res), write(“Res=”,Res)

 

 

Пролог – бағдарлама қызметін келесі кесте түрінде көрсетуге болады:

 

Предикатты шақыру

Қойылым

Соңғы есептеулер

Есептеу нәтижелері

Prod([1,2,3],[7,8,9],Res)

X=1,  У=7, Xs=[2,3], S=[8,9] Res=S

S=X×Y+Sp

S=1×7+43=50

prod(Xs,Ys,Sp)

 

prod([2,3],[8,9],S)

 

X=2, Y=8

Xs=[3], Ys=[9]

Res=S

Sp=X×Y+Sp

S=16+27=43

Prod([3],[9],S)

X=3, Y=9

Xs=[ ], Ys=[ ]

Res=S

S=X×Y+Sp

S=3×9=27

Prod([ ],[ ],0)

Рекурсиядан шығу

 

 

4. Мысал. Тізімге берілген (тапсырылған) элемент индексін алу (табу)

 

DOMAINS

 L=integer*

 X=integer

PREDICATES

 poluch(L,X,X)

CLAUSES

 poluch([X|Y],1,X).

 poluch([W|Y],N,X):-M=N-1,poluch(Y,M,X).

GOAL

 poluch([1,2,3,4],3,X),write(X)

 

Бағдарламаның қадамдық жұмысы механизмін қарастырайық:

 

CALL: goal ( ) /* сыртқы сұраныс */

CALL & POLUSH [1, 2, 3, 4] , 3,/* 3 элементі үшін индексті алу процедурасын шақыру */

REDO: POLUSH ([1, 2, 3, 4], 3, _ )  /* процедура алғашында ереженің бірінші сөйлеммен салыстырылады, ол сәтсіз аяқталады, содан кейін екінші сөйлеммен салыстырылады, басы мен аяғына тізімді бөлу операциясы, тізімнің бірінші элементі бөлініп алады да, стекке енгізіледі, М% айнымалысы мына мәнге ие болады 3 – 1 = 2: */

2 = 2

CALL: polush ([2, 3, 4], 2, _ )  /* сөйлемнің екінші бөлігі орындалады, polush (X, M, X) рекурсивті процедурасын шақыру */

REDO: polush ( [2, 3, 4], 2, _ ) /* процедура бірінші сөйлеммен салыстырылады, өйткен салыстыру сәтсіз аяқталғандықтан, кері шегіну орындалады, содан соң екінші сөйлем орындалады, екінші элемент бөлініп алып, стекке енгізіледі, айнымалы мына мәнге ие болады М = 2 – 1 = 1  */ 1= 1

CALL: polush ([3, 4], 1, _ )  /* сөйлемнің екінші бөлігі орындалады, polush (X, M, X) рекурсивті процедураны шақыру, процедура бірінші сөйлеммен салыстырылады, және де салыстыру жемісті (дұрыс) аяқталады:

*/ RETURN: polush ([3, 4], 1, 3)

/* Осы моменттен бастап, М айнымалысы үшін есептеулер аяқталады, стек операциялары басталады, яғни стектен мәндерді кезекпен шығару:  */

RETURN: polush ([2, 3, 4], 2, 3)

RETURN: polush ([1, 2, 3, 4], 3, 3)

                   Write (3)

 

5. Мысал. Тізімнің максималды элементін табу.

 

DOMAINS

 L=integer*

 X=integer

PREDICATES

 max(L,X)

CLAUSES

 max([X],X).

 max([X|Y],X):-max(Y,W), X>W,!.

 max([X|Y],W):-max(Y,W).

GOAL

 clearwindow, max([1,2,10,-4],X), write(X)

 

4.2. Тізімдермен операциялар жүргізу

 

1. Операция: тізімге қатыстылығы (мүшелігі).

Тізімге қатыстылығының бағдарламасын құру келесі тұжырымдарға негізделеді:

  1. Х бұл  l – дің басы, немесе
  2. Х  l  аяғына қатысты.

Осыны екі сөйлем түрінде жазуға болады, олардың ішіндегі біріншісі жәй файл, ал екіншісі ө ереже :

Қатысты (X, [X | Аяғы ] ).

Қатысты ( X [ басы | Аяғы ] ): қатысты (Х, Аяғы).

 

Мысалы:

Қатысты (в, [а, в, с])

Қатысты ( [в, с], [а, [в, с]])

 

  1. Операция: жалғастыру (конкатенация).

Конкатенация қатынасын анықтайтын бағдарлама:

Конк ( [ ] l, l ).

Конк ( [X | l1 ], l2, [x | l3 ]): - конк (l1, l2, l3).

Қолданылуы: құрылған бағдарламаны енді мынаған қолдануға болады

а) берілген тізімдерді біріктіру, мысалы:

?-конк([a,b,c],[1,2,3],L).

L=[a,b,c,1,2,3]

б) берілген тізімді екі бөлікке бөлу үшін:

 

?-конк(L1,L2,[a,b,c]).

L1=[]

L2=[a,b,c];

L1=[a]

L2=[b,c];

L1=[a,b]

L2=[c];

L1=[a,b,c]

L2=[];

 

в) шаблон немесе үлгі түрінде берілген, қандай да бір шартқа жауап беретін, элементтер комбинациясы тізімінде іздеу үшін:

 

?-конк(Do, [may|_]),[jan,feb,mart,apr,may,iun, iul, avg,sent, okt, nov, dec].

Do=[jan,feb,mart,apr]

 

  1. Операция: тізімге элементті қосу.

Тізімге элементі қосу бағдарламасы:

 

қосу (X, L, [X | L]).

 

  1. Операция: Тізімнен элементті алып тастау (жою).

Тізімнен элементті алып тастау (жою) бағдарламасы:

 

жою (Х, [Х | Аяғы ], Аяғы).

жою (Х, [Y | Аяғы ], [Y | Аяғы 1 ] ): - жою (Х, Аяғы, Аяғы 1).

 

Мысалы:

? – жою (а, [ а, в, а, а], L).

L=[в, а, а];

L=[а, в, а];

L=[а, в, в].

 

Қолданылуы:

? – жою (а, L, [1, 2, 3]).

L=[а, 1, 2, 3];

L=[1, а, 2, 3];

L=[1, 2, а, 3];

L=[1, 2, 3, а];

 

5. Операция: ішкі тізім.

Ішкі тізім бағдарламасы:

 

Ішкі тізіммен (S, L):- конк (L1, L2, L), конк (S, L3, L2).

 

Оны былайша түсіндіруге болады:

S L-дің ішкі тізіміне жатады, егер

1)    L-ді 2 тізімге L1, L2 бөлуге болады және

  1. L2-ні 2 тізімге S және L3-ке бөлуге болады.

? – ішкі тізім (S, [a, в, с])

S=[ ];

S=[а];

S=[а, в];

S=[а, в, с];

S=[в].

 

  1. Операция: орындарын ауыстыру

Орын ауыстыру қоныстары бағдарламасы бірінші тізім түріне байланысты екі жағдайды қарастыруға негізделген:

  1. Егер 1- ші тізім бос болса, онда 2-ші тізім де бос болуы керек.
  2. Егер 1- ші тізім бос болмаса, онда ол келесі түрде болады [x/L], және осындай тізімге орын ауыстыруды келесі түрде жүргізуге болады: басында L1 тізімнен алу – L орнын ауыстыру, ал кейіннен х-ті өзіндік позиция L1- ге енгізу.

Пролог тілінде бағдарлама:

Орын ауыстыру( [ ], [ ]).

Орын ауыстыру ( [ X/L], Р):-орын ауыстыру (L, L1), енгізу (X, L1, P).

 

4.3. Стандартты предикаттар

 

Стандартты (жүйеге енгізілген) предикаттар әртүрлі функциялар орындайды. Олар: әртүрлі типтегі айнымалыларды енгізу - шығару, файлдармен жұмыс істеу, DOS функцияларын орындау, жолдарды өңдеу, графикалық режимді қолдау, басқа да бағдарлама жүйелерімен (Си, Паскаль) интерфейсті қалтамасыз ету және т.б. жүйеде барлығы 200 стандартты предикаттар бар.

Стандартты предикаттар қолдану үшін предикат атын, оны шақыру тәсілдері, параметр мәндерінің типтері мен саны, сонымен қатар оларды тасымалдау режимдерін білу қажет. Тасымалдау режимі әдетте шаблон түрінде жазылады. (Шаблон) ол параметрлердің қайсысы предикат үшін енгізү (шаблонда і немесе енгізу деп белгіленеді), ал қайсысы шығыс (шаблонда о немесе шығару деп белгіленеді) екенін көрсетеді. Турбо-Прологтың қалған стандартты предикаттарын келесі форматта көрсетейік:

предикат(аргументтер тізімі)(домендер типі): (шаблон).

 

Makewindow (терезеНом, экрАшу, РамкаАшу, РамкаЖолы, Жол, Баған, биіктік, Ені, ТерТазалау, РамкаЖолыПоз, шекараБелг) (integer, integer, integer, string, integer, integer, integer, integer, integer, integer, string): (енг, енг, енг, енг, енг, енг, енг, енг, енг, енг, енг), (шығ, шығ, шығ, шығ, шығ, шығ, шығ, шығ, шығ, шығ, шығ). Makewindow Предикаты аргумент ТерНом нөмірімен терезені құрады. Предикаттың қалған аргументтері келесі мағынада болады:

ЭкрАшу – символ түсі мен фонын анықтайды;

РамкаАшу – нөлден басқа мәнде терезенің шекара сызықтары сызылады;

РамкаЖол – Терезе контуры жоғарғы шекарасы ортасында орналасқан жолды көрсетеді;

Жол, Баған – терезенің жоғарғы сол бұрышының вертикалды және горизонталды координаттары;

Биіктігі, ені – терезенің биіктігі (жолдар саны) және ені (бағандар саны);

Терезені тазалау анықтайды, терезені құраған соң, оны тазалау керек пе, жоқ па; 0 – терезені тазаламау, 1 – терезені тазалау;

РамкаЖолыПоз терезе басының орналасу орнын анықтайды (терезе рамкісінің жоғарғы сызығы ішінде): - 1 = Аты центрде; № = көрсетілген позицияда атын орналастырады;

ШекараБелгілері терезе рамкасын қалай салу керектігін көрсетеді.

 

Бұл аргумент қатал түрде 6 символдан тұрады, мыналарды білдіреді: жоғарғы сол бұрышы, жоғарғы оң бұрышы, төменгі сол бұрыш, горизонталдық сызық және сәйкесінше вертикаль сызық. Мысалы: <<|218|191|192|217|196|179>> - бір сызықтан тұратын шекаралар; <<|201|187|200|188|205|186>> - екі линиядан тұратын шекаралар;  <<++++| - >> - шекараға сипаттаудың басқа вариантын.

Readchar  (Айнымалы символы) (char): (шығ) – күнделікті енгізу құралынан, яғни клавиатурадан жалғыз символы оқиды, әзірше ол Readdevice көмегімен өзгертіледі.

Readdevice (Символ Файл Аты) (symbol): - (енг), (шығ) – күнделікті шығару құрылғысын бекітеді немесе орындайды, (енг): Симвалич Файл Аты  мәліметтері бар ашық файлға күнделікті енгізу құрылғысын тағайындайды. Ашық файл стандартты файлдардың бірі немесе модификация үшін ашылған, символикалық аты бар компьютерді қолданушының кез – келген файлы болуы мүмкін (шығ): СимвФайлАтын күнделікті енгізу құрылғысы атымен байланыстырады. Енгізу үшін ашылуы мүмкін стандартты файлдар: сот 1 – байланыстың кезекті портынан оқу; keyboard – клавиатурадан оқу (үндемей - ақ); stdin – DOS стандартты енгізуден оқу.

Readint (Мақсат айнымалы) (integer): (шығ) – күнделікті енгізу құрылғысынан бүтін санды оқиды. Символдар қайта өзгерту жүргізілмейді, Readint каретканы қайтару символын (ASCII 13) кездестіргенше.

Readln (айнымалы жол) (string): (шығ) – ASCII 13 каретканы қайтару символына дейін күнделікті енгізу құрылғысынан символдар жолын оқиды. Экранда оқылатын ең үлкен жол 147 симвоға тең.

Write (l1, l2, l3, … ln): (енг, енг, енг, …, енг) – күнделікті терезеге немесе күнделікті енгізу құрылғысына айнымалылар немесе константалар мәнін енгізеді. Write ie аргументтің өзіндік нольге тең емес санымен байланысты болуы мүмкін. Аргументтер бос айнымалылар болуы мүмкін емес.

Writedevice (симвФайлАты) (symbol) (енг), (шығ) – күнделікті енгізу құрылғысын бекітеді немесе орындайды. (енг): күнделікті енгізу құрылғысын СимвФайлАты мәліметі бар ашық файлға қайта тағайындайды. Ашық файл стандарттық символдық файлдың бірі немесе жазу немесе модификация үшін ашылған компьютер қолданушысының кез – келген файлы болуы мүмкін. (шығ): файлдың символдық атын күнделікті енгізу құрылғысымен байланыстырады. Шығару үшін келесі қондырылған (енгізілген) файлдар қолданылуы мүмкін: сот 1 – тізбекті порт; printer – принтердің параллельді порты; screen – монитор экраны; stdout – DOS – тың стандартты шығысы; stderr – стандартты қателер файлы .

RemoveWidow / 0 – ашық терезені жояды да, алдындағы терезеге көшеді.

Writef (СолФорматы, Apr1, Apr2, Apr3, … ) (енг, енг, енг ) – форматталған шығысты орындайды. Apr1 – AprN аргументтері константалар немесе айнымалылар басуы мүмкін. Форматтар кәдімгі текстің ФорматЖолы жолы түрінде беріледі, мұнда символдар % жол аргументі орнын ескереді. Форматтың рұқсат етілген спецификациялары кәдімгі символдардан тұрады. Олар модификациясыз баспаға шығарылады. Форма спецификациясының форматы % - m.pf. Спецификация форматы білдіреді: - (дефис) көрсетеді, поле солдан теңеледі; m поле – ондық сан, поленің минимум мөлшерін көрсетеді. f поле келесі форматтарды сипаттайды:

 

f – бекітілген есептеудің ондық жүцесіндегі заттық формат;

E -  экспоненциалды көрініс формасындағы заттық фомат;

G – қысқа форматтағы үндемеу бойынша қолданылады заттық формат;

D – символдар немесе бүтін ондық сандар форматы;

U – таңбасыз ондық сандар ретінде бүтін сандар немесе символдар форматы;

X – 16-лық сандар ретінде бүтін сандар немесе символдар форматы;

C – символдар ретінде бүтін сандар немесе символдар форматы;

R – мәліметтер базасы көрсеткіші нөміріне сілтеме ретінде аргументті қолданады;

X – ұзын 16-лық сан (жолдар, мәліметтер базасы көрсеткішінің нөмірі) ретінде аргументті қолданады;

S – формат жол ретінде (символдар және жолдар);

 

Asserta (<факт>) (dbasedom) (енг) – мәліметтердің резиденттік базасы басына факты (тұжырымдама) енгізеді (basedom ретінде белгіленетін, домен, database бөлімінен әрбір предикат үшін автоматты түрде жарияланады).

Assertz (X) (dbasedom): (енг) – мәліметтердің резиденттік базасының соңына Х фактісін (тұжырымын) енгізеді.

Retract (X): (енг) – мәліметтер базасына тұжырымды іздеу жүзеге асырылады, оның басы мен денесі Х термімен салыстырылады. Бірінші осындай тұжырым мәліметтер базасынан жойылады. Аргумент (терм Х) құрама терммен нақтылануы тиіс:

Retractall (X): (енг) – мәліметтер базасынан барлық тұжырымдарды жояды, олардың функтор мен арносттылыған Х – пен салыстыруға болады.

Cursor (жол, саны) (integer, integer): (енг, енг), (шығ, шығ) – (енг, енг) – курсорды координаттары (жол, саны) позициясына орналастырады.

 

6. Мысал. Конкатенация қатынасын қолдана, тізімнің 2 – ші элементін баспаға шығару.

 

DOMAINS

 Z=integer

 X, Y=integer*

PREDICATES

 konk(X,X,X)

 vtor(Z,X)

CLAUSES

 konk([],L,L).

 konk([X|L1],L2,[X|L3]):-konk(L1,L2,L3).

 vtor(X,L):-konk(_,[_,X|_],L).

GOAL

clearwindow, L=[1,2,3,4], vtor(X,L),  write(X)

 

 7. Мысал. Пәндер бойынша <<4>> және <<5>> бағасы бар студенттер фамилиясын экранға шығару.

 

DOMAINS

 Col=integer*

 Nam=symbol*

PREDICATES

 find(Col,Nam,Nam)

CLAUSES

 find([ ],[ ],[]):-!.

 find([H1|T1],[H2|T2][H3|T3]):-H1>=4, H1<=5, write(H2," ",H2,” ”,H3), nl,

 find(T1,T2,T3);

 find(T1,T2,T3).

GOAL

 clearwindow, makewindow(1,1,4,"find",1,1,10,20),

 find([3,2,4,5],[ivanov,petrov,kozlov,sidorov],[mat,xim,inf,fiz]).

 

8. Мысал. Меню пунктерін жүзеге асыратын, бағдарламаны құру: фамилиясы, жазған нөмірі, сұрақтарды қарастырып шығу бойынша іздеу.

 

DOMAINS

 Iniz=inizial(FIO,POL,GOD)

 In=ini(FIO,POL,GO)

 i=integer

 FIO,POL,Text,Go=symbol

 GOD,NUM=integer

 g=gr(NUM,Iniz)

 c=gh(Text,In)

PREDICATES

 bezr(g)

 vopros(c)

 vopros1(c)

 start

 process(i)

 patch

GOAL

 start.

CLAUSES

/* Мәзір құру процедурасы */

start:-makewindow(1,2,7,"Жұмыссыздар тізімі",0,0,25,80),

       clearwindow,

       patch.

/* Мәзірді басқару процедурасы */

patch:-cursor(7,0),

       write("1-Фамилия бойынша іздеу"),nl,

       write("2-Номері бойынша іздеу"),nl,

       write("3-Сұрақтарды көру"),nl,

       write("4-Шығу"),nl,

       write("=>"),

       readint(Choise),

       Choise>=0,

       Choise<4,

       clearwindow,

       process(Choise),

       retractall(_);

       clearwindow,

       Choise=4,

       retractall(_),

       removewindow.

bezr(gr(1,inizial("An","jen",1980))).

bezr(gr(2,inizial("Sim","muj",1979))).

bezr(gr(3,inizial("Pet","muj",1981))).

bezr(gr(4,inizial("Tor","jen",1970))).

 

vopros(gh("Енгізілген номер",ini("ФИО","Жынысы","Туылған жылы"))).

vopros1(gh(" номер",ini("Енгізілді: ФИО","Жынысы","Туылған жылы"))).

 

process(1):-makewindow(1,2,7,"Фамилия бойынша іздеу",0,0,25,80), nl,

            write("Фамилия енгіз: "), readln(F),nl,

            bezr(gr(N,inizial(F,P,GOD))),write("Номер: ",N," ФИО:"

            ,F," Жынысы: ",P," Туылған жылы :", GOD).

 

process(2):-makewindow(1,2,7,"Номер бойынша іздеу",0,0,25,80), nl,

            write("Номерін енгіз: "), readint(N),nl,

            bezr(gr(N,inizial(F,P,GOD))),write("Номер: ",N," ФИО:"

            ,F," Жынысы: ",P," Туылған жылы :", GOD).

 

process(3):-makewindow(1,2,7,"Сұрақтарды көру",0,0,25,80),

            vopros(C),write("Номер бойынша іздеу сұрағы: "), nl,

            write(C),nl,nl, vopros1(C1),

            write("Фамилия бойынша іздеу сұрағы: "), nl,

            write(C1).

 

9. Мысал. Стандартты предикаттарды және тізімдермен операцияларды жүргізуді қолдана, келесі мәзір пунктерін жүзеге асыратын бағдарламаны жазыңыз: тізімнің көрсетілген орнына қосу; көрсеткен элементті жою.

 

DOMAINS

 I,J=integer*

 N=integer

PREDICATES

 lister(I)

 process(N,I)

 writer(I)

 writers(I)

 inserts(N,I,I)

 insert(I)

 deletes(N,I,I)

 delete(I)

CLAUSES

 lister(I):-

         makewindow(1,2,5,"Menu",1,1,10,20),

write("inse.эжхз-0rt-1"),nl,

write("delete-2"),nl,

write("writer-3"),nl,

write("exit-4"),nl,

write("input N=>"),readint(L),L<5,L>0,process(L,I);lister(I).

process(1,I):-insert(I).

process(2,I):-delete(I).

process(3,I):-writer(I).

process(4,I):-exit.

 insert(I):-

makewindow(2,6,3,"Insert",1,1,10,20),

write("Input # "),

         readint(N),

         inserts(N,I,J),

         lister(J).

         inserts(1,I,J):-

write("Input New=>"),

readint(U),J=[U|I],!.

inserts(N,[H|L1],[H|L2]):-N1=N-1, inserts(N1,L1,L2).

 delete(I):-

         makewindow(3,7,5,"delete",1,1,10,20),

write("Input N=>"),readint(W),deletes(W,I,J),lister(J).

deletes(1,[H|T],T):-!.

deletes(N,[H|L1],[H|L2]):-N1=N-1,deletes(N1,L1,L2).

 writer(I):-

         makewindow(4,6,43,"write",1,1,15,20),

writers(I),readchar(U),lister(I).

writers([ ]):-!.

writers([H|T]):-write(H),nl,writers(T).

GOAL

 lister([1,2,3,4,5,6,7]).

Тапсырма 1

 

  1. (Қатынасты анықтаңыз:) Элемент Список тізімінің сонғы элементі болатындай, соңғы (элемент, тізім) қатынасын анықта.
  2. Қатынасты анықтаңыз: бірінші (элемент, тізім). Анықтаудың 2 вариантын жазыңыз: конкатенация қатынасын қолданып және қолданбай.
  3. Аптадағы бейсенбі күнінен алдыңғы және бейсенбі күннен кейінгі күнді анықтаңыз.
  4. Қатынасты анықтаңыз: линеаризация (тізім, сызықты тізім), мұндағы тізім – тура сол тізім, бірақ <<дүниеге келген>>, яғни оның ішкі тізімдерінің элементтері бір сызықты тізімді құрайды.
  5. Солға бір символға <<циклдік жылжытылған>> тізім 2 тізім 1 болып табылатындай, жылжу (тізім 1, тізім 2) қатынасын анықтаңыз. Мысалы:

Жылжу ([1, 2, 3, 4, 5] L1), жылжу (L1, L2)

Мынаны береді:  L1 = [2, 3, 4, 5, 1],  L2 = [3, 4, 5, 1, 2].

  1. L1 тізбегінен 3 бірінші және 3 соңғы элементтерін сызып тастаудан туындаған L2 тізімі үшін (осы L2 тізбегін дүниеге келтіру үшін) мақсаттар кезектігін (тізімін) жазыңыз.
  2. Тізімнің көрсеткен орнына қосуды жүзеге асыратын, бағдарламаны, стандартты предикаттар және тізімдермен жүргізілетін операцияларды қолдана, жазыңыз.
  3. Стандартты предикаттар мен тізімдермен жүргізілетін операциялар қолдан, тізімнің көрсеткен элементін жоятын, бағдарлама жазыңыз.
  4. Тізімдерді кері аударатын, кері аудару (тізім, кері аударылған тізім) қатынасын анықтаңыз. Мыс: тізім – [a, b, c, d], кері аударылған тізім – [d, c, b, a].
  5.  Екі предикатты анықтаңыз: тізімнің реттік ұзындығы және тізімнің ретсіз ұзындығы. Олар шындық болуы тиіс және, егер олардың аргументіне сәйкесінше реттік және ретсіз ұзындықтығы тізім жатса.
  6.  Тізім элементтері бүтін сандар болып табылатын, тізімнің оң сандар саны және тізімнің теріс сандары саны қатынасын анықтаңыз.
  7.  Тізімге << Z >> элементі кіретінін анықтаңыз, және егер кіретін болса осы элементтен соң барлық элементтерді жойыңыз.
  8.  Тізімге << Z >> элементі кіретінін анықтаңыз, және егер кіретін болса осы элементтен бұрынғы барлық элементтерді жойыңыз.
  9.  Тізім элементтері бүтін сандар болатын, тізімнің реттік (жұп) сандар саны және тізімнің ретсіз (тақ) сандар саны қатынасын анықтаңыз.
  10.  Тізім элементінің максималдық теріс мәні қатынасын анықтаңыз.
  11.  Тізімнің жұп және тақ элементтерінен максимум мәнді анықтаңыз.
  12.  Тізім элементінің минимум және максимум мәндері индексін анықтаңыз.
  13.  Тізімнің оң сандар сомасы және тізімнің теріс сандар сомасы қатынасын анықтаңыз.
  14.  Тізімнің жұп сандар сомасы және тізімнің тақ сандар сомасы қатынасын анықтаңыз.
  15.  Тізім 1 және тізім 2 – ң жұп элементтері көбейтіндісінің сомасын табыңыз.
  16.  Тізім 1 мен тізім 2 – ң тақ элементтері көбейтіндісін табыңыз, нәтижесін тізім 3 – ке жазыңыз.
  17.  Тізім 1 мен тізім 2 – ң оң элементтері көбейтіндісінің сомасын табыңыз.
  18.  Тізім 1 мен тізім 2 – ң теріс элементтері көбейтіндісін тап, нәтижесін тізім 3 – ке жаз.
  19.  Тізімнің теріс тақ элементтерін жою қатынасын жазыңыз.
  20.  Тізімнің оң және жұп элементтерін жою қатынасын жазыңыз.

 

Тапсырма 2

 

  1. Келесі мәзір пунктерін жүзеге асыратын бағдарлама жазыңыз: алименттері бар қызметкерлерді фамилиялары бойынша іздеу; барлық мәліметтерді қарастырып шығу.
  2. Стандарт предикаттар және тізімдермен жүргізетін операцияларды қолдана, келесі операцияларды орындайтын бағдарламаны жазыңыз: экранда тізімді көріп шығу; тізім элементтерін редакциялау.
  3. Брінші тапсырмамен қоса, меню пунктерін орындайтын бағдарлама жазыңыз: жанұя мәліметтері базасында 2 – 3 – тен 15 жасарға дейін балалары бар жанұяларды іздеу үшін сұрақтар жазыңыз; сұрақтарды экранда көріп шығу. Бағдарлама жазарда стандартты предикаттар мен тізімдермен жүргізетін операцияларды қолданыңыз.
  4. [1950, 1980] аралығында дүниеге келген қызметкерлерді фамилиясы бойынша іздеу; барлық мәліметтерді қарастырып (экранда көріп) шығу.
  5. Еңбек ақысы 8000 – нан кем, 1950 ж. дейін туылған қызметкерлерді фамилиясы бойынша іздеу; барлық мәліметтерді көріп шығу.
  6. Кірісі 5000 – нан жоғары, пенсия жасындағы қызметкерлерді фамилиясы бойынша іздеу; барлық мәліметтерді көріп шығу.
  7. Қарыз сомасы 3000 – нан 5000 – ға дейінгі абоненттерді фамилиясы бойынша іздеу; барлық мәліметтерді көріп шығу.
  8. Мәліметтер базасында (Балбөбек 1, Балбөбек 2) егіздер қатынасын анықтаңыз; барлық мәліметтерді көріп шығу.
  9. Жанұя мүшелерінің жалпы кірісін анықтаңыз; барлық мәліметтерді көріп шығу.
  10.  50 – ге жетпеген жастағы қызметкерлердің пенсиондық аударымы сомасын анықтаңыз; барлық мәліметтерді көріп шығу.
  11.  30 жастағы асқан еңбек ақылары ең жоғары қызметкерлерді фамилиясы бойынша іздеу; редакциялау.
  12.  20 – дан 40 – қа дейінгі жастағы қызметкерлер үшін еңбек ақы сомасын анықтаңыз; редакциялау.
  13.  Зейнеткерлер арасында еңбек ақы сомасын анықтаңыз; редакциялау.
  14.  Зейнеткер адамдар санын анықтаңыз, оның ішінен әйелдер мен еркектер санын; редакциялау.
  15.  Абоненттердің бір айлық қарыз сомасын анықтаңыз; барлық мәліметтерді көріп шығу.
  16.  Абоненттердің бір жылғы қарыз сомасын анықтаңыз. Барлық мәліметтерді көріп шығыңыз.
  17.  Өткен айда кітапханаға кірген оқырмандар санын анықта; редакциялау.
  18.  Белгілі ай аралығында белгілі оқырмандар оқуға алған кітаптар санын анықта; редакциялау.
  19.  Пенсия жасына дейінгі  және пенсия жасынан кейінгі әйелдер мен еркектер санын халықты қайта санаққа алу мәліметтері бойынша анықтаңыз; барлық мәліметтерді көріп шығу.
  20.  Халықтар бойынша пайызда, әйелдер мен еркектер арасындағы туылуы және дүниеден кетуін анықтаңыз.
  21.  Жұп күндер бойынша көрсетілген уақытта поездардың жүру тәртібін экранға шығару; барлық мәліметтерді көріп шығу.
  22.  Жұп күндер бойынша көрсетілген бағытта поездардың жүру тәртібін экранға шығару; барлық мәліметтерді көріп шығу.
  23.  Көрсетілген бағытта және жүру датасы бойынша поездардың жүру тәртібін (расписание) экранға шығару; барлық мәліметтерді көріп шығу.
  24.  Көрсетілген бағытта және жүру мерзімінде поездардағы бос орындар санын экранға шығару; барлық мәліметтерді көріп шығу.
  25.  Көрсетілген бағытта және жүру мерзімінде поездарда бос орындар барлығын экранға шығару; барлық мәліметтерді көріп шығу.

 

 

 

 

Қорытынды

 

Логикалық бағдарламалау жүйелеріне жататын Пролог тілі- формальдық логика тілінде есеп шарттарын жазу болып табылады. Сонымен қатар, есептеу немесе графикалық есептерді шешу үшін емес, логикалық есептерді, адамның. Логикалық  ақылын қорыту процесін модельдеу үшін арналған. Пролог бағдарламашыдан ерекшк ойлау қабілетін талап етеді, себебі басқа процедуралық бағдарламалау әдістерін үйрену бұл жағдайда қиындықтар туғызбайды.

 

 

 

ӘДЕБИЕТТЕР

 

  1. В.Н. Агафонов, В.Б. Борщев, А.А. Воронков, Логическое программирование в широком смысле. Пер. с анг. с фр.-М.: Мир, 1988.
  2. А.Тей П., Грибуомон и т.д. Логический подход к искусственному интеллекту. –М.: Мир, 1990.
  3. И. Братко. Программирование на языке Пролог для искусственного интеллекта. –М.: Мир, 1990.
  4. Дж. Стобо. Язык программирования Пролог. –М.: Радио и связь, 1993.
  5. Ц. Ин, Соломон Д. Использование Турбо-Пролога: Пер. с анг. – М.: Мир, 1987.
  6. К.Кларк. Введение  в логическое программирование на Micro Prolog-е.
  7. Клоксин, Меллиш. Программирование на языке Пролог. –М.: Мир, 1987.
  8. И.В. Котенко, Логическое программирование на Прологе. –СПб.: ВАС, 1993.
  9. Л.Стерлинг, Э.Шапиро. Искусство программирования на языке Пролог. – М.: Мир, 1990.
  10.  Д. Марселлус, Программирование экспертных систем на Турбо-Прологе.: Пер. с анг. – М.: Финансы и статистика, 1994.
  11. Хогтер. Введение в логическое программирование. –М.: Мир, 1988.
  12. Язык Пролог в пятом поколении ЭВМ. Сборник статей под редакцией Ильинского. –М.: Мир, 1988.

 

 

 

Мәлімет сізге көмек берді ма

  Жарияланған-2013-12-23 23:53:57     Қаралды-7418

БӨЛШЕКТЕР ҚАШАН ПАЙДА БОЛДЫ?

...

Алдымен бұлар «жай бөлшектер» деп аталды.

ТОЛЫҒЫРАҚ »

ДҮНИЕ ЖҮЗІНДЕГІ АЛҒАШҚЫ ЦИРК ҚАШАН ЖӘНЕ ҚАЙ ЖЕРДЕ АШЫЛДЫ?

...

Қазіргі кездегі заманауи цирктің әкесі - ағылшын кавалеристі аға сержант Филип Астли

ТОЛЫҒЫРАҚ »

МЕТРО ҚАЙ ЖЕРДЕ ЖӘНЕ ҚАШАН ПАЙДА БОЛДЫ?

...

Метро - теміржол көлігінің бір түрі, оның жолдары көшелерден алшақ, көбінесе жер асты.

ТОЛЫҒЫРАҚ »

МЫСЫҚТАР ҚАШАН ҮЙ ЖАНУАРЛАРЫНА АЙНАЛДЫ?

...

Соңғы уақытқа дейін ежелгі мысырлықтар мысықтарды алғаш қолға үйреткен деп есептелді

ТОЛЫҒЫРАҚ »

КІРПІШ ҚАШАН ПАЙДА БОЛДЫ?

...

Пісірілген балшықтан жасалған бұл әмбебап құрылыс материалы

ТОЛЫҒЫРАҚ »

ОТТЕГІ ҚАЙДАН КЕЛЕДІ ЖӘНЕ ОЛ НЕ ҮШІН ҚАЖЕТ?

...

Оттегі - жер бетіндегі ең көп таралған химиялық элементтердің бірі.

ТОЛЫҒЫРАҚ »

ДӘПТЕР ҚАЛАЙ ПАЙДА БОЛДЫ?

...

Мектеп дәптерлеріне ата-әжелеріңіз, аналарыңыз бен әкелеріңіз жазған

ТОЛЫҒЫРАҚ »

БІЗДІҢ ПЛАНЕТА ҚАЛАЙ ПАЙДА БОЛДЫ?

...

Біздің планетамыз шамамен 4,5 миллиард жыл бұрын пайда болды.

ТОЛЫҒЫРАҚ »

КҮН ЖҮЙЕСІНДЕГІ ЕҢ ҮЛКЕН ПЛАНЕТА ҚАЙСЫ?

...

Күн жүйесіндегі ең үлкен планета - Юпитер.

ТОЛЫҒЫРАҚ »