Глава 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] ).