Arg(N,T,A)

Предикат arg завжди повинен використовуватися з конкретизованими першим і другим аргументами. Він застосовується для доступу до конкретного аргументу структури. Перший аргумент предиката arg визначає, який аргумент структури потрібний. Другий аргумент визначає структуру, до аргументу якої потрібний доступ. Пролог знаходить відповідний аргумент і потім намагається зіставити його з третім аргументом предиката arg. Таким чином, ціль arg(N,T,A) узгоджується з базою даних, якщо N -й аргумент Т є А. Давайте розглянемо декілька цільових тверджень з arg.

?— arg(2,відношення(іван, мати(галина)),X).

X = мати(галина).

?- arg(1,a+(b+c),X).

X = а.

?— arg(2, [a, b, c], X).

X =[b, c].

?— arg(1,a+(b+c),b).

false

Іноді потрібно використати предикати functor і arg за ситуації, коли можливі структури вже відомі. Це пов'язано з тим, що структура може мати так багато аргументів, що просто незручно кожного разу перераховувати їх всіх.

41.Дія на процес повернення

У Пролозі є два вбудовані предикати, що змінюють нормальну послідовність подій, що відбуваються в процесі повернення. Предикат «!» усуває можливості для повторного узгодження цільових тверджень, а предикат repeat створює нові альтернативи там, де їх не було раніше.

Відсікання

Символ відсікання ('!') можна розглядати як вбудований предикат, який позбавляє Пролог-систему можливості змінити деякі з рішень, прийнятих нею раніше.

repeat

Вбудований предикат repeat забезпечує додаткову можливість для породження множинних рішень в процесі повернення. Хоча він і є вбудованим, його поведінка повністю відповідає наступному означенню:

repeat.

repeat:-repeat.

Що станеться, якщо ми помістимо предикат repeat як цільове твердження в одне з наших правил?

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

Розглянемо вбудований предикат get0. Якщо Пролог намагається довести узгодженість цільового твердження get0(X), то він розуміє це як вказівку взяти чергову літеру, яка була введена в систему, і спробувати зіставити цілочисельний код цієї літери зі значенням X. Якщо вони будуть порівнянні, то цільове твердження вважається погодженим, інакше воно непогоджене. Ми можемо означити новий предикат new_get таким чином:

new_get(X) :— repeat, get0(X).

Предикат new_get має наступну властивість: він породжує одне за одним значення усіх подальших літер (в порядку їх отримання) як альтернативні рішення. Чому так виходить? Коли ми перший раз викликаємо new_get(X), то підціль repeat узгоджується і підціль get0(X) теж, при цьому змінна X конкретизується черговою літерою. Коли ми ініціюємо повернення, то з'ясовується, що останнім місцем, де був вибір, являється repeat. Пролог забуває все, що було зроблено з тієї миті, а повторне узгодження цільового твердження repeat успішно завершується. Тепер він знову повинен звернути свою увагу на get0(X). До цього моменту поточною літерою є наступна літера, і в результаті X отримує в якості значення другу літеру.

42.Формування складених цільових тверджень

У правилах і запитаннях виду X :-Y або ?— Y терм, що з'являється на місці Y, може складатися з єдиного цільового твердження або представляти кон'юнкцію цільових тверджень або їх диз'юнкцію. Більше того, можна використовувати в якості цільових тверджень змінні і успішно доводити узгодженість цільового твердження, коли цільове твердження насправді не узгоджується, використовуючи для цього предикат not. Предикати, представлені в цьому питанні, дозволяють реалізувати ці складні способи вираження цільових тверджень.

43.Кон'юнкція цілей

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

44.Диз'юнкція цілей

Функтор ';' визначає диз'юнкцію (що означає або) цільових тверджень. Якщо X і Y — цільові твердження, то цільове твердження X;Y узгоджується з базою даних, якщо узгоджується X або Y. Якщо X не узгоджується, то робиться спроба довести узгодженість Y. Якщо і Y не узгоджується, то не узгоджується і диз'юнкція в цілому. Ми можемо використати функтор ';' для того, щоб виразити альтернативи в межах одного твердження. Наприклад, вважатимемо, що деякий об'єкт є людиною, якщо цей об'єкт — або Адам або Єва або якщо у об'єкта є мати. Ми можемо виразити це в одному правилі таким чином:

людина(Х) :— (Х=адам; Х=єва; мати(Х,Y)).

Наши рекомендации