Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
17.04.2013
Размер:
106.66 Кб
Скачать
‘ ­Єв-ЏҐвҐаЎгаЈбЄЁ© Ј®бг¤ аб⢥­­л© вҐе­ЁзҐбЄЁ© г­ЁўҐабЁвҐв

Љ дҐ¤а  Є®¬ЇмовҐа­ле Ё­вҐ««ҐЄвг «м­ле вҐе­®«®ЈЁ© ў Їа®ҐЄвЁа®ў ­ЁЁ

“ — … Ѓ Ќ Ћ … Џ Ћ ‘ Ћ Ѓ € …

¤«п Єгаб  "Ћб­®ўл Їа®ҐЄвЁа®ў ­Ёп Ё­вҐ««ҐЄвг «м­ле бЁб⥬"

‘®бв ўЁ« ЃҐаҐ§ЄЁ­ Ђ.Љ.



Ћ ѓ ‹ Ђ ‚ ‹ … Ќ € …


1. ‚ўҐ¤Ґ­ЁҐ
2. ЌҐЄ®в®алҐ бўҐ¤Ґ­Ёп ® «®ЈЁзҐбЄ®¬ Їа®Ја ¬¬Ёа®ў ­ЁЁ Ё
Џа®«®ЈҐ.
3. Џ®ўв®аҐ­Ёп Ё ४габЁп.
4. ЋаЈ ­Ё§ жЁп Ў § ¤ ­­ле.
5. ‘ЇЁбЄ®ўлҐ бвагЄвгал.
6. ЋЎйҐ­ЁҐ б Є®¬ЇмовҐа®¬ ­  ҐбвҐб⢥­­®¬ п§лЄҐ.
7. Џ®бв஥­ЁҐ нЄбЇҐав­ле бЁб⥬.
8. „агЈЁҐ ᢥ¤Ґ­Ёп.
‹ЁвҐа вга .
ЏаЁ«®¦Ґ­ЁҐ Ђ. ЋЇЁб ­ЁҐ п§лЄ  Їа®Ја ¬¬Ёа®ў ­Ёп Џа®«®Ј-PC.
ЏаЁ«®¦Ґ­ЁҐ Ѓ. €бЇ®«м§®ў ­ЁҐ । Єв®а  turbo-Џа®«®Ј .
ЏаЁ«®¦Ґ­ЁҐ ‚. „®Ї®«­ЁвҐ«м­лҐ ᢥ¤Ґ­Ёп ® turbo-б।Ґ Џа®«®Ј .
ЏаЁ«®¦Ґ­ЁҐ ѓ. ‚бв஥­­лҐ ЇаҐ¤ЁЄ вл turbo-Џа®«®Ј .




1. ‚ўҐ¤Ґ­ЁҐ.

„Ґа§Є п Ё¤Ґп ¤®ўҐ¤Ґ­Ёп ў®§¬®¦­®б⥩ ўлзЁб«ЁвҐ«м­ле ¬ иЁ­
(Є®¬ЇмовҐа®ў) ¤® га®ў­п ў®§¬®¦­®б⥩ 祫®ўҐзҐбЄ®Ј® ¬ли«Ґ­Ёп Ї®пўЁ« бм
Їа ЄвЁзҐбЄЁ ®¤­®ўаҐ¬Ґ­­® б ЇҐаўл¬Ё ५Ґ©­л¬Ё Ё « ¬Ї®ўл¬Ё ®Ўа §ж ¬Ё
д®­-­Ґ©¬ ­®ўбЄЁе ¬ иЁ­ ў б®а®Є®ўле Ј®¤ е. Ћ¤­ Є® ­  н⮬ ЇгвЁ ўбв « 
ваг¤­Ґ©и п § ¤ з  Ї®§­ ­Ёп Їа®жҐбб®ў дг­ЄжЁ®­Ёа®ў ­Ёп 祫®ўҐзҐбЄ®Ј®
а §г¬ . ”®а¬ «Ё§гп Ё Ё¬ЁвЁагп ®в¤Ґ«м­лҐ ҐЈ® бў®©бвў  Ё ¤Ґ©бвўЁп 㦥 ў
ЇҐаўлҐ ¤ҐбпвЁ«ҐвЁп Ўл«Ё Ї®«гзҐ­л § ¬Ґз вҐ«м­лҐ १г«мв вл ў
 ўв®¬ вЁ§ жЁЁ ўлзЁб«ЁвҐ«м­ле Їа®жҐ¤га Ё гЇа ў«пойЁе Їа®жҐбб®ў,
а бЇ®§­®ў ­ЁЁ ®Ўа §®ў, Ї®­Ё¬ ­ЁЁ аҐзЁ Ё ЇЁбм¬ , ЇаЁ­пвЁЁ аҐиҐ­Ё© ў
­Ґ®ЇаҐ¤Ґ«Ґ­­ле бЁвг жЁпе, ®Ўг祭ЁЁ Ё ў®бЇаЁпвЁЁ Ё ¤агЈЁе. Ќ® а ¤г¦­лҐ
­ ¤Ґ¦¤л Ї®пўЁўиЁебп ў 50-е Ј®¤ е ⥮аҐвЁЄ®ў Ё Їа ЄвЁЄ®ў
ЁбЄгбб⢥­­®Ј® Ё­вҐ««ҐЄв  (€€) ¬ҐаЄ«Ё ў бга®ў®© ¤Ґ©б⢨⥫쭮бвЁ
®вбв ў ­Ёп вҐе­ЁзҐбЄ®Ј® га®ў­п ®зҐаҐ¤­ле Ї®Є®«Ґ­Ё© Є®¬ЇмовҐа®ў ®в
Ї®бв®п­­® ®ЇҐаҐ¦ ойЁе вॡ®ў ­Ё© ⥮ਨ Ё, ®б®ЎҐ­­®, ў бўп§Ё б
­ҐаҐиҐ­­®бвмо б ¬®© Їа®Ў«Ґ¬л ЇҐаҐў®¤Ё¬®бвЁ ­  д®а¬ «м­л© ¬ иЁ­­л©
п§лЄ Ї®­пвЁп 祫®ўҐзҐбЄ®Ј® Ё­вҐ««ҐЄв  б в®© б⥯Ґ­мо Ї®«­®вл, Є®в®а п
ᮮ⢥вбвў®ў «  Ўл Ё­вгЁвЁў­®¬г ҐЈ® ᮤҐа¦ ­Ёо.
ЌҐг⮬Ё¬лҐ Ёбб«Ґ¤®ў ­Ёп ⥮аҐвЁЄ®ў €€ ў Їа®иҐ¤иЁҐ ¤ҐбпвЁ«ҐвЁп
ўбҐЈ¤  Ўл«Ё ўЇҐаҐ¤Ё Ё ў 業вॠў­Ё¬ ­Ёп а §а Ў®взЁЄ®ў ­®ўле Ё Ў®«ҐҐ
б®ўҐа襭­ле Їа®Ја ¬¬­ле бЁб⥬ - п§лЄ®ў, ¤а㦥б⢥­­ле Ё­вҐа䥩ᮢ,
। Єв®а®ў, бЇа ў®з­ЁЄ®ў, ЁЈа®ўле Їа®Ја ¬¬ Ё в.¤. Џ®н⮬㠧­ зҐ­ЁҐ
१г«мв в®ў €€ ¤«п а §ўЁвЁп Ё­д®а¬ вЁЄЁ ­Ґў®§¬®¦­® ЇҐаҐ®жҐ­Ёвм,  
¤ «м­Ґ©иЁҐ гбЇҐеЁ ў €€ Ї®§ў®«пов ®¦Ё¤ вм гбЁ«Ґ­Ёп ў«Ёп­Ёп Ё­д®а¬ вЁЄЁ
­  ўбҐ бдҐал ¦Ё§­Ё.
Ћ¤­  Ё§ Ё§ўҐбв­ле Ё ў ¦­ле Ё¤Ґ© €€ - ЇаЁ¬Ґ­Ґ­ЁҐ ЇаЁўлз­®© ў ®ЎйҐ­ЁЁ
«®ЈЁЄЁ б㦤Ґ­Ё© (Ё§ўҐбв­®© Є Є бЁ¬ў®«ЁзҐбЄ п «®ЈЁЄ  Ё«Ё «®ЈЁЄ 
ЇаҐ¤ЁЄ в®ў) Є Їа®Ја ¬¬Ёа®ў ­Ёо, в.Ґ. в Є ­ §лў Ґ¬®Ґ «®ЈЁзҐбЄ®Ґ
Їа®Ја ¬¬Ёа®ў ­ЁҐ. Ћ­® ®б­®ў ­® ­  ЇаҐ¤Ї®«®¦Ґ­ЁЁ, зв® ¤«п 祫®ўҐЄ 
Ў®«ҐҐ ҐбвҐб⢥­­® ®б¬лб«Ёў вм Ё д®а¬г«Ёа®ў вм Ё­вҐаҐбгойго ҐЈ® § ¤ зг
(ўлзЁб«Ґ­Ё©, «®ЈЁзҐбЄ®Ј® Ї®ўҐ¤Ґ­Ёп ®ЎмҐЄв®ў) Їг⥬ ­ҐЇ®б।б⢥­­®Ј®
®ЇЁб ­ЁЁ Ґс ў ўЁ¤Ґ ЇаҐ¤«®¦Ґ­Ё© «®ЈЁзҐбЄ®Ј® ЁбзЁб«Ґ­Ёп, Ў«Ё§ЄЁе Є
ҐбвҐб⢥­­®¬г п§лЄг,   ­Ґ ў ўЁ¤Ґ Ї®б«Ґ¤®ў вҐ«м­ле ¤Ґ©бвўЁ© ­ҐЄ®в®а®Ј®
( Ўбва Єв­®Ј® Ё«Ё Є®­ЄаҐв­®Ј®) Їа®жҐбб®а  ўлзЁб«ЁвҐ«м­®© ¬ иЁ­л,
а Ў®в о饩 ў ᮮ⢥вбвўЁЁ б Ё§ўҐбв­л¬ ЇаЁ­жЁЇ®¬ Їа®Ја ¬¬­®Ј®
гЇа ў«Ґ­Ёп (д®­-­Ґ©¬ ­®ўбЄ п ¬ иЁ­ ). Џ®бв஥­ЁҐ ¦Ґ  «Ј®аЁв¬®ў ўлў®¤ 
Ё§ б®ў®ЄгЇ­®бвЁ «®ЈЁзҐбЄЁе г⢥তҐ­Ё© (Ў §л §­ ­Ё©) Ёв®Ј®ў®Ј®
г⢥তҐ­Ёп (аҐиҐ­Ёп § ¤ зЁ) ЇаЁўҐ«® Є Ё¤ҐҐ Ї®бв஥­Ёп ­Ґ в®«мЄ®
­®ўле ў§ Ё¬®бўп§ ­­ле Ё ЇҐаҐбҐЄ ойЁебп вҐе­®«®ЈЁ© а §а Ў®вЄЁ
Їа®Ја ¬¬­®Ј® ®ЎҐбЇҐзҐ­Ёп, 祫®ўҐЄ®-¬ иЁ­­®Ј® Ё­вҐа䥩б , Ў § ¤ ­­ле,
нЄбЇҐав­ле бЁб⥬, Ё­вҐ««ҐЄвг «м­ле бЁб⥬, ®б­®ў ­­ле ­  §­ ­Ёпе, ­®
Ё Є Ё¤ҐЁ ᮧ¤ ­Ёп ¬ иЁ­ Ї а ««Ґ«м­®Ј® вЁЇ , ЇаЁ­жЁЇЁ «м­® ®в«Ёз­ле ®в
д®­-­Ґ©¬ ­®ўбЄЁе ¬ иЁ­.
‘а §г б«Ґ¤гҐв ®в¬ҐвЁвм, зв® ­Ґ®Ўе®¤Ё¬® ЇаЁ«®¦Ёвм ®ЇаҐ¤Ґ«Ґ­­лҐ
гбЁ«Ёп ¤«п ЇаҐ®¤®«Ґ­Ёп ЇаЁўлзЄЁ Є а ­ҐҐ гбў®Ґ­­®¬г ⨯㠯।бв ў«Ґ­Ёп
ўлзЁб«Ґ­Ё© ў ўЁ¤Ґ Ї®б«Ґ¤®ў вҐ«м­®бвЁ ®ЇҐа в®а®ў Ё«Ё Їа®жҐ¤га, в.Ґ.
Ё¬ЇҐа вЁў­®¬г Ё«Ё Їа®жҐ¤га­®¬г вЁЇг Їа®Ја ¬¬Ёа®ў ­Ёп. ‘вЁ¬г«®¬ Є
н⮬г пў«пҐвбп, ў®-ЇҐаўле, ­®ўлҐ ЇҐабЇҐЄвЁўл ў 㦥 ¤ҐЄ« а вЁў­®¬
(®ЇЁб вҐ«м­®¬) Їа®Ја ¬¬Ёа®ў ­ЁЁ, 㢥«ЁзҐ­ЁҐ Їа®Ё§ў®¤ЁвҐ«м­®бвЁ ў
б®бв ў«Ґ­ЁЁ Їа®Ја ¬¬, Їа®бв®вҐ Ё, б«Ґ¤®ў вҐ«м­®, ­ ¤Ґ¦­®бвЁ ®в« ¤ЄЁ,
­ Ј«п¤­®бвЁ ¤®Єг¬Ґ­вЁа®ў ­Ёп Ё в.¤. Ё, ў®-ўв®але, ў®§¬®¦­®бвм
Ї®бв஥­Ёп ўлзЁб«ЁвҐ«м­ле ¬ иЁ­ ­  ЇаЁ­жЁЇЁ «м­® ­®ўле Ї а ««Ґ«м­ле
ЇаЁ­жЁЇ е а Ў®вл (¬ иЁ­ Ўг¤г饣® Ё«Ё Їпв®Ј® Ё Ї®б«Ґ¤гойЁе Ї®Є®«Ґ­Ё©).
…бвҐб⢥­­®, зв® ¤«п ўлЇ®«­Ґ­Ёп «®ЈЁзҐбЄЁе Їа®Ја ¬¬ ­ 
д®­-­Ґ©¬ ­®ўбЄЁе ¬ иЁ­ е вॡговбп бЇҐжЁ «м­лҐ Ё­вҐаЇаҐвЁагойЁҐ
Їа®Ја ¬¬л Ё«Ё ᮮ⢥вбвўгойЁ© Є®¬ЇЁ«пв®а. Ќ ЁЎ®«ҐҐ Ї®«­® «®ЈЁзҐбЄ®Ґ
Їа®Ја ¬¬Ёа®ў ­ЁҐ ­ и«® бў®о ॠ«Ё§ жЁо ў п§лЄҐ Џа®«®Ј (PROgramming in
LOGic), ЇаҐ¤«®¦Ґ­­®¬ ў 1973 Ј®¤г б®ваг¤­ЁЄ ¬Ё ЈагЇЇл Ёбгбб⢥­­®Ј®
Ё­вҐ««ҐЄв  Њ аᥫмбЄ®Ј® г­ЁўҐабЁвҐв . ‡  Ў®«ҐҐ 祬 10 «Ґв Ўл«®
а §а Ў®в ­® ¬­®Ј® ўҐабЁ© Џа®«®Ј , ­® ­ ЁЎ®«ҐҐ § ¬Ґз вҐ«м­®© ўҐабЁҐ©
бв «  а §а Ў®вЄ  дЁа¬®© ‚orland International бЁб⥬л Turbo-Prolog
v.1.1 (v.2.1, 1986). „ «ҐҐ ЈагЇЇ  а §а Ў®взЁЄ®ў нв®© бЁбвҐ¬л ®б­®ў « 
бЇҐжЁ «м­л© 業ва а §ўЁвЁп Џа®«®Ј  (Prolog Development Centr - PDC) ў
Љ®ЇҐ­Ј ЈҐ­Ґ,   Ї®б«Ґ¤гойЁҐ ўҐабЁЁ бЁбвҐ¬л ­ §лў ов PDC Prolog v.3.21,
3.31 Ё в.¤.
‘Ёб⥬л Turbo Ё PDC Prolog ¤«п IBM б®ў¬ҐбвЁ¬ле Є®¬ЇмовҐа®ў бв «Ё
­ ЁЎ®«ҐҐ Ї®Їг«па­л¬Ё бЁб⥬ ¬Ё Їа®Ја ¬¬Ёа®ў ­Ёп § ¤ з €€,
ўлб®Є®бЄ®а®бв­л¬Ё, ­ ¤Ґ¦­л¬Ё Ё ­Ґ гбвгЇ ойЁ¬Ё Ї® бҐаўЁбг Ё
ў®§¬®¦­®бвп¬ Ё§ўҐбв­л¬ Ё­вҐЈаЁа®ў ­­л¬ бЁб⥬ ¬ Їа®Ја ¬¬Ёа®ў ­Ёп ­ 
Їа®жҐ¤га­ле п§лЄ е. Ќ «ЁзЁҐ д ©«®ў Ї®¬®йЁ Ё 㦥 ®ЎйҐгЇ®вॡЁвҐ«м­ле
ЇаЁҐ¬®ў Ё б।бвў а Ў®вл ў Ё­вҐЈаЁа®ў ­­®© turbo-б।Ґ Ї®§ў®«пҐв ЎҐ§
®б®Ў®© Ї®¤Ј®в®ўЄЁ Ё ўаҐ¬Ґ­­ле § ва в ЇҐаҐ©вЁ Є Ё§г祭Ёо ЎЁЎ«Ё®вҐз­ле
Ё б®бв ў«Ґ­Ёо ­®ўле Prolog-Їа®Ја ¬¬.



2. ЌҐЄ®в®алҐ бўҐ¤Ґ­Ёп ® «®ЈЁзҐбЄ®¬ Їа®Ја ¬¬Ёа®ў ­ЁЁ
Ё Џа®«®ЈҐ.

‚бваҐз ойЁҐбп ў б«®ўҐб­ле б㦤Ґ­Ёпе «®ЈЁзҐбЄЁҐ гб«®ўЁп, Є Є ¤ ў­®
ЇаЁ­пв®, 㤮Ў­® § ЇЁблў вм ў ўЁ¤Ґ д®а¬г«, ЁбЇ®«м§гойЁе н«Ґ¬Ґ­в а­лҐ
«®ЈЁзҐбЄЁҐ дг­ЄжЁЁ (бўп§ЄЁ). ‚ «®ЈЁзҐбЄ®¬ Їа®Ја ¬¬Ёа®ў ­ЁЁ Ё, ў
з бв­®бвЁ, Џа®«®ЈҐ ЁбЇ®«м§говбп б«Ґ¤гойЁҐ дг­ЄжЁЁ: € - ®Ў®§­ з Ґвбп
XandY Ё«Ё X,Y , €‹€ - ®Ў®§­ з Ґвбп XorY Ё«Ё X;Y , Ќ… - ®Ў®§­ з Ґвбп
not(X), <- - Ё¬Ї«ЁЄ жЁп ("Ґб«Ё"), ®Ў®§­ з Ґвбп XifY Ё«Ё X:-Y (ў
Ўг«ҐўбЄ®©  «ЈҐЎаҐ X or not(Y)), «®ЈЁзҐбЄ п Є®­бв ­в  0 - ®Ў®§­ з Ґвбп
fail, «®ЈЁзҐбЄ п Є®­бв ­в  1 - ®Ў®§­ з Ґвбп true. ќвЁ дг­ЄжЁЁ
б®бв ў«пов дг­ЄжЁ®­ «м­® Ї®«­л© ­ Ў®а, в.Ґ. ЇаЁ¬Ґ­пп бгЇҐаЇ®§ЁжЁо
(Ї®¤бв ­®ўЄг) ¬®¦­® Ї®бва®Ёвм Ё§ ­Ёе «оЎго ¤агЈго дг­ЄжЁо ®в «оЎ®Ј®
зЁб«  ЇҐаҐ¬Ґ­­ле.
‚ д®а¬г«Ґ ¤ў®Ёз­лҐ ЇҐаҐ¬Ґ­­лҐ б ¬Ё ¬®Јгв пў«пвмбп дг­ЄжЁп¬Ё ®в
«оЎ®Ј® зЁб«   аЈг¬Ґ­в®ў, ЇаЁ­Ё¬ ойЁе §­ зҐ­Ёп Ё§ Їа®Ё§ў®«м­®Ј®
¬­®¦Ґбвў  Њ (  ­Ґ в®«мЄ® Ё§ 0 Ё 1). ’ ЄЁҐ дг­ЄжЁЁ ­ §лў овбп
ЇаҐ¤ЁЄ в ¬Ё ў ЇаҐ¤¬Ґв­®© ®Ў« бвЁ Њ. Ќ ЇаЁ¬Ґа, ў ЇаҐ¤¬Ґв­®© ®Ў« бвЁ
楫ле зЁбҐ« ®в­®иҐ­ЁҐ a>b ¬®¦­® ®Ў®§­ зЁвм ЇаҐ¤ЁЄ в®¬ ђ(a,b), Є®в®ал©
а ўҐ­ 1 (true), Ґб«Ё ®в­®иҐ­ЁҐ ўлЇ®«­пҐвбп, Ё 0 (fail) ў Їа®вЁў­®¬
б«гз Ґ. …б«Ё a Ё b Є®­бв ­вл (в.Ґ. Є®­ЄаҐв­® § ¤ ­л), в® Ёе ба ў­Ґ­ЁҐ
¤ Ґв ®¤­®§­з­®Ґ §­ зҐ­ЁҐ ЇаҐ¤ЁЄ в . …б«Ё   Ё b ЇҐаҐ¬Ґ­­лҐ (в.Ґ.
ЇаҐ¤бв ў«пов ­ҐЄ®в®алҐ ¬­®¦Ґбвў  ў®§¬®¦­ле §­ зҐ­Ё©), в® ЇҐаҐ¤
ЇаҐ¤ЁЄ в®¬ бв ўпв да §г "¤«п ўбҐе a (b) Ё§ § ¤ ­­®Ј® ¬­®¦Ґбвў "
(Єў ­в®а ўбҐ®Ўй­®бвЁ) Ё«Ё да §г "бгйҐбвўгҐв a (b) Ё§ § ¤ ­­®Ј®
¬­®¦Ґбвў " (Єў ­в®а бгйҐбвў®ў ­Ёп). ’®Ј¤  §­ зҐ­ЁҐ ЇаҐ¤ЁЄ в  ¬®¦­®
®ЇаҐ¤Ґ«Ёвм Їа®ўҐапп ᮮ⢥вбвўго饥 ®в­®иҐ­ЁҐ ¤«п ўбҐе §­ зҐ­Ё©
ЇҐаҐ¬Ґ­­ле Ё§ § ¤ ­­ле ¤«п ­Ёе ¬­®¦Ґбвў Ё«Ё ¬®¦­® § ¤ вм ¬­®¦Ґбвў®
§­ зҐ­Ё© ЇҐаҐ¬Ґ­­®©, ­  Є®в®а®¬ ЇаҐ¤ЁЄ в Ўг¤Ґв Ёб⥭Ґ­ (Ё«Ё «®¦Ґ­).
ЏаҐ¦¤Ґ 祬 ЁбЇ®«м§®ў вм ЇаҐ¤ЁЄ в ў б㦤Ґ­Ёпе (ЇаҐ¤«®¦Ґ­Ёпе)
«®ЈЁзҐбЄ®© Їа®Ја ¬¬л ­Ґ®Ўе®¤Ё¬® гЄ § вм ЇаҐ¤¬Ґв­го ®Ў« бвм, Є Є®в®а®©
ЇаЁ­ ¤«Ґ¦ в §­ зҐ­Ёп  аЈг¬Ґ­в®ў ЇаҐ¤ЁЄ в . ‚ Џа®«®ЈҐ нв® ¤Ґ« Ґвбп ў
а §¤Ґ«Ґ predicates Їа®Ја ¬¬л, Ј¤Ґ ЇҐаҐзЁб«повбп ЇаҐ¤ЁЄ вл, ў Є®в®але
­  ¬Ґбв®  аЈг¬Ґ­в®ў бв ўпвбп Ё¬Ґ­  ЇаҐ¤¬Ґв­ле ®Ў« б⥩ - бв ­¤ ав­лҐ
Ё«Ё ўўҐ¤Ґ­­лҐ ў а §¤Ґ«Ґ domains (б®Ўб⢥­­лҐ ®Ў« бвЁ). €¬Ґовбп,
б«Ґ¤гойЁҐ бв ­¤ ав­лҐ Ё¬Ґ­  вЁЇ®ў ®ЎмҐв®ў (¤®¬Ґ­®ў): char (бЁ¬ў®«,
'a','\13'), integer (楫®Ґ зЁб«®), real (¤Ґ©б⢨⥫쭮Ґ зЁб«®),
string (бва®Є  Ё§ «оЎле бЁ¬ў®«®ў, "abc"), symbol (Ё¬п - бва®Є  Ё§
ЎгЄў Ё Ї®¤зҐаЄЁў ­Ёп ¤® 256 бЁ¬ў®«®ў, ­ зЁ­ ой пбп б ¬ «Ґ­мЄ®© ЎгЄўл,
Ё еа ­пй пбп ў бЇҐжЁ «м­®© в ЎЁжҐ Їа®Ја ¬¬л б 楫мо Ўлбва®Ј®
ЁбЇ®«м§®ў ­Ёп, name_abc), file (Ё¬п д ©«  Ё«Ё ў­Ґи­ҐЈ® гбва®©бвў ) Ё
­ҐЄ®в®алҐ ¤агЈЁҐ. Љ®­бв ­вл бва®Є Ё Ё¬Ґ­ (нвЁ вЁЇл ў Џа®«®ЈҐ
 ўв®¬ вЁзҐбЄЁ ЇаҐ®Ўа §говбп ¤агЈ ў ¤агЈ ) пў«повбп  в®¬ ¬Ё,
