между( N1, N2, X) :-
N1 < N2,
HoвoeNl is N1 + 1,
между( HoвoeNl, N2, X).
3. 22
:- ор( 900, fx, если).
:- ор( 800, xfx, то).
:- ор( 700, xfx, иначе).
:- ор( 600, xfx, :=).
если Вел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, Х/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 сопоставим с Терм'ом?
Читать дальше