Использование предиката fail

Visual Prolog производит откат, когда какой-то запрос терпит неудачу. В некоторых ситуациях, необходимо вызвать откат для поиска всех решений. Visual Prolog имеет специальный предикат fail,который служит как не выполнимая подцель, заставляющая вызывать откат. Эффект предиката fail соответствует эффекту сравнения чисел 2 и 3 или любой другой невозможной подцели.

17. Рассмотрим следующий пример программы, иллюстрирующей использование предиката fail.

База данных содержит факты вида father(name, name). Создать проект, позволяющий определить, кто чей отец.

18. Создайте новый проект и напишите нижеприведенный программный код.

DOMAINS

name = symbol

PREDICATES

father(name, name)

everybody

CLAUSES

father(“павел”, “петр”).

father(“петр”, “михаил”).

father(“петр”, “иван”).

everybody:- father(X, Y), write(X, “ - это отец”, Y, “a”), nl, fail.

GOAL

everybody.

Результат выполнения программы (рис. 10):

павел - это отец петра

петр - это отец михаила

петр - это отец ивана


Рис. 10. Вывод программы

Если внутренняя цель полностью выполнится, то ничего не заставляет Visual Prolog делать откат. Поэтому внутренний запрос father имеет только одно решение. Однако предикат everybody в программе использует fail для вызова отката и происходит поиск всех возможных решений.

Объект предиката everybody производит более корректный ответ. Предикат everybody использует откат для поиска всех решений father(X, Y), заставляя Пролог постоянно крутиться в теле правила everybody, пока не выполниться одна из предшествующих подцелей:

father(X, Y), write(X," is ",Y, "а"), nl, fail.

fail никогда не выполниться, поэтому Visual Prolog вынужден постоянно делать откат. Когда используется откат, Пролог делает откат к последнему запросу, позволяющему находить множественные решения. Такой запрос называется недетерминированный.Недетерминированный запрос является противоположностью детерминированного запроса, который может иметь только одно решение.

Предикат write является детерминированным, поэтому Visual Prolog должен делать откат к первой подцели в правиле.

Обратите внимание, что бесполезно размещать подцель после fail в теле правила. Так как предикат fail всегда не выполняется, то и стоящие за ним подцели никогда не будут выполнены.

19. Создайте проект, реализующий железнодорожный справочник. В справочнике содержится следующая информация о каждом поезде: номер поезда, пункт назначения и время отправления.

а) вывести всю информацию из справочника;

Решение:


3525682284905184.html
3525723402293775.html
    PR.RU™