ЁбЇ®«м§гҐ¬л¬Ё ¤«п а §¬ҐйҐ­Ёп ў ¬Ґбв е  аЈг¬Ґ­в®ў ЇаҐ¤ЁЄ в®ў.
„«п ®ЇЁб ­Ёп ­Ґбв ­¤ ав­ле ЇаҐ¤¬Ґв­ле ®Ў« б⥩ ў а §¤Ґ«Ґ domains
ўў®¤пвбп Ё Ё¬Ґ­говбп ­®ўлҐ ®ЎмҐЄвл, ­ ЇаЁ¬Ґа: a1 = integer - § ¤ ­
®ЎмҐЄв a1 Є Є 楫®Ґ зЁб«®, a2, a3 a4 = string - ваЁ ®ЎмҐЄв  вЁЇ 
бва®Є , name = symbol* - ®ЎмҐЄв name Ґбвм бЇЁб®Є Ё§ Ё¬Ґ­ (бЁ¬ў®« * ў
Є®­жҐ Ё¬Ґ­Ё вЁЇ  ®ЎмҐЄв  гЄ §лў Ґв ­  ҐЈ® бЇЁбЄ®ўго бвагЄвгаг), ir =
integer real - ®ЎмҐЄв ir Ґбвм 楫®Ґ Ё«Ё ¤Ґ©б⢨⥫쭮Ґ зЁб«®, irlist
= ir* - ®ЎмҐЄв irlist Ґбвм бЇЁб®Є зЁбҐ«, lir = irlist* - ®ЎмҐЄв lir
Ґбвм бЇЁб®Є бЇЁбЄ®ў Ё§ зЁбҐ«, s = char - ®ЎмҐЄв s ЇаЁ­Ё¬ Ґв §­ зҐ­ЁҐ
®в¤Ґ«м­®Ј® бЁ¬ў®«  Ё в.¤.
Ља®¬Ґ в®Ј® ¬®Јгв ўў®¤Ёвмбп б®бв ў­лҐ ®ЎмҐЄвл (ў«®¦Ґ­­лҐ ЇаҐ¤ЁЄ вл),
Є®в®алҐ гЇа®й ов «®ЈЁзҐбЄго Їа®Ја¬¬г, ­ ЇаЁ¬Ґа, ў¬Ґбв® ЇаҐ¤ЁЄ в 
p(a1,a2,a3,a4) ¬®¦­® ўўҐбвЁ ЇаҐ¤ЁЄ в p(a1,b), Ј¤Ґ ­®ўл© ЇаҐ¤ЁЄ в b, ў
н⮬ б«гз Ґ ­ §лў Ґ¬л© Є Є дг­Єв®а, ®ЇЁб ­ Є Є ¤®¬Ґ­ b = a(a2,a3,a4),
ў Є®в®а®¬, ࠧ㬥Ґвбп, вЁЇл ®ЎмҐЄв®ў ( аЈг¬Ґ­в®ў) ¤®«¦­л в Є¦Ґ Ўлвм
®ЇаҐ¤Ґ«Ґ­л. Ѓ®«ҐҐ в®Ј®, ў®§¬®¦­®  «мвҐа­ вЁў­®Ґ § ¤ ­ЁҐ в ЄЁе
¤®¬Ґ­®ў, ­ ЇаЁ¬Ґа: b = a(a2,a3,a4); c(c1,c2,c3); d(d1,d2,d3), в.Ґ. b
¬®¦Ґв Ўлвм ®¤­®© Ё§ ЇҐаҐзЁб«Ґ­­ле зҐаҐ§ в®зЄг б § Їпв®©, зв®
㢥«ЁзЁў Ґв ў®§¬®¦­®бвЁ « Є®­Ёз­®Ј® § ¤ ­Ёп бвагЄвгал «®ЈЁзҐбЄЁе
Їа®Ја ¬¬ Ё ¤ ­­ле (¤ «ҐҐ Ўг¤гв ¤ ­л ЇаЁ¬Ґал).
‘гйҐбвўгҐв б®Ј« иҐ­ЁҐ, зв® Ё¬Ґ­  ЇҐаҐ¬Ґ­­ле ў Џа®«®ЈҐ ўбҐЈ¤ 
­ зЁ­ овбп б Їа®ЇЁб­ле (Ў®«миЁе) ЎгЄў,   Є®­бв ­в б® бва®з­ле
(¬ «Ґ­мЄЁе). ЏаЁ н⮬ ЇҐаҐ¤ ЇаҐ¤ЁЄ в®¬, ᮤҐа¦ йЁ¬ ЇҐаҐ¬Ґ­­лҐ, Ї®
㬮«з ­Ёо Ї®¤а §г¬Ґў Ґвбп ­ «ЁзЁҐ Єў ­в®а®ў ўбҐ®Ўй­®бвЁ ¤«п нвЁе
ЇҐаҐ¬Ґ­­ле.
‚ «®ЈЁзҐбЄ®¬ Їа®Ја ¬¬Ёа®ў ­ЁЁ ЁбЇ®«м§гҐвбп Ї®­пвЁҐ вҐа¬ , Є®в®ал¬
пў«пҐвбп «ЁЎ® Є®­бв ­в , «ЁЎ® ЇҐаҐ¬Ґ­­ п ( в®¬л), «ЁЎ® Є®а⥦ (­ Ў®а)
Ё§ вҐа¬®ў ў бЄ®ЎЄ е. ’®Ј¤  ЇаҐ¤ЁЄ в (бЁ­®­Ё¬ ®в­®иҐ­Ёп) ®ЇЁб뢥вбп
®¤­Ё¬ Ё«Ё ­ҐЄ®в®ал¬ зЁб«®¬ вҐа¬®ў, ЇҐаҐ¤ Є®в®ал¬Ё б⮨⠯।ЁЄ в­л©
бЁ¬ў®« (Ё¬п). €­л¬Ё б«®ў ¬Ё, вҐа¬ Ґбвм бва®Є®ў®Ґ ЇаҐ¤бв ў«Ґ­ЁҐ
ЇаҐ¤ЁЄ в , ­ ЇаЁ¬Ґа, ¤«п 楫Ґ© еа ­Ґ­Ёп ў д ©«Ґ Ў §л ¤ ­­ле. ’Ґа¬л,
ЇаҐ¤ЁЄ вл, д®а¬г«л Ё ЇаҐ¤«®¦Ґ­Ёп, ­Ґ ᮤҐа¦ йЁҐ ЇҐаҐ¬Ґ­­ле,
­ §лў овбп ®б­®ў­л¬Ё. ЏаҐ¤ЁЄ вл ўла ¦ о⠮⭮襭Ёп ¬Ґ¦¤г  аЈг¬Ґ­в ¬Ё,
Є®в®алҐ ®Ў®§­ з овбп вҐа¬ ¬Ё,   ЇаҐ¤«®¦Ґ­Ёп ®ЇЁблў ов «®ЈЁзҐбЄЁҐ
бў®©бвў  нвЁе ®в­®иҐ­Ё©. ‚ н⮬ п§лЄҐ ¬®Јгв Ўлвм бд®аг«Ёа®ў ­л ўбҐ
ўлзЁб«ЁвҐ«м­лҐ § ¤ зЁ. ‚ Є®­ЄаҐв­®© ॠ«Ё§ жЁЁ п§лЄ  «®ЈЁзҐбЄ®Ј®
Їа®Ја ¬¬Ёа®ў ­Ёп бгйҐбвўгов б®Ј« иҐ­Ёп, в®з­® ®ЇЁблў ойЁҐ ўЁ¤л
ЇаҐ¤«®¦Ґ­Ё©, Є®в®алҐ ¬®Јг⠢室Ёвм ў Їа®Ја ¬¬л,   в Є¦Ґ Ё¬ҐойЁҐбп
б«®ў аЁ (б®Ј« иҐ­Ёп) ¤«п Ї®бв஥­Ёп Ё¬Ґ­.
ЏаҐ¤«®¦Ґ­Ёп (г⢥তҐ­Ёп) Џа®«®Ј  а §¤Ґ«повбп ­  Їа ўЁ«  Ё д Євл Ё
ᮤҐа¦ вбп ў а §¤Ґ«Ґ clauses. ’ЁЇЁз­®Ґ Їа ўЁ«® б®ўЇ ¤ Ґв б® б«®ўҐб­л¬
г⢥তҐ­ЁҐ¬ ҐбвҐб⢥­­®Ј® п§лЄ  "A Ё¬ҐҐв ¬Ґбв® Ґб«Ё Ё¬ҐҐв ¬Ґбв® A1 Ё
A2 Ё A3 Ё в.¤." Ё Ё¬ҐҐв ўЁ¤: A:-A2,A3,...An., Ј¤Ґ
Ђ,Ђ1,Ђ2,...Ђn,B1,B2...Bm - Їа®Ё§ў®«м­лҐ ЇаҐ¤ЁЄ вл Ё«Ё Ёе ®ваЁж ­Ёп
(в®зЄ  ў Є®­жҐ Їа ўЁ«  Ё«Ё г⢥তҐ­Ёп ®Ўп§ вҐ«м­ ). ” Євл ¦Ґ
ЇаҐ¤бв ў«пов б®Ў®© гбҐзҐ­­лҐ Їа ўЁ« , г Є®в®але ®вбгвбвўгҐв бўп§Є 
:(if) Ё б«Ґ¤гойЁҐ §  ­Ґ© ЇаҐ¤ЁЄ вл, в.Ґ. пў«повбп ®б­®ў­л¬Ё
ЇаҐ¤ЁЄ в ¬Ё Ё«Ё Ёе ®ваЁж ­ЁҐ¬. ЏаЁўҐ¤Ґ­­лҐ ўЁ¤л ЇаҐ¤«®¦Ґ­Ё©, Є
Є®в®ал¬ ¬®¦­® ᢥбвЁ ¤агЈЁҐ ўЁ¤л ЇаҐ¤«®¦Ґ­Ё©, ЇаЁ ЇҐаҐе®¤Ґ Є
Ўг«ҐўбЄЁ¬ дг­ЄжЁп¬ (A:-A1,A2,... нЄўЁў «Ґ­в­® A or not(A1) or not(A2)
or...) ЇаҐ¤бв ў«пов б®Ў®© ¤Ё§мо­ЄжЁо ЇаҐ¤ЁЄ в®ў Ё«Ё Ёе ®ваЁж ­Ё© Ё
Ї®н⮬㠭 §лў овбп ¤Ё§мо­Єв ¬Ё,   Ё¬Ґ­­® е®а­®ўбЄЁ¬Ё ¤Ё§мо­Єв ¬Ё, в Є
Є Є пў«повбп Ї®¤¬­®¦Ґбвў®¬ Ў®«ҐҐ ®ЎйҐЈ® Є« бб  ¤Ё§мо­Єв®ў. џ§лЄ
«®ЈЁзҐбЄ®Ј® Їа®Ја ¬¬Ёа®ў ­Ёп Ї®н⮬㠨­®Ј¤  ­ §лў ов "«®ЈЁЄ®©
е®а­®ўбЄЁе ¤Ё§мо­Єв®ў", Є®в®а п ЇаЁЈ®¤­  д ЄвЁзҐбЄЁ ¤«п «оЎле § ¤ з б
в®зЄЁ §аҐ­Ёп ⥮ਨ ўлзЁб«Ё¬®бвЁ.
‹®ЈЁзҐбЄ п Їа®Ја ¬¬  Ґбвм ­ Ў®а Їа ўЁ« Ё д Єв®ў ўЁ¤ :

:-A,C.
A:-B.
C:-D,E.
C:-F,G.
B.
C.
E.

‡¤Ґбм ЇҐаў®Ґ Їа ўЁ«® пў«пҐвбп 楫Ґўл¬ г⢥তҐ­ЁҐ¬ б ­Ґ®Ў®§­ зҐ­­л¬
Є®­бҐЄўҐ­в®¬ (Ј®«®ў®©), в.Ґ. пў«пҐвбп Є Є Ўл ў®Їа®б®¬ "зв® Ё¬ҐҐв
¬Ґбв® ЁбвЁ­  Ё«Ё «®¦м Ґб«Ё Ё¬ҐҐв ¬Ґбв® A Ё B ?". ‚ Ўг«ҐўбЄ®¬ ўЁ¤Ґ нв®
Їа ўЁ«® ᮤҐа¦Ёв ¤Ё§мо­ЄжЁо в®«мЄ® ®ваЁж ­Ё©: not(A,B) = not(A) or
not(B), в.Ґ. б«®ўҐб­® г⢥ত Ґв "­Ґ Ё¬ҐҐв ¬Ґбв® A Ё B". ‚ Џа®«®ЈҐ
楫Ґў®Ґ г⢥তҐ­ЁҐ § ЇЁблў Ґвбп ў а §¤Ґ«Ґ Їа®Ја ¬¬л goal, Ј¤Ґ
®ваЁж ­ЁҐ пў­® ­Ґ гЄ §лў Ґвбп Ё Ї®¤а §г¬Ґў Ґвбп Ї® 㬮«з ­Ёо - A,B.
‚лЇ®«­Ґ­ЁҐ Їа®Ја ¬¬л § Є«оз Ґвбп ў Їа®ўҐаЄҐ б Ї®¬®ймо «®ЈЁзҐбЄ®Ј®
ўлў®¤  Їа ўЁ«м­® «Ё 楫Ґў®Ґ г⢥তҐ­ЁҐ "­Ґ Ё¬ҐҐв ¬Ґбв® A Ё B".
ђ бᬮваЁ¬ Ї®и Ј®ўл© ўлў®¤ аҐиҐ­Ёп б ЇаЁ¬Ґ­Ґ­ЁҐ¬ Їа ўЁ«  १®«ожЁЁ.
Џа®б⥩и п १®«ожЁп ЇаҐ¤бв ў«пҐвбп ¤ўг¬п தЁвҐ«мбЄЁ¬Ё
ЇаҐ¤«®¦Ґ­Ёп¬Ё - 䠪⮬ Ё Їа ўЁ«®¬ (Ё¬Ї«ЁЄ жЁҐ©):

д Єв S1: not(Ђ).
Ё¬Ї«ЁЄ жЁп S2: Ђ if B.

Ё§ Є®в®але ®зҐўЁ¤­® Ї®«гз Ґ¬ ўлў®¤ - १®«мўҐ­вг Ё«Ё ­®ў®Ґ
г⢥তҐ­ЁҐ s: not(B). €­л¬Ё б«®ў ¬Ё, нв®в ўлў®¤ б«Ґ¤гҐв Ё§ Їа ўЁ« 
modus tollens: ¤®ЇгбЄ п, зв® ­Ґ Ђ Ё Ђ Ґб«Ё ‚, ўлў®¤Ё¬ ­Ґ ‚.
‘«Ґ¤гойЁ© ЇаЁ¬Ґа ЇаЁ¬Ґ­Ґ­Ёп १®«ожЁЁ, ў Є®в®а®¬ s ®ваЁж ­ЁҐ
д Єв ,   S3 д Єв:

®ваЁж ­ЁҐ s: not(B).
д Єв S3: B.

Ё§ 祣® б«Ґ¤гҐв ўлў®¤ ® Їа®вЁў®аҐзЁЁ Ё ­ҐЇа ўЁ«м­®¬ ¤®Їг饭ЁЁ not(A).
‘«®ўҐб­® ўлў®¤ д®а¬г«ЁагҐвбп в Є: ¤®ЇгбЄ п, зв® ­Ґ B Ё B, ўлў®¤Ё¬
Їа®вЁў®аҐзЁҐ, в.Ґ. ­ иҐ ¤®Їг饭ЁҐ (­Ґ A) ­Ґ Ї®¤вўҐа¦¤ Ґвбп Ё,
б«Ґ¤®ў вҐ«м­®, Ё¬ҐҐв ¬Ґбв® A Ё аҐиҐ­ЁҐ Їа®Ја ¬¬л ЇаЁ «®ЈЁзҐбЄ®¬
ўлў®¤Ґ гбЇҐи­®.
ђ бᬮваЁ¬ ЇаЁ¬Ґа, ў Є®в®а®¬ дЁЈгаЁаго⠯।ЁЄ вл give(X,Y,Z)
(ᮤҐа¦ вҐ«м­®: X ¤ Ґв Y ­ҐЄ®в®а®¬г ®ЎмҐЄвг Z) Ё get(Y,Z) (Y Ї®«гз Ґв
Z). Џгбвм §­ ­Ёп ®Ў нвЁе ®в­®иҐ­Ёпе § ¤ ­л ¤ўг¬п ЇаҐ¤«®¦Ґ­Ёп¬Ё (§¤Ґбм
 аЈг¬Ґ­в ¬Ё ЇаҐ¤ЁЄ в®ў пў«повбп Є®­бв ­вл вЁЇ  symbol, в.Ґ.
бЁ¬ў®«ЁзҐбЄЁҐ Ё¬Ґ­ , Є®в®алҐ ў ЄЁаЁ««ЁжҐ ¤®«¦­л Ўлвм ў Є ўлзЄ е):

S2: get("ўл", "бЁ« ") if give("«®ЈЁЄ ", "бЁ« ", "ўл").
(ўл Ї®«г砥⥠ᨫ㠥᫨ «®ЈЁЄ  ¤ Ґв бЁ«г ў ¬)
S3: give("«®ЈЁЄ ", "бЁ« ", "ўл").
(«®ЈЁЄ  ¤ Ґв бЁ«г ў ¬)

‡ ¤ з , Є®в®аго ­ ¤® аҐиЁвм, б®бв®Ёв ў ®вўҐвҐ ­  ў®Їа®б: Ї®«гз ҐвҐ
«Ё ўл бЁ«г? (в.Ґ. Їа ўЁ«Ґ­ «Ё ЇаҐ¤ЁЄ в get("ўл","бЁ« ")?).
ќв®в ЇаҐ¤ЁЄ в-ў®Їа®б пў«пҐвбп 楫мо, Є®в®аго ­ ¤® Ї®¤вўҐа¤Ёвм Ё«Ё
®вўҐаЈ­гвм:

S1: get("ўл", "бЁ« ").

‘Ёб⥬  «®ЈЁзҐбЄ®Ј® ўлў®¤  Џа®«®Ј  Їа®ўҐапҐв нв® г⢥তҐ­ЁҐ ЇаЁ
Ї®¬®йЁ ¤агЈЁе ЇаҐ¤«®¦Ґ­Ё© Ї®и Ј®ў® ЇаЁ¬Ґ­пп Їа ўЁ«® १®«ожЁЁ ®в 楫Ё
Є Їа ўЁ« ¬ Ё, ­ Є®­Ґж, Є д Єв ¬, Ї®«гз п гбЇҐи­®Ґ аҐиҐ­ЁҐ (yes,
success) «ЁЎ® ­Ґв (fail).
ЏаҐ¤бв ўЁ¬ ᥡҐ, зв® ЇаҐ¤«®¦Ґ­Ёп S1, S2, S3 Ґбвм Їа®Ја ¬¬ ,
Ї®¤ ў Ґ¬ п ­  ўе®¤ бЁб⥬л १®«овЁў­®Ј® ўлў®¤ , ॠ«Ё§®ў ­­го ­ 
Є®¬ЇмовҐаҐ. ’®Ј¤  бЁб⥬  ЇаЁ¬Ґ­Ґв Їа ўЁ«® १®«ожЁЁ Є S1 Ё S2 Ё
Ї®«гзЁв १®«мўҐ­вг:

s: give("«®ЈЁЄ ", "бЁ« ", "ўл").

„ «ҐҐ १®«ожЁп ЇаЁ¬Ґ­пҐвбп ­  ўв®а®¬ и ЈҐ Є s Ё S3, Ї®«гз п гбЇҐи­®Ґ
аҐиҐ­ЁҐ, success - १г«мв в Їа®Ја ¬¬л ­  Џа®«®ЈҐ.
‚ ¤агЈ®¬ б«гз Ґ ЇаЁ пў­®¬ § ¤ ­ЁЁ ®ваЁж ­Ёп 楫Ё:

S1: not(get("ўл","бЁ« ")).

Ё ЇаҐ¤Ї®« Ј п, зв® S2 Ё S3 Їа ўЁ«м­л, Ї®«гзЁ¬, зв® S1 ­ҐўҐа­®, в.Ґ.
®вўҐв®¬ § ¤ зЁ пў«пҐвбп fail.
ЏаЁўҐ¤Ґ¬ Ў®«ҐҐ ®ЎйЁ© б«гз © १®«ожЁЁ б தЁвҐ«мбЄЁ¬Ё ЇаҐ¤«®¦Ґ­Ёп¬Ё
ўЁ¤ :
S1: not(A1,..Ak,....An).
S2: Ak if B1,....Bm. (Ј¤Ґ 1<=k<=n )

‚ Є зҐб⢥ १®«мўҐ­вл Ї®«гзЁ¬:

s: not(A1,...Ak-1,B1,....Bm,Ak+1,....An).

‚®§¬®¦Ґ­ ў аЁ ­в, Є®Ј¤ , ­ ЇаЁ¬Ґа, S2 Їа®бв® д Єв - S2: Ak. ‚ н⮬
б«гз Ґ и Ј ўлў®¤  в®«мЄ® ўлзҐаЄЁў Ґв Ak Ё§ S1 Ё १®«мўҐ­в  Ё¬ҐҐв ўЁ¤

s: not(A1,A2,..Ak-1,Ak+1,...An).

€§ Їа ўЁ«  ўлў®¤  б«Ґ¤гҐв, зв® ЇҐаўл¬ гб«®ўЁҐ¬ ҐЈ® ЇаЁ¬Ґ­Ґ­Ёп Ґбвм
­ «ЁзЁҐ ­ҐЄ®в®а®Ј® ЇаҐ¤ЁЄ в  Ё§ S1 б।Ё ЇаҐ¤ЁЄ в®ў ў «Ґў®© з бвЁ
Ё¬Ї«ЁЄ жЁЁ (Ё«Ё д Єв ) S2.
ђ бᬮваЁ¬ б«Ґ¤гойЁ© ЇаЁ¬Ґа தЁвҐ«мбЄЁе ЇаҐ¤«®¦Ґ­Ё©, Ј¤Ґ ЇаҐ¤ЁЄ вл
ᮤҐа¦ в ЇҐаҐ¬Ґ­­лҐ Ё, б«Ґ¤®ў вҐ«м­®, Ї® 㬮«з ­Ёо ЇаҐ¤Ї®« Ј Ґвбп
­ «ЁзЁҐ Єў ­в®а®ў ўбҐ®Ўй­®бвЁ Ї® нвЁ¬ ЇҐаҐ¬Ґ­­л¬:

S1: get("ўл", Y).
S2: get(X, "бЁ« ") if give(Z, "бЁ« ", X).

‚ б«®ўҐб­®© д®а¬Ґ нвЁ ЇаҐ¤«®¦Ґ­Ёп ¬®¦­® § ЇЁб вм Є Є: S1: "¤«п ўбҐе
Y ўл Ї®«г砥⥠Y" Ё S2: "¤«п ўбҐе X Є ¦¤®Ґ X Ї®«гз Ґв бЁ«г Ґб«Ё ¤«п
ўбҐе Z Ё X Є ¦¤®Ґ Z ¤ Ґв бЁ«г X". ђҐ§®«мўҐ­в  Ї®«гз Ґвбп ЇаЁ
б®Ї®бв ў«Ґ­ЁЁ Є®­бв ­в Ё ЇҐаҐ¬Ґ­­ле ў ЇаҐ¤ЁЄ в е get Їа ўЁ« S1 Ё S2 б
Є®­ЄаҐвЁ§ жЁҐ© ў ᮮ⢥вбвўЁЁ б Єў ­в®а ¬Ё, § ¤ ойЁ¬Ё ®Ў« бвм Ёе
§­ зҐ­Ё©. ЏаЁ в Є®© Ї®¤бв ­®ўЄЁ ЇҐаҐ¬Ґ­­ п X ЇаЁ­Ё¬ Ґв §­ зҐ­ЁҐ "ўл",
  ЇҐаҐ¬Ґ­­ п Y §­ зҐ­ЁҐ "бЁ« ",   १®«мўҐ­в  ЇаЁ¬Ґв ўЁ¤ s: give(Z,
"бЁ« ", "ўл").
‚ ®ЎйҐ¬ б«гз Ґ Ї®¤бв ­®ўЄ®© Q ­ §лў Ґвбп ўбпЄ®Ґ ¬­®¦Ґбвў®
ЇаЁбў Ёў ­Ё© ўЁ¤  X:=t, Ј¤Ґ X - ЇҐаҐ¬Ґ­­ п,   t - вҐа¬. ЏаЁ¬Ґ­Ґ­ЁҐ
Ї®¤бв ў­®ўЄЁ Q Є Їа®Ё§ў®«м­®¬г ўла ¦Ґ­Ёо E (ЇаҐ¤ЁЄ вг) § Є«оз Ґвбп ў
§ ¬Ґ­Ґ ЇҐаҐ¬Ґ­­ле Ё§ E ­  вҐа¬л, Є®в®алҐ, б®Ј« б­® Q, ЇаЁбў Ёў овбп
нвЁ¬ ЇҐаҐ¬Ґ­­л¬. ЏҐаҐ¬Ґ­­ п, ­Ґ гЇ®¬п­гв п ў Q, ®бв свбп ЎҐ§
Ё§¬Ґ­Ґ­Ё©,   ЇаЁбў Ёў ­Ёп Ё§ Q ЇҐаҐ¬Ґ­­л¬, ­Ґ ўе¤пйЁ¬ ў E, ­Ґ
ўлЇ®«­повбп. ђҐ§г«мв в ЇаЁ¬Ґ­Ґ­Ёп Q Є E ®Ў®§­ з Ґвбп зҐаҐ§ EQ Ё
­ §лў Ґвбп Ї®¤бв ­®ў®з­л¬ ЇаЁ¬Ґа®¬ E. …б«Ё ЇаЁ¬Ґ­Ґ­ЁҐ Q Є ¤ўг¬
ўла ¦Ґ­Ёп¬ E1 Ё E2 ¤ Ґв ®¤Ё­ Є®ўлҐ Ї®¤бв ­®ў®з­лҐ ЇаЁ¬Ґал, в®
ўла ¦Ґ­ЁҐ E1Q(=E2Q) ­ §лў Ґвбп ®ЎйЁ¬ ЇаЁ¬Ґа®¬ E1 Ё E2,   Ї®¤бв ­®ўЄ 
Q ­ §лў Ґвбп в®Ј¤  г­ЁдЁЄ в®а®¬.
‚ ЇаЁўҐ¤Ґ­­®¬ ЇаЁ¬ҐаҐ தЁвҐ«мбЄЁҐ ЇаҐ¤ЁЄ вл ®Ў« ¤ ов б«Ґ¤гойЁ¬
г­ЁдЁЄ в®а®¬: Q = {X:="ўл", Y:="бЁ« "}
‚ Їа®Ја ¬¬ е ­  Џа®«®ЈҐ г­ЁдЁЄ в®ал «ҐЈЄ® ®ЇаҐ¤Ґ«повбп Ї®®зҐаҐ¤­л¬
б®Ї®бв ў«Ґ­ЁҐ¬ (matching)  аЈг¬Ґ­в®ў தЁвҐ«мбЄЁе ЇаҐ¤ЁЄ в®ў Ё
ЇаЁбў Ёў ­ЁҐ¬ ЇҐаҐ¬Ґ­­л¬ в ЄЁе §­ зҐ­Ё©, Є®в®алҐ б¤Ґ« «Ё Ўл нвЁ
 аЈг¬Ґ­вл ®¤Ё­ Є®ўл¬Ё. „«п Ё««обва жЁЁ ЇаЁҐ¬®ў г­ЁдЁЄ жЁЁ Ё १®«ожЁЁ
а бᬮваЁ¬ ЇаЁ¬Ґал.
1. ђ®¤ЁвҐ«мбЄЁҐ ЇаҐ¤ЁЄ вл P(6) Ё P(6). “­ЁдЁЄ в®а Q §¤Ґбм Їгбв®©, в Є
Є Є ­Ґв § ¬Ґ­л ЇҐаҐ¬Ґ­­ле. ЋЎйЁ© ЇаЁ¬Ґа P(6).
2. ђ®¤ЁвҐ«мбЄЁҐ ЇаҐ¤ЁЄ вл P(X) Ё P(6). “­ЁдЁЄ в®а Q={X:=6}. ЋЎйЁ©
ЇаЁ¬Ґа P(X)Q=P(6)Q=P(6).
3. ђ®¤ЁвҐ«мбЄЁҐ ЇаҐ¤ЁЄ вл P(X) Ё P(Y). “­ЁдЁЄ в®а Q={X:=Y}. ЋЎйЁ©
ЇаЁ¬Ґа P(Y). ЏҐаҐ¬Ґ­­ п ЇаҐ¤ЁЄ в , б®Ї®бв ў«пҐ¬®Ј® б Ї®б«Ґ¤гойЁ¬Ё
ЇаҐ¤ЁЄ в ¬Ё, § ¬Ґ­пҐв ЇҐаҐ¬Ґ­­го ў нвЁе ЇаҐ¤ЁЄ в е.
4. ђ®¤ЁвҐ«мбЄЁҐ ЇаҐ¤ЁЄ вл P(X,X) Ё P(6,Y). „«п ЇҐаўле  аЈг¬Ґ­в®ў
X:=6,   ¤«п ўв®але Y:=X. ’®Ј¤  г­ЁдЁЄ в®а Q={X:=6, Y:=6}.
5. ђ®¤ЁвҐ«мбЄЁҐ ЇаҐ¤ЁЄ вл P(f(X), f(6), X) Ё P(Z, f(Y), Y). ‘а ­Ёў п
 аЈг¬Ґ­вл б«Ґў  ­ Їа ў® Ё гзЁвлў п ЇаЁбў Ёў ­Ёп, Ї®«гзЁ¬ г­ЁдЁЄ в®а
Q={Z:=f(6), Y:=6, X:=6}. ЋЎйЁ© Їа¬Ґа P(f(6), f(6), 6).
6. ђ®¤ЁвҐ«мбЄЁҐ ЇаҐ¤«®¦Ґ­Ёп S1: P(5, Y). Ё S2: P(X, X) if G(X).
“­ЁдЁЄ в®а §¤Ґбм Q={X:=6, Y=6),   १®«мўҐ­в  s: G(6).
ЏаЁўҐ¤Ґ­­лҐ ЇаЁ¬Ґал Ї®Є §лў ов, зв® Ї®­пвЁҐ ЇҐаҐ¬Ґ­­®© ў Џа®«®ЈҐ
­ҐбЄ®«мЄ® ®в«Ёз Ґвбп ®в ЇаЁ­пв®Ј® ў Їа®жҐ¤га­ле (Ё¬ЇҐа вЁў­ле) п§лЄ е,
  Ї®­пвЁҐ г­ЁдЁЄ жЁЁ ў®®ЎйҐ ­Ґ Ё¬ҐҐв  ­ «®Ј  ў нвЁе п§лЄ е.
Џа®Ја ¬¬Ёбв ¤®«¦Ґ­ ЇаҐ¤бв ў«пвм ᥡҐ, зв® Ї®ЁбЄ தЁвҐ«мбЄЁе
ЇаҐ¤ЁЄ в®ў ¤«п Ї®«г祭Ёп १®«ожЁ© ®бгйҐбвў«повбп ў Їа®Ја ¬¬Ґ Џа®«®Ј 
®в 楫Ґў®Ј® г⢥তҐ­Ёп Є Їа ўЁ« ¬ Ё д Єв ¬, в.Ґ. ў«®¦Ґ­­® ᢥаег
ў­Ё§ Ё зв® б®Ї®бв ў«Ґ­ЁҐ Ёе  аЈг¬Ґ­в®ў (г­ЁдЁЄ жЁп) ®бгйҐбвў«пҐвбп
б«Ґў  ­ Їа ў®  ўв®¬ вЁзҐбЄЁ б।бвў ¬Ё ў­гв७­Ёе  «Ј®аЁв¬®ў Ё
бЇҐжЁ «м­ле Ї®¤Їа®Ја ¬¬ Є®¬ЇЁ«пв®а .
Џа®Є®¬¬Ґ­вЁа®ў ­­л© ЇаЁ¬Ґа Їа®Ја ¬¬л ­  Џа®«®ЈҐ ¤ ­ ­Ё¦Ґ.

/* Їа®Ја ¬¬  Ё Є®¬¬Ґ­в аЁЁ */
trace
/* ¤ ­® гЄ § ­ЁҐ Є®¬ЇЁ«пв®аг ­  Ї®и Ј®ў®Ґ ўлЇ®«­Ґ­ЁҐ ЇаҐ¤ЁЄ в®ў б
ўлў®¤®¬ ў ®Є­Ґ Trace §­ зҐ­Ё© Ёе  аЈг¬Ґ­в®ў ЇаЁ ­ ¦ вЁЁ Є« ўЁиЁ F10 */

domains % а §¤Ґ« ®ЇЁб ­Ёп вЁЇ®ў ®ЎмҐЄв®ў Їа®Ја ¬¬л
s = symbol % бЁ¬ў®«®¬ s ®Ў®§­ зҐ­ вЁЇ ®ЎмҐЄв®ў symbol (Ё¬Ґ­ )

predicates % а §¤Ґ« ®ЇЁб ­Ёп ЇаҐ¤ЁЄ в®ў
get (s,s) give(s,s,s)
/* ЇҐаҐзЁб«Ґ­л ЇаҐ¤ЁЄ вл б гЄ § ­ЁҐ¬ вЁЇ  ¤®¬Ґ­  (®Ў« бвЁ §­ зҐ­Ё©
Ё«Ё ®ЎмҐЄв®ў ¤«п  аЈг¬Ґ­в®ў) */

clauses % а §¤Ґ« д Єв®ў Ё Їа ўЁ« Їа®Ја ¬¬л
get("ўл",Y) if give("«®ЈЁЄ ","бЁ« ","ўл"). % Їа ўЁ«®
give("«®ЈЁЄ ","бЁ« ","ўл"). % д Єв

goal % а §¤Ґ« 楫Ё Їа®Ја ¬¬л
get(X,"бЁ« "), nl, write(X," Ї®«г砥⥠cЁ«г").
/* жҐ«м Ґбвм ЇаҐ¤ЁЄ вл get (®ЇаҐ¤Ґ«по饣® ЇҐаҐ¬Ґ­­го X), nl (ЇҐаҐў®¤
бва®ЄЁ) Ё write (ўлў®¤ ­  нЄа ­ §­ зҐ­Ё©  аЈг¬Ґ­в®ў) */

ЋзҐ­м Ї®«Ґ§­® ¤«п §¤®а®ў®Ј® Ї®­Ё¬ ­Ёп Џа®«®Ј  ўлЇ®«­пвм Їа®Ја ¬¬л б
¤ЁаҐЄвЁў®© trace, Є®в®а п ®ЎҐбЇҐзЁв ўлў®¤ ў ®Є­® Trace Ё«Ё ў
⥪бв®ўл© д ©« PROLOG.LOG (®ЇжЁп on ў ¬Ґ­о, ўл§лў Ґ¬®Ґ ­ ¦ вЁҐ¬
Є« ўЁи Alt-T) Ї®и Ј®ў®Ґ ўлЇ®«­Ґ­ЁҐ ўбҐе ЇаҐ¤ЁЄ в®ў б ⥪гйЁ¬Ё
§­ зҐ­Ёп¬Ё  аЈг¬Ґ­в®ў. Џ® а бЇҐз вЄҐ д ©«  ¬®¦­® а §ЎЁа вм ўбҐ ¤Ґв «Ё
Ё ¤Ё­ ¬ЁЄг ўлЇ®«­Ґ­Ёп Їа®Ја ¬¬л, Є®в®алҐ Ї® ¤ҐЄ« а вЁў­®© ЇаЁа®¤Ґ
Џа®«®Ј  бЄалвл ў Ёб室­®¬ ⥪б⥠­Ґ в®«мЄ® ®в ­ зЁ­ о饣®
Їа®Ја ¬¬Ёбв .
’ Є Є Є ў ¤ ­­®© Їа®Ја ¬¬Ґ Ґбвм гЄ § ­ЁҐ Є®¬ЇЁ«пв®аг ® Ї®и Ј®ў®¬
ўлЇ®«­Ґ­ЁЁ, в® Ї®б«Ґ § ЇгбЄ  ¤ЁаҐЄвЁў®© RUN Єгаб®а ў ®Є­Ґ । Єв®а 
гЄ ¦Ґв ­  楫м goal, ®¦Ё¤ п ­ ¦ вЁп Є« ўЁиЁ F10 ¤«п ЇҐаҐе®¤  Є
ўлЇ®«­Ґ­Ёо Ї®б«Ґ¤гойЁе ЇаҐ¤ЁЄ в®ў. ЏаЁўҐ¤Ґ¬ в Єго а бЇҐз вЄг ¤«п
Ї®б«Ґ¤­Ґ© Їа®Ја ¬¬л. ‡¤Ґбм CALL - ®§­ з Ґв ўл§®ў ᮮ⢥вбвўго饣®
ЇаҐ¤ЁЄ в , RETURN - ®§­ з Ґв гбЇҐи­®Ґ ўлЇ®«­Ґ­ЁҐ Їа ўЁ«  Ё
ў®§ўа йҐ­ЁҐ Є ўл§ўлўиҐ¬г ҐЈ® (தЁвҐ«мбЄ®¬г) ЇаҐ¤ЁЄ вг, ЇаЁзҐ¬ Ґб«Ё
ЇҐаҐ¤ ЇаҐ¤ЁЄ в®¬ Ё¬ҐҐвбп *, в® нв®в ЇаҐ¤ЁЄ в ўлЇ®«­Ґ­ б гз бвЁҐ¬
б⥪ , REDO - ®§­ з Ґв, зв® Ё¬Ґ« ¬Ґбв® ®вЄ в (­ ЇаЁ¬Ґа, ўб«Ґ¤бвўЁҐ
­Ґг¤ з­®Ј® б®Ї®бв ў«Ґ­Ёп  аЈг¬Ґ­в®ў) Ё ЇаҐ¤ЁЄ в ўлў®¤Ёвбп ў¬Ґб⥠б®
§­ зҐ­Ёп¬Ё  аЈг¬Ґ­в®ў, FAIL - ®§­ з Ґв ­ҐгбЇҐи­®Ґ ўлЇ®«­Ґ­ЁҐ ¤ ­­®Ј®
ЇаҐ¤ЁЄ в .

