You are on page 1of 15

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ БІОТЕХНОЛОГІЙ І

ПРИРОДОКОРИСТУВАННЯ
Факультет інформаційних технологій
Кафедра комп’ютерних наук

Методи та системи штучного інтелекту

Лабораторна робота №3

«Дослідження механізму виконання Пролог-програми»

(4 години)

Київ - 2023
Мета роботи: дослідження механізму виконання програми і вивчення
операцій мови Prolog в середовищі Visual Prolog: зіставлення зі зразком;
зв'язування змінних; відкат і звільнення змінних; анонімні змінні; зовнішня і
внутрішня мета.

Підготовка до роботи: Вивчити і уяснити призначення і зміст завдання


до лабораторної роботи.

Завдання:
1. Ознайомитись з методичною розробкою до лабораторноъ роботи.
2. Ознайомитись з рекомендованною літературою.
3. Дослідити основні процеси виконання Пролог-програми в
середовищі Visual Prolog.
4. Виконати завдання до лабораторної роботи..
5. За результатами досліджень скласти звіт з обґрунтованими
висновками.

Форма звіту
1. Тема та мета.
2. Опис завдання згідно розроблюваної студентом системи.

Рекомендована література
1. Братко И. Алгоритмы искусственного интелекта на языке PROLOG. –
М.:2004. – 640 с.
2. Eduardo Costa. Visual Prolog 7.1 for Tyros. Перевод с английского.
http://download.pdc.dk/vip/71/Costas-Tyros_rus_MS.pdf, 122 c.
3. Thomas W. de Boer. A Beginners' Guide to Visual Prolog Version 7.2,
2009. http://download.pdc.dk/vip/72/books/deBoer/VisualPrologBeginners.pdf

2
Теоретичні відомості

Завдання роботи: виконати пп. 1-11.

ПОРЯДОК ВИКОНАННЯ РОБОТИ

1. Набрати програму, що містить відомості про батьківство й стать


батьків і дітей.

trace

predicates

father(symbol,symbol)

m(symbol) % male (чоловік)

f(symbol) % female (жінка)

clauses

father(tom,ann).

father(bob,tom).

father(bob,liz).

m(tom).

m(bob).

f(ann).

f(liz).

2. Запустити програму на виконання і у вікні діалогу дати запит – хто


діти Боба (кому Боб доводиться батьком : father(bob, X). )
Система Visual Prolog повинна знайти два рішення - tom і liz.
2.1. Простежити хід пошуку рішення в режимі трасування. Для цього на
самому початку програми вставити оператор трасування - trace і знову
запустити. Для покрокового виконання програми служить функціональна
клавіша F10. Розглянути протокол трасування й зрозуміти (або пригадати з
другої роботи) значення ключових слів, що тут зустрічаються - CALL,
RETURN, REDO. З якими значеннями зв'язується змінна X?
3.Дослідити дерево пошуку для запиту - чи є в Боба дочка?
3
father(bob,X), f(X).
Записати трасувальні повідомлення й намалювати дерево пошуку.
Відмітити (перекреслити) гілки, на яких відбувається відкат. Відзначити
шлях, що приводить до відповіді.

4.Дослідити дерево пошуку для запиту - знайти батька із двома дітьми:


father(Z,X), father(Z,Y), X<>Y. Записати трасувальні повідомлення й
намалювати дерево пошуку. Перекреслити гілки, на яких відбувається
відкат. Відзначити шляхи, що приводять до відповіді.

5. Зупиніть виконання програми й перейдіть у режим редагування


тексту.

5.1. Додайте наприкінці програми секцію goal. Ціль, розміщена тут,


називається внутрішньою. Розмістіть тут ту ж ціль, що ми писали у вікні
діалогу в п.2: кому Боб доводиться батьком?
goal
father(bob, X).

5.2. Трасування поки скасуйте (закоментуйте оператор trace).


Запустіть програму.
НУ І ЩО ВИ ОДЕРЖАЛИ?
... Схоже, що нічого. Програма виконується, але відповіді не видно.
Для того, щоб одержати на екрані відповідь, доведеться додати до мети
оператор write:
goal
father(bob, X), write(X).
Тепер ціль буде досягнута тільки після того, як будуть виконані обидві
умови: по-перше, буде знайдений такий Х, якому Боб доводиться батьком, а
по-друге, цей Х буде надрукований (предикат write в разі успішного друку
своїх аргументів повертає значення TRUE). Так ми хоч про щось дізнаємось.

5.3. Запустіть програму знову.


