Читаем Prolog полностью

Иногда нам может понадобиться более строгий вид равенства - буквальное равенство двух термов. Этот вид реализован еще одним встроенным предикатом, записываемым как инфиксный оператор '==':

        Т1 == Т2

Это равенство выполняется, если термы   Т1    и   Т2   идентичны, т. е. имеют в точности одинаковую структуру, причем все

соответствующие компоненты совпадают.

В частности, должны совпадать и имена переменных.

Отношение "не идентичны"

, дополнительное к данному, записывается так:

        Tl \== T2

Приведем несколько примеров:

        ?-  f( a, b) == f( а, b).

        yes

        ?-  f( a, b) == f( a, X).

        nо

        ?-  f( a, X) == f( a, Y).

        no

        ?-  X \== Y.

        yes

        ?-  t( X, f( a, Y) ) == t( X, f( a, Y) ).

        yes

Давайте в качестве примера переопределим отношение

        счетчик( Терм, Список, N)

из разд. 7.1. Пусть на этот раз N будет числом буквальных вхождений Терм'а в Список:

        счетчик( _, [ ], 0).

        счетчик( Терм, [Голова | L], N) :-

                Терм == Голова,  !,

                счетчик( Терм, L, N1),

                N is N1 + 1;

                счетчик( Терм, L, N).

Назад | Содержание | Вперёд

Назад | Содержание | Вперёд

7. 4.    Работа с базой данных

Реляционная модель предполагает, что база данных - это описание некоторого множества отношений. Пролог-программу можно рассматривать как именно такую базу данных: описание отношений частично присутствует в ней в явном виде (факты), а частично - в неявном (правила). Более того, встроенные предикаты дают возможность корректировать эту базу данных в процессе выполнения программ. Это делается добавлением к программе (в процессе вычисления) новых предложений или же вычеркиванием из нее уже

существующих. Предикаты, используемые для этой цели, таковы:

assert

(добавить),

asserta

,

assertz

и

retract

(удалить).

Цель

        assert( С)

всегда успешна, а в качестве своего побочного эффекта вызывает "констатацию" предложения   С,  т. е. добавление его к базе данных.

Цель

        retract( С)

приводит к противоположному эффекту: удаляет предложение, сопоставимое с  С. Следующий диалог иллюстрирует их работу:

        ?-  кризис.

        no

        ? -  assert( кризис).

        yes

        ?-  кризис.

        yes

        ? -  retract( кризис).

        yes

        ?-  кризис.

        no

Предложения, добавленные к программе таким способом, ведут себя точно так же, как и те, что были в "оригинале" программы. Следующий пример показывает, как с помощью assert и retract можно работать в условиях изменяющейся обстановки. Предположим, что у нас есть такая программа о погоде:

        хорошая :-

                солнечно, not дождь.

        необычная :-

                солнечно, дождь.

        отвратительная :-

                дождь, туман.

        дождь.

        туман.

Ниже приводится пример диалога с этой программой, во время которого база данных постепенно изменяется:

        ?-  хорошая.

        no

        ?-   отвратительная.

        yes

        ?-  retract( туман).

        yes

        ?-   отвратительная.

        no

        ?-  assert( солнечно).

        yes

        ?-  необычная.

        yes

        ?-  retract( дождь).

        уes

        ?-  хорошая.

        yes

Добавлять и удалять можно предложения любой формы. Следующий пример показывает, что, кроме того, retract может работать недетерминировано: используя механизм возвратов с помощью только одной цели retract можно удалить целое множество предложений. Предположим, что в программе, с которой мы "консультируемся", есть такие факты:

        быстр( энн).

        медл( том).

        медл( пат).

К этой программе можно добавить правило:

        ?-  assert(

                         ( быстрее( X, Y) :-

                              быстр( X), медл( Y) ) ).

        yes

        ?-  быстрее( А, В).

        А = энн

        В = том

        ?-  retract( медл( X) ).

        Х = том;

        X = пат;

        nо

        ?-  быстрее( энн, _ ).

        nо

Заметьте, что при добавлении нового правила синтаксис требует, чтобы оно (как аргумент assert) было заключено в скобки.

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

базе

данных его следует поместить. Такую возможность обеспечивают предикаты

asserta

и

assertz

. Цель

        asserta( С)

помещает С в начале базы данных. Цель

        assertz( С)

- в конце. Вот пример, иллюстрирующий работу этих предикатов:

        ?-  assеrt( р( a)), assertz( р( b) ), asserta( p( c) ).

        yes

        ?-  p( X).

        Х = с;

        Х = а;

        Х = b

Перейти на страницу:

Похожие книги

12 великих трагедий
12 великих трагедий

Книга «12 великих трагедий» – уникальное издание, позволяющее ознакомиться с самыми знаковыми произведениями в истории мировой драматургии, вышедшими из-под пера выдающихся мастеров жанра.Многие пьесы, включенные в книгу, посвящены реальным историческим персонажам и событиям, однако они творчески переосмыслены и обогащены благодаря оригинальным авторским интерпретациям.Книга включает произведения, созданные со времен греческой античности до начала прошлого века, поэтому внимательные читатели не только насладятся сюжетом пьес, но и увидят основные этапы эволюции драматического и сценаристского искусства.

Александр Николаевич Островский , Иоганн Вольфганг фон Гёте , Оскар Уайльд , Педро Кальдерон , Фридрих Иоганн Кристоф Шиллер

Драматургия / Проза / Зарубежная классическая проза / Европейская старинная литература / Прочая старинная литература / Древние книги
Волчья тропа
Волчья тропа

Мир после ядерной катастрофы. Человечество выжило, но высокие технологии остались в прошлом – цивилизация откатилась назад, во времена Дикого Запада.Своенравная, строптивая Элка была совсем маленькой, когда страшная буря унесла ее в лес. Суровый охотник, приютивший у себя девочку, научил ее всему, что умел сам, – ставить капканы, мастерить ловушки для белок, стрелять из ружья и разделывать дичь.А потом она выросла и узнала страшную тайну, разбившую вдребезги привычную жизнь. И теперь ей остается только одно – бежать далеко на север, на золотые прииски, куда когда-то в поисках счастья ушли ее родители.Это будет долгий, смертельно опасный и трудный путь. Путь во мраке. Путь по Волчьей тропе… Путь, где единственным защитником и другом будет таинственный волк с черной отметиной…

Алексей Семенов , Бет Льюис , Даха Тараторина , Евгения Ляшко , Сергей Васильевич Самаров

Фантастика / Приключения / Боевик / Славянское фэнтези / Прочая старинная литература