Анонимді айнымалы
Анонимді айнымалылар бiздiң программаларымызды ретке келтіруге
мүмкіндік береді. Егер сiзге нақтылы мəлiмет керек болса, анонимді
айнымалыларды керек емес мəліметтерді жою үшін пайдалануға болады.
Прологта анонимді айнымалыларастын сызу символы арқылы белгіленеді
(_).
Келесі "отбасылық" мысал анонимді айнымалыларды пайдалану
арқылы іске асады. TestGoalға ch02e04.pro программасының жобасын
жүктеңiз.
predicates
male(symbol)
female(symbol)
parent(symbol, symbol)
clauses
male(bill).
male(]oe).
female(sue).
39
female(tammy).
parent(bill,joe).
parent(sue,joe).
parent(joe,tammy).
Аноним айнымалысы кез келген басқа өзгерiстердiң орынында
қолданылады жəне оған ешқандай мағына берілмейді.
Мысалы, бiзге келесi сұрауда қандай адамдар ата-ана бола
алатындығын бiлу керек бірақ, сiзге олардың балалары қызықты емес.
Прологтағы əрбір сұраныста сізге сызылған символды падаланған кезде
айнымалының мағынасы туралы ақпараттың қажеті жоқ.
goal
parent(Parent, _).
Мұндай сұранысты алғаннан кейін пролог былай деп жауап береді:
(Test Goal)
Parent=bill Parent=sue Parent=joe 3 Solutions
Бұл жағдайда пролог үш ата-ананы тауып бередi, бiрақ ол parent -тың
ұсынысында екiншi дəлелмен сабақтас мəндердi бермейдi.
Анонимді айнымалыларды айғақтар ретінде пайдалануға болады.
Прологтiң келесi айғақтары:
owns(_, shoes). eats (_ ).
Табиғи тiлде бекiтулердi өрнек үшiн қолдана алды:
Əрбір адамда аяқ киім бар. (Everyone owns shoes ) Əрбiр адам
тамақтана алады. (Everyone eats )
Аноним айнымалысы кез келген мəлiметтерге қарама-қарсы келеді.
Құрама мақсаттар: конъюнкция жəне дизъюнкция
Көріп отырғаныңыздай, құралған мақсаттарды іздеудің нəтижесі үшін
қолдануға болады, екі ішкі мақсат А жəне В ақиқат (конъюнкция ), ішкі
мақсат үтір арқылы ажыратамыз. Егер іздеудің нəтижесінде ақиқат А жəне В
ішкі мақсат (дизъюнкция) болса бұл ішкі мақсат нүктелі үтір арқылы
ажыратамыз.
Төменде программаның мысалы көрсетілген:
predicates
car(symbol,long,integer,symbol,long)
truck(symbol,long,integer,symbol,long)
vehicle(symbol,long,integer,symbol,long)
clauses
car(Chrysler,130000,3,red,12000).
car(ford,90000,4,gray,25000).
car(datsun,8000,1,red,30000).
truck(ford,80000, 6,blue,8000).
truck(datsun,50000,5,orange, 20000) .
truck(toyota,25000,2,black,25000).
40
vehicle(Make,Odometer,Age,Color,Price):-сar(Make,Odometer,Age,Color,Price);
truck(Make,Odometer,Age,Color,Price).
TestGoal-дың жобасына осы программаны жүктеңiз, содан соң мақсат
қойыңыз:
Goal
car(Make, Odometer, Years_on_road, Body, 25000).
Берілген мақсат айтылған ұсыныстардан бағасы $25 000 тұратын
машина (саr ) тұратын машина табуға тырысады. Пролог былай жауап береді:
Make=ford, Odometer=90000,
Years_on_road=4,
Body=gray
1 Solution.
Дегенмен берілген мақсат біршама жасанды. Жасанды болғандықтан
тез арада мынандай типті сұрақ қойылады:
Тізімде $25000-дан кем тұратын машина бар ма?( Is there a car listed that costs
less than $25000)
Мұндай мақсатты шешу үшін сіз Visual Prolog-та келесi құралған
мақсатты бере аласыз:
Сar (Make, Odometer, Years_on_road, Body, Cost) % ішкі мақсат А жəне Cost
< 25000. % ішкі мақсат В.
Бұл конъюнкция болып табылады. Құралған мақсатты шешу үшін
пролог ішкі мақсаттарды кезек бойынша рет-ретімен шешуге тырысады.
Бастапқыда ол мынаны шешуге талаптанады:
Сar (Make, Odometer, Years_on_road, Body, Cost), содан соң
Cost < 25000.
Cost айнымалысы екі подцельдерде ұқсас мəндерге ие. Енді осының
барлығын Test Goalмен істеп көріңіздер.
Ескерту
Cost < 25 000 ішкі мақсаты Visual Prolog жүйесінде құралған «кем»
қатынасына сəкес келеді. Кем қатынасы басқа да екі сандық объектілерге
пайдаланылатын қатынастардан ешқандай айымашылығы жоқ, бірақ та, ол
қатынастымына символмен (<) жəне де екі объектінің арасында қатыстыра
отырып жазған дұрыс.
Қарастырсақ келесі өрнек ақиқат болып табыла ма? Табиғи тілде ол
былай деп сипатталады: Тiзiмде $25 000-дан кем тұратын автомобиль немесе
$20 000-дан кем тұратын жүк машинасы бар ма?
Мына тапсырмада келесі құралған мақсаттарда пролог тиісті нəтижені
іздестіруді қайта орындайды:
Сar (Make, Odometer, Years_on_road, Body, Cost ), Cost<25000% ішкі мақсат
А немесе
truck (Make, Odometer, Years_pn_road, Body, Cost), 20000
мақсат В.
41
Құралған мақсаттағы бұл тип дизъюнкция болып табылады. Берілген
мақсат екі альтернативті ішкі мақсаттарды, бір ережеге екі ұсыныстың
біріктірілгеніне сəйкес келуі мүмкін келеді деп есептейді. Пролог екi ішкі
мақсаттарды да қанағаттандыратын нəтижелердің барлығын іздейді.
Рұхсат етілген құралған мақсатта пролог келесі ішкі мақсаттардан
құралған бірінші ішкі мақсаты іздеуге тырысады. ("автомобильді іздеу"):
car(Make, Odometer, Years_on_road, Body, Cost) жəне
Cost < 25000.
Егер
автомобиль
табылса
мақсат-ақиқат,егер
табылмаса(жүк
машинасын іздеу) – пролог келесі ішкі мақсатан тұратын екінші құрама
мақсаттарды шешуге тырысады:
truck(Make, Odometer, Years_on_road, Body, Cost),
жəне
Cost < 20000.
Visual Prolog программасы
Visual Prolog синтаксисі қасиеттер жəне өзара байланыстарды анықтау
үшін жасалған. Көбінесе (айғақтар жəне ереже) ұсыныс, предикаттар,
айнымалы жəне мақсаттарды қарастардыңыз.
Прологтың басқа болжамдардан айырмашылықтары, Visual Prolog -
бақылаушы типтердің компиляторы: əрбiр предикат үшiн қолданылатын
объекттердiң
типін
хабарлайды.
Сонымен
бiрге,
Visual
Prolog
бағдарламаларына
бұл
типтерді
орындайтын
жылдамдығы
машина
кодтарына сəйкес келуге мүкіндік береді,ал басқа жағдайда - Pascalдың
тiлдерiндегi ұқсас бағдарламалардың жылдамдығынан асады.
Енді Visual Prolog программасының негізгі төрт бөлімін талқылаймыз
– жарияланатын жəне сипатталатын предикаттар,сонымен қатар аргумент
типтері ,берілген жəне анықталған ережелер программаның мақсаты болып
табылады. Бұдан əрi ережелердiң синтаксисiн жəне хабарламаларды
толығырақ қарап шығамыз . Соңында ,программаның басқа да бөлiмдерiн
қысқаша қорытындылап сипаттаймыз: деректер қоры, тұрақтылар, əр түрлi
глобалдi бөлiмдер жəне компилятордың нұсқауы.
Visual Prolog – програмасының негізгі бөлімдері:
Prolog Visual тiлiндегi программа төрт негiзгiзгі программалық реттен
тұрады. Оларға мыналар жатады:
•
clauses (ұсыныстар) бөлiмі;
•
predicates (предикаттар) бөлiмі;
•
domains (домендер) бөлiмі;
•
goal (мақсаттар) бөлiмі.
Clauses бөлiмі- Visual Prolog программасының негізгі бөлігі; нақ осы
бөлімде айғақтар жəне ережелер жазылады, Visual Prolog операциясы
программаның мақсатын шешуге тырысады.
Predicates бөлiмі бұл (Visual Prologта кiрiстiрiлген предикаттарды
жарияламауға да болады) предикаттарды жəне домендердің (түрлер)
аргументтері жарияланады.
42
Domains бөлiмі сіздер қолданылатын барлық домендерді хабарлау
үшiн қызмет көрсетедi, олар (стандарты домендерді жариялау міндетті емес)
Visual Prolog-тың стандартты домендері бола алмайды.
Goal бөлiмі - бұл сiзге Visual Prolog-программасының мақсатын
сыйғызып алады.
Ұсыныстардың
бөлiмi
Программаны құру барысында сіз clauses -тың (ұсыныстар) бөлiмiнде
барлық айғақтар мен ережелерлерді сыйғыза аласыз. Негізгі тарауда
программадағы
ұсыныстарға(айғақтар
жəне
ережелер)
басты
назар
аудырылады: олар қалай жазу керектігін білдіреді.
Егер сiз айғақтарды жəне ережелерді олардың прологта көрсетілуін
түсiнсеңiз, онда сiз clausesтың бөлiмiндегi əрбiр нақты предикат үшiн барлық
ұсыныс бiрге орналасуы керек екендігін бiлесiз. Бiр предикатты анықтайтын
ұсыныстардың тiзбегi процедура деп аталады.
(clauses бөліміндегі бірінші ұсыныстан бастап) Visual Prolog əрбiр
айғақты жəне əрбiр ереженi табуға ұмтылады. Төмен қарай clausesтың бөлiмi,
ол бірінші ішкі нұсқауға ұсынысты шешімінің бір бөлігі ретінде орнатады.
Егер келесi ұсыныс логикалық жолдың бөлiгi болып табылмаса, онда Visual
Prolog қойылған нұсқағышқа қайтарылады жəне кезектi салыстыруды (бұл
процесс қайтарумен iздестiру деп аталады) нұсқағышқа орын алмастыра
жақындай iздейдi.
Предикаттардың
бөл iм i
Егер сіз clausesтың бөлiмiндегі Visual Prolog тiлiндегi программаның
меншiгіндегі
предикаттарды
сипаттасаңыз,
онда
сiз
predicatesтiң
(предикаттар ) бөлiмiнде жариялауыңыз керек; басқа жағдайда Visual Prolog
түсiнбейдi. Сiз предикатты хабарлаудың нəтижесiнде домендерге (түрлерге )
бұл предикаттың аргументіне жататынын хабарлаңыз.
Visual
Prolog
кiрiстiрiлген
(олардың
жариялауға
болмайды)
предикаттардың толық жиынымен əкелiнедi,анықтама кiтабы олардың толық
сипатын көрсетеді.
Предикаттар айғақтарға жəне ережелерге тапсырма бередi. Барлық
предикаттар predicates бөлiмінде олардың аргумент типтерінің (домендер)
нұсқауы есептелінеді.
Сіз айғақтарыңыз бен ережелеріңіздің жұмысын iстейтін (дəлелдер)
объектілер типін жарияласаңыз Visual Prolog жұмысының тиімділігі едəуiр
өседi.
Қолданбалы
предикатты жариялау
Предикаттың жариялануы сол предикаттың атымен басталады,содан
соң дөңгелек ашылатын жақша ішінде нөл немесе предикаттың үлкен
доменді(тип) аргументі жалғасады:
arguraent_typel OptionalNamel, argument_type2 OptionalName2 predicateName
......, argument_typeN OptionalName3
үтiр дəлелдiң (түр )
43
Əрбір доменді аргументтен кейін,соңғы аргумент типінен кейін
жабылатын жақша қойылады.Атап өтемiз, clausesтың бөлiмiндегi ұсыныстан
айырмашылығы декларация предикаты нүктемен аяқталмайды, предикаттың
доменді аргументі стандартты домен немесе domaines бөлімінде жарияланған
домен болады. Аргументтің атын OptionalNameK деп нұсқауға болады - бұл
прогрмманың оқылуын жақсартады, компилятор аяққа басатындықтан оның
орындалу жылдамдығы білінбейді.
Предикаттардың
аттары
Предикаттың аты реттеле орналасқан əрiптер, цифрлар жəне астын
сызылған таңбалармен басталуы керек. Əрiптердiң регистрi ешқандай
мағына бермейді, дегенмен сiзге бiз (прологтың басқа болжамы да бұған жол
бермейді жəне болашақта Visual Prolog- - болжам 6, ол да бұған тыйым
салады) бірақ біз сізге предикаттың атының бірінші əрпін бас əріппен жазуға
кеңес бермейміз. Предикаттың аты 250 символымен шектеледі.
Домендерд
iң бөл iм i
Дəстүрлi прологта тек – терм типі бар. Visual Prologта доменді барлық
аргументтің предикаты ретінде жариялаймыз.
Бiрнеше мысалдарды қарап шығамық.
1. Осы мысал предикаттардың домендерін қалай құжаттауға көмектесетiнiн
көрсетедi:
Франк - 45 жасқа толған еркек.
Стандартты домендерді қолана отырып , сiз тиiстi домен предикатын
қолдана аласыз:
person.(symbol, symbol, integer) .
Көп жағдайларда мұндай жарияланулар өте жақсы жұмыс iстейдi.
Дегенмен сiз программа жазылғаннан кейін бiрнеше айлардан соң түзеткіңіз
келді дейік.Предикаттың ұқсас хабарламасы сізге ештеңе айтпауы
мүмкін.Керісінше,төменде көрсетілгендей бұл предикаттың декларациясы
осы предикаттың аргументтерін ретке келтiруге көмектеседi:
Domains
name,sex = symbol
age = integer predicates
person (name, sex, age)
Меншiктi домендердiң хабарлауының бас артықшылықтарының бiрi,
Visual Prolog типтердің қатесiн зерттеп отыра алған, мысалы:
same_sex (X, Y):- person (X, Sex, _), person (Sex, Y, _).
name жəне sex symbol ретінде көрсетілгеніне қарамастан, олар бір біріне
эквивалентті емес. Егер сiз оларды шатыстырсаңыз, Visual Prolog сол қатенi
анықтауға мүмкiндiк бередi.Бұл сiздiң бағдарламаңыз өте үлкен жəне күрделi
болған жағдайларда пайдалы болмақ.
Domains
product, sum = integer
predicates
44
add_em_up (sum, sum, sum)
multiply_em (product, product, product)
clauses
add_em_up (X, Y, Sum):-Sum=X+Y.
multiply_em (X, Y, Product):-Product=X*Y.
Бұл прогрмма екi операцияны орындайды: жинақтайы жəне
көбейтеді.Оған мынадай мақсат беріп көрейік:
add_em_up (32, 54, Sum).
Visual Prolog (Test Goal) былай жауап бередi:
Sum=86
1 Solution
сіз программаға екi бүтiн санның қосындысын жібердіңіз.
Декларация
жəне ережелер
Visual Prologта бірнеше кірістірілген стандартты домендер бар. Оларды
domains
бөлiмiнде
декларарация
типінде
жəне
сипатталмаған
предикаттардың аргументінде қолдануға болады.
Негiзгi домендер 4 кестеде сипатталған
Домен
Сипатталуы
Іске асуы
short
Қысқа, таңбалы, сандық
Барлық платформалар (- 32 768—32
767) 16 бит
ushort
Қысқа, таңбасыз,сандық
(0—65 535 ) 16 биттік платформалар
long
Ұзын, таңбалы, сандық
барлық платформалар (- 2 147 483
648-2 147 483 647) 32 бит
ulong
Ұзын, таңбасыз, сандық
барлық платформалар (0-4 294 967
295 ) 32 бит
integer
Таңбалы,
сандық,
тəуелді
көлемді
платформаға ие
(-
32
768-32
767)
16
биттік
платформалар
(- 2 147 483 648-2 147 483 647) 32
биттік платформалар
unsigned
Таңбасыз,
сандық,тəуелді көлемді
платформаға ие
(0—65 535 ) 16 биттiк платформалар
(0-4 294 967 295 ) 32 биттік
платформалар
byte
Барлық платформалар (0— 55 ) 8 бит
word
Барлық платформалар (0—65 535 ) 16
бит
dword
Барлық платформалар (0—4 294 967
295 ) 32 бит
Идентификаторла жəне жолдар сіздің программаңызда бір-бірін
ауыстыра алады,бірақта
45
Visual
Prologта
олар
бөлек
сақталады.
Идентификаторлар,
идентификатор кестелерiнде сақталады, ал олардың көрінісіне оның кестедегі
индексі ғана қолданылады, бірақ жолдардың идентификаторы емес. Бұл
идентификаторлардың
қарама-қарсы
қойылуы
өте
жылдам
орындалатындығын білдіреді, ал олар программада біренше жерде
кездессе,ондо олардың сақталуы да тығыз болады. Жолдар іздеу кестесінде
сақталынбайды жəне қарама-қарсы қоюдың міндеттілігінде Visual Prolog
оның символдарын біртіндеп тесереді.керек болса нышанға олардың нышаны
тексередi. Сіз қай домен əрбір прграммада жақсы қолданылатынын өзiңіз
шешесіз.
Тапсырмалар
Visual Prolog аяқталған телефондық анықтама секілді программаларды
көрсетеді. Тек стандартты домендер пайдаланылғандықтан оған domains
бөлiмінің программада қажеті жоқ.
Predicates
phone_number (symbol, symbol)
clauses
phone_number ("Albert " , "EZY-3665 " ).
phone_number ("Betty " , "555-5233 " ) .
phone_number ("Carol " , "909-1010 " ) .
phone_number ("Dorothy " , "438-8400 " ) .
goal
программаны енгізіп, орындауға жібергеннен кейін рет-ретімен мақсаттарды
еңгізіңіз.
phone_number ("Carol " , Number) .
phone_number ("438-8400 " Who, ).
phone_number ("Albert " , Number).
phone_number (Who, Number).
Енді ұсыныстарды өзгертiңiз. Kim жəне dorothy бiр телефон номеріне ие деп
есептейік. Бұл айғақты сlauses бөлiмiне енгізіп, келесі мақсатты енгіземіз:
Рhone_number ("438-8400 " Who, ).
Бұл сұраныстан сіз екі нəтиже алуыңыз керек:
Who=dorothy
Who=kim
2 Solutions.
Програмасындағы сhar доменiн сипатау үшін isletter предикаты
пайдаланылады. Тапсырама барысында оған төменлегідей мақсаттар
қойылған:
isletter(%).
46
isletter(Q).
"Yes" немесе "No" сəйкес келетін мағынасына қарай қайтарады
Predicates
isletter(char)
clauses
= > белгісі % таңбасын анықтайды.
% мына теңдік "Алфавиттің алдында қойылады"
isletter (Ch):-‘ а’< = Ch, Ch<=’z’.
isletter (Ch ):-‘A’<= Ch, Ch<=’Z’
Программасын енгізіп, Test Goal -да əрбір мақсатты рет-ретімен сынап
көріңіз:
a ) isletter (‘х’).
d ) isletter (a ) .
b ) isletter (‘ 2 ‘ ).
e ) isletter (X ).
c ) isletter ("Hello " ).
(c) жəне (d) мақсаттары қателіктің түріне алып келеді,ал (е) мақсаты жəне
"Free variable " (байланыспаған айнымалы) хабарламасын қайтарады. Сіз
берілмеген объектінің а немесе z-ке қатынасын тексере алмайсыз.
Бақылау сұрақтары
3.
Логикалық программалау тілдерінің мүмкіндіктері.
4.
Тілдің құрылымы
Есеп беру мазмұны жəне формасы: Тапсырмалар нұсқасын құрастыру.
Тапсырманы орындау реті. Орындау нəтижелері. Қортынды.
2.3. Зертханалық жұмыс №3. Қолданбалы предикаттар.
Мақсаты: Предикаттардың пролог ортасында қолданылу əдістері.
Ереже - бұл шындығы кейбiр шарттардан тəуелдi болатын бекiту.
Ереже бастан жəне программа бөліктерінен тұрады :- егер деп оқылады.
Ереже, сонымен қатар айғақ, нүктемен бiтедi. Бас айнымалы компоненттер
ретiнде бола алатын бұрын суреттеп айтылған предикаттардың бiрi болып
табылады. Ереженiң басы бұл ереже анықтауы үшiн арналған айғақ
суреттейдi.
Ереженiң денесi ереженiң басы шын болды үшiн айғақтармен дəйектi
түрде келiсуi керек үшiн мақсаттар суреттейдi. Дене үтiрлермен немесе
нүктелi үтiр айырық термдердiң тiзiмiнде болады. Сонымен бiрге:
:- орнына if тердi пайдалануға,
, орнына and қолдануға,
; орынына or
қолдануға болады.
Тапсырмалар:
47
2-зерханалық жұмыс тапсырмаларын қарап қарапайым математикалық
өрнектерді шешу мысалдарын көрсетіңіз.
Бақылау сұрақтары
1.
Математикалық функциялар қалай сипатталады.
2.
Шамалардың қандай түрлері бар.
Есеп беру мазмұны жəне формасы: Тапсырмалар нұсқасын құрастыру.
Тапсырманы орындау реті. Орындау нəтижелері. Қортынды.
2.4. Зертханалық жұмыс № 4. Рекурсия жəне циклдарды ұйымдастыру
Мақсаты: Турбо Пролог ортасында рекурсивті есептерді шешу əдістерін,
арифметикалық амалдардын іс−жүзінде қолдану.
Көптеген
қарапайым
арифметикалық
есептеулер
итерациалық
бағдарлама көмегімен берілуі мүмкін. Мысалы, факторларды есептеу
циклдардың көмегімен орындалып, тізбектер сандарға көбейтіліп, керекті
факториалды алуға болады. Керекті процедура Паскаль тілінде жазылып,
төменде көрсетілген.
1-мысал. Факториалды есептеу.
real factorial (N: integer);
var i: integer ;
f: real ;
begin
i:=o; f:=1;
While (i
begin
i:=i+1; f=f*i
end;
factorial:=f
end;
Пролог тілінде итерациялық құрылымдағы мұндай бағдарлама жоқ.
Рекурсивті жəне итерациялы алгоритімдерді рекурсия қолданылады.
Итерацияның рекурсиядан негізгі мүмкіншілігі тиімділігінде, ең маңызды
тиімділігі жадыны қолдануы. Əрбір рекурсивті шақыруда рекурсияны
орындау белгілі бір уақытқа дейін аяқталмай, байланысқан ақпараттарды
сақтауды талап етіп, мəліметтердің құрылымын анықтау, стек фрагменті деп
аталады.
Стек -арнай мəліметтер құрылымы, элементері келесі қасиеттерге
байланысты болады: соңғы болып стекқа келген, алды болып стектан кеткен.
Стек элементтері берілуіне байланысты реттелген, сырттан тек стек
төбелеріне ғана қатынауға болады.
48
Элементтер төбелеріне жетсе, онда стектің жаңа төбесі элемент
орналасқан төбенің алдындағы төбесі болады. Егер стекке жаңа элемент
қосылса, онда ол стектің жаңа төбесі болады.
Есептеудегі жады өлшеміне процедураға n рекурсивті қатынауы кіріп,
n-ге сызықты байланысты болады. Бағдарламаның орындалу кезінде стектің
толып кетуін қадағалау керек, өйткені нəтижесінде бар мəліметтерді
жоғалтып алу мүмкін. Рекурсивті бағдарламадан итерациялы бағдарламаның
айырмашылығы шектелген жады көлемін қолданып, итерация санына
байланысты болмайды.
Турбо Пролог бағдарламасында қайталанатын іс-əрекеттерде рекурсия
қолдануға болады. Турбо Пролог тілінде бүтін санның факториалын
есептейтін бағдарлама жазайық. 5.4 бағдарлама екі ережеден тұрып, оның
бірі рекурсивті болады. Байқайтынымыз рекурсивті ереже үш ішкі мақсаттан
тұрып, ал соңғы ішкі мақсат Fact X=X+FactY, X-санының факториалын
есептеп жəне X-1 факториал саны FactY -айнымалысының мəні болмайынша
есептелмейді.
Достарыңызбен бөлісу: |