Иван Братко - Программирование на языке Пролог для искусственного интеллекта
- Название:Программирование на языке Пролог для искусственного интеллекта
- Автор:
- Жанр:
- Издательство:Мир
- Год:1990
- Город:Москва
- ISBN:5-03-001425-Х
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Иван Братко - Программирование на языке Пролог для искусственного интеллекта краткое содержание
Книга известного специалиста по программированию (Югославия), содержащая основы языка Пролог и его приложения для решения задач искусственного интеллекта. Изложение отличается методическими достоинствами — книга написана в хорошем стиле, живым языком. Книга дополняет имеющуюся на русском языке литературу по языку Пролог.
Для программистов разной квалификации, специалистов по искусственному интеллекту, для всех изучающих программирование.
Программирование на языке Пролог для искусственного интеллекта - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
% Или расстояния по направлениям Y и X
X1 is X + DX,
% X1 расположен в пределах шахматной доски
надоске( X1),
Y1 is Y + DY,
% Y1 расположен в пределах шахматной доски
надоске( Y1).
dxy( 2, 1). % 2 поля вправо, 1 поле вперед
dxy( 2, -1). % 2 поля вправо, 1 поле назад
dxy( -2, 1). % 2 поля влево, 1 поле вперед
dxy( -2, -1). % 2 поля влево, 1 поле назад
надоске( Коорд) :-
% Координаты в пределах доски
0 < Коорд,
Коорд < 9.
(b) путьконя( [ Поле]). % Конь стоит на поле Поле
путьконя( [S1, S2 | Остальные] ) :-
ходконя( S1, S2),
путьконя( [S2 | Остальные]).
(c) ?- путьконя( [2/1, R, 5/4, S, X/8] ).
5.1
(a) X = 1;
X = 2
(b) X = 1;
Y = 1;
X = 1;
Y = 2;
X = 2;
Y = 1;
X = 2;
Y = 2;
(c) X = 1;
Y = 1;
X = 1;
Y = 2;
5.2
класс( Число, положительное) :-
Число > 0, !.
класс( 0, нуль) :- !.
класс( Число, отрицательное).
5.3
разбить( [], [], []).
разбить( [X | L], [X | L1], L2) :-
X >= 0, !,
разбить( L, L1, L2).
разбить( [X | L], L1, [X | L2]) .
разбить( L, L1, L2).
5.4
принадлежит( Некто, Кандидаты),
not принадлежит( Некто, Исключенные)
5.5
разность( [], _, []).
разность( [X | L1], L2, L):-
принадлежит( X, L2), !,
разность( L1, L2, L).
разность( [X | L1], L2, [X | L]) :-
разность( L1, L2, L).
5.6
унифицируемые( [], _, []).
унифицируемые( [Первый | Остальные], Терм, Список) : -
not( Первый = Терм), !,
унифицируемые( Остальные, Терм, Список).
унифицируемые( [Первый | Остальные], Терм,
[Первый | Список] ) :-
унифицируемые( Остальные, Терм, Список).
6.1
найтитерм( Терм) :-
% Пусть текущий входной поток - это файл f
read( Терм), !,
% Текущий терм из f сопоставим с Терм'ом?
write( Терм); % Если да - вывести его на терминал
найтитерм( Терм). % В противном случае - обработать
6.2
найтитермы( Терм) :-
read( ТекущийТерм),
обработать( ТекущийТерм, Терм).
обработать( end_of_file, _ ) :- !.
обработать( ТекущийТерм, Терм) :-
( not( ТекущийТерм = Терм), !;
% Термы несопоставимы
write( ТекущийТерм), nl),
% В противном случае вывести текущий терм
найтивсетермы( Терм).
% Обработать оставшуюся часть файла
6.4
начинается( Атом, Символ) :-
name( Символ, [ Код]),
name( Атом, [Код | _ ]).
6.5
plural( Существительное, Существительные) :-
name( Существительное, СписокКодов),
name( s, КодS),
конк( СписокКодов, КодS, НовыйСписокКодов),
name( Существительные, НовыйСписокКодов).
7.2
добавить( Элемент, Список) :-
var( Список), !,
% Переменная Список представляет пустой список
Список = [Элемент | Хвост].
добавить( Элемент, [ _ | Хвост]) :-
добавить( Элемент, Хвост).
принадлежит( X, Список) :-
var( Список), !,
% Переменная Список представляет пустой список,
% поэтому X не может ему принадлежать
fail.
принадлежит( X, [X | Хвост]).
принадлежит( X, [ _ | Хвост] ) :-
принадлежит( X, Хвост).
8.2
добавить_в_конец( L1-[Элемент | Z2], Элемент, L1 - Z2).
8.3
обратить( А - Z, L - L) :-
% Результатом является пустой список,
% если A-Z представляет пустой список
А == Z, !.
обратить( [X | L] - Z, RL - RZ ) :-
% Непустой список
обратить( L - Z, RL - [X | RZ].
9.1
список( []).
список( [ _ | Хвост]) :-
список( Хвост).
9.2
принадлежит( X, X затем ЧтоУгодно).
принадлежит( X, Y затем Спис) :-
принадлежит( X, Спис).
9.3
преобр( [ , ничего_не_делать).
преобр( [Первый | Хвост], Первый затем Остальные):-
преобр( Хвост, Остальные).
9.4
преобр( [ , ПустСпис, _, ПустСпис).
% Случай пустого списка
преобр( [Первый | Хвост], НовСпис, Функтор, Пустой) :-
НовСпис =.. [Функтор, Первый, НовХвост],
преобр( Хвост, НовХвост, Функтор, Пустой).
9.8
сорт1( [], []).
сорт1( [X], [X]).
сорт1( Спис, УпорСпис) :-
разбить( Спис, Спис1, Спис2),
% Разбить на 2 прибл. равных списка
сорт1( Спис1, Упор1),
сорт1( Спис2, Упор2),
слить( Упор1, Упор2, УпорСпис).
% Слить отсортированные списки
разбить( [], [], []).
разбить( [X], [X], []).
разбить( [X, Y | L], [X | L1], [Y | L2]) :-
% X и Y помещаются в разные списки
разбить( L, L1, L2).
9.9
(а) двдерево( nil).
двдерево( д( Лев, Кор, Прав) ) :-
двдерево( Лев),
двдерево( Прав).
9.10
глубина( пусто, 0).
глубина( д( Лев, Кор, Прав), Г) :-
глубина( Лев, ГЛ),
глубина( Прав, ГП),
макс( ГЛ, ГП, МГ),
Г is МГ + 1.
макс( А, В, А) :-
А >= В, !.
макс( А, В, В).
9.11
линеаризация( nil, []).
линеаризация( д( Лев, Кор, Прав), Спис) :-
линеаризация( Лев, Спис1),
линеаризация( Прав, Спис2),
конк( Спис1, [Кор | Спис2], Спис).
9.12
максэлемент( д( _, Кор, nil), Кор) :- !.
% Корень - самый правый элемент
максэлемент( д( _, _, Прав,), Макс) :-
% Правое поддерево непустое
максэлемент( Прав, Макс).
9.13
внутри( Элем, д( _, Элем, _ ), [ Элем]).
внутри( Элем, д( Лев, Кор, _ ), [Кор | Путь]) :-
больше( Кор, Элем),
внутри( Элем, Лев, Путь).
внутри( Элем,д( _, Кор, Прав), [Кор | Путь]) :-
больше( Элем, Кор),
внутри( Элем, Прав, Путь).
9.14
% Отображение двоичного дерева, растущего сверху вниз
% Предполагается, что каждая вершина занимает при печати
% один символ
отобр( Дер) :-
уровни( Дер, 0, да).
% Обработать все уровни
уровни( Дер, Уров, нет) :- !.
% Ниже уровня Уров больше нет вершин
уровни( Дер, Уров, да) :-
% Обработать все уровни, начиная с Уров
вывод( Дер, Уров, 0, Дальше), nl,
% Вывести вершины уровня Уров
Уров1 is Уров + 1,
уровни( Дер, Уров1, Дальше).
Интервал:
Закладка: