Бақылау сұрақтары
Ағаштар дегеніміз не?
Екілік ағаш дегеніміз не?
Ағашты айналып өту деп нені айтамыз?
Ағашта іздеуді қалай жүзеге асыруға болады?
Практикалық сабақ № 6
Тақырыбы: Қарапайым сарапшы жүйелерді құру
Сабақтың мақсаты: TurboProlog ортасында программаларды құру кезінде қарапайым сарапшы жүйелерді құру принциптерін қалыптастыру.
Материалдар және жабдықтар: ДК, Turbo Prolog программалау ортасы
Жеке тапсырмалар
Ішкі білімдер қорына диагностика жасайтын сарапшы жүйелерді құру. Пәндік облысты өз бетімен таңдау (мысалыға, кейбір компьютердің жұмыс жасамауын, кейбір ауруларды, өсімдік пен жануардың қандай да бір түрге жатуын инвестицияларды, төлеуге қабілеттілікті, несиені және т.б. диагностикалау)
Жұмыстың орындалу реті мен мазмұнын әдістемелік сипаттау
Сарапшы жүйелер – бұл қандай да бір облыста сарпшы адам білімінің деңгейіне тең болатындай білімді көрсететін компьютерлік программа. Жалпы бұл облыс қатаң шектелген, бірақ қосымшалар саны көп: сөйлеуді түсіну, суретті талдау, ауа райы, болашақ егінді болжау, медициналық диагностика, интегралдық схемаларды құру, қаржыландыру және т.б.
ПРОЛОГТАҒЫ сарапшы жүйелердің ішкі білімдер қорын құру.
Мына қарапайым мысал ішкі бідімдер қорымен қалай классификациялық сарапшы жүйелерді құруға болатынын көрсетеді. Бұл мысалда мәліметтер қорын құрудың ерешелігі сіз программа орындалуы кезінде білімдерді қоса аласыз (және өшіре аласыз).
/* Program Lab_6_1.PRO */
domains
thing = string
conds = cond*
cond = string
database
is_a(thing,thing,conds)
type_of(thing,thing,conds)
false(cond)
predicates
run(thing)
ask(conds)
clauses
run(Item):-
is_a(X, Item, List),
ask(List),
type_of(Ans, X, List2),
ask(List2),
write(”The “, Item,” you need is a/an “,
Ans), nl.
run(_):-
write(”This program does not have enough “), write(”data to draw any conclusions.”), nl.
ask([]).
ask([H|T]):-
not(false(H)),
write(”Does this thing help you to “),
write(H,” (enter y/n)”),
readchar(Ans), nl, Ans=’y',
ask(T).
ask([H|_]):-
assertz(false(H)), fail.
Goal run(tool).
Келесі деректе р asserta, немесе assertz предикатының көмегімен енгізіле алады, немесе consult предикаты көмегімен файлдан оқылады. Бірақ, бұл мысалда олар clauses секциясында орналасқан.
is_a(language, tool, ["communicate"]).
is_a(hammer, tool, ["build a house", "fix a fender", "crack a nute"]).
is_a(sewing_machine, tool, ["make clothing", "repair sails"]).
is_a(plow, tool, ["prepare fields", "farm"]).
type_of(english, lahguage, ["communicate with people"]).
type_of(prolog,lahguage, ["communicate with a computer"]).
Әрбір сұраққа копьютермен сөйлесетін құрал тапқыңыз келгендей жауап беріңіз.
Енді goal бөліміне мыналарды енгізіңіз:
retract(type_of(prolog, language, ["communicate with a computer"])),
asserta(type_of(”turbo prolog”, language, ["communicate with personal computer"])), asserta(type_of(prolog, language, ["communicate with a mainframe computer"])), run(tool).
Бұл мақсат деректі жояды
type_of(prolog, language, ["communicate with a computer"])
из внутренней базы данных и добавляет два новых факта в программу type_of(prolog, language, ["communicate with a mainframe computer"]). type_of(”turbo prolog”, language, ["communicate with personal computer"]).
Енді тағы да әрбір сұраққа дербес компьютермен сөйлекскіңіз келгендей жауап қайтарыңыз. Аргументі ретінде файл аты бар Save предикатын шақыру арқылы тексттік файлдағы барлық мәліметтер қорын сақтауға болады. Мысалы save(”mydata.dba”) шақырғаннан кейін MYDATA.DBA файлы clauses секциясына ұқсас болады және әрбір дерек жолда тұрады. Consult предикаты көмегімен бұл файлды жадыға оқуға болады:
consult(”mydata.dba”)
Мәліметтер қоры предикаттарымен сипатталатын деректеге олар термдар сияқты манипуляция жасауға болады.
Мәліметтер қорын хабарлау кезінде Пролог ішкі жақтан мәліметтер қорын сипаттауға сәйкес келетін анықталу облысын құрады. Мысал ретінде мына хабарламаны қарайық:
database -dba1 /* dba1 – предикаттар домені */ person(name, telno)
city(cno, cname)
Мұндай хабарламаларды ала отырып, Пролог жүйесісәйкес облыс құрады (домен) dba1: domains
dba1 = person(name, telno); city(cno, cname)
Бұл dba1 домені басқа да алдын ала анықталған домен сияқты қолданыла алады. Мысалыға, consult предикатына анлогты my_consult предикатын құру үшін, readterm предикатын қолдануға болады.
Lab_6_2.PRO программасы ішкі мәліметтер қорын қолданудың ең оңай жолы.
Мына мысал дисплейді пайдалану құралын құрады.
Дисплейдің ағымдағы экранының форматы field және textfield деректерінде сақталады, screen мәліметтер қорында анықталған. Экранның бірнеше аттары screens қорында сақталуы мүмкін. Shiftscreen предикатының жұмысы кезінде бірнеше сақталып тұрған экрандарды screen базасына көшіріп алуға болады, бірақ алдын ала бұл қордағы барлық ағымдық мәліметтерді өшіріп алу керек және құрылып жатқан экранға қатысты ақпаратты алу үшін screen предикатын шақыру керек.
/* Lab_6_2.PRO программасы */
domains
screen_name = symbol
field_name = symbol
row, col, len = integer
type = int(); str(); real()
database – screen
field(field_name, type, row, col, len)
textfield(row, col, len, string)
database – screens
screen(screen_name, screen)
predicates
shiftscreen(screen_name)
clauses
shiftscreen(Screen):-
retractall(_, screen),
screen(Screen, ScreenFact),
assert(ScreenFact),
fail.
shiftscreen(_).
/*person жазбасы үшін экран схемасы */ screen(person,field(”fname”,str,6,16,36)). screen(person,field(”lname”,str,8,15,37)). screen(person,field(”street”,str,10,12,40)). screen(person,field(”zipcode”,str,12,14,7)). screen(person,field(”cityname”,str,12,33,19)). screen(person,field(”code”,str,15,17,35)). screen(person,textfield(15,4,12,”Person Code:”)). screen(person,textfield(12,22,10,”City Name:”)). screen(person,textfield(12,4,8,”Zip code:”)). screen(person,textfield(10,4,7,”Street:”)). screen(person,textfield(6,4,11,”First Name:”)).
screen(person,textfield(8,4,10,”Last Name:”)).
/*city жазбасы үшін экран схемасы */
screen(city,field(”zipcode”,str,8,16,7)).
Резюме:
Прологтың ішкі базасы database секциясында топтастырылған сіздің программаңыздағы деректерден тұрады. Қолданушы анықтаған және осы деректер тобында қолданылатын предикаттарды database кілттік сөзі арқылы хабарлауға болады.
database секцияларына аттар беруге болады. Келісім бойынша атауы бар database секциясының домені ретінде bdasedom домені болады. Программада database бірнеше секциялары болуы мүмкін, бірақ бұл кезде олардың әрқайсысында қайталанбайтын атау болуы керек. Мәліметтер қорының берілген предикатын тек бір ғана database секциясында сипаттауға болады.
Стандарт предикаттар asserta, assertz, және consult көмегімен программа орындалуы кезінде ішкі мәліметтер қорына деректер қосуға болады. Сонымен қатар retract және retractall предикаттары көмегімен осы деректерді программа орындалуы кезінде өшіруге болады.
save предикаты деректерді database секциясынан файлға сақтайды. Редактор көмегімен деректердің осындай файлын құруға және редакциялауға болады, сонан соң файлдардан фактілерді consult предикаты көмегімен алуға болады.
Программадағы мәліметтер қоры предикатына басқа да предикаттарға сияқты хабарлауға болады.
database секциясы үшін генерацияланған ішкі домендерді қолдану кезінде деректермен терм ретінде жұмыс жасауға болады.
Ішкі мәліметтер қоры
Database секциясын қалай хабарлайтынын және ішкі мәліметтер қорының мазмұнын қалай өзгертуге болатынын қарастырайық.
Ішкі мәліметтер қоры деректерден тұрады, оларды сіздің Прологтағы программаңыздан олардың орындалуы кезінде қосуға және өшіруге болады. Database секциясында ішкі мәліметтер қорын сипаттайтын предикаттарды хабарлауға болады, және осы предиктттарды predicates секциясында сипатталған предикаттар ретінде қолдануға болады.
Мәліметтер қорына жаңа деректерді қосу үшін Прологта asserta және assertz предикаттары қолданылады, ал retract және retractall предикаттары бар деректерді өшіру үшін қолданылады. Алдымен деректі өшіріп, мәліметтер қоры мазмұнын өзгертуге болады, сонан соң осы деректің жаңа нұсқасын қоюға болады. Consult предикаты деректерді файлдан оқып, оларды ішкі мәліметтер қорына қосады, ал save database ішкі секциясын файлға сақтайды.
Пролог реляциялық мәліметтер қорын жүзеге асыратындықтан, оны деректер жиыны ретінде ішкі мәліметтер қорына сұраныс ретінде қолдануға болады. Прологтың стандарт алгоритмі белгілі параметрлердің дұрыс ережесі бойынша деректерді автоматты түрде таңдайды және қайтымды іздеу алгоритмі берілген сұраныс үшін барлық шешімдерді бермейінше кез келген белгісіз параметрлерге мәнді меншіктец береді.
Пролог мәліметтер қорына жататын деректерді қарапайым предикаттар секілді интерпретациялайды. Ішкі мәліметтер қорының предикат деректері кеэ келген уақытта өзгертілетін кестеде сақталады.
Database кілттік сөзі ішкі мәліметтер қорын сипаттайтын предикттарды хабарлау тізбегінің басын анықтайды. Орындалу кезінде пернетақтадан asserta және assertz предикаттары көмегімен мәліметтер қорына деректер қосуға болады. Consult стандарт предикатын шақырып, дисктегі файлдан қосылатын деректерді алуға болады. Database секциясы төмендегі мысал сияқты бола алады:
domains
name, address = string
age = integer
gender = male; female
database
person(name,address,age,gender)
predicates
male(name,address,age)
female(name,address,age)
child(name,age,gender)
clauses
male(Name,Address,Age):- person(Name,Address,Age,male).
…
Бұл мысалда person предикатын басқа предикаттар (male,female,child) сияқты
қолдануға болады.
Келесілерді айта кеткен жөн:
Мәліметтер қорына ережелерді емес, тек деректерді ғана қосуға болады.
Қорлар декректері бос айнымалылардан тұрмауы керек.
Database бірнеше секцияларын жіберуге болады, бірақ ол үшін database әрбір секцияларының атын көрсету қажет. Бұл consult және save database ат бойынша қандай да бір анықталған секцияны жүктеу және сақтай алатын блған соң жасалады.
database – mydatabase
myFirstRelation(integer)
mySecondRelation(real, string)
myThirdRelation(string)
/* и т.д. */
goal
consult(”example.dba”,mydatabase),
retract(myFirstRelation(1)),
asserta(myFirstRelation(0)),
save(”example.dba”,mydatabase).
Мұндай сипаттама mydatabase атты мәліметтер қорын құрады. Егер шкі мәліметтер қорына ат бермесе, онда келісім бойынша оған dbasedom аты беріледі.
Модульдегі мәліметтер қоры предикаттарының аттары қайталанбайтынын түсінген жөн. Database екі әртүрлі секцияларында предикаттардың бірдей аттарын қолдануға болмайды.
Программаға деректерді енгізу үшін , үш түрлі әдіс бар:
деректерді clauses секторына енгізу;
программа орындалуы кезінде asserta және assertz предикаттары көмегімен;
consult предикаты көмегімен деректері бар мәліметтер қорын файлдан жүктеу. Деректерді қосу төмендегі форматқа ие болады:
asserta(<факт>) /* (i) */
asserta(<факт>,databaseName) /* (i,i) */ assertz(<факт>) /* (i) */ assertz(<факт>,databaseName) /* (i,i) */
Достарыңызбен бөлісу: |