Compiling C:\PROLOG\PRIM.PRO to memory get give
Execute program
CALL:_PROLOG_Goal()
CALL:get(_,"бЁ« ")
CALL:give("«®ЈЁЄ ","бЁ« ","ўл")
RETURN:give("«®ЈЁЄ ","бЁ« ","ўл")
RETURN:get("ўл","бЁ« ")
CALL:nl()
RETURN:nl()
write("ўл")
ўл write(" Ї®«г砥⥠cЁ«г")
Ї®«г砥⥠cЁ«г
RETURN:_PROLOG_Goal()

Program terminated with success

Љ Є १г«мв в Їа®Ја ¬¬  ўлўҐ¤Ґв ў ®Є­Ґ DIALOG бва®Єг "ўл Ї®«гз ҐвҐ
бЁ«г".
ЏаЁ ўлЇ®«­Ґ­ЁЁ Їа®Ја ¬¬л ЇаҐ¤ЁЄ вл 楫Ё Ї®б«Ґ¤®ў вҐ«м­® Ёйгвбп
б।Ё «Ґў®© з бвЁ Їа ўЁ« (Є®­бҐЄўҐ­в®ў) Ё д Єв®ў а §¤Ґ«  clauses.
…б«Ё в Є®ўлҐ Ґбвм, в® Їа®Ёб室Ёв г­ЁдЁЄ жЁп Ёе  аЈг¬Ґ­в®ў. ‚ б«гз Ґ
гбЇҐи­®Ј® б®Ї®бв ў«Ґ­Ёп б Є®­бҐЄўҐ­в®¬ Їа ўЁ«  Ё г­ЁдЁЄ жЁЁ
ЇҐаҐ¬Ґ­­ле, ЇаҐ¤ЁЄ вл Їа ў®© з бвЁ Їа ўЁ«  ( ­вҐжҐ¤Ґ­вл)
а бб¬ ваЁў овбп Є Є Ї®¤жҐ«Ё Ё ®зҐаҐ¤­®©  ­вҐжҐ¤Ґ­в Їа ўЁ«  Ґбвм ®¤­®
Ё§ தЁвҐ«мбЄЁе г⢥তҐ­Ё© б«Ґ¤го饣® и Ј  ўлў®¤  Ё в Є ¤ «ҐҐ. „«п
д Єв®ў ЇаЁ гбЇҐи­®¬ б®Ї®бв ў«Ґ­ЁЁ жҐ«м Ї®¤вўҐа¦¤ Ґвбп Ё ­ «Ёж®
аҐиҐ­ЁҐ. …б«Ё в Є®Ґ аҐиҐ­ЁҐ ­ ©¤Ґ­®, в® Їа®Ја ¬¬  ўл¤ Ґв ®Ў н⮬
б®®ЎйҐ­ЁҐ "yes" ў ®Є­Ґ Dialog. ЏаЁ ­ «ЁзЁЁ ­ҐбЄ®«мЄЁе ў аЁ ­в®ў
Їа ўЁ« Ё д Єв®ў ў Їа®Ја ¬¬Ґ Џа®«®Ј  Ё ЇаЁ­ «ЁзЁЁ 楫Ё ў а §¤Ґ«Ґ goal
Їа®Ёб室Ёв Ї®ЁбЄ ўбҐе ў®§¬®¦­ле аҐиҐ­Ё©.
…б«Ё и Ј ўлў®¤  ­Ґгᯥ襭 , в® Їа®Ёб室Ёв ў®§ўа в ­  и Ј ­ § ¤
(®вЄ в, backtracking) Є Ї®ЁбЄг ¤агЈ®Ј® ў аЁ ­в  Їа ўЁ«  (Є®­бҐЄўҐ­в )
Ё«Ё д Єв  б ⥬ ¦Ґ Ё¬Ґ­Ґ¬ ў а §¤Ґ«Ґ clauses. …б«Ё аҐиҐ­ЁҐ ­ 
Є Є®¬-«ЁЎ® и ЈҐ ­Ґ Ўг¤Ґв ­ ©¤Ґ­® Ё ¤агЈЁе ў®§¬®¦­ле ў аЁ ­в®ў Ї®ЁбЄ 
аҐиҐ­Ё© ­Ґ ®Є ¦Ґвбп, в®Ј¤  Їа®Ја ¬¬  ўл¤ бв १г«мв в fail ў ®Є­Ґ
б®®ЎйҐ­Ё©. ‚ Їа®жҐбᥠ­ е®¦¤Ґ­Ёп аҐиҐ­Ёп Їа®б¬ ваЁў овбп ўбҐ Їа ўЁ« 
ў­Ґ § ўЁбЁ¬®бвЁ ®в Ёе Ї®ап¤Є  § ЇЁбЁ Ё ®бгйҐбвў«повбп ўбҐ Ї®ЇлвЄЁ
гбЇҐи­®© г­ЁдЁЄ жЁЁ  аЈг¬Ґ­в®ў ЇаҐ¤ЁЄ в®ў. ’ ЄЁ¬ ®Ўа §®¬, Ґб«Ё
аҐиҐ­ЁҐ Ґбвм, в® ®­® Ўг¤Ґв ®Ўп§ вҐ«м­® ­ ©¤Ґ­®. ‚ Їа®вЁў­®¬ б«гз Ґ
ўл¤ Ґвбп б®®ЎйҐ­ЁҐ Їа®Ја ¬¬л ® ­ҐгбЇҐеҐ (fail) ў ўлЇ®«­Ґ­ЁЁ Їа®Ја ¬¬л.
ЏаЁўҐ¤Ґ¬ ҐйҐ ЇаЁ¬Ґа Їа®Ја ¬¬л ­  Џа®«®ЈҐ.

predicates % ®ЇЁб ­Ёп ЇаҐ¤ЁЄ в®ў
likes(symbol,symbol) % вЁЇ  аЈг¬Ґ­в®ў symbol
tastes(symbol,symbol)
food(symbol)
clauses % Їа ўЁ«  Ё д Євл
likes(bill, X) :- food(X), tastes(X, good).
tastes(pizza, good).
tastes(brussels_sprouts, bad).
food(brussels_sprouts).
food(pizza).
goal % 楫Ё
likes(bill,What), nl, write("ЃЁ«« «оЎЁв ", What).

‚ нв®© Їа®Ја ¬¬Ґ ЇаҐ¤ЁЄ в 楫Ё likes б®Ї®бв ў«пҐвбп б ®¤­®Ё¬Ґ­­®©
Ј®«®ў®© (Є®­бҐЄўҐ­в®¬) Їа ўЁ«  Ё ¤ «ҐҐ ЁйҐвбп аҐиҐ­ЁҐ ¤«п ЇаҐ¤ЁЄ в 
(ЇҐаў®Ј®  ­вҐжҐ¤Ґ­в ) food. ЏҐаўл© д Єв food ЇаЁ г­ЁдЁЄ жЁЁ
ЇаЁбў Ёў Ґв §­ зҐ­ЁҐ brussels_sprouts Ё ¤ «ҐҐ ЁйҐвбп аҐиҐ­ЁҐ ¤«п
ЇаҐ¤ЁЄ в  (ўв®а®Ј®  ­вҐжҐ¤Ґ­в ) tastes. Ќ® ЇаЁ нвЁе §­ зҐ­Ёпе
 аЈг¬Ґ­в®ў (Ї®«г祭­ле ЇаЁ г­ЁдЁЄ жЁЁ) гбЇҐи­®Ј® Ї®¤вўҐа¦¤Ґ­Ёп д Єв 
testes ў Їа®Ја ¬¬Ґ ­Ґв Ё Їа®Ёб室Ёв ®вЄ в Є Ї®ЁбЄг ¤агЈ®Ј® ў аЁ ­в 
¤«п б®Ї®бв ў«Ґ­Ёп ЇаҐ¤л¤г饣®  ­вҐжҐ¤Ґ­в  б 䠪⮬ food. „агЈ®© д Єв
food ­ е®¤Ёвбп ЇаЁ §­ зҐ­ЁЁ  аЈг¬Ґ­в  pizza. „ «ҐҐ б«Ґ¤гҐв г­ЁдЁЄ жЁп
Ё Ї®ЁбЄ Ї®¤вўҐа¦¤Ґ­Ёп ЇаҐ¤ЁЄв  testes c  аЈг¬Ґ­в ¬Ё pizza Ё good.
’ Є®Ґ Ї®¤вўҐа¦¤Ґ­ЁҐ ­ е®¤Ёвбп ў ўЁ¤Ґ ᮮ⢥вбвўго饣® д Єв  Ё
ЇаҐ¤ЁЄ в 楫Ё likes б® §­ зҐ­Ёп¬Ё  аЈг¬Ґ­в®ў bill Ё pizza ®Є §лў Ґвбп
ЁбвЁ­­л¬. ‘«Ґ¤гойЁҐ ЇаҐ¤ЁЄ вл 楫Ё ўлў®¤пв ­®ўго бва®Єг "ЃЁ«« «оЎЁв
pizza" ў ®Є­Ґ DIALOG ў Є зҐб⢥ ­ ©¤Ґ­­®Ј® аҐиҐ­Ёп.
ЊҐ¦¤г Їа®зЁ¬, ®вЄ в ¬®¦­® ®вбҐз (­ҐЇа®ў®¤Ёвм, § Ўлвм), Ґб«Ё
ўбв ўЁвм ­  ЇгвЁ Ї®ЁбЄ  аҐиҐ­Ёп бЇҐжЁ «м­л© ўбв஥­­л© ЇаҐ¤ЁЄ в !
(cut) - ®вбҐзҐ­ЁҐ. Ќ ЇаЁ¬Ґа, ЇаЁ ўўҐ¤Ґ­ЁЁ нв®Ј® §­ Є  ў Їа ўЁ«® likes
®­® ЇаЁ¬Ґв ўЁ¤ likes(bill, X) :- food(X),!, tastes(X, good). ’®Ј¤  ў
१г«мв вҐ ¤Ґ©бвўЁп ЇаҐ¤ЁЄ в  ! ў­гв७­ЁҐ  «Ј®аЁв¬л ўлў®¤  "§ Ўг¤гв"
в®зЄЁ ў®§ўа в  Є Ї®ЁбЄг ¤агЈЁе ў®§¬®¦­ле ў аЁ ­в®ў аҐиҐ­Ё© ЇаҐ¤л¤гйЁе
ЇаҐ¤ЁЄ в®ў. ‚ з бв­®бвЁ, ў १г«мв вҐ ­Ґг¤ з­®Ј® Ї®ЁбЄ  д Єв  tastes
c  аЈг¬Ґ­в ¬Ё brussels_sprouts Ё good Ї®ЁбЄ ­®ў®Ј® ў аЁ ­в  ¤«п д Єв 
food Їа®Ё§ў®¤Ёвмбп ­Ґ Ўг¤Ґв Ё Їа®Ја ¬¬  § Є®­зЁвбп б १®«ожЁҐ© fail
ў ®Є­Ґ Message.


3. Џ®ўв®аҐ­ЁҐ Ё ४габЁп.

Ћ¤­Ё¬ Ё§ ­Ґ®Ўе®¤Ё¬ле бў®©бвў е®а®иҐЈ® п§лЄ  Їа®Ја ¬¬Ёа®ў ­Ёп -
ҐбвҐб⢥­­ п Ё « Є®­Ёз­ п д®а¬  § ¤ ­Ёп ¬­®Ј®Єа в­ле ўлзЁб«Ґ­Ё©. ‚
Џа®«®ЈҐ в ЄЁҐ ўлзЁб«Ґ­Ёп ¬®¦­® § ¤ вм ­ҐбЄ®«мЄЁ¬Ё бЇ®б®Ў ¬Ё.
‚®-ЇҐаўле, Ї®ўв®аҐ­ЁҐ ®аЈ ­Ё§гҐвбп "த­л¬" ¤«п Џа®«®Ј-¬ иЁ­л
Ї®ўв®а­л¬ Ї®ЁбЄ®¬ аҐиҐ­Ёп Ї®б«Ґ ­Ґг¤ зЁ ў  ­вҐжҐ¤Ґ­вҐ Є Є®Ј®-«ЁЎ®
Їа ўЁ« . Ќ ЇаЁ¬Ґа, б«Ґ¤гой п Їа®Ја ¬¬  ¤Ґ¬®­бваЁагҐв в Є®© Ї®ўв®а:

predicates
country(symbol)
print_countries
clauses
country(england). % Ў §  ¤ ­­ле б ­ Ў®а®¬ д Єв®ў
country(france). % ® бва ­ е
country(germany).
country(denmark).
country(end). % д Єв б ЇаЁ§­ Є®¬ Є®­ж  Ў §л ¤ ­­ле end

/* б«Ґ¤го饥 Їа ўЁ«® ®ЎҐбЇҐзЁв ®вЄ в - Ї®ўв®аҐ­ЁҐ Ї®ЁбЄ  ­®ўле д Єв®ў
country ¤® вҐе Ї®а, Ї®Є  ­Ґ ўлЇ®«­Ёвбп гб«®ўЁҐ а ўҐ­бвў  §­ зҐ­Ёп X
б«®ўг end, Ї®б«Ґ 祣® Ўг¤Ґв ўлЇ®«­Ґ­ ЇаҐ¤ЁЄ в ! (cut, ®вбҐзҐ­ЁҐ) Ё
Ї®ЁбЄ ¤агЈЁе гбЇҐи­ле аҐиҐ­Ё©, в.Ґ. д Єв®ў country ЇаҐЄа вЁвбп,
ўЇа®зҐ¬, Є Є Ё ўбҐе ¤агЈЁе ў аЁ ­в®ў д Єв®ў Ё Їа ўЁ«, ўбваҐвЁўиЁебп
¤® §­ Є  !. */

print_countries :- country(X), write(X), nl, X = end, !.

/* ¤агЈ®© ў аЁ ­в ®аЈ ­Ё§ жЁЁ ®вЄ в  ў нв®© Їа®Ја ¬¬Ґ ўўҐ¤Ґ­ЁҐ ў
Є®­жҐ Їа ўЁ«  бв ­¤ ав­®Ј® Ё ЎҐ§гб«®ў­® ­ҐгбЇҐи­®Ј® ЇаҐ¤ЁЄ в  fail.
’®Ј¤  Ї®б«Ґ Їа®б¬®ва  ўбҐе д Єв®ў country Ё ­ҐгбЇҐи­®бвЁ Їа ўЁ« 
print_countries  «Ј®аЁв¬л Ї®ЁбЄ  ЇаЁўҐ¤гв Є б«Ґ¤го饬㠢 аЁ ­вг нв®Ј®
Їа ўЁ« , Є®в®ал© §¤Ґбм ­Ґ Ё¬ҐҐв  ­вҐжҐ¤Ґ­в®ў, в.Ґ. пў«пҐвбп Їа®бвл¬
䠪⮬, Є®в®ал© ЇаЁў®¤Ёв Є гбЇҐи­®¬г § ўҐа襭Ёо Їа®Ја ¬¬л.
print_countries :- country(X), write(X), nl, fail.
print_countries.
*/

goal print_countries.

‚®-ўв®але, Ї®ўв®а ўлзЁб«Ґ­Ё© ¬®¦­® ®аЈ ­Ё§®ў вм бЇҐжЁ «м­л¬
("еЁвал¬") ЇаЁҐ¬®¬ ЁбЇ®«м§®ў ­Ёп ЇаҐ¤ЁЄ в  ЎҐ§  аЈг¬Ґ­в®ў, ­ ЇаЁ¬Ґа,
repeat. „«п нв®Ј® ҐЈ® ®ЇЁблў ов ў а §¤Ґ«Ґ predicates,   ў а §¤Ґ«Ґ
clauses ўў®¤пв д Єв Ё ४габЁў­®Ґ Їа ўЁ«®, Є Є ­ ЇаЁ¬Ґа, ў б«Ґ¤го饩
Їа®Ја ¬¬Ґ:

predicates
repeat
typewriter
clauses
repeat. % д Єв - repeat
repeat :- repeat. /* ४габЁў­®Ґ Їа ўЁ«®, Є®в®а®Ґ ўбҐЈ¤  гбЇҐи­®,
в.Є. гᯥ襭  ­вҐжҐ¤Ґ­в repeat (Ї®¤жҐ«м) ўб«Ґ¤бвўЁҐ ­ «ЁзЁп
а ­ҐҐ ЇаЁўҐ¤Ґ­­®Ј® д Єв  repeat. „агЈ п ⮦¤Ґб⢥­­ п § ЇЁбм нвЁе
д Єв  Ё Їа ўЁ« : repeat:-true;repeat. */

typewriter :-
repeat,
/* ЇҐаў®Ґ ўлЇ®«­Ґ­ЁҐ нв®Ј® ЇаҐ¤ЁЄ в  Ўг¤Ґв гбЇҐи­л¬, в.Є. ЇаЁ Ї®ЁбЄҐ
аҐиҐ­Ёп б­ з «  Ўг¤Ґв ­ ©¤Ґ­ гбЇҐи­л© д Єв repeat. ЏаЁ «оЎ®¬
Ї®б«Ґ¤го饬 ®вЄ вҐ ў­гв७­Ё¬Ё  «Ј®аЁв¬ ¬Ё Џа®«®Ј  Ўг¤Ґв ­ ©¤Ґ­®
б«Ґ¤го饥 гЇ®¬Ё­ ­ЁҐ repeat, в.Ґ. Їа ўЁ«® repeat,  ­жҐ¤Ґ­в®¬ Є®в®а®Ј®
пў«пҐвбп Ї®¤жҐ«м repeat, Є®в®а п ў бў®о ®зҐаҐ¤м Ўг¤Ґв гбЇҐи­ , в.Є.
¤«п ­Ґс ба §г ­ е®¤Ёвбп гбЇҐи­л© д Єв repeat. ’ Є Є Є Їа ўЁ«® repeat
४габЁў­®, в® ў­гв७­ЁҐ  «Ј®аЁв¬л Џа®«®Ј  бзЁв ов, зв® Ё¬ҐҐвбп
¬­®Ј® аҐиҐ­Ё©, Є®в®алҐ ­ ¤® ­ е®¤Ёвм ЇаЁ ®вЄ вҐ,   Ё§-§  ®вбгвбвўЁп
 аЈг¬Ґ­в®ў г Їа ўЁ«  repeat Ёе §­ зҐ­Ёп ­Ґ ­ ¤® § ­®бЁвм ў б⥪ Ё,
б«Ґ¤®ў вҐ«м­®, ­Ґв § ва в Ї ¬пвЁ. ‚ н⮬ Ё б®бв®Ёв "еЁва®бвм" бЄ®«м
гЈ®¤­® ¬­®Ј®Єа в­®Ј® ®Ўа йҐ­Ёп Є Їа ўЁ«г repeat ЇаЁ ®вЄ вҐ. */
readchar(C), /* з⥭ЁҐ бЁ¬ў®«  Ё ЇаЁбў Ёў ­ЁҐ ҐЈ® ЇҐаҐ¬Ґ­­®© C */
write(C), /* ЇҐз вм бЁ¬ў®«  */
char_int(C,13).
/* ЇҐаҐў®¤ бЁ¬ў®«  ў 楫®Ґ зЁб«® Ё ®¤­®ўаҐ¬Ґ­­® Їа®ўҐаЄ  ҐЈ® ­ 
а ўҐ­бвў® Є®¤г бЁ¬ў®«  ўў®¤  (Enter=13), в.Ґ. Ґб«Ё а ўҐ­бвў  ­Ґв, в®
Їа®Ёб室Ёв ®вЄ в Є ЇаҐ¤л¤гйЁ¬  ­вҐжҐ¤Ґ­в ¬ ў Ї®ЁбЄҐ Ёе ­®ўле аҐиҐ­Ё©.
ЏаЁ ­ ¦ вЁЁ Enter б®бв®Ёвбп а ўҐ­бвў® C=13 Ё Їа ўЁ«® гбЇҐи­®
ўлЇ®«­Ёвбп ў¬ҐбвҐ б Їа®Ја ¬¬®©. */


Ќ® ­ ЁЎ®«ҐҐ ®ЎйЁ¬ б।бвў®¬ ®аЈ ­Ё§ жЁЁ ¬­®Ј®Єа в­ле ўлзЁб«Ґ­Ё©
пў«пҐвбп ४габЁп, в.Ґ. Є®Ј¤  ўлзЁб«Ґ­ЁҐ дг­ЄжЁЁ ®бгйҐбвў«пҐвбп б
Ї®¬®ймо ўл§®ў  б ¬®© дг­ЄжЁЁ. ‚ Џа®«®ЈҐ ®­  Ї®§ў®«пҐв 㤮Ў­®
®ЇЁблў вм б«®¦­лҐ  «Ј®аЁв¬л ®Ўа Ў®вЄЁ ¤ ­­ле, ®б®ЎҐ­­® ¤«п а Ў®вл б®
бЇЁбЄ ¬ Ё ¬­®ЈЁ¬Ё ¤агЈЁ¬Ё бвагЄвга ¬Ё, б Є®в®ал¬Ё Їа ЄвЁзҐбЄЁ ­Ґв
¤агЈЁе бЇ®б®Ў®ў ¬ ­ЁЇг«Ёа®ў ­Ёп. ‹®ЈЁзҐбЄЁ ४габЁп б宦  б
¤®Є § вҐ«мбвў®¬ Ї® ¬Ґв®¤г ¬ вҐ¬ вЁзҐбЄ®© Ё­¤гЄжЁЁ Ё з бв®
ЁбЇ®«м§гҐвбп ў ¬ вҐ¬ вЁзҐбЄЁе ®ЇаҐ¤Ґ«Ґ­Ёпе. ђ бᬮваЁ¬ ४габЁо ў
ЇаЁ¬ҐаҐ Їа®Ја ¬¬л ўлзЁб«Ґ­Ёп д Єв®аЁ « :

predicates
factorial(integer, real)
factorial_aux(integer, real, integer, real)
/* ‡¤Ґбм зЁб« , ЇаҐў®б室пйЁҐ 32767, ®Ўмпў«повбп Є Є ॠ«м­лҐ */

clauses
/* ЇаҐ¤ЁЄ в factorial ўўҐ¤Ґ­ ¤«п 㤮Ўбвў  ®ЇЁб ­Ёп ¤ўге  аЈг¬Ґ­в®ў -
ўе®¤­®Ј® §­ зҐ­Ёп N Ё १г«мв в  FactN, в®Ј¤  Є Є  ­вҐжҐ¤Ґ­в Їа ўЁ« 
factorial_aux ᮤҐа¦Ёв ў Є зҐб⢥  аЈг¬Ґ­в®ў ­ з «м­лҐ §­ Ґ­Ёп ¤«п N
Ё FactN, ­Ґ®Ўе®¤Ё¬лҐ ¤«п ४габЁў­®Ј® ўлзЁб«Ґ­Ёп д Єв®аЁ «  Ї® ҐЈ®
®ЇаҐ¤Ґ«Ґ­Ёо */
factorial(N, FactN) :- factorial_aux(N, FactN, 1, 1).

/* ®¤Ё­ Ё§ ў аЁ ­в®ў ४габЁў­®Ј® ®ЇЁб ­Ёп ЇаҐ¤ЁЄ в  factorial_aux
б«®ўҐб­® § ¤ Ґвбп в Є: ЇаҐ¤ЁЄ в factorial_aux ®в N Ё FactN (§ ¤ ­­®Ґ
зЁб«® Ё ЁбЄ®¬®Ґ §­ зҐ­ЁҐ д Єв®аЁ « ),   в Є¦Ґ I Ё P (⥪г饥 зЁб«® Ё
ҐЈ® д Єв®аЁ «) гᯥ襭 (Ўг¤Ґв ўлзЁб«Ґ­), Ґб«Ё:
1) I ҐйҐ ­Ґ Ў®«миҐ N, в.Ґ. ЇаЁ I>N гб«®ўЁҐ ­Ґ ўлЇ®«­пҐвбп Ё
Їа®Ёб室Ёв ®вЄ в б Ї®ЁбЄ®¬ ¤агЈ®Ј® ў аЁ ­в  аҐиҐ­Ёп ЇаҐ¤ЁЄ в 
factorial_aux,
2) ! - ¤ «ҐҐ ¤агЈЁҐ ў аЁ ­вл аҐиҐ­Ё© ЇаҐ¤ЁЄ в  factorial_aux ў
а §¤Ґ«Ґ clauses ЇаЁ ®вЄ вҐ а бб¬ ваЁў вмбп ­Ґ Ўг¤гв (ў­гв७­ЁҐ
 «Ј®аЁв¬л ®зЁй ов Ї ¬пвм ® в®зЄ е ў®§ўа в  Є Ї®ЁбЄг ¤агЈЁе аҐиҐ­Ё©),
3) ­®ў п ЇҐаҐ¬Ґ­­ п ¤«п д Єв®аЁ «  Ї® ®ЇаҐ¤Ґ«Ґ­Ёо а ў­  NewP=P*I,  
ЇҐаҐ¬Ґ­­ п ¤«п б«Ґ¤го饣® зЁб«  а ў­  NewI=I+1,
4) гᯥ襭 (Ўг¤Ґв ўлзҐб«Ґ­) в®в ¦Ґ ЇаҐ¤ЁЄ в factorial_aux, ­® б
­®ўл¬Ё ЇҐаҐ¬Ґ­­л¬Ё NewI Ё NewP.
*/

factorial_aux(N, FactN, I, P) :-
I <= N, !,
/* гб«®ўЁҐ I>N ®Ја ­ЁзЁв ४габЁо Ё ўл§®ўҐв ®вЄ в Є ¤агЈЁ¬ аҐиҐ­Ёп¬
ЇаҐ¤ЁЄ в ,   ЇаЁ I<=N ўлЇ®«­пҐвбп б«Ґ¤гойЁ© ЇаҐ¤ЁЄ в ! - ®вбҐзҐ­ЁҐ,
в.Ґ. ®бў®Ў®¦¤Ґвбп Ї ¬пвм ®в еа ­Ґ­Ёп ў®§¬®¦­ле ­ Їа ў«Ґ­Ё© Ї®ЁбЄ 
¤агЈЁе аҐиҐ­Ё© Ё, зв® §¤Ґбм ў ¦­®, ­Ґ ᮧ¤ Ґвбп б⥪ (§¤Ґбм ®­ ­Ґ
­г¦Ґ­) ¤«п еа ­Ґ­Ёп §­ зҐ­Ё©  аЈг¬Ґ­в®ў Є ¦¤®Ј® ४габЁў­®Ј® ўл§®ў 
нв®Ј® Їа ўЁ« . */

NewP = P * I, NewI = I + 1, /* ­ §­ зҐ­ЁҐ ­®ўле ЇҐаҐ¬Ґ­­ле */
factorial_aux(N, FactN, NewI, NewP). /*  ­вҐжҐ¤Ґ­в, ўл§лў ойЁ©
Ї®ўв®а­®Ґ ®Ўа йҐ­ЁҐ Є н⮬㠦Ґ Їа ўЁ«г, в.Ґ. ४габЁо */

factorial_aux(N, FactN, I, FactN) :- I > N. /* ў б«гз Ґ ®вЄ в 
ў ЇаҐ¤л¤г饬 Їа ўЁ«Ґ (Є®Ј¤  гб«®ўЁҐ I<=N ­Ґ ўлЇ®«­Ёвбп) Ўг¤Ґв
Їа®ўҐапвмбп ­  гбЇҐи­®бвм ¤ ­­л© ЇаҐ¤ЁЄ в Ё ®¤­®ўаҐ¬Ґ­­® ў १г«мв вҐ
г­ЁдЁЄ жЁЁ ¤ў   аЈг¬Ґ­в  ЇаЁ¬гв ®¤Ё­ Є®ў®Ґ §­ зҐ­ЁҐ FactN §­ зҐ­Ёп
д Єв®аЁ « . ‘«Ґ¤®ў вҐ«м­® ўлЇ®«­Ёвбп ЇаҐ¤ЁЄ в factorial Ё ўбп
Їа®Ја ¬¬ . */

goal
nl, write("‚ўҐ¤ЁвҐ зЁб«® "), readint(N),
factorial(N,FactN),
nl, write("” Єв®аЁ « зЁб«  ",N,"=",FactN).

‚ нв®© Їа®Ја ¬¬Ґ ४габЁп Їа®е®¤Ё«  ЎҐ§ б®еа ­Ґ­Ёп б⥪  Ё
"ўЇҐаҐ¤", в.Ґ. ўлзЁб«Ґ­Ёп ®бгйҐбвў«п«Ёбм ЎҐ§ ®вЄ« ¤лў ­Ёп Ё
­ҐЇ®б।б⢥­­® ЇаЁ Є ¦¤®¬ ®Ўа йҐ­ЁЁ Їа ўЁ«  Є б ¬®¬г ᥡҐ. Ќ® нв® ­Ґ
ўбҐ ў®§¬®¦­®б⨠४габЁЁ.
Ќ ЁЎ®«ҐҐ ®Ўй п бвагЄвга  аҐЄгабЁў­®Ј® Їа ўЁ«  ў Їа®Ја ¬¬Ґ Џа®«®Ј 
¬®¦Ґв Ўлвм ЇаҐ¤бв ў«Ґ­  ў б«Ґ¤го饬 ўЁ¤Ґ:

<Ё¬п Їа ўЁ«  ४габЁЁ> :-
<бЇЁб®Є ЇаҐ¤ЁЄ в®ў>, (1)
<ЇаҐ¤ЁЄ в гб«®ўЁп ўл室 >, (2)
<бЇЁб®Є ЇаҐ¤ЁЄ в®ў>, (3)
<Ё¬п Їа ўЁ«  ४габЁЁ>, (4)
<бЇЁб®Є ЇаҐ¤ЁЄ в®ў>. (5)

ЏҐаў п ЈагЇЇ  ЇаҐ¤ЁЄ в®ў ўлЇ®«­пҐвбп ­Ґ ў«Ёпп ­  ४габЁо (Єа®¬Ґ
ЇаҐ¤ЁЄ в  ®вбҐзҐ­Ёп, Є®в®ал© ЁбЄ«оз Ґв Ї®бв஥­Ёп б⥪  ¤«п еа ­Ґ­Ёп
Ёбв®аЁЁ §­ зҐ­Ё© ўе®¤­ле  аЈг¬Ґ­в®ў Їа ўЁ« ),   ўв®а п ЈагЇЇ  (®Ўлз­®
Ё§ ®¤­®Ј® ЇаҐ¤ЁЄ в ) ЇаҐ¤­ §­ зҐ­  ¤«п Їа®ўҐаЄЁ гб«®ўЁп ®Є®­з ­Ёп
४габЁЁ. ’аҐвмп ЈагЇЇ  ®Їпвм ¬®¦Ґв ­Ґ ў«Ёпвм ­  ४габЁо. —ҐвўҐав п
ЈагЇЇ  ᮤҐа¦Ёв Ё¬п б ¬®Ј® ४габЁў­®Ј® Їа ўЁ« , ўл§лў п ҐЈ®
Ї®ўв®а­®. ЏаЁ н⮬ ў­гв७­Ё¬Ё  «ЈаЁв¬ ¬Ё ЇаҐ¤гᬮв७® § Ї®«­Ґ­ЁҐ
б⥪  Ї ¬пвЁ (Ґб«Ё ­Ґв ®вбҐзҐ­Ёп), Ј¤Ґ еа ­пвбп §­ зҐ­Ёп ЇҐаҐ¬Ґ­­ле
Є ¦¤®Ј® ­®ў®Ј® ўе®¦¤Ґ­Ёп ४габЁў­®Ј® Їа ўЁ«  ў б ¬® ᥡп (еў®бв
४габЁЁ). ќв® ­ ¤® Ё¬Ґвм ўўЁ¤г, в Є Є Є ЇаҐ¤гᬮв७­л© ®ЎмҐ¬ б⥪ 
®Ја ­ЁзҐ­ (®Є®«® 3 ЉЎ) Ё ЇаЁ ЇҐаҐЇ®«­Ґ­ЁЁ ўл§®ўҐв  ў аЁ©­л© ®бв ­®ў
Їа®Ја ¬¬л. Њ®¦­® 㢥«ЁзЁвм нв®в ®ЎмҐ¬ б⥪  ў ®ЇжЁЁ Miscellaneous ў
¬Ґ­о Setup.
Џпв п ЈагЇЇ  ЇаҐ¤ЁЄ в®ў ЎҐасв §­ зҐ­Ёп  аЈг¬Ґ­в®ў, Ї®¬ҐйҐ­­лҐ ў
б⥪ ў® ўаҐ¬п ўлЇ®«­Ґ­Ёп ४габЁЁ, в.Ґ. Ї®б«Ґ § ўҐа襭Ёп ४габЁЁ
§­ зҐ­Ёп Ё§ б⥪  Ї®б«Ґ¤®ў вҐ«м­® ЁбЇ®«м§говбп нвЁ¬Ё ЇаҐ¤ЁЄ в ¬Ё Є Є
Ўл а §ў®а зЁў п Ґс ў ®Ўа в­го бв®а®­г. ќв® ҐбвҐб⢥­­®, в Є Є Є ⥬
б ¬л¬ б®еа ­пҐвбп бў®©бвў® ў­гв७­Ёе  «Ј®аЁв¬®ў § Ї®¬Ё­ вм
(®вЄ« ¤лў вм) ў®§¬®¦­лҐ аҐиҐ­Ёп ЇаЁ ®ЇаҐ¤Ґ«Ґ­ЁЁ гбЇҐи­®бвЁ ў
Ї®б«Ґ¤®ў вҐ«м­®бвЁ (楯®зЄҐ) ў«®¦Ґ­­ле Їа ўЁ« Ё ЇаҐ¤ЁЄ в®ў. ‚
Є зҐб⢥ ЇаЁ¬Ґа  в ЄЁе ўлзЁб«Ґ­Ё© ЇаЁўҐ¤Ґ¬ б«Ґ¤гойго Їа®Ја ¬¬г:

domains
number, sum = integer

predicates
sum_series (number, sum)

goal
sum_series (7, Sum), nl,
write("‘㬬  ап¤ : ",Sum).

clauses
sum_series(1,1). /* нв®в ЇаҐ¤ЁЄ в гᯥ襭 ЇаЁ Ґ¤Ё­Ёз­ле ­ з «м­ле
§­ зҐ­Ёпе зЁб«  Ё бг¬¬л Ё, б«Ґ¤®ў вҐ«м­®, ­Ґгᯥ襭 ЇаЁ ЇҐаўле
б®Ї®бв ў«Ґ­Ёпе б 楫мо sum_series (7, Sum). */

sum_series(Number, Sum) :-
Number > 0, % гб«®ўЁҐ ўлЇ®«­Ґ­Ёп ४габЁЁ
Next_number = Number - 1, % § ¤ ­ЁҐ ­®ў®© ЇҐаҐ¬Ґ­­®©
sum_series(Next_number, Partial_Sum),
/*  ­вҐжҐ¤Ґ­в, б­ з «  ­Ґг¤ з­® б®Ї®бв ў«пҐ¬л© б 䠪⮬
sum_series(1,1), в.Є. Next_number<>1,   § вҐ¬ ४габЁў­® (­® ЇаЁ
­®ўле §­ зҐ­пе  аЈг¬Ґ­в®ў) ­ зЁ­ Ґв Їа®ўҐапвм Їа ўЁ«®, з бвмо
Є®в®а®Ј® ®­ б ¬ пў«пҐвбп. ќв® Їа®¤®«¦ Ґвбп ¤® ¤®бвЁ¦Ґ­Ёп ®зҐаҐ¤­®©
ЇҐаҐ¬Ґ­­®© Next_number §­ зҐ­Ёп 1, ЇаЁ н⮬ ᮧ¤ ў Ґ¬лҐ ў १г«мв вҐ
४габЁЁ ЇҐаҐ¬Ґ­­лҐ Partial_Sum ®бв овбп ­Ґ®ЇаҐ¤Ґ«Ґ­­л¬Ё. Љ®Ј¤ 
Next_number бв ­Ґв а ў­®© 1, гбЇҐи­® б®Ї®бв ўЁвбп д Єв
sum_series(1,1), Ўг¤Ґв ЇаЁбў®Ґ­® §­ зҐ­ЁҐ 1 ЇҐаҐ¬Ґ­­®© Partial_Sum
Ї®б«Ґ¤­Ґ© ў б⥪Ґ Ё ४габЁў­лҐ ўл§®ўл § Є®­з вбп, ­® ­Ґ ўлзЁб«Ґ­ЁҐ
б ¬®Ј® Їа ўЁ« . */
Sum = Number + Partial_Sum.
/* ЏаЁ ४габЁў­®© Їа®ўҐаЄҐ гбЇҐи­®бвЁ ЇаҐ¤л¤г饣®  ­вҐжҐ¤Ґ­в  Ўл«
ᮧ¤ ­ б⥪, ў Є®в®а®¬ еа ­пвбп ўбҐ §­ зҐ­Ёп  аЈг¬Ґ­в®ў Є ¦¤®Ј®
ўл§®ў  ®¤­®Ё¬Ґ­­®Ј® Їа ўЁ« , ў ⮬ зЁб«Ґ, ®ЇаҐ¤Ґ«Ґ­­®Ґ Ї®б«Ґ¤­ҐҐ
§­ зҐ­ЁҐ ­Ґ®ЇаҐ¤Ґ«Ґ­­®© ў ­ з «Ґ ЇҐаҐ¬Ґ­­®© Partial_Sum. ’®Ј¤  ¤ ­­л©
ЇаҐ¤ЁЄ в ¤®«¦Ґ­ Ўлвм ўлЇ®«­Ґ­ ¤«п ўбҐе §­ зҐ­Ё©  аЈг¬Ґ­в®ў Їа ўЁ« 
б®еа ­Ґ­­ле ў б⥪Ґ, ­ зЁ­ п б Ї®б«Ґ¤­Ёе Ї®«г祭­ле §­ зҐ­Ё© ¤® Ёе
ЇҐаўле §­ зҐ­Ё©. ‚ Ёв®ЈҐ ўлзЁб«Ґ­Ё© ЇҐаҐ¬Ґ­­ п Sum ЇаЁ¬Ґв
®Є®­з вҐ«м­®Ґ §­ зҐ­ЁҐ Ё Їа ўЁ«® ўлЇ®«­Ёвбп гбЇҐи­®. */

ЏаЁўҐ¤Ґ­­л© ЇаЁ¬Ґа Ї®Є §лў Ґв, з⮠४габЁў­®Ґ § ¤ ­ЁҐ ўлзЁб«Ґ­Ё©
­Ґ Ё¬ҐҐв  ­ «®Ј  ў ЇаҐ¤бв ў«Ґ­ЁЁ а Ў®вл Ї®б«Ґ¤®ў вҐ«м­®© ¬ иЁ­л -
ўлЇ®«­Ґ­ЁЁ ®ЇҐа в®а®ў Ё§ п祪Ё §  п祩Є®© ®ЇҐа вЁў­®© Ї ¬пвЁ, ­® Ў«Ё¦Ґ
Є « Є®­Ёз­®бвЁ ҐбвҐб⢥­­ле п§лЄ®ў, ­ ЇаЁ¬Ґа, ®ЇЁблў ойЁе
¬ вҐ¬ вЁзҐбЄЁҐ ®ЇаҐ¤Ґ«Ґ­Ёп Ё ¤®Є § вҐ«мбвў .
‡ ¬Ґз вҐ«м­®, зв® ў®§¬®¦­®б⨠४габЁЁ ў Џа®«®ЈҐ ­  н⮬ ­Ґ
®Ја ­ЁзЁў овбп Ё а бЇа®бва ­повбп ­  багЄвгал ¤ ­­ле. €­л¬Ё б«®ў ¬Ё
ў®§¬®¦­® ®ЇЁб ­ЁҐ бвагЄвгал ¤ ­­ле, ᮤҐа¦ йЁе ў Є зҐб⢥ н«Ґ¬Ґ­в 
б ¬г бвагЄвгаг. Љ в ЄЁ¬ бвагЄвга ¬ ®в­®бпвбп, ­ ЇаЁ¬Ґа, бЇЁбЄЁ,
Є®в®алҐ Ўг¤гв а бᬮваҐ­л ®в¤Ґ«м­®.
Ћбв ­®ўЁ¬бп §¤Ґбм ­  бвагЄвга е ¤ ­­ле вЁЇ  ¤ҐаҐў  (tree), ў
Є®в®але Є ¦¤л© н«Ґ¬Ґ­в (㧥« ¤ҐаҐў ), Ї®¬Ё¬® ­ҐЄ®в®а®Ј® ᮤҐа¦ ­Ёп
(­ ЇаЁ¬Ґа, бва®ЄЁ), Ё¬ҐҐв ў бў®Ґ¬ б®бв ўҐ Є Є ¬Ё­Ё¬г¬ (Ё­ зҐ ­Ґв
бвагЄвгал) ¤ў  ®ЎмҐЄв  в Є®Ј® ¦Ґ вЁЇ  - гб«®ў­® «Ґў®Ґ Ё Їа ў®Ґ
Ї®¤¤ҐаҐўмп, «ЁЎ® ЇгбвлҐ ®ЎмҐЄвл.
„«п § ¤ ­Ёп ¤аҐў®ўЁ¤­®© (а §ўҐвў«по饩бп) бвагЄвгал ¤ ­­ле
¤®бв в®з­® ҐҐ ®ЇЁб вм ў а §¤Ґ«Ґ domains, ­ ЇаЁ¬Ґа, в Є:

treetype = tree(string, treetype, treetype); empty()

‡¤Ґбм treetype Ё¬п ¤®¬Ґ­ , Є®в®ал© Ё¬ҐҐв ¤ў   «мвҐа­ вЁў­ле
§­ зҐ­Ёп - дг­Єв®а tree(string, treetype, treetype) Ё«Ё Їгбв®©
дг­Єв®а empty(). ЏҐаўл© дг­Єв®а ᮤҐа¦Ёв, Єа®¬Ґ ®ЎмҐЄв ,
ЇаҐ¤бв ў«по饣® ҐЈ® ᮤҐа¦ ­ЁҐ, ­ ЇаЁ¬Ґа, бва®ЄЁ, ҐйҐ ¤ў  ®ЎмҐЄв ,
б®ўЇ ¤ ойЁе б б ¬Ё¬ ®ЇЁблў Ґ¬л¬ ¤®¬Ґ­®¬, в.Ґ. ४габЁў­® ®ЇЁблў Ґв
а §ўҐвў«пойгобп бвагЄвгаг ¤ ­­ле. ‚в®а®© Їгбв®© дг­Єв®а ЎҐ§
 аЈг¬Ґ­в®ў ¤ Ґв Їа ў® ¤®¬Ґ­г treetype ЇаЁ­Ё¬ вм §­ зҐ­ЁҐ, Є®в®а®Ґ ¤«п
­ҐЄ®в®але  аЈг¬Ґ­в®ў ­Ґ Ё¬ҐҐв ¤ ­­ле, в.Ґ. в ЄЁ¬ ®Ўа §®¬ ®в¬Ґз Ґвбп
Є®­Ґж ўҐвў«Ґ­Ёп ¤ ­­ле.
’ЁЇЁз­ п § ¤ з , аҐи Ґ¬ п ­  в Є®© бвагЄвгаҐ, Їа®б¬®ва ўбҐе бва®Є ў
㧫 е ¤ҐаҐў  Ё«Ё Ї®ЁбЄ (ўл¤Ґ«Ґ­ЁҐ) ®¤­®Ј® Ё«Ё ­ҐбЄ®«мЄЁе 㧫®ў,
㤮ў«Ґвў®апойЁе Є ЄЁ¬-«ЁЎ® гб«®ўЁп¬ (traversing),   в Є¦Ґ ᮧ¤ ­ЁҐ
(§ Ї®«­Ґ­ЁҐ) в ЄЁе бвагЄвга.
Џа®Ја ¬¬ , Ё««обваЁагой п аҐиҐ­ЁҐ в Є®© § ¤ зЁ, ЇаҐ¤бв ў«Ґ­  ­Ё¦Ґ.

domains % § ¤ ­ЁҐ ¤аҐў®ўЁ¤­®© бвагЄвгал ¤ ­­ле
treetype = tree(string, treetype, treetype) ; empty()

predicates % ®ЇЁб ­ЁҐ вЁЇ   аЈг¬Ґ­в®ў ў ЇаҐ¤ЁЄ в е
print_all_elements(treetype)

clauses
print_all_elements(empty). /* ЇаҐ¤ЁЄ в гᯥ襭 ЇаЁ §­ зҐ­ЁЁ
 аЈг¬Ґ­в  - empty */

print_all_elements(tree(X, Y, Z)) :- /* Ј®«®ў  Їа ўЁ«  - ЇаҐ¤ЁЄ в
б  аЈг¬Ґ­в®ў ў ўЁ¤Ґ ЇаҐ¤ЁЄ в  (дг­Єв®а ) б ваҐ¬п ЇҐаҐ¬Ґ­­л¬Ё */
write(X), nl, % ЇҐз вм бва®ЄЁ ®зҐаҐ¤­®Ј® 㧫  ¤ҐаҐў 
print_all_elements(Y), /*  ­вҐжҐ¤Ґ­в, ўл§лў ойЁ© ४габЁў­®Ґ
®Ўа йҐ­ЁҐ (Ї®б«Ґ Ї®ЇлвЄЁ ўлЇ®«­Ёвм ЇаҐ¤л¤гйЁ© ЇаҐ¤ЁЄ в б Їгбвл¬
 аЈг¬Ґ­в®¬) Є н⮬㠦Ґ Їа ўЁ«г, ­® б  аЈг¬Ґ­в®¬, Є®в®ал© пў«пҐвбп
«Ґўл¬ Ї®¤¤ҐаҐў®¬ ўе®¤­®Ј® н«Ґ¬Ґ­в  (㧫  ¤ҐаҐў ), ЇаҐ¤бв ў«Ґ­­®Ј®
дг­Єв®а®¬ ў Ј®«®ўҐ Їа ўЁ« , в.Ґ. Ґб«Ё ЇҐаўл©  аЈг¬Ґ­в X - ҐЈ®
ᮤҐа¦ ­ЁҐ (бва®Є ), в® Y Ё Z - ҐЈ® «Ґў®Ґ Ё Їа ў®Ґ Ї®¤¤ҐаҐўмп.
Џ®н⮬㠢 нв®© ४габЁЁ Ўг¤гв ЇҐаҐе®¤л Є «Ґўл¬ Ї®¤¤ҐаҐўмп¬ (㧫 ¬,
н«Ґ¬Ґ­в ¬), Ї®Є  ­Ґ ўбваҐвЁвбп Їгбв®© н«Ґ¬Ґ­в - дг­Єв®а empty, зв®
ўл§®ўҐв Є®­Ґж ४габЁЁ ўб«Ґ¤бвўЁҐ гбЇҐи­®Ј® ўлЇ®«­Ґ­Ёп ЇаҐ¤л¤г饣®
ЇаҐ¤ЁЄ в . Ќ®, Є Є ¬л §­ Ґ¬, ў Їа®жҐбᥠ४габЁЁ ®вЄ« ¤лў овбп ў
б⥪Ґ §­ зҐ­Ёп  аЈг¬Ґ­в®ў ЇаЁ Є ¦¤®¬ ҐҐ и ЈҐ. Џ®н⮬㠯®б«Ґ
­ е®¦¤Ґ­Ёп «Ґў®Ј® empty Ё§ б⥪  Ўг¤гв ўлЎЁа вмбп Ў«Ё¦ ©иЁҐ §­ зҐ­Ёп
Z - Їа ўлҐ Ї®¤¤ҐаҐўмп Ё ўў®§®Ў­®ў«пвмбп ४габЁп Ї® 㦥 Ёе «Ґўл¬
Ї¤¤ҐаҐўмп¬. */
print_all_elements(Z). /* …б«Ё Z Їгбв®© н«Ґ¬Ґ­в, в® ЎҐаҐвбп Ё§
б⥪  б«Ґ¤го饥 §­ зҐ­ЁҐ Z. …б«Ё Z - 㧥«, в® Їа®¤®«¦ Ґвбп ४габЁп
Ї® «Ґў®© ўҐвўЁ, в.Ґ. Ї® ЇҐаҐ¬Ґ­­®© Y, ¤®Ї®«­пп б⥪ ­®ўл¬Ё §­ зҐ­Ёп¬Ё
 аЈг¬Ґ­в®ў ४габЁў­®Ј® Їа ўЁ« . ‚ १г«мв вҐ Ј а ­вЁа®ў ­ Їа®б¬®ва
ўбҐе 㧫®ў ¤ҐаҐў  ᢥаег ў­Ё§ Ё б«Ґў  ­ Їа ў®. */


goal /* 楫м ᮤҐа¦Ёв ў Є зҐб⢥  аЈг¬Ґ­в  ЇаЁ¬Ґа ў«®¦Ґ­­®©
¤аҐў®ўЁ¤­®© бвагЄвгал */

print_all_elements(tree("Cathy",
tree("Michael", tree("Charles", empty, empty),
tree("Hazel", empty, empty)),
tree("Melody", tree("Jim", empty, empty),
tree("Eleanor", empty, empty)))).

„ ­­ п Їа®Ја ¬¬  ¤Ґ¬®­бваЁагҐв § ¬Ґз вҐ«м­лҐ бў®©бвў  Џа®«®Ј 
« Є®­Ёз­® § ¤ ў вм б«®¦­лҐ бвагЄвгал ¤ ­­ле Ё Їа®бв®вг а Ў®вл б ­Ё¬Ё
б।бвў ¬Ё ४габЁЁ. ђ бᬮваЁ¬ ҐйҐ ЇаЁ¬Ґа Їа®Ја ¬¬л ᮧ¤ ­Ёп
(§ Ї®«­Ґ­Ёп) ¤аҐў®ўЁ¤­®© Ў §л ¤ ­­ле, Є®в®ал© ЇаЁў®¤Ёвбп ­Ё¦Ґ.

domains % § ¤ свбп ¤аҐў®ўЁ¤­ п бвагвга  ¤ ­­ле
treetype = tree(string, treetype, treetype) ; empty()

predicates % § ¤ овбп вЁЇл  аЈг¬Ґ­в®ў ЇаҐ¤ЁЄ в®ў
create_tree(string, treetype)
insert_left(treetype, treetype, treetype)
insert_right(treetype, treetype, treetype)

clauses
create_tree(A, tree(A, empty, empty)). /* нв®в ЇаҐ¤ЁЄ в §  бзҐв
г­ЁдЁЄ жЁЁ ЇаЁбў Ёў Ґв §­ зҐ­ЁҐ ЇҐаҐ¬Ґ­­®© A ЇҐаў®¬г  аЈг¬Ґ­вг
дг­Єв®а  tree. ”г­Єв®а §¤Ґбм - н«Ґ¬Ґ­в, ўлЇ®«­пойЁ© а®«м ЇҐаҐ¬Ґ­­®©,
Є®в®ал© ЇаЁ®ЎаҐв Ґв §­ зҐ­ЁҐ, Ґб«Ё §­ зҐ­ЁҐ ЇаЁ®ЎаҐв ов ҐЈ®
 аЈг¬Ґ­вл. */
insert_left(X, tree(A, _, B), tree(A, X, B)). /* нв®в ЇаҐ¤ЁЄ в § 
бзҐв г­ЁдЁЄ жЁЁ § ¤ Ґв §­ зҐ­Ёп  аЈг¬Ґ­в ¬ н«Ґ¬Ґ­в  tree(A, X, B),
ўлЇ®«­по饣® а®«м १г«мвЁаго饩 ЇҐаҐ¬Ґ­­®©, ЁбЇ®«м§гп §­ зҐ­Ёп
ўе®¤­®© ЇҐаҐ¬Ґ­­®© X Ё н«Ґ¬Ґ­в  tree(A, _, B), ўлЇ®«­по饣® а®«м
ўе®¤­®© ЇҐаҐ¬Ґ­­®© б § ¤ ­­л¬Ё §­ зҐ­Ёп¬Ё  аЈг¬Ґ­в®ў A Ё B
(Ї®¤зҐаЄЁў ­ЁҐ ®§­ з Ґв, зв® §­ зҐ­ЁҐ ЇҐаҐ¬Ґ­­®© ЎҐ§а §«Ёз­® Ё«Ё ­Ґ
ЁбЇ®«м§гҐвбп). */
insert_right(X, tree(A, B, _), tree(A, B, X)). /* нв®в ЇаҐ¤ЁЄ в
ўлЇ®«­пҐв § ¤ зг  ­ «®ЈЁз­го ЇаҐ¤л¤г饬㠯।ЁЄ вг. Ћв«ЁзЁҐ «Ёим ў
⮬, зв® ўе®¤­ п ЇҐаҐ¬Ґ­­ п X, Ё¬Ґой п §­ зҐ­ЁҐ Їа ў®Ј® 㧫  ¤ҐаҐў 
®в­®бЁвҐ«м­® ¤ ­­®Ј® 㧫 , ®в®¦¤Ґбвў«пҐвбп б ᮮ⢥вбвўгойЁ¬
 аЈг¬Ґ­в®¬ ўл室­®Ј® н«Ґ¬Ґ­в  tree(A, B, X). */

goal
/* ᮧ¤ свбп ¤ҐаҐў® Ї®б«Ґ¤®ў вҐ«м­л¬ ўлЇ®«­Ґ­ЁҐ¬ ЇаҐ¤ЁЄ в®ў
б­ з «  create_tree, ЇҐаўл¬  аЈг¬Ґ­в®¬ Є®в®але п«пҐвбп бва®Є 
(ᮤҐа¦ ­ЁҐ 㧫  ¤ҐаҐў ),   ўв®ал¬ пў«пҐвбп ЇҐаҐ¬Ґ­­ п, §­ зҐ­ЁҐ
Є®в®а®© бв ­®ўЁвбп дг­Єв®а tree c ᮮ⢥вбвўгойЁ¬Ё § ¤ ў Ґ¬л¬Ё
§­ зҐ­Ёп¬Ё  аЈг¬Ґ­в®ў. ’ ЄЁ¬ ®Ўа §®¬, Ўг¤гв ®ЇаҐ¤Ґ«Ґ­л (ЇаЁбў®Ґ­л §­ зҐ­Ёп)
б«Ґ¤гойЁҐ ЇҐаҐ¬Ґ­­лҐ: Ch, H, Mi, J, E, Me, Ca. */

create_tree("Charles", Ch),
create_tree("Hazel", H),
create_tree("Michael", Mi),
create_tree("Jim", J),
create_tree("Eleanor", E),
create_tree("Melody", Me),
create_tree("Cathy", Ca),

/* б«Ґ¤гойЁҐ ЇаҐ¤ЁЄ вл бўп§лў ов н«Ґ¬Ґ­вл ў ¤ў®Ёз­®Ґ ¤ҐаҐў®.
Ќ ЇаЁ¬Ґа, ЇаҐ¤ЁЄ в insert_left(Ch, Mi, Mi2) §­ зҐ­ЁҐ ЇҐаҐ¬Ґ­­®© Mi,
в.Ґ. дг­Єв®а tree(A, _, B) Ё §­ зҐ­ЁҐ ЇҐаҐ¬Ґ­­®© Ch, в.Ґ. дг­Єв®а
tree("Charles", empty, empty), ЇаЁбў Ёў Ґв ЇҐаҐ¬Ґ­­®© Mi2, в.Ґ. ҐҐ
§­ зҐ­ЁҐ бв ­®ўЁвбп а ў­л¬ дг­Єв®аг tree("Michael",Ch, empty). */

insert_left(Ch, Mi, Mi2),
insert_right(H, Mi2, Mi3),
insert_left(J, Me, Me2),
insert_right(E, Me2, Me3),
insert_left(Mi3, Ca, Ca2),
insert_right(Me3, Ca2, Ca3),

/* ЏҐз вм १г«мв в®ў б Ї®¬®ймо гЄ § ­Ёп Ё¬Ґ­Ё н«Ґ¬Ґ­в  ўҐае­ҐЈ®
га®ў­п. */
write(Ca3), nl.

‘вагЄвгал вЁЇ  ¤ҐаҐў  㤮Ў­® ЁбЇ®«м§®ў вм ¤«п Ўлбва®Ј® Ї®ЁбЄ 
­г¦­®Ј® н«Ґ¬Ґ­в  (㧫 ) ў Ў §Ґ ¤ ­­ле. „«п нв®Ј® ЇаҐ¤ў аЁвҐ«м­®
­Ґ®Ўе®¤Ё¬® ў Ў §Ґ ¤ ­­ле Ї®бва®Ёвм ¤аҐў®ўЁ¤­го бвагЄвгаг Ё«Ё
§ Ї®«­Ёвм Ў §г ¤ ­­ле ў ᮮ⢥вбвўЁЁ б 㦥 ᮧ¤ ­­®© бвагЄвга®©.
„ў®Ёз­®Ґ гЇ®а冷稢 ­ЁҐ ¬®¦Ґв Їа®Ё§ў®¤Ёвмбп «ЁЎ® ў  «д ўЁв­®¬
Ї®ап¤ЄҐ, «ЁЎ® ў зЁб«®ў®¬ Ї®ап¤ЄҐ, «ЁЎ® ў Ї®ап¤ЄҐ Ў®«ҐҐ б«®¦­®¬ (Ї®
з бвп¬ н«Ґ¬Ґ­в®ў Ё«Ё Ёе ўҐ«ЁзЁ­Ґ). ’®Ј¤  вҐе­®«®ЈЁп а Ў®вл б Ў §®©
¤ ­­ле бў®¤Ёвбп Є ®ЇаҐ¤Ґ«Ґ­Ёо ­ ЁЎ®«ҐҐ з бвле ЇаЁ§­ Є®ў ўлЎ®аЄЁ Ё
Ї®бв஥­ЁҐ Ё¬Ґ­­® ¤«п ­Ёе ¤ў®Ёз­ле ¤ҐаҐўмҐў (¬®¦Ґв Ўлвм ­ҐбЄ®«мЄ®),  
§ вҐ¬ ЁбЇ®«м§®ў вм нвЁ ¤ҐаҐўмп ¤«п Ўлбва®© ®Ўа Ў®вЄЁ § Їа®б®ў Є Ў §Ґ
¤ ­­ле.
„«п §­ Є®¬бвў  б ®аЈ ­Ё§ жЁҐ© ¤аҐў®ўЁ¤­®© бвагЄвгал ў ⥪бв®ў®¬
д ©«Ґ, Ј¤Ґ бва®ЄЁ пў«повбп н«Ґ¬Ґ­в ¬Ё, гЇ®а冷稭­л¬Ё ў  «д ўЁв­®¬
Ї®ап¤ЄҐ, ЇаЁўҐ¤Ґ¬ Їа®Ја ¬¬г Ї®бва®з­®Ј® ўў®¤  ®Ўлз­®Ј® д ©«  Ё
ᮧ¤ ­ЁҐ ­®ў®Ј® д ©« , ў Є®в®а®¬ бва®ЄЁ бўп§ ­л ¤аҐў®ўЁ¤­®© багЄвга®©
¤ ­­ле. Ћ¤­®ўаҐ¬Ґ­­® ў Їа®Ја ¬¬Ґ Ўг¤гв Їа®Є®¬¬Ґ­вЁа®ў ­л ­®ўлҐ ЇаЁҐ¬л
а Ў®вл ў Џа®«®ЈҐ.

domains % § ¤ Ґвбп ¤аҐў®ўЁ¤­ п бвагЄвга  ¤®¬Ґ­ 
treetype = tree(string, treetype, treetype) ; empty
file = infile ; outfile /* бв ­¤ ав­®г вЁЇг file ЇаЁбў Ёў овбп
Ё¬Ґ­  (Ґ¤Ё­б⢥­­л© б«гз ©, Є®Ј¤  вЁЇ § ¤ Ґвбп б«Ґў  ®в ўў®¤Ё¬ле ¤«п
­ҐЈ® Ё¬Ґ­, ЁЈа ойЁе а®«м «®ЈЁзҐбЄЁе Ё¬Ґ­ д ©«®ў, в.Ґ. ЁбЇ®«м§гҐ¬ле ў
Їа®Ја ¬¬Ґ. */

predicates
main
read_input(treetype)
read_input_aux(treetype, treetype)
insert(string, treetype, treetype)
write_output(treetype)

clauses

main :-
clearwindow, /* ®зЁбвЄ  ®Є­  */
write("Џ®бв஥­ЁҐ ¤ҐаҐў "),nl, % ўл¤ з  б®®ЎйҐ­Ёп
write("” ©« ¤«п з⥭Ёп: "),
readln(In), % ўў®¤ Ё¬Ґ­Ё д ©« 
openread(infile, In), % ®вЄалвЁҐ д ©«  ¤«п з⥭Ёп
write("” ©« ¤«п § ЇЁбЁ: "), readln(Out), % з⥭ЁҐ бва®ЄЁ
openwrite(outfile, Out), % ®вЄалвЁҐ д ©«  ¤«п § ЇЁбЁ
readdevice(infile), % ­ §­ зҐ­ЁҐ гбва®©бвў®¬ з⥭Ёп infile
read_input(Tree), % ЇаҐ¤ЁЄ в ўў®¤  бва®Є Ё Ї®бв஥­ЁҐ ¤ҐаҐў 
writedevice(screen), % ­ Їа ў«Ґ­ЁҐ ўлў®¤  ­  нЄа ­
write_output(Tree), % ўлў®¤ ¤ҐаҐў  ­  нЄа ­
closefile(infile), % § ЄалвЁҐ д ©«  з⥭Ёп
closefile(outfile). % § ЄалвЁҐ д ©«  ўлў®¤ 

main :- % ЇаҐ¤ЁЄ в ўлЇ®«­пҐвбп ЇаЁ ®иЁЎЄҐ ў ЇаҐ¤л¤г饬 main
closefile(outfile), % § ЄалвЁҐ д ©«  ўлў®¤ 
writedevice(screen), % ­ §­ зҐ­ЁҐ ўлў®¤  ­  нЄа ­
write("ЌҐў®§¬®¦­® ўлЇ®«­Ёвм б®авЁа®ўЄг \n"),
write("‚®§¬®¦­® ­Ґ ®вЄалвм д ©« ўў®¤  \n").

/* ЇаҐ¤ЁЄ в read_input(Tree) зЁв Ґв бва®ЄЁ Ё§ гбва®©бвў  infile ¤®
ЇаЁ§­ Є  Є®­ж  д ©«  EOF Ё ®Ўа §гҐв ЎЁ­ а­®Ґ Ї®ЁбЄ®ў®Ґ ¤ҐаҐў® */

read_input(Tree) :- read_input_aux(empty,Tree).

/* ЇаҐ¤ЁЄ в read_input_aux(Tree, NewTree) зЁв Ґв бва®Єг, ўў®¤Ёв ҐҐ ў
¤ҐаҐў® Tree, ᮧ¤ ў п ­®ў®Ґ Tree1, Ё ўл§лў Ґв ᥡп ४габЁў­® ¤®
Є®­ж  д ©«  EOF */
read_input_aux(Tree, NewTree) :-
readln(S), % з⥭ЁҐ бва®ЄЁ
!, % ®вбҐзҐ­ЁҐ ¤«п ®в¬Ґ­л б⥪ 
insert(S, Tree, Tree1), % ўўҐ¤Ґ­ЁҐ бва®ЄЁ ў Tree Ё Ї®«г祭ЁҐ Tree1
read_input_aux(Tree1, NewTree). /* аҐгабЁп Ї®§ў®«пҐв ўўҐбв ­®ўго
бва®Єг. */

read_input_aux(Tree, Tree). /* ЇаҐ¤ЁЄ в ўлЇ®«­пҐвбп, Ґб«Ё з⥭ЁҐ ў
ЇаҐ¤л¤г饬 ЇаҐ¤ЁЄ вҐ ®иЁЎ®з­®, в.Ґ. б«гзЁвбп Є®­Ґж д ©«  EOF. ’ҐЄг饥
¤ҐаҐў® Tree б®ўЇ ¤Ґв б ўл室­л¬ Tree Ё ЇаҐ¤ЁЄ в гᯥ襭. */

/* insert(Element, Tree, NewTree) ўбв ў«пҐв н«Ґ¬Ґ­в ў ¤ҐаҐў®
Tree, ᮧ¤ ў п ­®ў®Ґ ¤ҐаҐў® NewTree. */
insert(NewItem, empty, tree(NewItem, empty, empty)) :- !.
/* Ґб«Ё ўе®¤­®Ґ ¤ҐаҐў® Tree Їгб⮥, в® ўлЇ®«­Ёвбп г­ЁдЁЄ жЁп Ё
ᮧ¤ бвбп ­®ўл© н«Ґ¬Ґ­в ¤ҐаҐў  tree(NewItem, empty, empty) б
®вбҐзҐ­ЁҐ¬ ¤агЈЁе аҐиҐ­Ё©. */
insert(NewItem, tree(Element, Left, Right),
tree(Element, NewLeft, Right)) :-
NewItem < Element, /* Ґб«Ё ўў®¤Ё¬л© н«Ґ¬Ґ­в NewItem ¬Ґ­миҐ
бгйҐбвўго饣® н«Ґ¬Ґ­в  Element (ба ў­Ґ­ЁҐ бва®Є Ё¤Ґв Ї® Є®¤ ¬
бЁ¬ў®«®ў Ё Ї® зЁб«г бЁ¬ў®«®ў), в® Ї®б«Ґ ®вбҐзҐ­Ёп (®в¬Ґ­  б⥪ )
¤ «ҐҐ ЎҐаҐвбп б«Ґ¤гойЁ© н«Ґ¬Ґ­в ¤ҐаҐў  б«Ґў  ¤«п Ї®ўв®а­®Ј® ®Ўа йҐ­Ёп
Є ЇаҐ¤ЁЄ в ¬ insert */
!, % ®вбҐзҐ­ЁҐ ў®§ўа в  Є ¤агЈЁ¬ аҐиҐ­Ёп¬
insert(NewItem, Left, NewLeft). /* ४габЁў­®Ґ ®Ўа йҐ­ЁҐ Є
н⮬㠦Ґ Їа ўЁ«г insert, ¤® вҐе Ї®а, Ї®Є  Left ­Ґ Ўг¤Ґв Їгбвл¬ -
empty. …б«Ё Left Їгбв®, в® ¤«п ⥪г饣® н«Ґ¬Ґ­в  ¤ҐаҐў  §­ зҐ­ЁҐ
«Ґў®Ј® Ї®¤¤ҐаҐў  NewLeft бв ­Ґв ­Ґ Їгбвл¬,   ­®ўл¬ н«Ґ¬Ґ­в®¬ б®
бва®Є®© Ё Їгбвл¬ «Ґўл¬ Ё Їа ўл¬ Ї®¤¤ҐаҐў®¬ Ё Ўг¤Ґв ўлЇ®«­Ґ­ ЇҐаў©
ЇаҐ¤ЁЄ в insert, Є®в®ал© б®§¤ бв ­®ўл© (­Ё¦­Ё©) ­ҐЇгбв®© н«Ґ¬Ґ­в
¤ҐаҐў . */


insert(NewItem, tree(Element, Left, Right),
tree(Element, Left, NewRight)) :- /* нв® Їа ўЁ«®
ўлЇ®«­пҐвбп ЇаЁ ­®ў®© ўўҐ¤Ґ­­®© бва®ЄҐ NewItem а ў­®© Ё«Ё Ў®«м襩
н«Ґ¬Ґ­в  Element Ё ўл§®ўҐв ४габЁў­л© Ї®ўв®а Їа ўЁ«  б н«Ґ¬Ґ­в®¬
бЇа ў  ®в ⥪г饣® н«Ґ¬Ґ­в  ¤ҐаҐў  */
insert(NewItem, Right, NewRight).

/* write_output(Tree) ўлў®¤Ёв н«Ґ¬Ґ­вл ў  «д®ўЁв­®¬ Ї®ап¤ЄҐ */

write_output(empty). /* ­ЁзҐЈ® ­Ґ ¤Ґ« Ґв */

write_output(tree(Item, Left, Right)) :-
write_output(Left), /* ४габЁў­® ЁйҐвбп б ¬®Ґ «Ґў®Ґ Ї®¤¤ҐаҐў® */
write(Item), nl, /* ўлў®¤ Ї®¤¤ҐаҐўмҐў Ё§ б⥪  */
write_output(Right). /* ४габЁў­® Ёйгвбп Їа ўлҐ Ї®¤¤ҐаҐўмп */
goal
main.


Џ®б«Ґ § ЇгбЄ  Їа®Ја ¬¬л ўл¤ свбп § Їа®б ­  ўў®¤ Ё¬Ґ­Ё ⥪бв®ў®Ј®
д ©«  Ё Ё¬Ґ­Ё ўл室­®Ј® д ©« . ђҐ§г«мв в а Ў®вл Їа®Ја ¬¬л - ⥪бв®ўл©
д ©« б гЇ®а冷祭­л¬Ё бва®Є ¬Ё ў Ї®ап¤ЄҐ ў®§а бв ­Ёп §­ зҐ­Ё© Ёе
Є®¤®ў Ё зЁб«  бЁ¬ў®«®ў, в.Ґ. ў  «д ўЁв­®¬ Ї®ап¤ЄҐ.
ЏаЁҐ¬л ЁбЇ®«м§®ў ­Ёп ¤аҐў®ўЁ¤­ле бвагЄвга ў Ў § е ¤ ­­ле Ўг¤гв
а бб¬®вҐ­л ¤ «ҐҐ.





4. ‘ЇЁбЄ®ўлҐ бвагЄвгал.


‘ЇЁб®Є - нв® ЇҐаҐзҐ­м Їа®Ё§ў®«м­ле н«Ґ¬Ґ­в®ў ®¤­®Ј® вЁЇ . ‚ ⥪бвҐ
®­ ЇаҐ¤бв ў«пҐвбп Ё¬Ґ­ ¬Ё н«Ґ¬Ґ­в®ў, § ЇЁб ­­л¬Ё зҐаҐ§ § Їпвго Ё
§ Є«о祭묨 ў Єў ¤а в­лҐ бЄ®ЎЄЁ, ­ ЇаЁ¬Ґа: [1,2,3] - бЇЁб®Є Ё§ ваҐе
楫ле зЁбҐ« (е®вп ў­гв७­ҐҐ ¬ иЁ­­®Ґ ЇаҐ¤бв ў«Ґ­ЁҐ бЇЁбЄ  ­Ґ
ᮤҐа¦Ёв § Їпвле Ё«Ё ¤агЈЁе а §¤Ґ«ЁвҐ«Ґ©,   в Є¦Ґ бЄ®Ў®Є).
‚ Џа®«®ЈҐ бЇЁб®Є § ¤ Ґвбп ў а §¤Ґ«Ґ domains Їг⥬ ¤®Ў ў«Ґ­Ёп ў
Є®­Ґж Ё¬Ґ­Ё ¤®¬Ґ­  §­ Є  §ўҐ§¤®зЄЁ *. Ќ ЇаЁ¬Ґа, listint = integer*
§ ¤ Ґв ¤®¬Ґ­ listint, Є®в®ал© пў«пҐвбп бЇЁбЄ®¬ 楫ле зЁбҐ«, listli =
listint* - § ¤ св бЇЁб®Є, н«Ґ¬Ґ­в ¬Ё Є®в®а®Ј® пў«повбп бЇЁбЄЁ 楫ле
зЁбҐ«. Ћ¤­ Є® Ґбвм ®Ја ­ЁзҐ­ЁҐ - ­Ґ«м§п б®ў¬Ґй вм бв ­¤ ав­лҐ вЁЇл
¤®¬Ґ­®ў ў ®¤­®¬ бЇ¬бЄҐ, в.Ґ. ¤®¬Ґ­ element=integer, real, string -
­ҐЇа ўЁ«Ґ­. Ќ® ¬®¦­® б®ў¬Ґй вм а §­лҐ дг­Єв®ал, ­ ЇаЁ¬Ґа:
li=element*, Ј¤Ґ element = r(real), i(integer), s(string).
„«п а Ў®вл б® бЇЁбЄ ¬Ё, в.Ґ. Ї®ЁбЄ, ¤®Ў ў«Ґ­ЁҐ Ё г¤ «Ґ­ЁҐ н«Ґ¬Ґ­в ,
а §¤Ґ«Ґ­ЁҐ, ®ЎмҐ¤Ё­Ґ­ЁҐ Ё гЇ®а冷稢 ­ЁҐ бЇЁбЄ®ў, ЇаҐ®Ўа §®ў ­ЁҐ ў
¤агЈЁҐ бвагЄвгал ¤ ­­ле Ё в.¤., ў Џа®«®ЈҐ ЇаЁ¬Ґ­повбп ४габЁў­®Ґ
ЇаҐ¤бв ў«Ґ­ЁҐ Ёе бвагЄвгал Ё, ᮮ⢥вб⢥­­®, ४габЁў­лҐ Їа ўЁ«  Ёе
®Ўа Ў®вЄЁ. Џ®н⮬㠏஫®Ј ў ®ЇҐаҐ¤Ґ«Ґ­­®© б⥯Ґ­Ё ЇҐаҐЄалў Ґв
б।бвў  в Є®Ј® п§лЄ  бЇЁбЄ®ў Ё ЁбЄгбб⢥­­®Ј® Ё­вҐ««ҐЄв , Є Є LISP.
“¤®Ў­® бЇЁб®Є а бб¬ ваЁў вм Є Є ¤ў®Ёз­®Ґ ¤ҐаҐў®, Є ¦¤л© 㧥«
Є®в®а®Ј® ᮤҐа¦Ёв бЇЁб®Є в®«мЄ® Ё§ ¤ўге ®ЎмҐЄв®ў - н«Ґ¬Ґ­в  бЇЁбЄ  Ё
¤агЈ®Ј® бЇЁбЄ  ®бв ўиЁебп н«Ґ¬Ґ­в®ў, Є®в®ал© ¬®¦Ґв Ўлвм Їгбвл¬
(Їгбв®© бЇЁб®Є). ’ Є бЇЁб®Є [1,2,3,4] ¬®¦Ґв Ўлвм ЇаҐ¤бв ў«Ґ­ ў ўЁ¤Ґ
[1,A], Ј¤Ґ A=[2,B], Ј¤Ґ B=[3,C], Ј¤Ґ C=[4,D], Ј¤Ґ D=[] (Їгбв®©
бЇЁб®Є). ќв®в ЇаЁҐ¬ ва ¤ЁжЁ®­­® ­ §лў Ґвбп а §ЎЁҐ­ЁҐ¬ бЇЁбЄ  ­ 
Ј®«®ўг (head, H) Ё еў®бв (tail, T), в.Ґ., ®ЇаҐ¤Ґ«пп ४габЁў­®, «оЎ®©
бЇЁб®Є L Ґбвм «ЁЎ® Їгбв®© бЇЁб®Є L=[], «ЁЎ® бЇЁб®Є Ё§ ¤ўге ®ЎмҐЄв®ў -
Ј®«®ўл Ё еў®бв , L=[H,T], Ј¤Ґ Ј®«®ў  H - н«Ґ¬Ґ­в,   еў®бв T
®Ўп§ вҐ«м­® бЇЁб®Є ®бв ўиЁебп н«Ґ¬Ґ­в®ў (пб­®, зв® Їгбв®© бЇЁб®Є ­Ґ
¬®¦Ґв а §ЎЁў вмбп ­  Ј®«®ўг Ё еў®бв).
Ћб­®ў­®© ЇаЁҐ¬ Ї®бв஥­Ёп  «Ј®аЁв¬®ў а Ў®вл б® бЇЁбЄ®¬ - б®бв ў«Ґ­ЁҐ
¤ўге Їа ўЁ«: ४габЁў­®Ј® Їа ўЁ«  а Ў®вл б Ј®«®ў®© Ё еў®б⮬ Ё Їа ўЁ« 
а Ў®вл б Їгбвл¬ бЇЁбЄ®¬.
ђ бᬮваЁ¬ Їа®Ја ¬¬г Їа®б¬®ва  б®¤Ґа¦Ё¬®Ј® бЇЁбЄ .

domains
list = integer* /*бЇЁб®Є 楫ле зЁбҐ« */
predicates
write_a_list(list)
clauses
write_a_list([]). /* ЇаҐ¤ЁЄ в гᯥ襭 ЇаЁ Їгб⮬ бЇЁбЄҐ */
write_a_list([H|T]) :- /* Ґб«Ё ўе®¤­®©  аЈг¬Ґ­в Ґбвм бЇЁб®Є Ё§
н«Ґ¬Ґ­в  H Ё еў®бв  бЇЁбЄ T в® Їа ўЁ«® Ўг¤Ґв аҐи вмбп ў  ­вҐжҐ¤Ґ­в е
*/
write(H), nl, % ўлў®¤ н«Ґ¬Ґ­в  бЇЁбЄ 
write_a_list(T). /* ४габЁў­®Ґ ®Ўа йҐ­ЁҐ Є н⮬㠦Ґ Їа ўЁ«г,
­® б  аЈг¬Ґ­в®¬, а ў­л¬ еў®бвг бЇЁбЄ . …б«Ё ®­ Їгбв, в® ўлЇ®«­Ёвбп
ЇаҐ¤иҐбвўгойЁ© д Єв Ё ४габЁп § Є®­зЁвбп. */

goal
write_a_list([1, 2, 3]). /*  аЈг¬Ґ­в®¬ пў«пҐвбп бЇЁб®Є ¤«п ўлў®¤  */

‘«Ґ¤гойЁ© ЇаЁ¬Ґа - Їа®Ја ¬¬  Ї®¤бзҐв  зЁб«  н«Ґ¬Ґ­в®ў бЇЁбЄ .

domains
list = integer* /* oбЇЁб®Є 楫ле зЁбҐ« */
predicates
length_of(list, integer)
clauses
length_of([], 0).
length_of([_|T], L) :- length_of(T, TailLength),
/* ЇҐаўл© д Єв length_of ®ЎҐбЇҐзЁў Ґв Є®­Ґж ४габЁЁ ЇаЁ Їгб⮬
бЇЁбЄҐ Ё ®¤­®ўаҐ¬Ґ­­® ЇаЁ г­ЁдЁЄ жЁЁ ЇаЁбў Ёў Ґв §­ зҐ­ЁҐ 0 ўв®а®¬г
 аЈг¬Ґ­вг TailLength Ё ЇаЁбў Ёў Ґв ҐЈ® Ї®б«Ґ¤­Ґ© п祩ЄҐ б⥪ .  Ј®ў
४габЁЁ Ўг¤Ґв бв®«мЄ®, бЄ®«мЄ® н«Ґ¬Ґ­в®ў ў бЇЁбЄҐ Ё бв®«мЄ® ¦Ґ Ўг¤Ґв
ᮧ¤ ў Ґ¬ле п祥Є б⥪  Ё и Ј®ў ®Ўа в­®© а бЄагвЄЁ ४габЁЁ Ї®
п祩Є ¬ б⥪ , ®ЇаҐ¤Ґ«Ґ­ЁҐ §­ зҐ­Ё© Є®в®але (Єа®¬Ґ Ї®б«Ґ¤­Ґ©) Ўл«®
®в«®¦Ґ­® */
L = TailLength + 1.
/* нв®в ЇаҐ¤ЁЄ в Ўг¤Ґв ®ЇаҐ¤Ґ«пвм §­ зҐ­Ёп ­Ґ®ЇаҐ¤Ґ«Ґ­­ле п祥Є б⥪ 
ўл¤Ґ«пҐ¬ле ЇаЁ аҐЄгабЁЁ ¤«п ўбҐе нЄ§Ґ¬Ї«па®ў ЇҐаҐ¬Ґ­­®© L. ЏаЁ ўл室Ґ
Ё§ ४габЁЁ (®Ўа в­®© а бЄагвЄЁ) ў Ёв®ЈҐ Ўг¤Ґв Ї®«г祭® §­ зҐ­ЁҐ
¤«Ё­л бЇЁбЄ  L /*

goal length_of([1,2,3], L).

ќв®в ЇаЁ¬Ґа Ї®Є §лў Ґв, зв® ­Ґ в Є Їа®бв® ®аЈ ­Ё§®ў вм нЄ®­®¬­л©
¬Ґе ­Ё§¬ Ї®¤бзҐв  ¤«Ё­л еў®бв  бЇЁбЄ , ЇаЁе®¤Ёвбп ЁбЇ®«м§®ў вм
"®Ўа в­л© 室" ४габЁЁ, ­  зв® § ва зЁў Ґвбп ¤®Ї®«­ЁвҐ«м­®Ґ ўаҐ¬п.
Ѓ®«ҐҐ нЄ®­®¬­л© б нв®© в®зЄЁ §аҐ­Ёп ў аЁ ­в Ї®¤бзҐв  ¤«Ё­л бЇЁбЄ 
ЇаЁўҐ¤Ґ¬ ­Ё¦Ґ.

domains
list = integer* /* бЇЁб®Є 楫ле */
predicates
length_of(list, integer, integer)
clauses
/* ЇаЁ Їгб⮬ бЇЁбЄҐ §­ зҐ­Ёо ўв®а®Ј®  аЈг¬Ґ­в  (१г«мв вг)
ЇаЁбў Ёў Ґвбп §­ зҐ­ЁҐ ваҐв쥣®  аЈг¬Ґ­в  (бзҐвзЁЄ ) */
length_of([], Result, Result):- !.

/* ЇаЁ ­Ґ Їгб⮬ бЇЁбЄҐ бзҐвзЁЄг Counter ЇаЁЎ ў«пҐвбп 1 Ё ¤Ґ« Ґвбп и Ј
४габЁЁ,  аЈг¬Ґ­в (१г«мв в) ­Ґ Ё§¬Ґ­пҐвбп) */
length_of([_|T], Result, Counter) :-
NewCounter = Counter + 1,
length_of(T, Result, NewCounter).

goal
length_of([1, 2, 3], L, 0), /* ­ з «м­®Ґ §­ зҐ­ЁҐ бзҐвзЁЄ  0 */
write(L), nl.

‡¤Ґбм §  бзҐв ¤®Ї®«­ЁвҐ«м­®Ј®  аЈг¬Ґ­в  г¤ Ґвбп Ї®¤бзЁв вм зЁб«®
и Ј®ў ४габЁЁ ­ҐЇ®б।б⢥­­® ЇаЁ ҐҐ ўлЇ®«­Ґ­ЁЁ.
— бв® ЁбЇ®«м§гҐ¬ п ®ЇҐа жЁп ®ЎмҐ¤Ё­Ґ­Ёп бЇЁбЄ®ў ®бгйҐбвў«пҐвбп
ў б«Ґ¤го饩 Є®а®вЄ®© Їа®Ја ¬¬Ґ.

trace
domains
integerlist = integer*
predicates
append(integerlist, integerlist, integerlist)
clauses
append([], List, List).
append([X|L1], List2, [X|L3]) :- append(L1, List2, L3).
goal append([1,2,3],[6,7],L).

„«п Ї®­Ё¬ ­Ёп ҐҐ а Ў®вл ЇаЁўҐ¤Ґ¬ а бЇҐз вЄг д ©«  PROLOG.LOG
ва ббЁа®ўЄЁ ўлЇ®«­Ґ­Ёп ЇаҐ¤ЁЄ в®ў.

Execute program
CALL:_PROLOG_Goal()
CALL:append([1,2,3],[6,7],_)
REDO:append([1,2,3],[6,7],_)
CALL:append([2,3],[6,7],_)
REDO:append([2,3],[6,7],_)
CALL:append([3],[6,7],_)
REDO:append([3],[6,7],_)
CALL:append([],[6,7],_)
RETURN:append([],[6,7],[6,7])
RETURN:append([3],[6,7],[3,6,7])
RETURN:append([2,3],[6,7],[2,3,6,7])
RETURN:append([1,2,3],[6,7],[1,2,3,6,7])
RETURN:_PROLOG_Goal()
Program terminated with success

€§ а бЇҐз вЄЁ ўЁ¤­®, зв® ЇаҐ¤ЁЄ в ўл§лў Ґвбп б­ з «  Ё§ 楫Ё, § вҐ¬
®вЄ в ®в д Єв  (­Ґв б®Ї®бв ў«Ґ­ЁҐ ЇҐаў®Ј®  аЈг¬Ґ­в  б Їгбвл¬ бЇЁбЄ®¬),
§ вҐ¬ ўе®¤ ў Їа ўЁ«® Ё ўл§®ў ЇаҐ¤ЁЄ в - ­вҐжҐ¤Ґ­в , § вҐ¬ ४габЁў­л©
Ї®ўв®а нвЁе и Ј®ў ¤® ®Ўа §®ў ­Ёп Їгбв®Ј® бЇЁбЄ  ў ЇҐаў®¬  аЈг¬Ґ­вҐ,  
§ вҐ¬ ў®§ўа в Ё§ ४габЁЁ Ё Ї®«г祭ЁҐ १г«мв в .
„ў  ¬®й­ле б।бвў  § ¤ ­Ёп ўлзЁб«Ґ­Ё© ў Џа®«®ЈҐ - ®вЄ в б Ї®ЁбЄ®¬
­®ўле аҐиҐ­Ё© ў Їа®Ја ¬¬Ґ Ё ४габЁп (ў з бв­®бвЁ Ў §  ¤ ­­ле Ё
бЇЁбЄЁ) Їа ЄвЁзҐбЄЁ ­Ґ б®зҐв овбп, в.Ґ. б®ў¬Ґбв­® ­Ґ Ї®§ў®«пов
бва®Ёвм Ј а¬®­Ёз­® б®ў¬ҐбвЁ¬лҐ Ё Є зҐб⢥­­® «гзиЁҐ Ї® Єа вЄ®бвЁ Ё
нЄ®­®¬ЁЁ ўаҐ¬Ґ­Ё Ё б।бвў ў ॠ«Ё§ жЁЁ Їа®Ја ¬¬л. Ќ® нв  ЇаҐЈа ¤ 
Ўл«  Ё§пй­® ЇаҐ®¤®«Ґ­  ᮧ¤ вҐ«п¬Ё Џа®«®Ј  ўўҐ¤Ґ­ЁҐ¬ бв ­¤ ав­®Ј® Ё
Єа бЁў®Ј® ЇаҐ¤ЁЄ в  findall(A,P(...,A,...),L), Є®в®ал© Ё¬ҐҐв ваЁ
 аЈг¬Ґ­в  - ЇҐаўл© A гЄ §лў Ґв Ё¬п  аЈг¬Ґ­в  ЇаҐ¤ЁЄ в  P(...,A,...),
пў«по饣®бп ўв®ал¬  аЈг¬Ґ­в®¬,   ваҐвЁ©  аЈг¬Ґ­в L=[A1,A2,..] Ґбвм
бЇЁб®Є, Єг¤  § ­®бпвбп ўбҐ §­ зҐ­Ёп ЇҐаў®Ј®  аЈг¬Ґ­в  ЇаЁ Ї®ЁбЄҐ
ў­гв७­Ё¬Ё  «Ј®аЁв¬ ¬Ё Џа®«®Ј  ўбҐе аҐиҐ­Ё© ЇаҐ¤ЁЄ в  P(...,A,...).
ЏаЁўҐ¤Ґ­­ п ­Ё¦Ґ Їа®Ја ¬¬  Ї®Є §лў Ґв Є Є а Ў®в Ґв ЇаҐ¤ЁЄ в findall.

domains
name, address = string
age = integer
list = age*
predicates
person(name, address, age)
sumlist(list, age, integer)
goal
findall(Age, person(_, _, Age), L), /* бЎ®а ў бЇЁбЄҐ L ўбҐе §­ зҐ­Ё©
 аЈг¬Ґ­в  Age (ў®§а бв ) ў Ў §Ґ ¤ ­­ле */
sumlist(L, Sum, N), /* б㬬Ёа®ў ­ЁҐ ўбҐе н«Ґ¬Ґ­в®ў бЇЁбЄ  Ё Ї®¤бзҐв
Ёе зЁб«  */
Ave = Sum/N, /* ®ЇаҐ¤Ґ«Ґ­ЁҐ б।­ҐЈ® §­ зҐ­Ёп */
write("Average =", Ave), nl.
clauses
sumlist([], 0, 0).
sumlist([H|T], Sum, N) :- sumlist(T, S1, N1), Sum=H+S1, N=1+N1.
/* д Єв Ё Їа ўЁ«® sumlist ४габЁў­® ¤®е®¤пв ¤® Їгбв®Ј® бЇЁбЄ  T Ё
§ ¤ ов ЇаЁ н⮬ ­ з «м­лҐ §­ зҐ­Ёп  аЈг¬Ґ­в®ў Sum Ё N,   ЇаЁ ®Ўа в­®©
а бЄагвЄЁ ®ЇаҐ¤Ґ«пҐвбп Ёе ®Є®­з вҐ«м­®Ґ §­ зҐ­ЁҐ */
person("Sherlock Holmes", "22B Baker Street", 42).
person("Pete Spiers", "Apt. 22, 21st Street", 36).
person("Mary Darrow", "Suite 2, Omega Home", 51).

…йҐ ®¤Ё­ ЇаЁ¬Ґа ®ЇҐа жЁ© б® бЇЁбЄ ¬Ё - ўл¤Ґ«Ґ­ЁҐ ®ЎйЁе н«Ґ¬Ґ­в®ў
¤ўге бЇЁбЄ®ў ў ®в¤Ґ«м­л© бЇЁб®Є.

domains
list = integer*
predicates
member(integer, list)
intersect(list, list, list)
goal intrsect(X, [1,2,3],[2,3,4,5]), nl, write(X).
clauses
member(X, [X|_]).
member(X, [_|Y]) :- member(X, Y).
/* Їа ўЁ«® Ё д Єв member гбЇҐи­л, Ґб«Ё X Ґбвм ў бЇЁбЄҐ ўв®а®Ј®
 аЈг¬Ґ­в  */
intersect([], [], _).
intersect([X|Y], [X|L1], L2) :- member(X, L2), !,
intersect(Y, L1, L2).
intersect(Y, [_|L1], L2) :-
intersect(Y, L1, L2).
/* ЇҐаўл© д Єв intersect § ¤ Ґв ЇаЁ§­ Є Є®­ж  ४габЁЁ, ўв®а®©
intersect (Їа ўЁ«®) § ¤ Ґв ४габЁо, ЇаЁбў Ёў п ЇҐаў®¬г бЇЁбЄг
н«Ґ¬Ґ­в ўв®а®Ј® (X) ЇаЁ гб«®ўЁЁ ҐЈ® ўе®¦¤Ґ­Ёп ў L2 (ЇаҐ¤ЁЄ в member),
  ваҐвЁ© intersect ба Ў влў Ґв, Ґб«Ё н«Ґ¬Ґ­в X ­Ґ з«Ґ­ бЇЁбЄ  L2, Ё
®бгйҐбвў«пҐв ЇҐаҐе®¤ Є б«Ґ¤го饬г н«Ґ¬Ґ­вг L1. */

„«п Їлв«Ёў®Ј® Ёбб«Ґ¤®ў вҐ«п Ё­вҐаҐб­® ўлЇ®«­Ёвм Їа®Ја ¬¬г б
ва ббЁа®ўЄ®© Ё Ї®б¬®ваҐвм, Є Є ў«ЁпҐв ­ «ЁзЁҐ Ё ®вбгвбвўЁҐ ®вбҐзҐ­Ёп
! ­  १г«мв в.
Њ®¦­® ЇаҐ¤«®¦Ёвм зЁв вҐ«о, Єа®¬Ґ в®Ј®, б ¬®бв®п⥫м­л© а §Ў®а
Їа®Ја ¬¬л гЇ®а冷稢 ­Ёп н«Ґ¬Ґ­в®ў бЇЁбЄ , Є®в®а п ЇаЁў®¤Ёвбп ­Ё¦Ґ.

domains
number = integer
list = number*
predicates
insert_sort(list,list)
insert(number, list, list)
asc_order(number,number)
clauses
insert_sort([],[]).
insert_sort([X|Tail],Sorted_list):-
insert_sort(Tail,Sorted_Tail),
insert(X,Sorted_Tail,Sorted_list).
insert(X,[Y|Sorted_list],[Y|Sorted_list]):-
asc_order(X,Y),!,
insert(X,Sorted_list,Sorted_list1).
asc_order(X,Y):-X>Y.


‚ Џа®«®Ј ўбв஥­ ап¤ ЇаҐ¤ЁЄ в®ў, ®ЇҐаЁагойЁе б® бва®Є ¬Ё. ‚ᥠ®­Ё
ЇҐаҐзЁб«Ґ­л ў ЇаЁ«®¦Ґ­ЁЁ Ё Є ¦¤л© Ё§ ­Ёе ¤®бв в®з­® Їа®бв ў Ї®­Ё¬ ­ЁЁ
Ё ЁбЇ®«м§®ў ­ЁЁ Ё Ї®н⮬㠧¤Ґбм Ї®¤а®Ў­® ­Ґ а бб ¬ ваЁў овбп. Ћ¤­ Є®
б«Ґ¤гҐв ®в¬ҐвЁвм, зв® Ў« Ј®¤ ап нвЁ¬ б।бвў ¬ бва®пвбп ®зҐ­м
нд䥪⨢­лҐ Їа®Ја ¬¬л а Ў®вл б ⥪бв®ўл¬Ё ¤ ­­л¬Ё, ў з бв­®бвЁ, а §Ў®а
ЇаҐ¤«®¦Ґ­Ё© ҐбвҐб⢥­­®Ј® п§лЄ .





5. ЋаЈ ­Ё§ жЁп Ў § ¤ ­­ле ў Џа®«®ЈҐ.

‚ ЇаҐ¤л¤гйЁе ЇаЁ¬Ґа е Їа®Ја ¬ ­  Џа®«®ЈҐ 㦥 ўбваҐз «Ёбм ¬Ґбв® Ў §л
¤ ­­ле ў ўЁ¤Ґ ­ Ў®а®ў д Єв®ў ў а §¤Ґ«Ґ clauses. ‘ў®©бвў  Џа®«®Ј 
Ї®§ў®«п«Ё ®бгйҐбвў«пвм ўлЎ®аЄг ўбҐе §­ зҐ­Ё©  аЈг¬Ґ­в®ў нвЁе д Єв®ў б
Ї®¬®ймо ®вЄ в . Ћ¤­ Є® ­Ґ®Ўе®¤Ё¬л Ў®«ҐҐ а §ўЁвлҐ б।бвў  ᮧ¤ ­Ёп Ё
¬ ­ЁЇг«Ёа®ў ­Ёп Ў § ¬Ё ¤ ­­ле. Џ®н⮬㠢 Џа®«®Ј ўўҐ¤Ґ­® бЇҐжЁ «м­®Ґ
®ЇЁб ­ЁҐ Ў § ¤ ­­ле ў а §¤Ґ«Ґ database, Ј¤Ґ § ¤ овбп бвагЄвгал ¤ ­­ле
ў ўЁ¤Ґ ®ЇЁб ­Ёп ЇаҐ¤ЁЄ в®ў Ё вЁЇ®ў Ёе  аЈг¬Ґ­в®ў. ЏаҐ¤ЁЄ в
ЇаҐ¤бв ў«пҐв §¤Ґбм ®Ўа §Ґж § ЇЁбЁ Ў §л ¤ ­­ле ५пжЁ®­­®Ј® вЁЇ . …б«Ё
Ў §  ¤ ­­ле ᮤҐа¦Ёв в ЄЁҐ § ЇЁбЁ, в® ўлЎ®аЄ  Ёе ®бгйҐбвў«пҐвбп
Їа®бв® гЇ®¬Ё­ ­ЁҐ¬ нв®Ј® ЇаҐ¤ЁЄ в  ў Їа ўЁ« е Їа®Ја ¬¬л Ё  ­ «®ЈЁз­ 
⮬г, Є Є ўбҐ ў аЁ ­вл ЇаҐ¤ЁЄ в®ў (д Євл) ўлЎЁа «Ёбм ЇаЁ Ї®ЁбЄҐ
аҐиҐ­Ё© ў а §¤Ґ«Ґ clauses. Ќ® ®ЇЁб ў ЇаҐ¤ЁЄ в ў а §¤Ґ«Ґ database
(в ЄЁе а §¤Ґ«®ў ¤®ЇгбЄ Ґвбп ¬­®Ј® Ё а §«Ёз овбп ®­Ё Ё¬Ґ­ ¬Ё) ¬®¦­®
¤®Ў ў«пвм Ё г¤ «пвм нЄ§Ґ¬Ї«пал § ЇЁбҐ© (д Єв®ў) Ё ¤Ґ« вм ¤агЈЁҐ
¬ ­ЁЇг«пжЁЁ, Є Є б ®в¤Ґ«м­л¬Ё § ЇЁбп¬Ё, в Є Ё 楫ЁЄ®¬ б Ё¬Ґ­®ў ­®©
Ў §®© ¤ ­­ле. ђ бᬮваЁ¬ ЇаЁ¬Ґа.

domains
thing = string
conds = cond*
cond = string
database /* Ї® 㬮«з ­Ёо ¤ свбп Ё¬п - dbasedom */
is_a(thing, thing, conds) /* и Ў«®­ § ЇЁбЁ Ў §л ¤ ­­ле */
type_of(thing, thing, conds) /* ҐйҐ ®¤Ё­ и Ў«®­ § ЇЁбЁ */
false(cond) /* и Ў«®­ § ЇЁбЁ ¤«п б«г¦ҐЎ­ле 楫Ґ© */
/* Їгбвм 㦥 ᮧ¤ ­  Ў §  ¤ ­­ле Ё ᮤҐа¦Ё¬®Ґ ҐҐ ЇаЁўҐ¤Ґ­® ўб«Ґ¤ § 
Їа®Ја ¬¬®© ў ўЁ¤Ґ ⥪бв®ў®Ј® д ©«  б Ё¬Ґ­Ґ¬ dbname.dba */
predicates
run(thing) ask(conds)

