Введення нових тверджень. Спискова форма запису

Коли пишеться програма на Пролозі, то слід повідомити систему, які твердження треба використати, і потім ставити відносно них запитання.

Є два основні вбудовані предикати для введення нових тверджень: consult і reconsult.

Вбудований предикат consult призначений для використання в тих ситуаціях, коли ви хочете додати твердження з деякого файлу (чи що вводяться з терміналу) до тверджень, вже наявних у базі даних. Аргумент предиката має бути атомом, що вказує ім'я файлу, з якого повинні братися твердження.

?— consult(myfile).

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

Пролог надає спеціальну форму запису, що дозволяє зручніше задавати предикати consult і reconsult в якості цільових тверджень, особливо у разі, коли ви хочете ввести більш ніж один файл. Для цього досить просто записати сукупність імен файлів (як атомів Прологу) у вигляді списку і задати цей список в якості цільового твердження. Якщо ви хочете, щоб вміст файлу був просто доданий до бази даних (consult), то ім'я такого файлу записується в списку в тому вигляді, як воно є, якщо ж ви хочете, щоб при цьому сталася заміна вже наявних однакових предикатів (reconsult), то перед ім'ям файлу ставиться знак '-' (мінус). Так, наприклад, запитання

?— [файл1,-файл2,'федір.1', -'борис.2'].

повністю еквівалентне наступному, але довшому:

?— consult(файл1), reconsult(файл2), consult('федір.1), reconsult('борис.2').

 

 

37.Виконання і невиконання цільового твердження

При нормальному виконанні програми на Пролозі цільове твердження вважається погодженим (з базою даних), коли це може бути доведено, і неузгодженим у разі, коли докази знайти не вдається. У мові є два предикати, що дозволяють зручно і явним чином визначити випадки, коли цільове твердження вважається погодженим і коли неузгодженим. Це предикати true і fail.

true

Це цільове твердження завжди узгоджується з базою даних. Насправді цей предикат не є необхідним, оскільки твердження у базі даних і цілі можуть бути переупорядковані або перегруповані так, щоб уникнути використання предиката true. Проте для зручності він входить до складу вбудованих предикатів.

fail

Це цільове твердження ніколи не узгоджується з базою даних. Є дві ситуації, коли цей предикат виявляється корисним. Одна з них — це використання комбінації !—fail, яка вже була описана в питанні 3 теми 4. Кон'юнкція цільових тверджень

..., !, fail

застосовується для того, щоб вказати, що якщо процес виконання дійшов до цього моменту, то можна більше не намагатися довести (погоджувати) це цільове твердження. Кон'юнкція вважається неузгодженою завдяки наявності предиката fail, а батьківське цільове твердження не узгоджується з огляду на те, що використано відсікання.

Інша ситуація, в якій використовується предикат fail, виникає, коли ви хочете явно вказати, що для деякого цільового твердження треба перебрати усі рішення. Можливо, ви захочете надрукувати усі можливі рішення. Наприклад, виконання цільового твердження

?— подія(X,Y), phh(Y), fail.

привело б до друку усіх подій, наявних у базі даних, що розглянуті в питанні 1 теми 5, вибір подій і друк їх короткого змісту виконують предикати подія і phh, при цьому ціль виявиться неузгодженою з базою даних.

 

38.Класифікація термів

Якщо вам потрібно означити предикати, які використовуватимуться з аргументами різних типів, то корисно мати можливість виділяти у означенні предиката ситуації, що відповідають кожному з можливих типів. У простому випадку може знадобитися застосовувати різні твердження залежно від того, чи є аргумент цілим числом або атомом. Різні твердження можуть знадобитися і для конкретизованих і неконкретизованих аргументів. Предикати, що наводяться нижче, дозволяють програмістові включити в твердження ці додаткові умови.

var(X)

Цільове твердження var(X) узгоджується з базою даних, якщо на даний момент X є неконкретизованою змінною. Таким чином, можливий наступний діалог:

?— var(X).

true

?— var(23).

false

?— X=Y,Y=23, var(X).

false

При грі в хрестики-нулики може виникнути необхідність означити, чи зайнята або ні деяка клітинка. Спроба зіставити неконкретизовану змінну з «0» або «х» привела б просто до того, що відповідний символ був би поміщений в клітинку, що відповідає змінній.

nonvar(X)

Цільове затвердження nonvar(X) узгоджується з базою даних, якщо X на даний момент не є неконкретизованою змінною. Предикат nonvar є, таким чином, протилежним по відношенню до предиката var. Дійсно, він може бути означений на Пролозі таким чином:

nonvar(X) :- var(X), !, fail.

nonvar(_).

atom(X)

Цільове затвердження atom(X) узгоджується з базою даних, якщо поточне значення X є атомом в сенсі мови Пролог.

?— atom(23).

false

?— atom(apples).

true

Цільове затвердження integer(X) узгоджується з базою даних, якщо на даний момент X означає ціле число. Цей предикат можна використати при означенні простого предиката для спрощення арифметичних виразів, де необхідно знати, чи є вираз цілим числом.

atomic(X)

Цільове затвердження atomic(X) узгоджується з базою даних, якщо на даний момент X означає або ціле число, або атом. Предикат atomic може бути означений через предикати atom і integer таким чином:

atomic(X) :— atom(X).

atomic(X) :— integer(X).