Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Пролог для искусственного интеллекта

Братко Иван

Шрифт:

получить( Функтор),

 вычислить( Списарг),

 Цель =.. [Функтор | Списарг],

 Цель

Здесь

получить
и
вычислить
 — некоторые определенные пользователем процедуры, предназначенные для вычисления компонент цели. После этого цель порождается предикатом '
=..
', а затем активизируется при помощи простого указания ее имени
Цель
.

% Отношение

%

% подставить(
Подтерм, Терм, Подтерм1, Терм1)

%

% состоит в следующем: если все вхождения Подтерм'а в Терм

% заменить на Подтерм1, то получится Терм1.

% Случай 1: Заменить весь терм

подставить( Терм, Терм, Терм1, Терм1) :- !.

% Случай 2: нечего подставлять

подставить( _, Терм, _, Терм) :-

 atomic( Терм), !.

% Случай 3: Проделать подстановку в аргументах

подставить( Под, Терм, Под1, Терм1) :-

 Терм =.. [F | Арги],

% Выделить аргументы

 подспис( Под, Арги, Под1, Арги1),

% Выполнить над ними подстановку

 Терм1 =.. [F | Арги1].

подспис( Под, [Терм | Термы], Под1, [Терм1 | Термы1]) :-

 подставить( Под, Терм, Под1, Терм1),

 подспис( Под, Термы, Под1, Термы1).

Рис. 7.3. Процедура подстановки в терм вместо одного из его подтермов некоторого другого подтерма.

Некоторые реализации Пролога могут содержать требование, чтобы все цели, появляющиеся в программе, по своей синтаксической форме были либо атомами, либо структурами с атомом в качестве главного функтора. Поэтому переменная, вне зависимости от ее текущей конкретизации, может по своей синтаксической форме не подойти в качестве цели. Эту трудность можно обойти при помощи еще одного встроенного предиката

call
(вызов), чьим аргументом является цель, подлежащая вычислению. В соответствий с этим предыдущий пример должен быть переписан так:

...

Цель = [Функтор | Списарг],

саll( Цель)

Иногда нужно извлечь из терма только его главный функтор или один из аргументов. В этом случае можно, конечно, воспользоваться отношением '

=..
'. Но более аккуратным и практичным, а также и более эффективным способом будет применение одной из двух новых встроенных процедур:
functor
и
аrg
. Вот их смысл: цель

functor( Терм, F, N)

истинна, если

F
 — главный функтор
Tepм
'a, а
N
 — арность
F
. Цель

arg( N, Терм,
А)

истинна, если

А
 — N-й аргумент в
Терм
'е, в предположении, что нумерация аргументов идет слева направо и начинается с 1. Примеры для иллюстрации:

?- functor( t( f( x), X, t), Фун, Арность).

Фун = t

Арность = 3

?- аrg( 2, f( X, t( a), t( b) ), Y).

Y = t( a)

?- functor( D, дата, 3),

arg( 1, D, 29),

arg( 2, D, июнь),

arg( 3, D, 1982).

D = дата( 29, июнь, 1982)

Последний пример иллюстрирует особый случай применения предиката

functor
. Цель
functor( D, дата, 3)
создает "обобщенный" терм с главным функтором
дата
и тремя аргументами. Этот терм обобщенный, так как все три его аргумента — не конкретизированные переменные, чья имена генерируются пролог-системой. Например:

D = дата( _5, _6, _7)

Затем эти три переменные конкретизируются при помощи трех целей

аrg
.

К рассматриваемому множеству встроенных предикатов относится также и введенный в гл. 6 предикат

name
, предназначенный для синтеза и декомпозиция атомов. Для полноты изложения мы здесь напомним его смысл. Цель

name( A, L)

истинна, если L — список кодов (в кодировке ASCII) символов, входящих в состав атома А.

Упражнения

7.3. Определите предикат

конкрет(Терм)
так, чтобы он принимал значение истина, когда в
Tepм
'e нет ни одной неконкретизированной переменной.

7.4. Процедура

подставить
из данного раздела производит, при наличии разных вариантов, лишь самую "внешнюю" подстановку.

Модифицируйте эту процедуру так, чтобы она находила все возможные варианты при помощи автоматического перебора. Например:

?- подставить( a+b, f( A+B), новый, НовыйТерм).

А = а

В = b

НовыйТерм = f( новый);

А = а+b

В = а+b

НовыйТерм = f( новый + новый)

Наша исходная версия нашла бы только первый из этих двух ответов.

7.5. Определите отношение

включает( Tepм1, Терм2)

которое выполняется, если

Терм1
является более общим, чем
Терм2
. Например:

?- включает( X, с).

yes

?- включает( g( X), g( t( Y))).

yes

?- включает f( X,X), f( a,b)).

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

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5