goal
consult(dbname.dba), run(tool),
retractall(false(_)),save(dbname.dba, retractall.
/* ЇаҐ¤ЁЄ в consult ўў®¤Ёв Ў §г ¤ ­­ле Ё§ д ©«  ў Ї ¬пвм, ЇаҐ¤ЁЄ в
run § ЇгбЄ Ґв § ¤ зг ®Їа®б  ЇаЁ§­ Є®ў Ё ўлў®¤ ®вўҐв  Ans, ЇаҐ¤ЁЄ в
retractall(false(_)) г¤ «пҐв Ё§ Ў §л ¤ ­­ле ўбҐ д Євл false, ЇаҐ¤ЁЄ в
save б®еа ­пҐв Ў §г ¤ ­­ле ў д ©«Ґ ­  ¤ЁбЄҐ, ЇаҐ¤ЁЄ в retractall
®зЁй Ґв ўбо Ў §г ¤ ­­ле Ё§ ®ЇҐа вЁў­®© Ї ¬пвЁ */

clauses
run(Item):-
is_a(X, Item, List),
/* ЇаҐ¤ЁЄ в is_a ўлў®¤Ёв Ё§ Ў §  ¤ ­­ле ўбҐ § ЇЁбЁ б Item=tool */
ask(List),
/* ЇаҐ¤ЁЄ в ask § Їа иЁў Ґв Ї®¤вўҐа¦¤Ґ­ЁҐ ¤«п Є ¦¤®Ј® н«Ґ¬Ґ­в  бЇЁбЄ 
List */
type_of(ANS, X, List2),
/* ЇаҐ¤ЁЄ в type_of ўлЎЁа Ґв ўбҐ § ЇЁбЁ б ᮮ⢥вбвўгойЁ¬ X */
ask(List2),
/* ЇаҐ¤ЁЄ в ask_of § Їа иЁў Ґв Ї®¤вўҐа¦¤Ґ­ЁҐ ¤«п Є ¦¤®Ј® н«Ґ¬Ґ­в  Ё§
бЇЁбЄ  List2 */
write("The ", Item," you need is a/an ", Ans),nl.
/* ЇҐз вм ®вўҐв  Ans, c®®вўҐвбвўг饣® ¤ ­­л¬ Ї®¤вўҐа¦¤Ґ­Ёп¬ */
run(_):-
/* Ґб«Ё ў Ў §Ґ ­Ґв § ЇЁбҐ© ᮮ⢥вбвўгойЁе Ї®¤вўҐа¦¤Ґ­Ёп¬, в®
ўлў®¤Ёвбп б®®ЎйҐ­ЁҐ ® ­Ґ¤®бв в®з­®бвЁ ¤ ­­ле */
write("This program does not have enough "),
write("data to draw any conclusions."),
nl.

ask([]). /* ўл室 Ё§ ४габЁЁ ЇаЁ Їгб⮬ бЇЁбЄҐ § Їа®б®ў */
ask([H|T]):- /* ўлЎ®а ®зҐаҐ¤­®Ј® н«Ґ¬Ґ­в  бЇЁбЄ  */
not(false(H)), /* Їа®ўҐаЄ  - Ўл« «Ё а ­ҐҐ ®ваЁж вҐ«м­л© ®вўҐв ­ 
нв®в § Їа®б H */
write("Does this thing help you to "),
write(H," (enter y/n)"),
readchar(Ans), nl, Ans='y',
/* ЇаЁЈ« иҐ­ЁҐ Є ўў®¤г Ї®¤вўҐа¦¤Ґ­Ёп Ё ҐЈ® ўў®¤ */
ask(T). /* ४габЁў­л© ЇҐаҐ®¤ Є б«Ґ¤го饬г н«Ґ¬Ґ­вг бЇЁбЄ  */

ask([H|_]):- /* ЇаЁ ­ҐЇ®¤вўҐа¦¤Ґ­ЁЁ нҐ¬Ґ­в  ®­ § ­®бЁвбп ў Ў §г ў
ўЁ¤Ґ д Єв  false(H) ЇаҐ¤ЁЄ в®¬ assertz */
assertz(false(H)), fail.



’ҐЄбв®ўл© д ©« Ў §л ¤ ­­ле dbname.dba ЇаЁўҐ¤Ґ­ ­Ё¦Ґ.

is_a(language, tool, ["communicate"]).
is_a(hammer, tool, ["build a house", "fix a fender", "crack a nut"]).
is_a(sewing_machine, tool, ["make clothing", "repair sails"]).
is_a(plow, tool, ["prepare fields", "farm"]).

type_of(english, language, ["communicate with people"]).
type_of(prolog, language, ["communicate with a computer"]).

‚ ЇаЁўҐ¤Ґ­­®¬ ЇаЁ¬ҐаҐ Ў §  ¤ ­­ле б­ з «  § Јаг¦ Ґвбп ў ®ЇҐа вЁў­го
Ї ¬пвм, § вҐ¬ б®еа ­пҐвбп ­  ¤ЁбЄҐ,   в Є¦Ґ ¬®¦Ґв ¬®¤ЁдЁжЁа®ў вмбп ў
Їа®жҐбᥠࠡ®вл Їа®Ја ¬¬л.
ЏаЁўҐ¤Ґ¬ Ґйс ЇаЁ¬Ґа ᮧ¤ ­Ёп Ё а Ў®вл б Ў §®© ¤ ­­ле ў ўЁ¤Ґ
ЈЁЇҐа⥪бв .
Ќ® Ґб«Ё ®ЎмҐ¬ Ў §л Ў®«миҐ Ё¬Ґо饩бп Ї ¬пвЁ, в® ­Ґ®Ўе®¤Ё¬®
­ҐЇ®б।б⢥­­® бзЁвлў вм Ё § ­®бЁвм § ЇЁбЁ ­  ¬ Ј­Ёв­л© ¤ЁбЄ. ’ ЄЁҐ
Ў §л ¤ ­­ле ­ §лў ов ў­Ґи­Ё¬Ё (ў ®в«ЁзЁҐ ®в а бᬮв७­ле а ­ҐҐ
ў­гв७­Ёе). ЏаЁ н⮬ ®¤­  Ё§ Їа®бвле Ё¤Ґ© - ЁбЇ®«м§®ў вм, Ї®¬Ё¬®
⥪бв®ў®Ј® д ©«  Ў §л ¤ ­­ле, Ё­¤ҐЄб­л© д ©«, ᮤҐа¦ йЁ©  ¤аҐб  ­ 
¤ЁбЄҐ Є ¦¤®© § ЇЁбЁ (д Єв ) ⥪бв®ў®Ј® д ©«  ®в­®бЁвҐ«м­® ­ з « ,
Є®­ж  Ё«Ё ⥪г饣® Ї®«®¦Ґ­Ёп д ©«  (ЇаЁ§­ Є P=0,1,2). Љ ¦¤л©  ¤аҐб
(Ё«Ё гЄ § вҐ«м) ў Ё­¤ҐЄб­®¬ д ©«Ґ ЇаҐ¤бв ў«пҐвбп в Є¦Ґ ў ўЁ¤Ґ § ЇЁбЁ,
д®а¬ в Є®в®а®© б®ўЇ ¤ Ґв б вЁЇ®¬ real Ё § ­Ё¬ Ґв 7 Ў ©в®ў Ї«об
бЁ¬ў®«л Є®­ж  § ЇЁбЁ ў®§ўа в Є аҐвЄЁ Ё ЇҐаҐў®¤ бва®ЄЁ (\n), в.Ґ.
ўбҐЈ® 9 Ў ©в®ў. –Ґ«ЁЄ®¬ Їа®Ја ¬¬  ­  Џа®«®ЈҐ, а Ў®в ой п б ў­Ґи­Ґ©
Ў §®© ¤ ­­ле, ®ЎмҐ¬­  ¤«п ¤ ­­®Ј® ⥪бв . Џ®н⮬㠯ਢҐ¤Ґ¬ ЇаЁ¬Ґа
гбҐзҐ­­®© Їа®Ја ¬¬л, ᮤҐа¦ йҐ© ®б­®ў­лҐ ¤Ґ©бвўЁп Ї® § ЇЁбЁ, г¤ «Ґ­Ёо
Ё Їа®б¬®ваг § ЇЁбҐ© ў­Ґи­Ґ© Ў §л ¤ ­­ле.

domains
file = datafile; indexfile
name, address = string
age = integer
sex = m or f
interest = symbol
interests = interest*

/* и Ў«®­ § ЇЁбЁ = person(name, address, age, sex, interests) */

filename = string
filepos = real

database - record /* Ё¬п Ў §л ¤ ­­ле record */
person(name, address, age, sex, interests)

predicates
dbassert(record) % ¤®Ў ў«Ґ­ЁҐ § ЇЁбҐ©, assert
dbretract(record) % г¤ «Ґ­ЁҐ § ЇЁбҐ©, retract
dbread(record) % ¤®бвгЇ Є § ЇЁбп¬, acces

dbass(record, filename, filename)
dbaaccess(record, filepos)
dbret(record, filename, filename)
dbret1(record, filepos)
dbrd(record, filename, filename)

clauses
/* Ј®«®ў­лҐ ЇаҐ¤ЁЄ вл б ЇҐаҐ¬Ґ­­®© Term ЇҐаҐЁ¬Ґ­®ўлў овбп Ё
¤®Ї®«­ЁвҐ«м­® гЄ §лў овбп Ё¬Ґ­  д ©«®ў Ў §л ¤ ­­ле Ё Ё­¤ҐЄб®ў */
dbassert(Term) :- dbass(Term, "dba.ind", "dba.dat").
dbretract(Term) :- dbret(Term, "dba.ind", "dba.dat").
dbread(Term) :- dbrd(Term, "dba.ind", "dba.dat").

/* dbass ¤®Ў ў«пҐв вҐа¬ Є д ©«г Ў §л ¤ ­­ле Ё гЄ § вҐ«м ҐЈ® Ї®«®¦Ґ­Ёп
Є Ё­¤ҐЄб­®¬г д ©«г */

dbass(Term, IndexFile, DataFile) :-
/* Їа®ўҐаЄ  бгйҐбвў®ў ­Ёп д ©«®ў, Ё­ зҐ ®вЄ в */
existfile(DataFile), existfile(IndexFile), !,
/* ®вЄалвЁҐ д ©«  ¤«п ¤®Ў ў«Ґ­Ёп § ЇЁбҐ© Ё ЇаЁбў Ёў ­Ёп Ґ¬г
«®ЈЁзҐбЄ®Ј® Ё¬Ґ­Ё datafile */
openappend(datafile, DataFile),
/* ЇҐаҐ­ Їа ў«Ґ­ЁҐ ўлў®¤  ­  гбва®©бвў® (д ©«) datafile */
writedevice(datafile),
/* ЇаЁбў Ёў ­ЁҐ Pos §­ зҐ­Ёп  ¤аҐб  ­®ў®© § ЇЁбЁ ­  ¤ЁбЄҐ */
filepos(datafile, Pos, 0),
/* § ЇЁбм вҐа¬  Term ў д ©« ­  ¤ЁбЄ */
write(Term), nl,
/* § ЄалвЁҐ д ©«  datafile */
closefile(datafile),
/* ®вЄалвЁҐ д ©«  indexfile ¤«п ¤®Ў ў«Ґ­Ёп § ЇЁбҐ© */
openappend(indexfile, IndexFile),
/* ЇҐаҐ­ Їа ў«Ґ­ЁҐ ўлў®¤  ­  гбва®©бвў® (д ©«) indexfile */
writedevice(indexfile),
/* ўлў®¤ § ЇЁбЁ ў Ё­¤ҐЄб­л© д ©« д®а¬ в­л¬ writef */
writef("%7.0\n", Pos),
/* § ЄалвЁҐ Ё­¤ҐЄб­®Ј® д ©«  */
closefile(indexfile).

/* ўбҐ ⮦Ґ, ­® ЇаЁ ®вбгвбвўЁЁ д ©«®ў ®­Ё Ўг¤гв ᮧ¤ ­л ¤«п § ЇЁбЁ */
dbass(Term, IndexFile, DataFile) :-
openwrite(datafile, DataFile),
writedevice(datafile),
filepos(datafile, Pos, 0),
write(Term), nl,
closefile(datafile),
openwrite(indexfile, IndexFile),
writedevice(indexfile),
writef("%7.0\n", Pos),
closefile(indexfile).

/* ЇаҐ¤ЁЄ в dbrd ў®§ўа й Ґв вҐа¬ Ё§ Ў §л ¤ ­­ле */
dbrd(Term, IndexFile, DataFile) :-
openread(datafile, DataFile),
openread(indexfile, IndexFile),
dbaaccess(Term, -1).
/* Ї®б«Ґ ЇҐаў®Ј® ў аЁ ­в  dbrd ўбп Ў §  ¤ ­­ле бзЁв ­  Ё Ўг¤Ґв
ўлЇ®«­Ґ­ ўв®а®© ҐЈ® ў аЁ ­в Ё д ©«л Ўг¤гв § Єалвл */
dbrd(_, _, _) :-
closefile(datafile), closefile(indexfile), fail.
/* ЇҐаў®Ґ dbaaccess ­Ґ ўлЇ®«­Ёвбп, в.Є. Datpos=-1 */
dbaaccess(Term, Datpos) :-
Datpos >= 0,
/* гбв ­®ўЄ  д ©«  ­   ¤аҐб Datpos */
filepos(datafile, Datpos, 0),
/* ­ §­ зҐ­ЁҐ ўў®¤  ­  datafile Ё з⥭ЁҐ вҐа¬  Term (⥪бв®ў®© §ЇЁбЁ)
Ў §л §­ ­Ё© record Ё ЇаҐ®Ўа §®ў ­ЁҐ ҐЈ® ў®ў ў­гв७­ҐҐ ЇаҐ¤бв ў«Ґ­ЁҐ
*/
readdevice(datafile),
/* з⥭ЁҐ вҐа¬®ў ¤® Є®­ж  д ©« , Ї®б«Ґ 祣® ЇаҐ¤ЁЄ в ­Ґгᯥ襭 */
readterm(record, Term).

/* ४габЁў­®Ґ Їа ўЁ«® dbaaccess ўлЇ®«­Ёвбп, ўў®¤ ЇҐаҐЄ«озЁвбп ­ 
indexfile, Datpos1 ЇаЁбў®Ёвбп §­ зҐ­ЁҐ ®зҐаҐ¤­®© § ЇЁбЁ Ё­¤ҐЄб­®Ј®
д ©«  (>=0), в.Ґ.  ¤аҐб ЇҐаў®© § ЇЁбЁ ў д ©«Ґ Ў §л ¤ ­­ле */
dbaaccess(Term, _) :-
readdevice(indexfile),
/* ЇаЁ Є®­жҐ д ©«  ЇаҐ¤ЁЄ в ­Ґгᯥ襭 */
readreal(Datpos1),
dbaaccess(Term, Datpos1).

/* dbret г¤ «пҐв вҐа¬л (§ ЇЁбЁ) Їг⥬ ®в¬ҐвЄЁ ў Ё­¤ҐЄб­®¬ д ©«Ґ ҐЈ®
 ¤аҐб  §­ зҐ­Ёп -1 (нв® ­Ґ бва и­®, в.Є. Їа®бв  Їа®жҐ¤га  ЇҐаҐЇЁбЁ
д ©«  б г¤ «Ґ­ЁҐ¬ ®в¬ҐзҐ­­ле § ЇЁбҐ©) */

dbret(Term, Indexfile, Datafile) :-
openread(datafile, DataFile),
/* ®вЄалвЁҐ Ё­¤Ґб­®Ј® д ©«  ¤«п ¬®¤ЁдЁЄ жЁЁ */
openmodify(indexfile, IndexFile),
dbret1(Term, -1).
closefile(datafile), closefile(indexfile).



dbret1(Term, Datpos) :-
Datpos >= 0,
filepos(datafile, Datpos, 0),
readdevice(datafile),
readterm(record, Term), !,
/* ЇҐаҐў®¤ гЄ § вҐ«п Ё­¤Ґб­®Ј® д ©«  ­  ­ з «® бзЁв ­­®© § ЇЁбЁ */
filepos(indexfile, -9, 1),
/* ўлў®¤ ᮤҐа¦Ё¬®Ј® Ё§ ЎгдҐа  Ё­¤ҐЄб­®Ј® д ©«  ­  ¤ЁбЄ ¤«п
Ї®¤Ј®в®ўЄЁ § ЇЁбЁ */
flush(indexfile),
writedevice(indexfile),
/* § ЇЁбм ЇаЁ§­ Є  -1 ­  ¬Ґбв®  ¤аҐб  */
writef("%7.0\n", -1),
writedevice(screen).

/* Ї®ЁбЄ ®зҐаҐ¤­®Ј® Datpos ў Ё­¤ҐЄб­®¬ д ©«Ґ */
dbret1(Term, _) :-
readdevice(indexfile),
readreal(Datpos1),
dbret1(Term, Datpos1).

ЏаЁўҐ¤Ґ­­лҐ да Ј¬Ґ­вл ®аЈ ­Ё§ жЁЁ бЁб⥬л гЇа ў«Ґ­Ёп Ў §®© ¤ ­­ле
Є®­Ґз­® ­Ґ ЇҐаҐЄалў о⠢ᥠдг­ЄжЁЁ, ­ ЇаЁ¬Ґа, в ЄЁҐ Є Є
। ЄвЁа®ў ­ЁҐ § ЇЁбҐ©, Їа®ўҐаЄ  ¤ ­­ле, зЁб«Ґ­­лҐ Ї®¤бзҐвл,
а §«Ёз­лҐ ўЁ¤л ®взҐв®ў, ¤Ё «®Ј ­  ҐбвҐб⢥­­®¬ п§лЄҐ Ё ¤а. „«п
§­ Є®¬бвў  б в ЄЁ¬Ё ў®§¬®¦­®бвп¬Ё ¬®¦­® ®Ўа вЁвмбп Є Ёб室­®¬г ⥪бвг
Їа®Ја ¬¬л REGISTR.PRO, Є®в®а п пў«пҐвбп § Є®­зҐ­­л¬ ЇаЁ¬Ґа®¬
Ї®бв஥­Ёп ўЇ®«­Ґ ॠ«м­®© ‘“Ѓ„, ­® ў бЁ«г « Є®­Ёз­®бвЁ Џа®«®Ј  Ё¬ҐҐв
­ҐЎ®«ми®© ®ЎмҐ¬ Ё ¤®бвгЇ­  ­Ґ¤®«Ј®Ј® ¤«п Ё§г祭Ёп.
‘«Ґ¤гойЁ© и Ј ў Ї®бв஥­ЁЁ Ў § ¤ ­­ле ­  Џа®«®ЈҐ нв® ў­Ґи­ЁҐ Ў §л
¤ ­­ле б ЁбЇ®«м§®ў ­ЁҐ¬ бЇҐжЁ «м­ле бвагЄвга ¤ ­­ле -
Ї®б«Ґ¤®ў вҐ«м­®б⥩ вҐа¬®ў, ®ЎмҐ¤Ё­Ґ­­ле ў 楯м (chain), Є®в®алҐ
Ё¬ЁвЁагов в Ў«Ёжл Ё ®в­®иҐ­Ёп. ’ ЄЁҐ Ї®б«Ґ¤®ў вҐ«м­®бвЁ ¤®ЇгбЄ ов
Їаאַ© ¤®бвгЇ Є ¤ ­­л¬, ­® ­Ґ пў«повбп ­ҐЇ®б।б⢥­­®© з бвмо
Їа®Ја ¬¬л Џа®«®Ј . ђ §¬ҐйҐ­ЁҐ в ЄЁе ¤ ­­ле ў®§¬®¦­® ў д ©«Ґ ­  ¤ЁбЄҐ
(⥪бв®ў®© Ё«Ё ¤ў®Ёз­®© д®а¬Ґ) - Place = in_file, ў ®б­®ў­®© Ї ¬пвЁ -
Place = in_memory Ё ў а биЁаҐ­­®© (EMS) Ї ¬пвЁ - Place = in_ems, Ё
Ї®¤¤Ґа¦Ёў Ґвбп в ЄЁ¬Ё б।бвў ¬Ё Є Є ЎЁ­ а­лҐ ¤ҐаҐўмп (B+tree),
®ЎҐбЇҐзЁў ойЁ¬Ё Ўлбвал© Ї®ЁбЄ Ё б®авЁа®ўЄг вҐа¬®ў Ї® Є«оз ¬. Ља®¬Ґ
в®Ј® ®аЈ ­Ё§гҐвбп ¬­®Ј®Ї®«м§®ў вҐ«мбЄЁ© ¤®бвгЇ Є Ў §Ґ ¤ ­­ле.
Љ ¦¤ п ў­Ґи­пп Ў §  ¤ ­­ле, Є®в®а п ¬®¦Ґв ᮤҐа¦ вм ­ҐбЄ®«мЄ®
楯Ґ©, Ё¬Ґ­гҐвбп бЇа ў  ®в бв ­¤ ав­®Ј® ¤®¬Ґ­  ( ­ «®ЈЁз­® вЁЇг
¤®¬Ґ­  file), ­ ЇаЁ¬Ґа: db_selector = dba1; dba2;.... (Dbase). „ «ҐҐ
бв ­¤ ав­л¬Ё ЇаҐ¤ЁЄ в ¬Ё Ё¬Ґ­®ў ­­го Ў §г ¤ ­­ле ¬®¦­® ᮧ¤ вм
(db_create(Dbase, Name, Place)) Ё г¤ «Ёвм (db_delete(Name, Place)),
®вЄалвм (bd_open(Dbase, Name, Place)) Ё § Єалвм (db_close(Dbase)),
бЄ®ЇЁа®ў вм ў ¤агЈ®Ґ ¬Ґбв® (db_copy(Dbase, Name, NewPlace)) Ё
ЁбЇа ўЁвм (db_openinvalid(Dbase, Name, Place)), ўлўҐбвЁ Ё§ ЎгдҐа 
(db_flush(Dbase)) Ё Є®¬Ї Єв­® ЇаҐ¤бв ўЁвм ­  ¤ЁбЄҐ
(db_garbagecollect(Dbase)), Ї®«гзЁвм ®вЄ в®¬ ўбҐ Ё¬Ґ­  楯Ґ© Ў §л
¤ ­­ле (db_chains(Dbase, ChainName)) Ё ¬Ґ­  Ґс ¤ҐаҐўмҐў
(db_btrees(Dbase, BtreeName)) Ё, ­ Є®­Ґж, Ї®«гзЁвм бв вЁбвЁЄг ® Ў §Ґ
¤ ­­ле (db_statistics(Dbase, NoOfTerms, MemSize, DbaSize, FreeSize)).
Џа®«®Ј Є ¦¤®¬г вҐа¬г ў 楯Ё ­ §­ з Ґв гЄ § вҐ«м (database reference
number - ref), б Ї®¬®ймо Є®в®а®Ј® вҐа¬л ўл§лў овбп, г¤ «повбп,
§ ¬Ґ­повбп Ё ®ЇаҐ¤Ґ«пҐвбп б«Ґ¤гойЁ© Ё ЇаҐ¤л¤гйЁ© вҐа¬ ў 楯Ё.
“Є § вҐ«м бўп§ ­ б вҐа¬®¬ ¤® г¤ «Ґ­Ёп Ї®б«Ґ¤­ҐЈ® Ё ҐЈ® Ї®«Ґ§­®
ЁбЇ®«м§®ў вм ў ¤ҐаҐўмпе ¤«п б®авЁа®ўЄЁ Ё Ўлбва®Ј® Ї®ЁбЄ  вҐа¬®ў.
–ҐЇЁ ᮧ¤ овбп ЇаЁ ўўҐ¤Ґ­ЁЁ вҐа¬  ў ҐҐ ­ з «® (chain_inserta(Dbase,
Chain, Domain, Term, Ref)), Є®­Ґж (бhain_insertz(Dbase, Chain,
Domain, Term, Ref) Ё«Ё ўбв ўЄ®© Ї®б«Ґ вҐа¬  б § ¤ ­­л¬ гЄ § вҐ«Ґ¬
(chain_insertafter(Dbase, Domain, Ref, Term,NewRef),   г¤ «повбп
ЇаҐ¤ЁЄ в®¬ chain_delete(Dbase, Chain). Џа®б¬®ваҐвм ўбҐ вҐа¬л 楯Ё б
гЄ § вҐ«п¬Ё ¬®¦­® ЇаЁ¬Ґ­пп ®вЄ в ¤«п ЇаҐ¤ЁЄ в  chain_terms(Dbase,
Chain, Domain, Term, Ref)). ‘®®вўҐвбвўгойЁ¬Ё ЇаҐ¤ЁЄ в ¬Ё Ї®«гз ов
гЄ § вҐ«Ё ЇҐаў®Ј® вҐа¬  楯Ё (chain_first(Dbase, Chain, FirstRef)),
Ї®б«Ґ¤­ҐЈ® (chain_last(Dbase, Chain, LastRef)), б«Ґ¤го饣®
(chain_next(Dbase, Ref, NextRef)) Ё ЇаҐ¤л¤г饣® (chain_prev(Dbase,
Ref, PrevRef)). ‚ бў®о ®зҐаҐ¤м вҐа¬л (ЇаЁ ­ «ЁзЁЁ гЄ § вҐ«п) § ¬Ґ­пов
(term_replace(Dbase, domain, Ref,Term)), г¤ «пов (term_delete(Dbase,
Chain, Ref)) Ё Ї®«гз ов (ref_term(Dbase, Domain, Ref, Term)).
„ҐаҐўмп (B+tree) а §¬Ґй овбп ў­гваЁ Ў §л ¤ ­­ле Ё Є ¦¤л© ўе®¤
(н«Ґ¬Ґ­в, 㧥«) ў ­Ёе ЇаҐ¤бв ў«пҐвбп Є«о祢®© бва®Є®© Ё«Ё Є«о箬 (key
string) Ё гЄ § вҐ«Ґ¬ (ref). …б«Ё ў Ў §Ґ ЇаҐ¤гᬮв७® ¤ҐаҐў®, в® ЇаЁ
ўў®¤Ґ § ЇЁбЁ ў Ў §г ¤ ­­ле ба §г ўў®¤Ёвбп Ё Є«оз (Є«о祢 п бва®Є ),
Є в®ал© ў¬Ґбвᥠб гЄ § вҐ«Ґ¬ пў«повбп 㦥 н«Ґ¬Ґ­в®¬ Ё«Ё § ЇЁбмо Ў §л
¤ ­­ле ᮮ⢥вбвўго饣® ¤ҐаҐў . ’ Є п § ЇЁбм ¤«п 㧫  ¤ҐаҐў  пў«пҐвбп
гб«®¦­Ґ­­л¬ Ё­¤ҐЄб®¬ ¤«п § ЇЁбЁ Ё§ Ў §л ¤ ­­ле. „«п Ї®«г祭Ёп ў
®ЇаҐ¤Ґ«Ґ­­®¬ Ї®ап¤ЄҐ § ЇЁбҐ© (вҐа¬®ў) Ё§ Ў §л ­Ґ®Ўе®¤Ё¬® ­ ©вЁ Ёе
гЄ § вҐ«Ё, ¤«п 祣® Ё ­Ґ®Ўе®¤Ё¬  в Є п бвагЄвга , Є Є ¤ҐаҐў®, Є®в®а п
еа ­Ёв ў ®ЇаҐ¤Ґ«Ґ­­®¬ Ї®ап¤ЄҐ Є«озЁ Ё бўп§ ­­лҐ б ­Ё¬Ё гЄ § вҐ«Ё. ќв®
§­ зЁв, зв® ўлЎЁа п Ё§ ¤ҐаҐў  Є«озЁ ¬л ¬®¦Ґ¬ Ї®«гзЁвм ў ⮬ ¦Ґ
Ї®ап¤ЄҐ § ЇЁбЁ Ў §л ¤ ­­ле. ‚ 㧫Ґ ¤ҐаҐў  B+tree Є«оз ¬®¦Ґв Ўлвм ­Ґ
®¤Ё­ Ё, в ЄЁ¬ ®Ўа §®ў, а §ўҐвў«Ґ­Ёп Ї® ўҐвўп¬ ¬®Јгв Ўлвм ­Ґ
¤ў®Ёз­л¬Ё,   Ї® Є ¦¤¬г Є«озг, в.Ґ. Ї® ¬­®ЈЁ¬ ­ Їа ў«Ґ­Ёп¬, зв®
®зҐўЁ¤­® 㢥«ЁзЁў Ґв бЄ®а®бвм Ї®ЁбЄ . „агЈ п § ¬Ґз вҐ«м­ п
®б®ЎҐ­­®бвм ¤ҐаҐўмҐў, зв® ®­Ё, ­ е®¤пбм ў Є Є®©-в® ®¤­®© Ў §Ґ, ¬®Јгв
ᮤҐа¦ вм гЄ § вҐ«Ё ­  вҐа¬л ¤агЈ®© Ў §л ¤ ­­ле.
‚ ¤ҐаҐўҐ Є«озЁ бЈагЇЇЁа®ў ­л ў бва ­Ёжл б ®¤Ё­ Є®ўл¬Ё а §¬Ґа ¬Ё Ё
Є®«ЁзҐбвў®¬ Є«о祩, Є®в®алҐ в Є¦Ґ ¤®«¦­л Ўлвм ®¤­®Ј® а §¬Ґа  (KeyLen),
гЄ §лў Ґ¬®Ј® ЇаЁ ᮧ¤ ­ЁЁ ¤ҐаҐў  (Ґб«Ё ЇаЁ ўў®¤Ґ Є«оз  ¤«Ё­  Ў®«миҐ,
в® ®­ гᥪ Ґвбп). Љ®­Ґз­®, ¦Ґ« вҐ«м­® ўлЎЁа вм Є«озЁ ¬Ґ­м襩 ¤«Ё­л ¤«п
Ў®«ҐҐ Ўлбва®© Ёе ®Ўа Ў®вЄЁ.
ЏаЁ ᮧ¤ ­ЁЁ ¤ҐаҐў  гЄ §лў Ґвбп Є®«ЁзҐбвў® Є«о祩 ў 㧫Ґ (Order),
­ ЇаЁ¬Ґа, 4 (Ё«Ё ¤® 8), ­® нв® зЁб«® «гзиҐ ®Є®­з вҐ«м­® ®ЇаҐ¤Ґ«Ёвм
Ї®§¦Ґ ЇаЁ нЄбЇҐаЁ¬Ґ­вҐ, Є Є Є®¬Їа®¬Ёбб ¬Ґ¦¤г ¤«Ё­®© Є«о祩, Ёе зЁб«®¬
Ё ЎлбвதҐ©бвўЁҐ¬ Є®¬ЇмовҐа  - bt_create(Dbase, BtreeName, Btree_Sel,
KeyLen, Order [,Dupl]), §­ зҐ­ЁҐ Btree_Sel - д®а¬ЁагҐвбп ў­гв७­Ё¬Ё
 «Ј®аЁв¬ ¬Ё Џа®«®Ј  Ё ЁЈа Ґв а®«м «®ЈЁзҐбЄ®Ј® Ё¬Ґ­Ё д ©« , ЇаЁ
®вбгвбвўЁЁ Dupl Ё«Ё Dupl=0 § ЇаҐй овбп ®¤Ё­ Є®ўлҐ Є«озЁ, ЇаЁ Dupl=1
¤®ЇгбЄ овбп Ї®ўв®ал Є«о祩, ­® Ёе г¤ «Ґ­ЁҐ ­г¦­® ¤Ґ« вм ў¬Ґб⥠б
гЄ § вҐ«Ґ¬. C®§¤ ­­®Ґ а ­ҐҐ ¤ҐаҐў® ®вЄалў Ґвбп б гЄ § ­ЁҐ¬ Ё¬Ґ­Ё Ў §л
Ё бў®ҐЈ® Ё¬Ґ­Ґ¬(bt_opene(Dbase, Btree_Name, Btree_Sel), § Єалў Ґвбп б
гЄ § ­ЁҐ Ё¬Ґ­Ё Ў §л Ё «®ЈЁзҐбЄ®Ј® Ё¬Ґ­Ё (bt_close(Dbase, Btree_Sel),
  г¤ «пҐвбп б гЄ § ­ЁҐ¬ Ё¬Ґ­Ё Ў §л Ё ¤ҐаҐў  (bt_delete(Dbase,
BtreeName)). Ља®¬Ґ в®Ј®, ў®§¬®¦­® ¬­®Ј®Єа в­®Ґ ®вЄалвЁҐ ¤ҐаҐў  ¤«п
®¤­®ўаҐ¬Ґ­­®Ј® Ї®«г祭Ёп а §«Ёз­ле ў аЁ ­в®ў ўе®¤  ў Ў §г ¤ ­­ле
(bt_copyselector(Dbase, OldBtree_sel, NewBtree_Sel)).
Љ«озЁ ўў®¤пвбп Ё г¤ «повбп Ё§ ¤ҐаҐў  ў¬Ґб⥠б гЄ § вҐ«п¬Ё -
key_insert(Dbase, Btree_Swl, Key, Ref), key_delete(Dbase, Btree_Sel,
Key, Ref).
€§ ¤ҐаҐў  ¬®¦Ґв ўлЎЁа вмбп ЇҐаўл©, Ї®б«Ґ¤­Ё© Ё гЄ § вҐ«Ё б
ᮮ⢥вбвўгойЁ¬ Є«о箬 - key_first(Dbase, Btree_Sel, Ref),
key_last(Dbase, Btree_Sel, Ref), key_search(Dbase, Btree_Sel, Key,
Ref),   ЇаЁ ­ҐгбЇҐи­®¬ Ї®ЁбЄҐ § ¤ ­­®Ј® Є«оз  Ў«Ё¦ ©иЁ©
ЇаҐ¤иҐбвўгойЁ© ¬®¦­® Ї®«гзЁвм б Ї®¬®ймо ЇаҐ¤ЁЄ в  key_current(Dbase,
Btree_Sel, Key, Ref).
ђ бᬮваЁ¬ ЇаЁ¬Ґа Їа®Ја ¬¬л б да Ј¬Ґ­в ¬Ё а Ў®вл ‘“Ѓ„ - ўў®¤®¬,
§ ¬Ґ­®© Ё г¤ «Ґ­ЁҐ¬ § ЇЁбҐ©.

domains /* вҐа¬л ¤«п ¤гЎ«Ёа®ў ­Ёп ¤Ґ©бвўЁ© б Ў §®© ¤ ­­ле ­  б«гз ©
®вЄ §  вҐе­ЁЄЁ */
logdom = insert(relation,dbdom,ref);
replace(relation,dbdom,ref,dbdom);
erase(relation,ref,dbdom)

predicates /* ЇаҐ¤ЁЄ в ¤гЎ«Ёа®ў ­Ёп ¤ ­­ле */
logdbchange(logdom)

clauses /* ў Ў §г ¤ ­­ле logdba 楯м logchain § ­®бпвбп вҐа¬л LogTerm
вЁЇ  logdom Ё ЎгдҐа ба §г § ­®бЁвбп ў д ©« Ў §л ¤ ­­ле */
logdbchange(Logterm):-
chain_insertz(logdba,logchain,logdom,Logterm,_),
db_flush(logdba).

domains /* ®ЇЁб ­л вҐа¬ вЁЇ  dbdom ¤«п city Ё person */
dbdom = city(zipcode, cityname);
person(firstname, lastname, street, zipcode, code)
zipcode, cityname, firstname, lastname = string
street, code = string
indexName = person_name; person_adr; city_no /* Ё¬Ґ­  Є«о祩 */
relation = city; person /* Ё¬Ґ­  ®в­®иҐ­Ё© */
db_selector = dba; logdba /* ¤ўҐ ў­Ґи­Ёе Ў §л ¤ ­­ле */

database
indices(IndexName, bt_selector)
/* ў­гв७­пп Ў §  ¤ ­­ле ᮤҐа¦Ёв § ЇЁбЁ б Ё¬Ґ­Ґ¬ Є«оз  (®¤­Ё¬ Ё§
ваҐе) Ё «®ЈЁзҐбЄЁ¬ (ў­гв७­Ё¬) Ё¬Ґ­Ґ¬ ¤ҐаҐў  */
*/
predicates
xname(FirstName, LastName, string)
/* ЇаҐ¤ЁЄ в ®ЎмҐ¤Ё­пҐв ЇҐаў®Ґ (10) Ё ўв®а®Ґ Ё¬п (20) ў бва®Єг Ё§ 30
бЁ¬ў®«®ў, в.Ґ. ў Є«оз (Ё­¤ҐЄбб Ё¬Ґ­Ґ¬ person_name) */

clauses /* ®ЎмҐ¤Ё­Ґ­ЁҐ ¤ўге бва®Є ў ®¤­г */
xname(F, L, S) :- str_len(L, LEN), LEN>20, !,
frontstr(20, L, L1, _), format(S, "%-20%", L1, F).
xname(F, L, S) :- format(S, "%-20%", L, F).

predicates /* ЇаҐ¤ЁЄ вл ўў®¤ , § ¬Ґ­л Ё г¤ «Ґ­Ёп § ЇЁбҐ© Ѓ„ c
ᮮ⢥вбвўгойЁ¬Ё Ё¬Ґ­ ¬Ё ®в­®иҐ­Ё© */
dba_insert(relation, dbdom)
dba_replace(relation, dbdom, Ref)
dba_erase(relation, Ref)

clauses /* §­ зҐ­ЁҐ Term Ї®бвгЇ Ґв ­  ўе®¤ */
dba_insert(person, Term) :- !, /* ўў®¤ ®в­®иҐ­Ёп person ў 楯м
person */
break(OldBreak), /* § Ї®¬Ё­ ­ЁҐ бв а®Ј® б®бв®п­Ёп break */
break(off), /* § ЇаҐв ЇаҐалў ­Ёп ЇаЁ ўў®¤Ґ ¤ ­­ле */
indices(person_name, I1), /* ®ЇаҐ¤Ґ«Ґ­ЁҐ Ё¬Ґ­Ё ¤ҐаҐў  */
indices(person_adr, I2), !, /* Ё¬п ўв®а®Ј® ¤ҐаҐў  Ё ®вбҐзҐ­ЁҐ */
Term = person(Fname, Lname, Adr, _, _), /* ®§­ зЁў овбп
ЇҐаҐ¬Ґ­­лҐ */
xname(Fname, Lname, Xname), /* ®§­ зЁў Ґвбп Xname */
chain_insertz(dba, person, dbdom, Term, Ref), /* ўў®¤ вҐа¬ 
ў 楯м person Ё Ї®«г祭ЁҐ гЄ § вҐ«п Ref */
key_insert(dba, I1, Xname, Ref), /* ‚ў®¤ ў ¤ҐаҐў® I1 Є«оз 
Xname Ё гЄ § вҐ«п Ref */
key_insert(dba, I2, Adr, Ref), /* ўў®¤ ў ¤ҐаҐў® I2 Є«оз  Adr Ё
гЄ § вҐ«п Ref ¤«п § ЇЁбЁ ® ЇҐаб®­Ґ */
db_flush(dba), /* ЎгдҐа ў д ©« ­  ¤ЁбЄҐ */
logdbchange(insert(person, Term, Ref)), /* १Ґаў­л© ўў®¤ */
break(OldBreak). /* ў®ббв ­®ў«Ґ­ЁҐ break */

dba_insert(city, Term) :- /* ўў®¤ Ё§ ®в­®иҐ­Ёп city ў 楯м city */
break(OldBreak),
break(off),
indices(city_no, I), !,
Term = city(ZipCode, _),
chain_insertz(dba, city, dbdom, Term, Ref),
key_insert(dba, I, ZipCode, Ref), /* ўў®¤ ў ¤ҐаҐў® I Є«оз 
ZipCode Ё гЄ § вҐ«п Ref ¤«п § ЇЁбЁ ® Ј®а®¤Ґ */
db_flush(dba),
logdbchange(insert(city, Term, Ref)),
break(OldBreak).

dba_replace(person, NewTerm, Ref) :- !, /* § ¬Ґ­  ў 楯Ё person ­ 
­®ўл© вҐа¬ NewTerm б гЄ § вҐ«Ґ¬ Ref */
break(OldBreak),
break(off),
indices(person_name, I1),
indices(person_adr, I2), !,
ref_term(dba, dbdom, Ref, OldTerm), /* з⥭ЁҐ бв а®Ј® вҐа¬  */
OldTerm = person(OldFname, OldLname, OldAdr, _, _),
xname(OldFname, OldLname, OldXname), /* бв ал© Є«оз */
key_delete(dba, I1, OldXname, Ref), /* г¤ «Ґ­ЁҐ бв але Є«о祩 */
key_delete(dba, I2, Oldadr, Ref), /* Ё гЄ § вҐ«Ґ© */
NewTerm = person(NewFname, NewLname, NewAdr, _, _),
xname(NewFname, NewLname, NewXname),
term_replace(dba, dbdom, Ref, NewTerm), /* § ¬Ґ­  вҐа¬  */
key_insert(dba, I1, NewXname, Ref), /* ўў®¤ ­®ўле Є«о祩 */
key_insert(dba, I2, NewAdr, Ref), /* Ё гЄ § вҐ«Ґ© */
db_flush(dba),
logdbchange(replace(person, NewTerm, Ref, OldTerm)),
break(OldBreak).

dba_replace(city, NewTerm, Ref) :- !, /* § ¬Ґ­  § ЇЁбЁ ў 楯Ё city
­  ­®ўл© вҐа¬/*
break(OldBreak),
break(off),
indices(city_no, I), !, /* Ё¬п ¤ҐаҐў  I */
ref_term(dba, dbdom, Ref, OldTerm), /* з⥭ЁҐ бв а®Ј® вҐа¬  */
OldTerm = city(OldZipCode, _),
key_delete(dba, I, OldZipCode, Ref), /* г¤ «Ґ­ЁҐ Є«оз  */
NewTerm = city(ZipCode, _),
term_replace(dba, dbdom, Ref, NewTerm), /* § ¬Ґ­  вҐа¬  */
key_insert(dba, I, ZipCode, Ref), /* ўў®¤ Є«оз  */
db_flush(dba),
logdbchange(replace(city, NewTerm, Ref, OldTerm)),
break(OldBreak).

dba_erase(person, Ref) :- !, /* г¤ «Ґ­ЁҐ § ЇЁбЁ ў 楯Ё person */
break(OldBreak),
break(off),
indices(person_name, I1), /* Ё¬Ґ­  ¤ҐаҐўмҐў I1 Ё I2 */
indices(person_adr, I2), !,
ref_term(dba, dbdom, Ref, OldTerm), /* з⥭ЁҐ вҐа¬  */
OldTerm = person(OldFname, OldLname, OldAdr, _, _),
xname(OldFname, OldLname, OldXname), /* бв ал© Є«оз */
key_delete(dba, I1, OldXname, Ref), /* г¤ «Ґ­ЁҐ Є«о祩 */
key_delete(dba, I2, OldAdr, Ref),
term_delete(dba, person, Ref), /* г¤ «Ґ­ЁҐ вҐа¬  */
db_flush(dba),
logdbchange(erase(person, Ref, OldTerm)),
break(OldBreak).

dba_erase(city, Ref) :- /* г¤ «Ґ­ЁҐ § ЇЁбЁ ў 楯Ё city */
break(OldBreak),
break(off),
indices(city_no, I), !, /* Ё¬п ¤ҐаҐў  I */
ref_term(dba, dbdom, Ref, OldTerm),
OldTerm = city(OldZipCode, _),
key_delete(dba, I, OldZipCode, Ref), /* г¤ «Ґ­ЁҐ Є«оз  */
term_delete(dba, city, Ref), /* г¤ «Ґ­ЁҐ вҐа¬  */
db_flush(dba),
logdbchange(erase(city, Ref, OldTerm)),
break(OldBreak).


6. ЋЎйҐ­ЁҐ б Є®¬ЇмовҐа®¬ ­  ҐбвҐб⢥­­®©¬ п§лЄҐ.

ЋЎйҐ­ЁҐ б Є®¬ЇмовҐа®¬ ­  ҐбвҐб⢥­­®¬ п§лЄҐ ®¤­  Ё§ ваг¤­Ґ©иЁе
Їа®Ў«Ґ¬ €€. Џа ЄвЁзҐбЄЁ б нвЁ¬ бўп§ ­л в ЄЁҐ § ¤ зЁ, Є Є ¬ иЁ­­л©
ЇҐаҐў®¤, ®ЎйҐ­ЁҐ б а®Ў®в ¬Ё, ўў®¤ § Їа®б®ў Ё д®а¬Ёа®ў ­ЁҐ ®вўҐв®ў Ў §
¤ ­­ле Ё ап¤ ¤агЈЁе § ¤ з.
ђ бᬮваЁ¬ ¤ў  Ё§ўҐбв­ле ¬Ґв®¤  -  ­ «Ё§ Є«о祢ле б«®ў Ё
ЄЄ®­вҐЄбв­®-бў®Ў®¤­лҐ (Љ‘) Ја ¬¬ вЁЄЁ, Є®в®алҐ ¤®бв в®з­® « Є®­Ёз­®
Ё««обваЁаговбп ­  ¬®й­ле б।бвў е Џа®«®Ј , ўЇЁв ўиҐЈ® ®Їлв
¬ ­ЁЇг«Ёаў ­Ёп б® б«®ў ¬Ё Ё ЇаҐ¤«®¦Ґ­Ёп¬Ё г в Є®Ј® п§лЄ , Є Є LISP.
Ђ­ «Ё§ Є«о祢ле б«®ў б®бв®Ёв ў а §Ў®аҐ ЇаҐ¤«®¦Ґ­Ё© ­  ЇаҐ¤¬Ґв
­ «ЁзЁп Є«о祢ле б«®ў Ё§ Ё¬Ґо饣®бп б«®ў ап Ё ­Ґ ®вб«Ґ¦Ёў Ґв бўп§Ё
¬Ґ¦¤г б«®ў ¬Ё. ђ §ЎЁа п ўўҐ¤Ґ­­®Ґ 祫®ўҐЄ®¬ ЇаҐ¤«®¦Ґ­ЁҐ ЇаЁ н⮬
¬Ґв®¤Ґ ўл¤Ґ«повбп б«®ў  (Є«о祢лҐ) Ё«Ё Ёе б®зҐв ­Ёп, Є®в®алҐ ¬®Јгв
Ўлвм ЁбЇ®«м§®ў ­л ¤«п ®Ўа йҐ­Ёп Є Ў §Ґ ¤ ­­ле. ’ Є ®¤­Ё б«®ў  ¬®Јгв
Ёбв «Є®ўлў вмбп Є Є § Їа®б,   ¤агЈЁҐ Є Є з бвЁз­л© ЇаЁ§­ Є
§ Їа иЁў Ґ¬ле ¤ ­­ле. …б«Ё ЇаЁ­пвм, зв® бвагЄвга  ўе®¤­®Ј®
ЇаҐ¤«®¦Ґ­Ёп ­Ґ ў«ЁпҐв ­  ўлЎ®а ЁбЇ®«м§®ў ­­ле б«®ў Ё «Ёим ­ҐбЄ®«мЄ®
б«®ў ў«Ёпов ­  Є®«ЁзҐбвў® Ё ўЁ¤ § Їа иЁў Ґ¬®© Ё­д®а¬ жЁЁ, в® ЇаЁ
Ї®бв஥­ЁЁ Їа®Ја ¬¬л д®а¬Ёа®ў ­Ёп § Їа®б  Є Ѓ„ ­Ґ®Ўе®¤Ё¬® аҐи вм ваЁ
§ ¤ зЁ - ўў®¤ Є®¬ ­¤л Ё§ бва®ЄЁ бЁ¬ў®«®ў, ЇаҐ®Ўа §®ў ­ЁҐ ҐҐ ў бЇЁб®Є
б«®ў Ё Ё¤Ґ­вЁдЁЄ жЁп нвЁе б«®ў (б®Ї®бв ў«Ґ­ЁҐ б бгйҐбвўго饩 Ѓ„). ЏаЁ
а®б⥠а бЇ®§­ ў Ґ¬ле Є«о祢ле б«®ў Ё§ Ѓ„ г¤ бвбп Ё§ў«ҐЄ вм Ў®«ҐҐ
®ЇаҐ¤Ґ«Ґ­­го Ё Ї®¤а®Ў­го Ё­д®а¬ жЁо ® § Їа®бҐ Є Є®¬ЇмовҐаг.
ЏаЁўҐ¤Ґ¬ ЇаЁ¬Ґа в Є®© Їа®Ја ¬¬л.


/* Їа®Ја ¬¬  ®ЇаҐ¤Ґ«Ґ­Ёп Є«о祢ле б«®ў */
domains
str_list = symbol*
str = string
p_name, t_name, pos, height, college = string
p_number, weight, nfl_exp = integer

database /* Ў §  ¤ ­­ле ЁЈа®Є®ў дгвЎ®«­ле Є®¬ ­¤ */
dplayer(p_name, t_name, p_number, pos,
height, weight, nfl_exp, college)
predicates
repeat do_query assert_database
clear_database
player(p_name, t_name, p_number, pos,
height, weight, nfl_exp, college)
convers(string, str_list)
first_element(str_list, string)
last_element(str_list, string)
access_database(string)
seach_player(string)
do_right_form(string, string)
keyword(string)

goal do_query. /* жҐ«м Їа®Ја ¬¬л */

clauses
repeat :- true; repeat.
/* ¤Ў ў«Ґ­ЁҐ § ЇЁбЁ ў Ѓ„ */
assert_database :- player(P_name, T_name, P_number,
Pos, Ht, Wt, Exp, College),
assertz(dplayer(P_name, T_name, P_number, Pos,
Ht, Wt, Exp, College)), fail.
assert_database :-!.
/* г¤ «Ґ­ЁҐ Ё§ Ѓ„ */
clear_database :- retract(dplayer(_,_,_,_,_,_,_,_)), fail.
clear_database :- !.
/* c®§¤ ­ЁҐ бЇЁбЄ  Ё§ б«®ў ЇаҐ¤«®¦Ґ­Ёп */
convers(Str, [Head|Tail]) :-
fronttoken(Str, Head, Str1), !, convers(Str1,Tail).
convers(_,[]).
/* ўл¤Ґ«Ґ­ЁҐ ЇҐаў®Ј® ¬ Ї®б«Ґ¤­ҐЈ® б«®ў  */
first_element ([Head|_],Fname):- Fname=Head.
last_element([Head], last_element) :-
Last_element=Head.
last_element([_|T],Last_element):-
last_element(T,Last_element).
access_database(Lname):- seach_player(Lname).
/* ўлЎ®аЄ  § ЇЁбҐ© Ё§ Ѓ„ б ®вЄ в®¬ */
seach_player(Lname):-
dplayer(Name, Team, Number, Position,
Height, Weight, NFl_Exp, College),
Team_name = Name,
convers(Team_name, Dlist),
last_element(Dlist, Dname),
/* Їа®ўҐаЄ  ­  б®ўЇ ¤Ґ­ЁҐ Ї®б«Ґ¤­ҐЈ® б«®ў  б Ѓ„ */
Lname= Dname, nl,
/* ўлў®¤ ¤ ­­ле */
write("Џ®¤Ј®в®ўЄ  Ё­д®а¬ жЁЁ:"), nl,nl,
write(" ",Name," ЁЈа®Є ", Team," Є®¬ ­¤л."),nl,
write(" “Ј® ­®¬Ґа -", Number," Ё ®­ ", Position,"."),
nl,write("…Ј® ўҐб Ё а®бв ",Weight," Ё ",Height," f."),nl,
write("Ћ­ Ё¬ҐҐв ",NFL_Exp," «Ґв ®Їлв  NFL."),
nl,write(" Ћ­ ўлЇгбЄ­ЁЄ ",College,"."),nl,!.
seach_player(_):- nl,nl,
write(" ќв®в ЁЈа®Є ®вбгвбвўгҐв ў Ѓ„."),nl.

do_query:- /* ЇҐаҐў®¤ д Єв®ў ў ў­гв७­оо Ў §г ¤ ­­ле */
assert_database,
makewindow(1,7,7,"",0,0,25,80),
makewindow(2,7,7,"",1,3,4,71),
cursor(1,22), write(" ”“’ЃЋ‹њЌЂџ ЃЂ‡Ђ „ЂЌЌ›•"),
makewindow(3,7,7,"‚ў®¤ Ё­д®а.",6,3,6,37),
repeat,
nl, write(" ‚®Їа®б: "),
cursor(3,2), readln(Sentence), /* ўў®¤ § Їа®б  */
makewindow(4,7,7,"‘ЇЁб®Є",6,42,6,32),
convers(Sentence, List), /* ®Ўа §®ў ­ЁҐ бЇЁб®Є б«®ў */
first_element(List,Kname), /* ЇҐаў®Ґ б«®ў® */
last_element(List,Lname), /* Ї®б«Ґ¤­ҐҐ б«®ў® */
do_right_form(Kname,Lname), clear_database.

do_right_form(Kname,Lname):-
/* Їа®ўҐаЄ  ­  б®ўЇ ¤Ґ­ЁҐ б Є«озҐўл¬ б«®ў®¬ */
keyword(Kname),
nl, write("Љ‹ћ—…‚Ћ… ‘‹Ћ‚Ћ"),nl,
nl,write(" ",Kname," ",Lname),
makewindow(5,7,7," „ ­­лҐ ® ЁЈа®ЄҐ",12,3,12,71),
/* Їа®ўҐаЄ  ­ «ЁзЁп Ї®б«Ґ¤­ҐЈ® б«®ў  ў Ѓ„ */
access_database(Lname),
nl, write("‹оЎ п Є« ўЁи "), readchar(_),
removewindow, gotowindow(4),
removewindow, gotowindow(3),
clearwindow, !, fail.
/* Їа®ўҐаЄ  Є®­ж  а Ў®вл */
do_right_form(Kname,_):- Kname="Q", !, exit.
/* б®®ЎйҐ­ЁҐ ® ­Ґг¤ зЁ Ё Їа®¤«¦Ґ­ЁҐ */
do_right_form(Kname,_):-
nl,write("ќв® Є«оз. б«. ­ҐЁ§ўҐбв­®:"),nl,
nl,write(" ",Kname), nl,
write(" ‹оЎ п Є« ў. Їа®¤®«."), readchar(_),
removewindow, clearwindow, !, fail.
/* Їа®ўҐаЄ  ­  Є«озҐўлҐ б«®ў  */
keyword(Key):- /*upper_lower(Upkey,Key),*/ Upkey="Љв®",!.
keyword(Key):- /* upper_lower(Upkey,Key),*/ Upkey="ѓ¤Ґ",!.
keyword(Key):- /* upper_lower(Upkey,Key),*/ Upkey="Љ®Ј¤ ",!.
/* д Євл Ѓ„ */
player("‚®ў  ЏҐва®ў","‘Ї ав Є",13,"‹Џ€","6-3",215,4,"ЏҐва").
player("’®«п •®е«®ў","„Ё­ ¬®",95,"‹ѓ“","6-5",263,4,"‚лЎ").
player("‘ и  „га®ў","Ља.‘®ў.",19,"‹€ЂЏ","6-5",210,2,"–Ґ­в").
player("ѓҐ­  “¬­®ў","‡Ґ­Ёв",84,"‹€€†’","6-6",235,8,"ЉЁа").
player("‚Ёвп ‘аҐ¤­Ґў","‚®¤­ЁЄ",16,"‹ќ’€","6-4",223,7,"‘¬®«").



‚в®а®© ¬Ґв®¤ - Љ‘- ­ «Ё§ Ї®¤а §г¬Ґў Ґв ­ «ЁзЁҐ ­ҐЄ®в®але Їа ўЁ«
ў­гв७­Ґ© Є®­бвагЄжЁЁ ЇаҐ¤«®¦Ґ­Ёп, Ё¬Ґ­гҐ¬ле Ја ¬¬ вЁЄ®©, ў ®в«ЁзЁҐ
®в Є®­вҐЄбв­®-§ ўЁбЁ¬®Ј®  ­ «Ё§ , Ј¤Ґ бвагЄвга  ЇаҐ¤«®¦Ґ­Ёп § ўЁбЁв
®в Є®­вҐЄбв , ў Є®в®а®¬ ­ е®¤Ёвбп да §  п§лЄ . Ћ¤­ Є® ЉC Ја ¬¬ вЁЄЁ,
®ЇЁблў п ў­гв७­оо бвагЄвга㠯।«®¦Ґ­Ёп, ¤®бв в®з­® Їа®бв®
®ЇЁблў овбп г⢥তҐ­Ёп¬Ё Џа®«®Ј , Ё § ¤ з  а бЇ®§­®ў ­Ёп ЇаҐ¤«®¦Ґ­Ёп
бў®¤Ёвбп Є ¤®Є § вҐ«мбвўг г⢥তҐ­Ё© - Їа ўЁ« б®бв ў«Ґ­Ёп
ЇаҐ¤«®¦Ґ­Ё©. ‚®®ЎйҐ Їа ўЁ« б®бв ў«Ґ­Ёп ЇаҐ¤«®¦Ґ­Ё© ¬®¦Ґв Ўлвм ¬­®Ј®,
­® ¤ ¦Ґ ба ў­ЁвҐ«м­® Їа®бвлҐ Їа ўЁ«  Ї®§ў®«пов  ­ «Ё§Ёа®ў вм ¤®ў®«м­®
иЁа®ЄЁ© бЇҐЄва ॠ«м­ле ЇаҐ¤«®¦Ґ­Ё©.
‘ в®зЄЁ §аҐ­Ёп Љ‘- ­ «Ё§  ЇаҐ¤«®¦Ґ­Ёп ¬®¦­® а бб¬ ваЁў вм Є Є ­ҐЄЁ©
бЇЁб®Є б«®ў, Є®в®ал© а §¤Ґ«пҐвбп, ­ ЇаЁ¬Ґа, ­  ЈагЇЇг
бгйҐб⢨⥫쭮Ј® Ё ЈагЇЇг Ј« Ј®« , в.Ґ.

ЇаҐ¤«®¦Ґ­ЁҐ = ЈагЇЇ  бгйҐб⢨⥫쭮Ј®, ЈагЇЇ  Ј« Ј®« 

„Ґв «Ё§Ёагп ¤ «миҐ Ї®«гзЁ¬ б«Ґ¤гойЁҐ ¬®¤Ґ«Ё

ЈагЇЇ  бгйҐб⢨⥫쭮Ј® =
= [®ЇаҐ¤Ґ«Ґ­ЁҐ,][ЇаЁ« Ј вҐ«м­®Ґ,] бгйҐб⢨⥫쭮Ґ| ¬Ґбв®Ё¬Ґ­ЁҐ

ЈагЇЇ  Ј« Ј®«  =
= [­ аҐзЁҐ,][ ­ҐЇҐаҐе®¤­л© Ј« Ј®« | [­ аҐзЁҐ,] ЇҐаҐе®¤­л© Ј« Ј®«,
ЈагЇЇ  бгйҐб⢨⥫쭮Ј®

‚ бЄ®ЎЄ е бв®пв ­Ґ®Ўп§ вҐ«м­лҐ з«Ґ­л ЇаҐ¤«®¦Ґ­Ёп,   | а §¤Ґ«пҐв
 «мвҐа­ вЁўл. Ѓ®«миЁ­бвў® ЇаҐ¤«®¦Ґ­Ё© 㦥 ᮮ⢥вбвўгов нв®© ¬®¤Ґ«Ё,
зв® Ї®§ў®«пҐв Є Є  ­ «Ё§Ёа®ў вм, в Є Ё б®бв ў«пвм Їа ўЁ«м­лҐ
ЇаҐ¤«®¦Ґ­Ёп, Є®­Ґз­® ЇаЁ ­ «ЁзЁЁ ­ҐЄ®в®а®Ј® ­ Ў®а  ᮮ⢥вбвўгойЁе
бгйҐб⢨⥫м­ле, Ј« Ј®«®ў Ё ¤а.
„®бв в®з­® Їа®бв® ўлЈ«п¤Ёв да Ј¬Ґ­в Їа®Ја ¬¬л Їа®ўҐаЄЁ бвагЄвгал
ЇаҐ¤«®¦Ґ­Ёп, ­ ЇаЁ¬Ґа, Ё§ ваҐе б«®ў (вЁЇ  "Њ и  «оЎЁв Є иг").
ЏаҐ¤Ї®«®¦Ё¬, зв® бгйҐбвўгов д Євл Ё«Ё Ў §  ¤ ­­ле ¤«п бгйҐб⢨⥫м­ле
noun(N1) Ё Ј« Ј®«®ў - verb(N2) Ё зв® б«®ў  ЇаҐ¤«®¦Ґ­Ёп 㦥 ᢥ¤Ґ­л ў
бЇЁб®Є S. ’®Ј¤  Їа ўЁ«® Їа®ўҐаЄЁ test(S):- test([N1,N2,N3])
Їа ўЁ«м­®бвЁ в Є®Ј® ЇаҐ¤«®¦Ґ­Ёп Ўг¤Ґв ўлЈ«п¤Ґвм в Є:

test([N1,N2,N3]):- noun(N1), verb(N2), noun(N3),!.
test(_):- nl, write(" ЌҐЇа ўЁ«м­®Ґ ЇаҐ¤«®¦Ґ­ЁҐ").

…бвҐб⢥­­®, ¬®¦­® бва®Ёвм Ў®«ҐҐ б«®¦­лҐ ў аЁ ­вл в Є®Ј®
«ҐЄбЁзҐбЄ®Ј® а §Ў®а  ЇаҐ¤«®¦Ґ­Ё©, Є Є, ўЇа®зҐ¬, Ё ᨭ⥧ . Ќ ЇаЁ¬Ґа,
¬®¦­® ЇаҐ¤«®¦Ёвм в Є®© ў аЁ ­в ЇаҐ¤ЁЄ в  test(S,S1,S2):-
append(S1,S2,S), noun_phrase(S1), verb_phrase(S2) ¤«п а §ЎЁўЄЁ бЇЁбЄ 
­  ЈагЇЇл бгйҐб⢨⥫쭮Ј® Ё Ј« Ј®« . …йҐ ®¤Ё­ ў аЁ ­в test(S,S1,S2):-
append(SX,SY,S), append(S1,S2,SX), noun_phrase(S1), verb_phrase(S2),
noun_phrase(SY) а §ЎЁў Ґв ЇаҐ¤«®¦Ґ­ЁҐ ба §г ­  ваЁ ЈагЇЇл (Ґб«Ё ®­Ё
Ґбвм). Ћ¤­ Є® нвЁ ў аЁ ­вл Їа®ЁЈалў ов ў® ўаҐ¬Ґ­Ё ॠ«Ё§ жЁЁ, в.Є.
дўЄвЁзҐбЄЁ бў®¤пв аҐиҐ­ЁҐ Є ЇҐаҐЎ®аг. Џ®н⮬㠯।Ї®звЁвҐ«Ґ­ ЇаЁҐ¬
 ­ «Ё§  Ї® Ї а ¬ а §«ЁзЁ©, Є®Ј¤  ®ЎмҐЄв (бЇЁб®Є б«®ў ЇаҐ¤«®¦Ґ­Ёп)
ўбҐЈ¤  а бб¬ ваЁў Ґвбп Є Є ¤ў  бЇЁбЄ  - бЇЁб®Є ЁбЄ®¬®© ЈагЇЇл Ё
®бв «м­ п з бвм бЇЁбЄ  (еў®бв). Ќ ЇаЁ¬Ґа, ЇаҐ¤ЁЄ в np(S0,S):-
determiner(S0,S1), backnp1(S1,S). ў Ёб室­®¬ бЇЁбЄҐ S0 ­ е®¤Ёв
®ЇаҐ¤Ґ«ЁвҐ«м,   еў®бв бЇЁбЄ  S1 Ґбвм  аЈг¬Ґ­в ЇаҐ¤ЁЄ в  backnp1. ‚
бў®о ®зҐаҐ¤м Їа ўЁ«® backnp(S1,S):- adjecnive(S0,S1), backn2(S1,S).
­ е®¤Ёв ў бЇЁбЄҐ S1 ЇаЁ« Ј вҐ«м­®Ґ (adjecnive) Ё еў®бв S,   Їа ўЁ«®
back(S0,S):- noun(S0,S). ў® ўе®¤­®¬ бЇЁбЄҐ S0 ­ е®¤Ёв бгйҐб⢨⥫쭮Ґ
Ё еў®бв S. €б室­л© ЇаҐ¤ЁЄ в np(S0,S1) гᯥ襭, Ґб«Ё ў бЇЁбЄҐ S0
Ї®б«Ґ¤®ў вҐ«м­® ­ ©¤гвбп ®ЇаҐ¤Ґ«ЁвҐ«м, ЇаЁ« Ј вҐ«м­®Ґ Ё
бгйҐб⢨⥫쭮Ґ,   бЇЁб®Є S ЇаҐ¤бв ўЁв ®бв ўигобп з бвм ЇаҐ¤«®¦Ґ­Ёп.
…б«Ё ЇаҐ¤ЁЄ в ­Ґгᯥ襭, в® ­ «Ёж® ­Ґб®®вўҐвбвўЁп Ёб室­®Ј®
ЇаҐ¤«®¦Ґ­Ёп Їа ўЁ« ¬ Ја ¬¬ вЁЄЁ. Џгбв®© бЇЁб®Є S Ґбвм ЇаЁ§­ Є Є®­ж 
а §Ў®а  ЇаҐ¤«®¦Ґ­Ёп.
‘®Ј« б®ў ­ЁҐ ў зЁб«Ґ ¬Ґ¦¤г Ї®¤«Ґ¦ йЁ¬ Ё бЄ §гҐ¬л¬ (®­Ё ¤®«¦­л Ўлвм
ў ®¤Ё­ Є®ў®¬ зЁб«Ґ) ®ЇаҐ¤Ґ«пҐвбп бв ­¤ ав­® Їг⥬ ᮧ¤ ­Ёп ¤ўге
ў аЁ ­в®ў Їа ўЁ« ¤«п Ґ¤Ё­б⢥­­®Ј® Ё ¬­®¦ЁвҐ«м­®Ј® зЁб«  Ё ¤ўге
ў аЁ ­в®ў Є«о祢ле б«®ў ў Ў §Ґ ¤ ­­ле.
‘вагЄвга­л©  ­ «Ё§ (ᨭ⥧) ЇаҐ¤«®¦Ґ­Ё© ЇаЁ Ў®«ҐҐ б«®¦­®© ¬®¤Ґ«Ё
Љ‘-Ја ¬¬ вЁЄЁ Їа®¤Ґ¬®­бваЁа㥬 ­  б«Ґ¤го饩 Їа®Ја ¬¬л.

trace
domains
tklist = string*
sentence = sentence(noun_phrase, verb_phrase)
noun_phrase = noun_phrase(determiner, string, relative_clause)
determiner = nil ; determ(string)
relative_clause = nil ; relcl(string, verb_phrase)
verb_phrase = verb(string) ; verbp(string, noun_phrase)

/* ‡¤Ґбм ЇаҐ¤«®¦Ґ­ЁҐ ®ЇЁблў Ґвбп дг­Єв®а®¬ sentence c ¤ўг¬п
 аЈг¬Ґ­в ¬Ё, ЇаҐ¤бв ў«пойЁ¬Ё ЈагЇЇл бгйҐб⢨⥫쭮Ј® Ё ЈагЇЇг
Ј« Ј®« . ѓагЇЇ  бгйҐб⢨⥫쭮Ј® noun_phrase ЇаҐ¤бв ў«Ґ­  дг­Єв®а®¬
noun_phrase c ваҐ¬п  аЈг¬Ґ­в ¬Ё, ЇаҐ¤бв ў«пойЁ¬Ё ®ЇаҐ¤Ґ«Ґ­ЁҐ, б«®ў® Ё
®в­®иҐ­ЁҐ. ЋЇаҐ¤Ґ«Ґ­ЁҐ determiner ЇаҐ¤бв ў«пҐвбп «ЁЎ® Є®­бв ­в®© nil
(Їгбв®), «ЁЎ® д㥪в®а®¬ determ,  аЈг¬Ґ­в Є®в®а®Ј® - б«®ў® (бва®Є ).
Ћв­®иҐ­ЁҐ ЇаҐ¤бв ў«пҐвбп «ЁЎ® Є®­бв ­в®© nil, «ЁЎ® дг­Єв®а®¬ б
 аЈг¬Ґ­в ¬Ё вЁЇ  б«®ў® (бва®Є ) Ё Ј« Ј®«м­®© ЈагЇЇ®© verb_phrase. ‚
бў®о ®зҐаҐ¤м Ј« Ј®«м­ п ЈагЇЇ  ЇаҐ¤бв ў«пҐвбп «ЁЎ® дг­Єв®а®¬ verb б
 аЈг¬Ґ­в®¬ вЁЇ  б«®ў® (бва®Є ), «ЁЎ® дг­Єв®а®¬ verbp c  аЈг¬Ґ­в ¬Ё
вЁЇ  б«®ў® Ё ЈагЇЇл бгйҐб⢨⥫쭮Ј®. */

database
noun(string) verb(string) dete(string) rela(string)
/* Ў §  ¤ ­­ле ᮤҐа¦Ёв § ЇЁбЁ зҐвлаҐе вЁЇ®ў - ¤«п бгйҐб⢨⥫м­ле,
Ј« Ј®«®ў, ЇаЁ« Ј вҐ«м­ле Ё ¬Ґбв®Ё¬Ґ­Ё© */

predicates
toklist(string,tklist) match(string)
nphrase(tklist, tklist, noun_phrase)
determiner(tklist, tklist, determiner)
sentex(tklist,tklist, sentence)
relclause(tklist,tklist, relative_clause)
vphrase(tklist,tklist, verb_phrase)

do_dog analyse_it request_a_sentence
analyse_sentence(string)
print_list(tklist)
process(integer)

goal trace(off), do_dog.

clauses
do_dog:- /* § ¤ ­ЁҐ ®Є®­ Ё ¬Ґ­о */
makewindow(1,7,7,"",0,0,25,80),
makewindow(2,7,7," ѓ‹Ђ‚ЌЋ… ЋЉЌЋ",1,0,22,39),
nl,nl,write(" ЂЌЂ‹€‡Ђ’Ћђ Џђ…„‹Ћ†…Ќ€‰"),
nl,nl,write(" 1. Ђ­ «Ё§ "),
nl,nl,write(" 2. ‚л室 "),
nl,nl,write(" ‚ўҐ¤ЁвҐ 1 Ё«Ё 2."),
readint(Choice), process(Choice),
do_dog.
process(1):- analyse_it.
process(2):- exit.

analyse_it:- /* ¤®Ї®«­ЁвҐ«м­лҐ б®®ЎйҐ­Ёп */
makewindow(3,7,7," ЂЌЂ‹€‡Ђ’Ћђ Џђ…„‹Ћ†…Ќ€‰",2,4,23,72),
nl, write(" ќв® Їа®Ја ¬¬   ­ «Ё§ "),
nl, write("ЇаҐ¤«®¦Ґ­Ё© Љ‘-¬®¤Ґ«Ё"),nl,nl,
write(" ЇаҐ¤«®¦Ґ­ЁҐ = ЈагЇЇ  бгй-Ј® + ЈагЇЇ  Ј« Ј®« "),
request_a_sentence.
analyse_it:- removewindow.

request_a_sentence:- makewindow(4,7,7," „€Ђ‹Ћѓ ",8,2,4,38),
nl, write(" ‚ўҐ¤ЁвҐ ЇаҐ¤«®¦Ґ­ЁҐ:"), nl, readln(Line),
not(Line="Q"),
analyse_sentence(Line),!,
request_a_sentence.

analyse_sentence(Line) :-
/* Ї®¤Ј®в®ўЄ  бЇЁЄ , ЇаҐ¤ЁЄ в sentex Ё ўлў®¤ १г«мв в  */
makewindow(5,7,7," ЋЄ­® ђҐ§г«мв в ",8,41,16,38),
toklist(Line, Tklist),
sentex(Tklist, _, Sent_model), /* ®б­®ў­®© ЇаҐ¤ЁЄ в */
nl,write(" ‚室­®Ґ ЇаҐ¤«®¦Ґ­ЁҐ:",Line),nl,nl,
nl,write("‘ЇЁб®Є б«®ў: "),nl,nl,
print_list(Tklist),
nl, write(" Њ®¤Ґ«м ЇаҐ¤«®¦Ґ­Ёп: "),nl,nl,
write(Sent_model).
analyse_sentence(_).

print_list([]).
print_list([Head|Tail]):- write(" ",Head),nl,
print_list(Tail).
/* Ї®¤Ј®в®ўЄ  бЇЁбЄ  */
toklist(Str,[Token|Tklist]):-
fronttoken(Str, Token, Str1),
match(Token), !,
toklist(Str1, Tklist).
toklist(_,[]).

/* Їа®ўҐаЄ  ­ «ЁзЁп б«®ў ў Ў §Ґ ¤ ­­ле */
match(W):- noun(W),!. match(W):- dete(W),!.
match(W):- rela(W),!. match(W):- verb(W),!.
match(W):- nl, write(W," - нв® б«®ў® ­Ґ а бЇ®§­ ­®"),
nl, write(" †¬Ё Є« ўЁиг "), readchar(_).

/* ®б­®ў­®© ЇаҐ¤ЁЄ в ®ЇаҐ¤Ґ«Ґ­Ёп ЈагЇЇ бгйҐб⢨⥫쭮Ј® Ё Ј« Ј®«  */
sentex(Tklist,Tklist2, sentence(Noun_phrase, Verb_phrase)):-
nphrase(Tklist,Tklist1, Noun_phrase),
vphrase(Tklist1,Tklist2, Verb_phrase), !.
sentex(_,_,_):- nl, write("ЇаҐ¤«®¦Ґ­ЁҐ ­Ґ а бЇ®§­ ­®"),nl,fail.

/* ®ЇаҐ¤Ґ«Ґ­ЁҐ ЈагЇЇл бгйҐб⢨⥫쭮Ј® */
nphrase(Tklist, Tklist2, noun_phrase(Determiner,Noun,
Relative_clause)):-
determiner(Tklist,[Noun|Tklist1],Determiner),
noun(Noun),
relclause(Tklist1, Tklist2, Relative_clause).

/* ®ЇаҐ¤Ґ«Ґ­ЁҐ ®ЇаҐ¤Ґ«ЁвҐ«п */
determiner([Determiner|Tklist], Tklist,
determ(Determiner)):-
dete(Determiner).
determiner(Tklist,Tklist,nil).

/* ®ЇаҐ¤Ґ«Ґ­ЁҐ б«Ґ¤гойЁе б«®ў Є Є ¬Ґбв®Ё¬Ґ­Ёп Ё«Ё Ј« Ј®«м­®© ЈагЇЇл
*/
relclause([Relative|Tklist],Tklist1,
relcl(Relative,Verb_phrase)):-
rela(Relative), vphrase(Tklist,Tklist1,Verb_phrase).
relclause(Tklist,Tklist,nil).

/* ®ЇаҐ¤Ґ«Ґ­ЁҐ б«®ў  Є Є ЈагЇЇл Ј« Ј®«  */
vphrase([Verb|Tklist],Tklist1,verbp(Verb, Noun_phrase)):-
verb(Verb), nphrase(Tklist,Tklist1,Noun_phrase).
vphrase([Verb|Tklist],Tklist,verb(Verb)):- verb(Verb).
/* Ў §  ¤ ­­л ¤«п бгйҐб⢨⥫м­ле, ®ЇаҐ¤Ґ«ЁвҐ«Ґ©, ¬Ґбв®Ё¬Ґ­Ё© Ё
Ј« Ј®«®ў */
noun("Lana"). noun("Tom"). noun("cat"). noun("dog").
dete("a"). dete("an"). rela("who").
verb("loves"). verb("hates"). verb("likes").
verb("sleep"). verb("dislikes"). verb("scares").


Џа®Ја ¬¬  ­  ЇаҐ¤«®¦Ґ­ЁҐ: Tom loves dog ўл¤ бв ¬®¤Ґ«м ЇаҐ¤«®¦Ґ­Ёп:
sentence(noun_phrase(nil,"Tom",nil), verbp("loves", noun_phrase(nil,
"dog",nil))).
’ ЄЁ¬ ®Ўа §®¬, ў ¤ ­­®© Їа®Ја ¬¬Ґ Їа®¤Ґ¬®­бваЁа®ў ­ ®¤Ё­ Ё§ ¬Ґв®¤®ў
Їа®ўҐаЄЁ бЁ­в ЄбЁб  ЇаҐ¤«®¦Ґ­Ёп, в.Ґ. ЇаҐ¤бв ў«Ґ­ЁҐ ЇаҐ¤«®¦Ґ­Ёп ў
ўЁ¤Ґ ­ Ў®а  «ҐЄбҐ¬ (а §®Ўа ­ле вЁЇ®ў б«®ў Ё«Ё Ёе б®зҐв ­Ё©). •®вп
§ ¤ з  ᥬ ­вЁзҐбЄ®Ј®  ­ «Ё§  §¤Ґбм ­Ґ Їа®Ё§ў®¤Ёвбп, ­® ¬®¦­®
ЇаҐ¤«®¦Ёвм а §ўЁвЁҐ нв®Ј® ¬Ґв®¤  ¤«п а §Ў®а  ᥬ ­вЁЄЁ ЇаҐ¤«®¦Ґ­Ё© б
нд䥪⨢­®© ॠ«Ё§ жЁҐ© Џа®«®ЈҐ.
Њ®й­®© бва вҐЈЁҐ© ¤«п Ї®­Ё¬ ­Ёп б¬лб«  ЇаҐ¤«®¦Ґ­Ё© пў«пҐвбп
⥬ вЁзҐбЄЁ©  ­ «Ё§ Ї®б।бвў®¬ Ї ¤Ґ¦­®© Ја ¬¬ вЁЄЁ. ‡¤Ґбм Ј« ў­ п
Ё¤Ґп ў ⮬, зв® Ј« Ј®« ­ е®¤Ёвбп б।Ё ЈагЇЇ бгйҐб⢨⥫­ле, Є®в®алҐ
Ї®пб­пов ҐЈ® ¤Ґ©бвўЁҐ, в.Ґ. ­ е®¤пвбп ў ®ЇаҐ¤Ґ«Ґ­­®¬ ®в­®иҐ­ЁЁ Є
Ј« Ј®«г. ’ЁЇл ®в­®иҐ­Ё© ­ §лў овбп Ї ¤Ґ¦ ¬Ё Ё Ёе ¬¦­® ЇҐаҐзЁб«Ёвм.
Ќ ЇаЁ¬Ґа, ¬®Јгв а бб¬ ваЁў вмбп б«Ґ¤гойЁҐ Ї ¤Ґ¦Ё.
ЋЎмҐЄв­л© Ї ¤Ґ¦. ЋЎмҐЄв (ЈагЇЇ  бгйҐб⢨⥫м­ле), ЇҐаҐ¤ ойЁе
¤Ґ©бвўЁҐ, ўла ¦Ґ­­®Ґ Ј« Ј®«®¬.
ЂЈҐ­в­л© Ї ¤Ґ¦. ЂЈҐ­б (ЈагЇЇ  бгйҐб⢨⥫쭮Ј®), ЇаЁ¬Ґ­пойЁе
¤Ґ©бвўЁҐ Є ®ЎмҐЄвг.
Љ®- ЈҐ­в­л© Ї ¤Ґ¦. „агЈ®©  ЈҐ­б, гз бвўгойЁ© ў ¤Ґ©бвўЁЁ Є ®ЎмҐЄвг.
–Ґ«Ґў®© Ї ¤Ґ¦. ѓагЇЇ  бгйҐб⢨⥫м­ле, ®в®Ўа ¦ ойЁе а ¤Ё 祣®/Є®Ј®
Їа®Ё§ўҐ¤Ґ­® ¤Ґ©бвўЁҐ.
‹®ЄгвЁў­л© Ї ¤Ґ¦. ѓагЇЇ  бгйҐб⢨⥫м­ле, ®Ў®§­ з ойЁе ¬Ґбв®
б®ўҐа襭Ёп ¤Ґ©бвўЁп.
‚६Ґ­­®© Ї ¤Ґ¦. ѓагЇЇ  бгйҐб⢨⥫м­ле, ўла ¦ ойЁе ўаҐ¬п
б®ўҐа襭Ёп ¤Ґ©бвўЁ.
€­бва㬥­в «м­л© Ї ¤Ґ¦. ѓагЇЇ  бгйҐб⢨⥫м­ле, ®Ў®§­ з ойЁе в®, зв®
ЁбЇ®«м§гҐвбп  ЈҐ­б®¬ ¤«п б®ўҐа襭Ёп ¤Ґ©бвўЁп.
Џ ¤Ґ¦Ё Ёбв®з­ЁЄ  Ё ­ §­ зҐ­Ёп. ѓагЇЇ  бгйҐб⢨⥫쭮Ј® ў
ЇаҐ¤«®¦Ґ­ЁЁ-¤Ґ©бвўЁЁ, ®в®Ўа ¦ ой п ­ з «м­®Ґ Ё Є®­Ґз­®Ґ ¬Ґбв 
ЇҐаҐ¤ўЁ¦Ґ­Ёп Ё«Ё б®бв®п­Ёп.
Џ ¤Ґ¦ ва ҐЄв®аЁЁ. ѓагЇЇ  бгйҐб⢨⥫쭮Ј®. ®ЇЁблў ой п ¬ аиагв, Ї®
Є®в®а®¬г б®ўҐаи Ґвбп ¤Ґ©бвўЁҐ.
Џ ¤Ґ¦ ­®бЁвҐ«п. ѓагЇЇ  бгйҐб⢨⥫쭮Ј®, ®Ў®§­ з о饥 ­®бЁвҐ«м, ў
Є®в®а®¬ Їа®Ёб室Ёв ¤Ґ©бвўЁҐ.
ЏҐаҐзЁб«Ґ­­лҐ Ї ¤Ґ¦Ё ­Ґ ўбҐЈ¤  б®ўЇ ¤ ов б Ја ¬¬ вЁзҐбЄЁ¬Ё,  
ЈагЇЇл ­Ґ ¬®Јгв зҐвЄ® ॣЁбваЁа®ў вмбп Ё Ўлвм ᢥ¤Ґ­л Є ®ЇаҐ¤Ґ«Ґ­­®¬г
Є в «®Јг, е®вп ¤«п ®в¤Ґ«м­ле § ¤ з ¬®Јгв ®ва ¦ вм Ў®«миЁ­бвў®
ў®§¬®¦­ле б«гз Ґў. „«п ®ЇаҐ¤Ґ«Ґ­Ёп Ї ¤Ґ¦  ®¤­®ўаҐ¬Ґ­­® ЁбЇ®«м§гҐвбп
Ё­д®а¬ жЁп ® вЁЇҐ ЇаҐ¤«®Ј , §­ зҐ­ЁЁ Ј« Ј®« , Ї®ап¤ЄҐ б«®ў,
®ЇЁблў Ґ¬®¬ Є®­вҐЄбвҐ, ўбЇ®¬®Ј вҐ«м­ле б«®ў е (з бвЁж е) Ё ¤а.
€бЇ®«м§гп ўўҐ¤Ґ­­лҐ вЁЇл ЈагЇЇ бгйҐб⢨⥫м­ле (Ї ¤Ґ¦Ґ©) ¬®¦­®
Ї®бва®Ёвм Ја ¬¬ вЁЄг (­ Ў®а Їа ўЁ«), ®ва ¦ ойЁе Ёе ®в­®иҐ­Ёп Є Ј« Ј®«г
­ ЇаЁ¬Ґа, ваҐв쥣® «Ёж , Ґ¤Ё­б⢥­­®Ј® зЁб« , Ї®иҐ¤иҐЈ® ўаҐ¬Ґ­Ё Ё ў
 ЄвЁў­®¬ § «®ЈҐ (¤«п ¤агЈЁе д®а¬ Ј« Ј®«  ¬®Јгв Ї®вॡ®ў вмбп ¤агЈЁҐ
Їа ўЁ« ).
ЇаҐ¤«®¦Ґ­ЁҐ :-  ЈҐ­б, Ј« Ј®«, ®ЎмҐЄв
ЇаҐ¤«®¦Ґ­ЁҐ :-  ЈҐ­б, Ј« Ј®«, ®ЎмҐЄв, Ё­бва㬥­в
ЇаҐ¤«®¦Ґ­ЁҐ :-  ЈҐ­б, Ј« Ј®«, ®ЎмҐЄв, ва ҐЄв®аЁп, ўаҐ¬п

 ЈҐ­б :- ¬Ґбв®Ё¬Ґ­ЁҐ
 ЈҐ­б :- б®Ўб⢥­­®Ґ бгйҐб⢨⥫쭮Ґ
 ЈҐ­б :- Ё¬Ґ­­®Ґ-бгйҐб⢨⥫쭮Ґ

®ЎмҐЄв :- ¬Ґбв®Ё¬Ґ­ЁҐ
®ЎмҐЄв :- б®Ўб⢥­­®Ґ-бгйҐб⢨⥫쭮Ґ
®ЎмҐЄв :- Ё¬Ґ­­®Ґ-б«®ў®б®зҐв ­ЁҐ

Ё­бва㬥­в :- with, Ё¬Ґ­­®Ґ-б«®ў®б®зҐв ­ЁҐ
ва ҐЄв®аЁп :- through, Ё¬Ґ­­®Ґ-б«®ў®б®зҐв ­ЁҐ
ўаҐ¬п :- during, Ё¬Ґ­­®Ґ-б«®ў®б®зҐв ­ЁҐ
ўаҐ¬п :- befor, Ё¬Ґ­­®Ґ-б«®ў®б®зҐв ­ЁҐ
ўаҐ¬п :- after, Ё¬Ґ­­®Ґ-б«®ў®б®зҐв ­ЁҐ
¬Ґбв®Ё¬Ґ­ЁҐ :- he, Ё ¤а.

Ё¬Ґ­­®Ґ-б«®ў®б®зҐв ­ЁҐ :- ЇаЁ« Ј вҐ«м­®Ґ, бгйҐб⢨⥫쭮Ґ
Ё¬Ґ­­®Ґ-б«®ў®б®зҐв ­ЁҐ :- ®ЇаҐ¤Ґ«ЁвҐ«м, бгйҐб⢨⥫쭮Ґ

ЇаЁ« Ј вҐ«м­®Ґ :- "Ў®«ми®©"
®ЇаҐ¤Ґ«ЁвҐ«м :- "нв®в" (" ")
Ј« Ј®« :- "гЄгбЁ«"
Ј« Ј®« :- "б쥫" Ё в.Ї.


‚ б奬 вЁз­® ЇаҐ¤бв ў«Ґ­­ле Їа ўЁ« е ®ЎмҐЄвл ЇаҐ¤бв ў«пов б®Ў®©
"Ї ¤Ґ¦­лҐ п祪Ё", Є®в®алҐ Ї®¤«Ґ¦ в § Ї®«­Ґ­Ёо Ё¬Ґ­­л¬Ё
б«®ў®б®зҐв ­Ёп¬Ё. Љ®«ЁзҐбвў® в ЄЁе Їа ўЁ« ¤®«¦­® Ўлвм ¤®бв в®з­®
¬­®Ј® (­ҐбЄ®«мЄ® б®вҐ­) ¤«п Ї®бв஥­Ёп ў®§¬®¦­ле ᥬ ­вЁзҐбЄЁе
ў аЁ жЁ© ¤ ¦Ґ Їа®бвле ЇаҐ¤«®¦Ґ­Ё©.
Ќ  Џа®«®ЈҐ ­Ґваг¤­®
Соседние файлы в папке Доки к Прологу