Вход/Регистрация
Prolog
вернуться

Неизвестно

Шрифт:

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) ).

  • Читать дальше
  • 1
  • ...
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: