У Клоксин - ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ
- Название:ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
У Клоксин - ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ краткое содержание
Книга английских специалистов, содержащая описание основ логического программирования и особенностей языка Пролог – базового языка ЭВМ пятого поколения. Области применения этого языка связаны с разработкой экспертных систем, интеллектуальных баз данных, обработкой естественного языка, разработкой компиляторов ЭВМ. Книга полезна для первого ознакомления с языком Пролог.
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Встроенный предикат retractпозволяет удалять утверждения из базы данных. Этот предикат имеет один аргумент, представляющий терм, с которым должно быть сопоставлено удаляемое утверждение. Указанный терм должен быть достаточно конкретизирован, чтобы можно было определить предикат утверждения (аналогично предикатам asserta, clauseи т. д.). При попытке выполнить целевое утверждение retract(X)находится первое утверждение в базе данных, с которым может быть сопоставлен X, и это утверждение удаляется. При попытке вновь выполнить это целевое утверждение Пролог просматривает базу данных, начиная с места удаленного утверждения, в попытке найти другое сопоставимое утверждение. Если такое утверждение находится, то выполняются действия, рассмотренные выше. Если делается новая попытка согласовать целевое утверждение, то продолжается поиск следующего подходящего утверждения. И так далее. Заметим, что если утверждение было удалено, то оно ни при каких условиях не будет восстановлено вновь, даже при попытке вновь выполнить предикат retractпри возврате. Если в некоторый момент поиск не дает новых сопоставлений утверждений, то согласование целевого утверждения заканчивается неудачей.
Так как аргумент Xсопоставляется с удаляемым утверждением, то имеется возможность получить точное представление об удаляемом утверждении, даже если Xисходно означал некоторую структуру, содержащую множество неконкретизированных переменных. Это позволяет использовать предикат retractвместо предиката clause, в ситуации когда найденное утверждение сразу же удаляется. Такая ситуация как раз имеет место в определении предиката генатом (разд. 7.8).
6.5. Создание структур и работа с компонентами структур
Обычно когда мы хотим задать в программе на Прологе операции со структурой определенного вида, то мы делаем это, «упоминая» некоторым образом подобную структуру. Это значит, что если предикат используется для обработки множества структур различного вида, передаваемых ему в качестве аргумента, то обычно мы обеспечиваем отдельное утверждение для каждого класса структур. Хорошим примером такого подхода является программа для символьного дифференцирования, которая будет рассмотрена в разд. 7.1. В этой программе используются отдельные утверждения для функторов +, -, * и так далее. Мы знаем заранее, какие структуры могут появиться, и обеспечиваем утверждения для каждой из них.
В некоторых программах мы не можем предвидеть заранее все возможные структуры. Это имеет место, например, при написании программы «красивой печати», которая могла бы печатать произвольные структуры языка Пролог, размещая их в нескольких строках и используя отступы. (См. разд. 5.1, где представлена такая программа для печати списков.) Так, например, возможно, мы захотели бы напечатать терм
книга(629,автор(бронте, эмили),вх)
следующим образом:
книга
629
автор
бронте
эмили
вх
Важным моментом является то, что мы хотим, чтобы эта программа работала правильно, какую бы структуру мы ей ни задали. Понятно, что одна из возможностей сделать это – обеспечить отдельное утверждение для каждого функтора, какой только можно представить. Но это работа, которую мы никогда не завершим, потому что существует бесконечно много различных функторов! Написать подобную программу можно, используя встроенные предикаты для работы со структурами произвольного вида. Здесь мы опишем некоторые из них – это предикаты functor, argи ' =..'. Мы опишем также предикат name, выполняющий операции над атомами.
Предикат functorопределен таким образом, что functor(T,F,N)означает, что Т– это структура с функтором F, имеющим N аргументов. Этот предикат можно использовать двумя основными способами, В первом случае аргумент Туже имеет значение. Целевое утверждение считается несогласованным с базой данных, если Тне является ни атомом, ни структурой. Если Т– это атом или структура, то Fсопоставляется с функтором этой структуры, а Nприсваивается значение, равное числу аргументов функтора. Заметим, что в данном контексте считается, что атом – это структура с числом аргументов 0. Ниже приведено несколько примеров целевых утверждений с предикатом functor:
?- functor(f(a,b,g(Z)),F,N).
Z = _23, F = f ,N = 3
?- functor(a+b,F,N).
F = +, N = 2
?- functor([a,b,c],F,N).
F =., N = 2
?- functor(apple,F,N).
F = apple, N = 0
?- functor([a,b,c],'.',3).
нет
?- functor([a,b,c],a,Z).
нет
Прежде чем перейти к обсуждению предиката arg,следует рассмотреть второй способ использования предиката functor.В этом случае первый аргумент целевого утверждения functor (Т, F, N)неконкретизирован. В этом случае два других аргумента должны быть конкретизированы, однозначно определяя функтор и число аргументов соответственно. Целевое утверждение такого вида всегда согласуется с базой данных, и в результате значением Тстановится структура с указанными функтором и числом аргументов. Таким образом, это некоторый способ создания произвольных структур по заданным функтору структуры и числу ее аргументов. Аргументами такой структуры, созданной с помощью предиката functor,являются неконкретизированные переменные. Следовательно, эта структура будет сопоставима с любой другой структурой, имеющей тот же функтор и одинаковое число аргументов.
Предикат functorиспользуется для создания структуры в основном тогда, когда нам надо получить «копию» некоторой уже существующей структуры с новыми переменными в качестве аргументов. Мы можем ввести для этого предикат копирование,использующий functorкак целевое утверждение:
копирование(Старая, Новая):- functor(Cтapaя,F,N), functor(Hoвaя,F,N).
В этом определении подряд используются два целевых утверждения functor.Если целевое утверждение копированиеимеет конкретизированный первый аргумент и неконкретизированный второй, то произойдет следующее. Первое целевое утверждение functorбудет соответствовать первому способу использования этого предиката (так как первый аргумент этого предиката конкретизирован). Следовательно, Fи Nконкретизируются, получив в качестве значений функтор и число аргументов этой существующей структуры. Второе целевое утверждение functorсоответствует второму способу использования этого предиката. На этот раз первый аргумент неконкретизирован, и информация, задаваемая Fи N, используется для создания структуры Новая.Эта структура имеет те же функтор и число аргументов, что и Старая, но ее компонентами являются переменные. Таким образом, возможен следующий диалог:
Читать дальшеИнтервал:
Закладка: