Программирование на языке Пролог для искусственного интеллекта [Иван Братко] (fb2) читать постранично, страница - 150
[Настройки текста] [Cбросить фильтры]
если Вел1 > Вел2 то Перем := Вел3 иначе ЧтоУгодно :- Вел1 > Вел2, Перем = Вел3. если Вел1 > Вел2 то ЧтоУгодно иначе Перем := Вел4 :- Вел1 =< Вел2, Перем = Вел4.
Глава 4
4.1 (a) ?- семья(членсемьи( _, Фамилия, _, _ ), _, []). (b) ?- ребенок( членсемьи( Имя, Фамилия, _, работает( _, _ ) )). (c) семья(членсемьи( _, Фамилия, _, неработает), членсемьи( _, _, _, работает( _, _ ) ),_ ). (d) ?- семья( Муж, Жена, Дети), датарождения( Муж, дата( _, _, Год1) ), датарождения( Жена, дата( _, _, Год2) ), ( Год1 - Год2 >= 15; Год2 - Год1 >= 15 ), принадлежит( Ребенок, Дети). 4.2 близнецы( Ребенок1, Ребенок2) :- семья( _, _, Дети), удалить( Ребенок1, Дети, ДругиеДети), % Выделить первого ребенка принадлежит( Ребенок2, ДругиеДети), принадлежит( Ребенок1, Дата), принадлежит( Ребенок2, Дата). 4.3 n_элемент( 1, [X | L], X). % X - первый элемент списка [X | L] n_элемент( N, [Y | L], X) :- % X - n-й элемент [Y | L] N1 is N - 1, n_элемент( N1, L, X). 4.4 Входная цепочка укорачивается на каждом неспонтанном цикле, а укорачиваться бесконечно она не может. 4.5 допускается( S, [], _ ) :- конечное( S). допускается( S, [X | Остальные], Макс_переходов) :- Макс_переходов > 0, переход( S, X, S1), НовыйМакс is Макс_переходов - 1, допускается( S1, Остальные, НовыйМакс). допускается( S, Цепочка, Макс_переходов) :- Макс_переходов > 0, спонтанный( S, S1), НовыйМакс is Макс_переходов - 1, допускается( S1, Цепочка, НовыйМакс). 4.7 (а) ходконя( X/Y, X1/Y1) :- % Ход коня с поля X/Y на поле X1/Y1 ( dxy( DX, DY); % Расстояния по направлениям X и Y dxy( DY, DX) ), % Или расстояния по направлениям 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
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
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
7.2 добавить( Элемент, Список) :- var( Список), !, % Переменная Список представляет пустой список Список = [Элемент | Хвост]. добавить( Элемент, [ _ | Хвост]) :- добавить( Элемент, Хвост).принадлежит( X, Список) :- var( Список), !, % Переменная Список представляет пустой список, % поэтому X не может ему принадлежать fail. принадлежит( X, [X | Хвост]). принадлежит( X, [ _ | Хвост] ) :- принадлежит( X, Хвост).
Последние комментарии
1 час 39 минут назад
15 часов 33 минут назад
17 часов 6 минут назад
21 часов 7 секунд назад
21 часов 4 минут назад
1 день 2 часов назад