Механизъм за извод в системата Prolog, страница 3
Фиг. 4.9. Схема на интерпретатора Prolog
По-долу разглеждаме последователността от операции на интерпретатора, като въвеждаме следните обозначения: B - въпрос на потребителска база данни или въпрос, получен чрез факти и правила; H - намерен факт или правило в базата данни; Y - фразата в предишния ред; B е унифициран с фразата в ред H; Преименуване на променливи. Точките за връщане са дадени в квадратни скоби, където търсенето започва, когато съответната подцел бъде разрешена:
Hдядо(X,Y) :- баща(X,Z), баща(Z,Y)
Pдядо(X1,Y1) :- баща(X1,Z1), баща(Z1,Y1)
Yдядо(X,Y) :- баща(X,Z), баща(Z,Y) [TB0] X=X1,Y=Y1
Нбаща (алексей, владимир)
Yдядо (al,Y1) :- баща(алексей,Z1), баща(алексей,Y1) [TB1] X1= алексей, Y1=владимир
НТук интерпретаторът спира, тъй като в базата данни няма фрази с първи аргумент "vladimir". Интерпретаторът се връща към TBO, т.е. съдържанието на стека се възстановява:
Нбаща (андрей, алексей)
Yдядо (an,Y1) :- баща(андрей, алексей), баща(al,Y1) [TB0] X1=андрей, Z1=алексей
Нбаща (алексей, владимир)
Uдядо (андрей, владимир) :- баща (андрей, алексей), баща (алексей, владимир)
Правилото „дядо“ е разрешено, следователно отиваме на TB0.
Предикат"отрежете". Специално средство за "изрязване" в Prolog ви позволява да заобиколите (не да гледате през) определени цели при връщане. Първо, програма, която включва изрязване, е по-бърза, тъй като не взема предвид цели, които не предоставят нищо ново за решението. Второ, такава програма заема по-малко място в паметта, тъй като не е необходимо да се запомнят точките за връщане, за да се заобиколят ненужните цели.
1) разреши (ако е възможно) първата цел за първия релевантен факт;
2) допуска се втора цел (ако е възможно) за всички релевантни факти;
3) тогава интерпретаторът се връща обратно по веригата от цели веднага щом всички факти са задоволили (или не са задоволили) втората цел.
С вградения предикат "!" (удивителен знак) - означава "отрязване" - може да се предотврати движението назад.
Например за заявка
Prolog намира първото решение:
X =a, Y =bи скача до втората цел, което показва, че е невъзможно да се върне назад и процесът спира.
Нека има четири цели:
цел-1, цел-2,! , цел-3, цел-4.
Prolog анализира четирите цели една след друга и след това: се връща обратно веднага щом няма решение за цел-4; връща се назад веднага щом няма решение за цел-3 (или отново се връща напред към цел-4, ако има решение за цел-3); след това интерпретаторът спира на предиката "!", т.е. връщането към цел-2 и цел-1 е невъзможно.
Нека дадем примери за прилагането на предиката "!".
Помислете за следната програма Prolog:
предшественик(X,Y) :- баща(X,Y). /* 1-во правило X,Y */
баща(X,Z), /* 2-ро правило, 1-ва цел: X,Z,*/
предшественик (Z, Y). /* 2-ро правило, 2-ра цел:",Z,Y.*/
Последователността на операциите е следната:
2-ро правило 1-ви гол: a,b
2-ро правило 2-ри гол: b,c
2-ро правило 1-гол: b,c
2-ро правило 2-ри гол: c,d
2-ро правило 2-ри гол: b,d
!, баща(X,Y), баща(Y,Z) получаваме
Грешен предикат.Prolog има вграден "неуспешен" предикат, който винаги показва фалшив, т.е. до задънена улица в процеса на анализ на целите. Този предикатполезно, когато е необходимо да се получат всички решения на някаква по-ранна цел, преди да се пристъпи към анализ на следващите цели (обикновено Prolog намира първото решение на първата цел, а след това и следващите цели). Въпросът е как да стигнете до следващите цели, ако предикатът „провал“ систематично се връща. Например, за заявка, баща (X, Y), пишете (X, Y), nl, неуспех, майка (Z, Y). имената на всички бащи са осветени и няма как да се стигне до предиката "майка". Това може да се направи с помощта на логическата операция ИЛИ, която може да се използва, за да се каже: ИЛИ има следващ факт „баща“ ИЛИ преходът към следващата цел е в ход.
Аритметични, логически и релационни операции.
Помислете за следната база данни:
път (символ, символ, цяло число)
връзка (символ, символ, цяло число)
път (Минск, Москва, 750).
път (Москва, Свердповск, 1668).
път (Свердловск, Новосибирск, 1675).
връзка (заминаване, пристигане, разстояние): -
път (тръгване, пристигане, разстояние).
връзка (заминаване, пристигане, разстояние): -
Разстояние = Разстояние1 + Разстояние2.
и вземете разстояния от Минск до други градове:
Можете да въведете конкретна заявка
За получаване на отговора е използвана аритметичната операция "+".
- AltGTU 419
- AltGU 113
- AMPGU 296
- ASTU 266
- BITTU 794
- BSTU "Voenmekh" 1191
- BSMU 172
- BSTU 602
- BSU 153
- BSUIR 391
- БелГУТ 4908
- BSEU 962
- БНТУ 1070
- BTEU PK 689
- БрСУ 179
- ВНТУ 119
- VGUES 426
- ВлГУ 645
- VMEDA 611
- ВолгГТУ 235
- ВНУ им. Далия 166
- VZFEI 245
- ВятГША 101
- ВятГГУ 139
- ВятГУ 559
- GGDSK 171
- GomGMK 501
- GSMU 1967
- GSTU im. Сухой 4467
- ГСУ им. Скарина 1590г
- GMA им. Макарова 300
- ГДПУ 159
- DalGAU 279
- DVGGU 134
- DVGMU 409
- DVGTU 936
- DVGUPS 305
- FEFU 949
- ДонГТУ 497
- DITM MNTU 109
- IVGMA 488
- IGHTU 130
- ИжГТУ 143
- KemGPPC 171
- KemGU 507
- KSMTU 269
- Киров АТ 147
- KGKSEP 407
- KGTA им. Дегтярев 174
- КнАГТУ 2909
- КрасГАУ 370
- КрасГМУ 630
- KSPU им. Астафиева 133
- KSTU (SFU) 567
- КГТЕИ (СФУ) 112
- PDA № 2 177
- КубГТУ 139
- КубСУ 107
- KuzGPA 182
- КузГТУ 789
- MSTU им. Носова 367
- МГУ ги. Сахарова 232
- IPEC 249
- МГПУ 165
- МАИ 144
- МАДИ 151
- MGIU 1179
- MGOU 121
- MGSU 330
- Московски държавен университет 273
- МГУКИ 101
- MGUPI 225
- MGUPS (MIIT) 636
- МГУТУ 122
- MTUCI 179
- ХАЙ 656
- TPU 454
- NRU MPEI 641
- НМСУ "Горни" 1701
- ХПИ 1534
- НТУУ "КПИ" 212
- НУК тях. Макарова 542
- HB 777
- NGAVT 362
- NSAU 411
- NGASU 817
- NGMU 665
- NGPU 214
- NSTU 4610
- НГУ 1992г
- NSUE 499
- NII 201
- OmGTU 301
- OmGUPS 230
- СПбПК №4 115
- PGUPS 2489
- ПСПУ им. Короленко 296
- ПНТУ им. Кондратюк 119
- RANEPA 186
- ROAT MIIT 608
- RTA 243
- RSHU 118
- РГПУ им. Херцен 124
- РГППУ142
- RSSU 162
- "МАТИ" - РГТУ 121
- РГУНиГ 260
- REU ги. Плеханов 122
- РГАТУ им. Соловьова 219
- RyazGMU 125
- RGRTU 666
- SamGTU 130
- СПбГАСУ 318
- INGECON 328
- СПбГИПСР 136
- СПбГЛТУ им. Киров 227
- СПбГМТУ 143
- СПбГПМУ 147
- SPbGPU 1598
- СПбГТИ (ТУ) 292
- СПбГТУРП 235
- Държавен университет в Санкт Петербург 582
- GUAP 524
- СПбГУНИПТ 291
- СПбГУПТД 438
- СПбГУСЕ 226
- СПбГУТ 193
- СПГУТД 151
- SPbGUEF 145
- Електротехнически университет в Санкт Петербург "LETI" 380
- ПИМаш 247
- NRU ITMO 531
- СГТУ им. Гагарина 114
- СахСУ 278
- SZTU 484
- СибАГС 249
- СибГАУ 462
- СибГИУ 1655 г
- СибГТУ 946
- SGUPS 1513
- СибГУТИ 2083
- СибУПК 377
- SFU 2423
- SNAU 567
- SSU 768
- TRTU 149
- ТОГУ 551
- TGEU 325
- TSU (Томск) 276
- TSPU 181
- ТулГУ 553
- УкрГАЖТ 234
- UlGTU 536
- UIPCPRO 123
- USPU 195
- USTU-UPI 758
- UGNTU 570
- USTU 134
- ХГАЕП 138
- KhSAFC 110
- HNAGH 407
- HNUVD 512
- KhNU им. Каразина 305
- ХНУРЕ 324
- KhNEU 495
- Процесор 157
- ЧитГУ 220
- SUSU 306
За да отпечатате файла, изтеглете го (във формат Word).