/span>
exam (В«99-233В», Математика , 3).
exam ("99-235", Інформатика , 5).
Тепер виведемо інформацію про всіх студентів факультету АТП, які здали іспит з інформатики з оцінкою 5. Для чого задамо ціль (Num,, Інформатика , 5), student (Num, Name, АТП ), write (Name), nl, fail.
Пролог-програма переглядає всі факти з предикатом exam до тих пір, поки не знаходить факт exam ("99-235", Інформатика , 5), відповідає другому предикату правила. В результаті чого вільна мінлива Num отримує значення "99-235". Таким чином, перший предикат мети погоджений, і програма переходить до узгодження наступного предиката student ("99-235", Name, АТП ). Так як в програмі є факт student ( 99-235 , Демидов З . А. , АТП ), предикат виявляється правдивий, і у результаті мінлива Name отримує значення Демидов С.А. , яке і буде виведено на екран у результаті перевірки предиката write (Name). Решта предикати nl і fail призначені для перегляду та пошуку інформації по всьому списку студентів.
БД у наведеному прикладі є частиною коду програми і не може бути змінена в процесі її виконання, тобто наведені фрагменти є прикладом статичної БД.
Однак Пролог надає кошти по створенню динамічних БД, тобто БД, в які можна додавати і видаляти записи в процесі роботи програми. Для роботи з такою БД, її предикати необхідно описати в розділі database. Розділ має наступний формат:
database [- <ім'я БД>] (...) (...)
..................
Наприклад,
database - tabel (symbol, symbol, symbol.)
dexam (symbol, symbol, integer)
Перераховані здесь предикати після підстановки в них замість змінних констант (тобто перетворення їх у факти) можуть бути поміщені і, якщо буде потрібно, видалені під час виконання програми в динамічну базу даних. Робиться це за допомогою стандартних (вбудованих в систему) предикатів: asserta, assertz, retract, save, consult, readterm, findall. У програмі можна використовувати декілька розділів database, при цьому кожному з них потрібно призначити унікальне ім'я. Якщо ім'я розділу database не призначено (такий розділ в програмі може бути тільки один), компілятор за замовчуванням призначає ім'я dbasedom. br/>
Стандартні предикати для роботи з динамічними БД
. Предикат asserta заносить новий факт до бази даних, що розташовується в оперативній пам'яті комп'ютера (резидентна БД). Новий факт поміщається перед всіма вже внесеними твердженнями даного предиката. Цей предикат має такий синтаксис:
asserta (<факт>)
Таким чином, щоб помістити в БД твердження
dstudent ( 99-233 , Степанов И.А . , АТП )
перед уже наявними там твердженням
dstudent ( 99-234 , Іванов А.В . , ПМА ),
стоїть в даний момент в базі даних на першому місці, необхідно наступне предикатное вираз
asserta (dstudent ( 99-233 , Степанов І . О. , АТП )). p>
2. Предикат assertz так само, як і asserta, заносить нові твердження в базу даних. Однак він поміщає нове твердження за всіма вже наявними в базі твердженнями того ж предиката. Синтаксис предиката той же. Наприклад,
assertz (dstudent ( 99-235 , Демидов З . О. , АТП )). p>
Зауваження: іно...