фактів і правил.
Факти - це відношення, або ж властивості, про які ви, програміст, знаєте, що вони істинні.
Правила - це залежні відношення; вони дозволяють Прологу робити виведення, порівнюючи одну частину інформації з іншою.
2.Правила Прологу складаються з трьох частин: голови, символу, тіла.
Голова - це факт, який буде вірним, якщо деяка кількість умов виконається. Голову ще іноді називають заключенням, або ж відношенням залежності.
Символ - відділяє голову правила від тіла; може бути текстовим типу or або ж if.
Тіло - це множина умов (або список файлів), котрі повинні бути істинними, для того щоб Пролог міг довести, що голова правила вірна.
Розглянемо наступну програму:
predicates
can_buy(symbol, symbol)
person(symbol)
car(symbol)
likes(symbol, symbol)
for_sale(symbol)
clauses
can_buy(X, Y) :-
person(X),
car(Y),
likes(X, Y),
for_sale(Y).
person(kelly).
person(judy).
car(lemon).
car(hot_rod).
likes(kelly, hot_rod).
likes(judy, pizza).
for_sale(pizza).
for_sale(lemon).
for_sale(hot_rod).
Можна задати такі питання:
Що можуть купити judy i kelly? can_buy(judi,X) can_buy(kelly,X).
Хто може купити бутерброд з гарячою сосискою? can_buy(X,hot_rod).
2.2.Як змінні отримують свої значення.
Як ви вже мабуть відмітили, в Пролозі не має операції присвоєння. Змінні Прологу отримують свої значення, порівнюючи їх з константами в фактах і правилах.
Поки змінна не отримає свого значення, вона називається вільною, а коли отримує значення - зв'язаною. Але вона залишається зв'язаною тільки на час, який необхідний для отримання одного розв'зку на запит, потім Пролог звільнює її, повертає і шукає альтернативні розв' язки.
Розглянемо наступну програму:
predicates
likes(symbol,symbol)
clauses
likes(ellen, reading).
likes(john, computers).
likes(john, badminton).
likes(leonard, badminton).
likes(eric, swimming).
likes(eric, reading).
Побудуємо запит:
Чи існує особа, яка любить читання і купання ?
likes(Person,reading) and likes(Person,swimming)
змінна Person - вільна ; її значення невідомо до тих пір, поки ПРОЛОГ пробує знайти розв'язок, інший аргумет - reading - відомий . ПРОЛОГ робить пошук факту, який порівнює першу частину запиту. Використовуючи перший факт програми:
likes(ellen,reading)
Враховуючи другу частину запиту, Пролог повинен шукати факт:
likes(ellen,swimming)
ПРОЛОГ веде пошук цього факту з самого початку программи, але співставлення не проходить (тому, що не існує такого факту в програмі).
ПРОЛОГ зразу "розв'язує" Person і пробує знайти інший розв'язок першої частини запиту з Person як з вільною змінною. Пошук іншого факту, який задовільняє першу частину запиту, починається з місця відміченого вказівником. Вказівник ставиться для реалізації перебору з повертаннями.
Пролог шукає іншу особу, яка любить читати і знаходить факт likes (eric, reading). Тому Person зв'язується з eric. Він задовільняє і другій частині запиту. Пролог відповідає:
Person = eric
1 Solution
2.3.Анонімні змінні.
Анонімні змінні використовуються у випадку, коли вам потрібна часткова інформація із запиту. За допомогою анонімних змінних ігноруються значення, які вам не потрібні. Наступний приклад демонструє використання анонімних змінних.
predicates
male(symbol)
female(symbol)
parent(symbol, symbol)
clauses
male(bill).
male(joe).
female(sue).
female(tammy).
parent(bill, joe).
parent(sue, joe).
parent(joe, tammy).
Анонімна змінна може бути використана на місці любої змінної. Відмінність полягає в тому, що анонімна змінна ніколи не отримає значення.
Наприклад, якщо вам потрібна інформація тільки про батьків, тоді ви можете використати запит:
Goal:parent(Who, _)
де символ _ позначає анонімну змінну. Система видасть результат:
Who=bill
Who=sue
Who=joe
3 Solution.
Анонімні змінні можуть також використовуватись і в фактах:
owns(_,shoes).
eats(_).
В цьому випадку анонімна змінна зрівнює все.
2.4.Складні цілі: кон`юнкція та диз`юнкція.
Ви можете використати складну ціль, щоб знайти рішення, в якому дві підцілі А і В справджуються (кон`юнкція), або розв`язок, в якому справджується хоча б одна із підцілей А або В (диз`юнкція).
Наприклад, розглянемо програму:
predicates
car(symbol,real,integer,symbol,integer)
truck(symbol,real,integer,symbol,integer)
clauses
car(chrysler, 130000, 3, red, 12000).
car(ford, 90000, 4, gray, 25000).
car(datsun, 8000, 1, red, 30000).
truck(ford, 80000, 6, blue, 8000).
truck(datsun, 50000, 5, orange, 20000).
Загрузимо і запустимо цю програму, задавши ціль:
Goal: car(Make,Odometer,Years_on_road,Body,25000).
пробуємо знайти автомобіль, вартість якого становить рівно 25000. Пролог-система видасть одне рішення - ford. Але такий запит не природній. В житті ми будуємо питання іншим чином. Чи існує в продажі автомобіль, вартість якого менша за 25000? Таке питання можна реалізувати наступним складним запитом:
car(Make,Odometer,Years_on_road,Body,Cost) and Cost < 25000.
Якщо ж ми хочемо реалізувати в Пролозі питання наступного типу:
чи існує в продажі автомобіль або вантажівка, вартість яких менша 25000? Тоді ми повинні використовувати складну ціль:
car(Make,Odometer,Years_on_road,Body,Cost) and Cost < 25000 or
truch(Make,Odometer,Years_on_road,Body,Cost) and Cost < 25000.
Узагальнення.
1.Програма Прологу складається із фраз. Фрази бувають двох типів: факти та правила.
* Факти - це відношення або властивість, про вірність яких програміст попередньо знає.
* Правила - це залежні відношення. Вони дозволяють Прологу отримувати деяку інформацію із іншої.
2.Факти мають загальну форму:
property(obj, obj1, ... objn) або ж
relation(obj, obj1, ... objn) , де property виражає властивість об`єктів, а relation - відношення між об`єктами.
3.Кожний факт відноситься до одного або ж декількох об`єктів. Наприклад, в факті Прологу likes(tom,baseball) відношенням є likes, а об`єктами tom і baseball. Він описує речення:
Тому подобається бейсбол.
А в факті left-hander(tom) властивістю є left-hander, об`єктом - tom. Він описує речення : Том - лівша.
4.Правила мають загальну форму:
голова if тіло,
яка в програмі приймає вигляд:
relation(obj, obj1, ... objn) if
relation(obj, obj1, ... objn) and
....
relation(obj, obj1, ... objn).
5.При виборі імен змінних і констант, ви повинні дотримуватись наступних обмежень:
* Імена змінних повинні починатись із великої букви. За нею може зустрічатись довільне число символів; символами є букви, цифри та символ підкреслення.
6.Предикат - це символьне ім`я (ідентифікатор), яке пов`язує відношення з його аргументами.
Програма - це послідовність фраз і директив, а процедура - це послідовність фраз, які визначають предикат фрази.
7.Змінні дозволяють вам записувати загальні факти та