Файлдармен байланыс

Скачать

Файлдармен байланыс

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

1 сурет

1 суретте Прологтың файлдармен байланысы көрсетілген. Мұндағы, қолданушының терминалынан келіп түскен ақпарат тағы бір кіріс ағыны ретінде қарастырылады. Ал, қолданушының терминалына баратын ақпарат шығыс ағыны болады. Осы екі «псевдофайлдар» user (қолданушы) атына сілтеме жасайды. Ал, қалған файлдар атын программист өзі қоя алады.
Пролог-программа жұмыс істеп жатқан кезде екі файл «активті» болады: біреуі - енгізу үшін, екіншісі – шығару үшін. Бұл екі файлдар ағымды кіріс ағыны және ағымды шығыс ағыны деп аталады. Басында бұл екі ағын терминалға сәйкес болады. Ағымды кіріс ағыны see(ФайлАты) мақсатымен басқа файлға алмастырылуы мүмкін. See предикатына мысал:

...
see(файл1), (қарау(ФайлАты))
файлдан_оқу(ақпарат),
see(user),
...
мұнда ақпарат файл1-ден оқылып, терминалға жіберіледі.

Ағымды шығыс ағыны келесі мақсатпен ауыстырылады:
tell(ФайлАты)

Мысал:
...
tell(файл3), (хабарлау(ФайлАты))
файға_жазу(ақпарат),
tell(user),
...
мұнда кейбір ақпаратты файл3-ке шығарылып, одан кейін келесі шығыс терминалға жіберіледі.

Мақсат
seen (оқудың соңы)
ағымды шығыс файлын жабады.

Мақсат
told (жазудың соңы)
ағымды шығыс файлын жабады.

Файллар тек тізбекті түрде өнделеді. Мұнда файлдар терминал секілді болады. Кіріс файлының оқылуы туралы сұраныс ағымды кіріс ағынын оқуға алып келеді. Егер оқу туралы сұраныс файдың соңында болса, онда жауап ретінде end_of_file (файл соңы) деген атом шығады. Бір рет оқылған ақпарат екінші рет оқылмайды.
Барлық файл «тексттік» болады, яғни олар символдардан тұрады.
Ақпараттың жазылу формасына қарай Прологта файлдардың қарастырылуы екі тәсілмен жүреді. Бірінші тәсіл – символды файлдың негізгі элементі ретінде қарастыру. Сәйкесінше енгізуге немесе шығаруға жасалған сұраныс бір символдың оқылуына немесе жазылуына әкеледі. Бұл мақсат үшін get, get0, put (алу, 0-ді алу, шығару) предикаттары пайдаланылады.
Екінші тәсіл – файлдың негізгі элементі ретінде тексттің үлкенірек бірлігі алынып отыр деп қарастыру. Мұндағы үлкенірек бірлік дегеніміз прологтік терм. Сондықтан енгізу-шығаруға жасалған сұраныс толық термнің ағымды кіріс ағынынан немесе ағымды шығыс ағынына ауысуына әкеледі. Бұл мақсат үшін read және write предикаттары қолданылады. Мұнда файлдағы ақпарат формасы бойынша термдер синтаксисіне сай болу керек.
Файлды ұйымдастырудың формасы тапсырмаға байланысты болады. Егер тапсырма ақпаратты термдер синтаксисіне сәйкес оқуға рұқсат етсе, онда термдерден тұратын файлдарды таңдаған жөн. Нәтижесінде, бір үндеу арқылы енгізу немесе шығаруға толық мағыналы фрагменті бар ақпаратты жіберуге болады. Ал, жүйе мен қолданушы арасында ағылшын тілінде диалогты орнату тапсырмасы болса, онда файлдары термдер синтаксисіне сай емес символдар қатары ретінде қарастырған жөн.

read және write
read орнатылған предикат ағымды кіріс ағынынан термдерді оқуға арналған. Мақсат
Read(Х)
келесі Т термін оқу және Х-пен салыстыру үшін керек. Егер Х – айнымалы болса, онда нәтижесінде Х нақтыланып, Т-ға тең болады. Егер беттесу орындалмаса, онда Read(Х) мақсаты да орындалмайды. Read предикаты – детерминирленген, яғни ол орындалмаған кезде келесі термді енгізуге қайтып келу болмайды. Файлдағы әрбір термнен кейін нүкте немесе пробел, немесе каретканы қайтару символы болу керек.
Егер Read(Х) файлдың соңы болған кезде анықталса, онда Х end_of_file (файл соңы) атомымен нақтыланады.
write орнатылған предикат термді шығарады. Сондықтан мақсат
Write(Х)
Х термін ағымды шығыс файлына шығарады. Прологтың ерекшелігі write
процедурасының термді (қиындығына қарамастан) қалай шығару керектігін «білуі».
Бұл мысалдың декларативті мәнін құрастыру қиын. Бірақ оның процедуралық мәні түсінікті: кубты есептеу үшін, ең бірінші X-ті санау керек; содан кейін оны өңдеу керек; егер Х = тоқтау болса, онда барлығы жасалынды, басқа жағдайда Х3-ті шығару және басқа сандарды өңдеу үшін рекурсивті түрде куб процедурасын қосу.
Осы процедураның көмегімен сандар кубының кестесі келесі түрде алынуы мүмкін:

?- куб.
2.
8
5.
125
12.
1728
тоқтау.
yes

2, 5 және 12 сандарын қолданушы терминалдан енгізген, ал қалған сандар программа арқылы шығарылған. Байқасаңыз, қолданушы енгізген әрбір саннан кейін нүкте қойылуы керек, ол термнің соңы екендігін көрсетеді.
Көрсетілген куб процедурасын оңайлатуға болатындай болып көрінуі мүмкін. Бірақ келесі оңайлату әдісі қате болып келеді:

куб :-
read( тоқтау), !.
куб :-
read( N),
C is N * N * N,
write(C),
куб.

Бұл процедураның жұмыс істемеуінің себебін кіріс аргументінің (мысалға, 5 санының) орындалуын бақылау арқылы көруге болады. Бұл санды оқу кезінде read( тоқтау) мақсаты сәтсіздікке ұшырайды, және ол сан жоғалып кетеді. Келесі read мақсаты келесі термді енгізеді. Басқа жағынан, стоп сигналы read( N)-нің мақсаты сияқты қарастырылуы мүмкін, ол сандық емес ақпараттың көбейтілуіне алып келеді.
куб процедурасы программа мен қолданушы арасында диалог жүргізеді. Мұндай жағдайларда, программа терминалдан жаңа мәліметтерді оқымай тұрып, қолданушыға ақпаратты қабылдауға дайындығы туралы және қандай ақпарат күтетіні туралы сигнал бергені жөн. Бұл көбінесе оқымай тұрып, «шақыру» (приглашение) арқылы жасалынады. Ол үшін куб процедурасын өзгертуге болады:

куб :-
write( ‘Келесі сан: ’),
read( X).
обработать( X).
обработать( тоқтау) :- !.
обработать( N) :-
C is N * N * N,
write( ‘Куб’), write( N), write( ‘тең’),
write( C), nl,
куб.

Жаңа версия арқылы сөйлесу, келесі түрде болуы мүмкін:


Скачать


zharar.kz