Одержали відповідь? Чудово. А тепер порівняйте її з відповіддю,
отриманою в пункті 2, і зробіть висновок.

На відміну від п. 2, тут Пролог виводить тільки одне ім'я. Це пов'язано з


тим, що для зовнішньої мети система знаходить всі рішення, а для
внутрішньої мети – тільки одне рішення. Для одержання всіх рішень із
4
внутрішньою метою необхідно "обдурити" систему, задавши їй ціль, яка
завжди "створює неуспіх", наприклад 2=3:
goal
father (bob, X), write(X), nl, 2=3.

Для штучного створення неуспіху в Пролозі є (і широко


використовується) спеціальний вбудований предикат відкату (предикат
неуспіху) - FAIL. Вставте fail замість «2=3» і запустіть програму.

За необхідності використайте предикат nl (від new line) для переходу на


новий рядок.
Відокремити відповіді друг від друга можна й таким способом :
write(X,' ').

6. Повторити виконання програми з такою внутрішньою метою:


goal
father(X,Y),father(X,Z),Y<>Z, write(Y,' ',Z), nl, fail
Що означає ця мета? (Висловте цей запит природною мовою.)
А що ви одержали у відповіді?

7. Замалюйте й вивчіть дерево трасування для внутрішньої мети по


пошуку батька із двома дітьми.

8. Щоб позбутися надлишковості відповідей, спробуйте додати до мети


умову f(Y). Начебто допомагає (якщо, звичайно, ви змогли правильно його
поставити в програмі). Але, на жаль, це не універсально: якщо в Боба обоє
дітей - сини, то це не спрацює. Спробуйте, чи спрацює умова типу Y>Z.
(Пригадаємо, що Y і Z мають тип symbol.) У багатьох мовах така операція
над символьними рядками припустима, а тут?

9. Додати в програму про батьківство факт father(tom,liz) і скласти


наступні запити:
9.1.Знайти ім'я батька, що має двох дітей.
9.2.Знайти ім'я батька, що має двох різностатевих дітей.
9.3.Знайти ім'я батька, що має двох одностатевих дітей.
9.4.Знайти ім'я дитини, у якої є двоє батьків з різними іменами
(вважаючи, що це помилковий запис)

5
10. Скласти програму на Пролозі, що описує відомості про осіб
предикатами типу : person("Ivan", 24, 1.73, 'm').
- ім'я (тип string: "Ivan"),
- вік (тип integer: 24),
- зріст (тип real: 1.73).
- стать (тип char, 'm' або 'f').

Задати в такий спосіб дані про 5-6 людей.


Скласти запити, що виведуть:
10.1. імена всіх чоловіків: person(X,_,_,'m'), write(X), nl, fail.

10.2. імена й стать людей, які мають зріст більше 1.50 (значення
параметрів рекомендується задати так, щоб вивелося кілька записів):
person(X, _, R, P), R>1.50, write(X, " ",P), nl, fail.

10.3. імена й зріст дівчат, молодших за 20 років.

11. На кожен з наступних типів мети складіть по одній програмі мовою


Пролог (предметна область будь-яка):
ПРОСТА КОНСТАНТНА МЕТА
ПРОСТА МЕТА ЗІ ЗМІННИМИ
СКЛАДЕНА КОНСТАНТНА МЕТА
СКЛАДЕНА ЦІЛЬ ЗІ ЗМІННИМИ
ЗІСТАВЛЕННЯ ІЗ РЕЧЕННЯМ-ПРАВИЛОМ
Запишіть тексти програм в зошит. По своєму зошиту (без комп’ютера)
поясніть викладачу, як проходить пошук розв’язку в кожній з ваших
програм. (Одразу це зробити важко, тому спершу виконайте програми в
Турбо-Пролозі і, використовуючи трасування, простежте за процедурою
пошуку розв’язку. )

6
Контрольні запитання

1. Яка різниця між фактами і правилами?


2. Що таке ціль в Visual Prolog? Які бувають цілі?
3. Як виконується операція зіставлення з реченням-правилом?
4. Що називають зовнішньою і внутрішньою метою? Яка між
ними різниця?
5. Що називають анонімною змінною? Для чого вона
потрібна?
6. Що називають предикатом неуспіху? Для чого він
потрібен? Наведіть приклад його використання.
7. Що таке зв’язування змінної? Звільнення змінної? Відкат?
8. Як задати питання системі Visual Prolog?
9. Поясніть значення повідомлень при трасуванні: CALL,
RETURN, REDO.
10. Як отримати всі розв’язки з внутрішньою метою?
11. Яке значення мають предикати “fail” та “nl’?

7
Завдання для самостійної роботи
Завдання 1
Запишіть наступні факти й правила у формі, яка прийнята в мові Prolog

Завдання 2
Побудуйте по тому ж принципу власну базу знань, яка містить факти і
правила типу якщо-то про яких-небудь людей або об’єкти і зробіть із неї
кілька логічних висновків.

Контрольні питання
1. Яку інформацію містить розділ clauses?
2. Як записати в Visual Prolog твердження "Маша вивчає математику"?
3. Як записуються змінні в Visual Prolog?
4. Як перевірити правильність твердження?
5. Як реалізується дедукція в Visual Prolog?

8
Додаток А, Приклад виконання завдання
Текст програми

________________________________________________________________________________

main.pro

/*****************************************************************************

Copyright (c) 2022 Unregistered

*****************************************************************************
*/

implement main
open core

constants
className = "main".
classVersion = "$JustDate: $$Revision: $".

clauses
classInfo(className, classVersion).

%domains
%gender = female(); male().

class facts - familyDB


личность : (string Имя, integer Возраст, real Рост, string Пол).

class predicates
reconsult : (string FileName).
clauses
reconsult(FileName) :-
retractFactDB( familyDB),
file::consult(FileName, familyDB).

clauses
run():-
console::init(),
console::clearOutput(),
console::setTextAttribute(3,4),
console::setConsoleTitle("Институт компьютерных технологий"),
console::setTextAttribute(11),
9
stdio::write("Лабораторная работа №4\nФакультет компьютерных систем\nГруппа 205\n
Семко \n"),
stdio::nl,
console::setTextAttribute(13),
stdIO::write("Исходные данные загружены\n"),
reconsult("art.txt"),
stdIO::write("\nВас интересует в списке мужчина или женщина : "),
Y=stdio::readLine(),
личность(X, _, _, Y),
stdIO::writef("\nИмя % - %\n", X, Y),
fail.

run():-
stdIO::write("\nВас интересуют люди из списка с ростом выше (метры) : "),
X=stdio::read(),
личность(Z, _, T, _),
T > X,
stdIO::writef("\n % имеет рост % метров \n", Z, T),
fail.

run():-
stdIO::write("\nВас интересуют люди из списка моложе (полных лет) : "),
X = stdio::read(),
_ = stdio::readLine(),
stdIO::write("\nВас интересует в списке мужчина или женщина : "),
Y=stdio::readLine(),
личность(Z, U, T, Y),
X > U,
stdIO::writef("\n % имеет рост % метров, возраст % лет \n", Z, T, U),
stdio::nl,
fail.

run():-
stdIO::write("Завершение диалога\n"),
stdio::write("Для продолжения нажмите клавишу ENTER ---> "),
_ = stdio::readLine().
end implement main

goal
mainExe::run(main::run).

________________________________________________________________________________

10
main.ph

/*****************************************************************************

Copyright (c) 2022 Unregistered

*****************************************************************************
*/

#requires @"main.pack"
% publicly used packages
#include @"pfc\core.ph"

% exported interfaces

% exported classes
#include @"main.cl"

________________________________________________________________________________

main.pack

/*****************************************************************************

Copyright (c) 2022 Unregistered

*****************************************************************************
*/

#include @"main.ph"

% privately used packages


#include @"pfc\fileSystem\fileSystem.ph"
#include @"pfc\application\Exe\exe.ph"
#include @"pfc\console\console.ph"
#include @"pfc\exception\exception.ph"

% private interfaces

% private classes

11
% implementations
#include @"main.pro"

________________________________________________________________________________

main.cl

/*****************************************************************************

Copyright (c) 2022 Unregistered

*****************************************************************************
*/
class main
open core

predicates
classInfo : core::classInfo.
% @short Class information predicate.
% @detail This predicate represents information predicate of this class.
% @end
predicates
run : core::runnable.

end class main

________________________________________________________________________________

Laba_4.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>


<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Laba_4"
type="win32"
/>
<dependency>
<dependentAssembly>

12
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

________________________________________________________________________________

art.txt

clauses

личность("Алексей",19,1.92,"мужчина").

личность("Алиса",22,1.74,"женщина").

личность("Ника",20,1.62,"женщина").

личность("Александр",25,1.82,"мужчина").

личность("Лана",16,1.61,"женщина").

личность("Владимир",20,1.74,"мужчина").

личность("Кирилл",20,1.72,"мужчина").

________________________________________________________________________________

13
Результат роботи програми

14
15

You might also like