Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Доки к Прологу / PROLOG1
.TXT ‘ Єв-ЏҐвҐаЎгаЈбЄЁ© Ј®бг¤ абвўҐл© вҐеЁзҐбЄЁ© гЁўҐабЁвҐв
Љ дҐ¤а Є®¬ЇмовҐале ЁвҐ««ҐЄвг «мле вҐе®«®ЈЁ© ў Їа®ҐЄвЁа®ў ЁЁ
“ — … Ѓ Ќ Ћ … Џ Ћ ‘ Ћ Ѓ € …
¤«п Єгаб "Ћб®ўл Їа®ҐЄвЁа®ў Ёп ЁвҐ««ҐЄвг «мле бЁб⥬"
‘®бв ўЁ« ЃҐаҐ§ЄЁ Ђ.Љ.
Ћ ѓ ‹ Ђ ‚ ‹ … Ќ € …
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, Ё ¤а.
Ё¬Ґ®Ґ-б«®ў®б®зҐв ЁҐ :- ЇаЁ« Ј ⥫쮥, бгйҐб⢨⥫쮥
Ё¬Ґ®Ґ-б«®ў®б®зҐв ЁҐ :- ®ЇаҐ¤Ґ«ЁвҐ«м, бгйҐб⢨⥫쮥
ЇаЁ« Ј ⥫쮥 :- "Ў®«ми®©"
®ЇаҐ¤Ґ«ЁвҐ«м :- "нв®в" (" ")
Ј« Ј®« :- "гЄгбЁ«"
Ј« Ј®« :- "б쥫" Ё в.Ї.
‚ б奬 вЁз® ЇаҐ¤бв ў«Ґле Їа ўЁ« е ®ЎмҐЄвл ЇаҐ¤бв ў«пов б®Ў®©
"Ї ¤Ґ¦лҐ п祪Ё", Є®в®алҐ Ї®¤«Ґ¦ в § Ї®«ҐЁо Ё¬Ґл¬Ё
б«®ў®б®зҐв Ёп¬Ё. Љ®«ЁзҐбвў® в ЄЁе Їа ўЁ« ¤®«¦® Ўлвм ¤®бв в®з®
¬®Ј® (ҐбЄ®«мЄ® б®вҐ) ¤«п Ї®бв஥Ёп ў®§¬®¦ле ᥬ вЁзҐбЄЁе
ў аЁ жЁ© ¤ ¦Ґ Їа®бвле ЇаҐ¤«®¦ҐЁ©.
Ќ Џа®«®ЈҐ Ґва㤮
Љ дҐ¤а Є®¬ЇмовҐале ЁвҐ««ҐЄвг «мле вҐе®«®ЈЁ© ў Їа®ҐЄвЁа®ў ЁЁ
“ — … Ѓ Ќ Ћ … Џ Ћ ‘ Ћ Ѓ € …
¤«п Єгаб "Ћб®ўл Їа®ҐЄвЁа®ў Ёп ЁвҐ««ҐЄвг «мле бЁб⥬"
‘®бв ўЁ« ЃҐаҐ§ЄЁ Ђ.Љ.
Ћ ѓ ‹ Ђ ‚ ‹ … Ќ € …
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, Ё ¤а.
Ё¬Ґ®Ґ-б«®ў®б®зҐв ЁҐ :- ЇаЁ« Ј ⥫쮥, бгйҐб⢨⥫쮥
Ё¬Ґ®Ґ-б«®ў®б®зҐв ЁҐ :- ®ЇаҐ¤Ґ«ЁвҐ«м, бгйҐб⢨⥫쮥
ЇаЁ« Ј ⥫쮥 :- "Ў®«ми®©"
®ЇаҐ¤Ґ«ЁвҐ«м :- "нв®в" (" ")
Ј« Ј®« :- "гЄгбЁ«"
Ј« Ј®« :- "б쥫" Ё в.Ї.
‚ б奬 вЁз® ЇаҐ¤бв ў«Ґле Їа ўЁ« е ®ЎмҐЄвл ЇаҐ¤бв ў«пов б®Ў®©
"Ї ¤Ґ¦лҐ п祪Ё", Є®в®алҐ Ї®¤«Ґ¦ в § Ї®«ҐЁо Ё¬Ґл¬Ё
б«®ў®б®зҐв Ёп¬Ё. Љ®«ЁзҐбвў® в ЄЁе Їа ўЁ« ¤®«¦® Ўлвм ¤®бв в®з®
¬®Ј® (ҐбЄ®«мЄ® б®вҐ) ¤«п Ї®бв஥Ёп ў®§¬®¦ле ᥬ вЁзҐбЄЁе
ў аЁ жЁ© ¤ ¦Ґ Їа®бвле ЇаҐ¤«®¦ҐЁ©.
Ќ Џа®«®ЈҐ Ґва㤮
Соседние файлы в папке Доки к Прологу