Назад | Содержание| Вперёд ОТВЕТЫ К НЕКОТОРЫМ УПРАЖНЕНИЯМ/p...

Назад | Содержание| Вперёд

ОТВЕТЫ К НЕКОТОРЫМ УПРАЖНЕНИЯМ

Глава 1

1. 1

(a)    no

(b)    X = пат

(c)    X = боб

(d)    X = боб,    Y = пат

1. 2

(a)    ?-  родитель( X, пат).

(b)    ?-  родитель( лиз, X).

(c)    ?-  родитель( Y, пат),    родитель( X, Y).

1. 3

(a)    счастлив( X) :-

               родитель( X, Y).

(b)    имеетдвухдетей( X) :-

               родитель( X, Y),

               сестра( Z, Y).

1. 4

внук( X, Z) :-

        родитель( Y, X),

        родитель( Z, Y).

1. 5

тетя( X, Y) :-

        родитель( Z, Y),

        сестра( X, Z).

1. 6

Да.    (Определение верно)

1. 7

(a)    возвратов не будет

(b)    возвратов не будет

(c)    возвратов не будет

(d)    возвраты будут

Глава 2

2. 1

(a)    переменная

(b)    атом

(c)    атом

(d)    переменная

(e)    атом

(f)    структура

(g)    число

(h)    синтаксически неправильноевыражение

(i)    структура

(j)    структура

2. 3

(a)    успех

(b)    неуспех

(c)    неуспех

(d)    D = 2,    Е = 2

(e)    Р1 = точка(-1, 0)

        Р2 = точка( 1, 0)

        Р3 = точка( 0, Y)

Такая конкретизация определяет семействотреугольников, у которых две вершинырасполагаются на оси х в точках 1 и -1, атретья - в произвольной точке оси у.

2. 4

отр( точка( 5, Y1),    точка( 5, Y2) )

2. 5

регулярный( прямоугольник( точка( X1, Y1),

                                   точка( Х2, Y1), точкa( X2, Y3),

                                   точка( X1, Y3) ) ).

Здесь предполагается, что первая точкасоответствует нижней левой вершинепрямоугольника.

2. 6

(a)    А = два

(b)    no

(c)    С = один

(d)    D = s(s(1));

        D = s(s(s(s(s(1)))))

2. 7

родственники( X, Y) :-

    предок( X, Y);

    предок( Y, X);

    предок( Z, X),

    предок( Z, Y);

    предок( X, Z),

    предок( Y, Z).

2. 8

преобразовать( 1, один).

преобразовать( 2, два).

преобразовать( 3, три).

2. 9

В случае, изображенном на рис. 2.10,пролог-система выполняет несколько большийобъем работы.

2. 10

В соответствии с определением сопоставления,приведенном в разд. 2.2, данное сопоставлениебудет успешным. X приобретает вид циклическойструктуры, в которой сам X присутствует вкачестве одного из аргументов.

Глава 3

3. 1

(a)    конк( L1, [ _, _, _ ], L)

(b)    конк( [ _, _, _ ], L1, L),

                       % Удалить 3 первые элемента L

        конк( L2, [ _, _, _ ], L1)

                       % Удалить 3 последние элемента L1

Вот более короткий вариант, предложенный I. Tvrdy:

        конк( [ _, _, _ | L2], [ _, _, _], L)

3. 2

(а)    последний( Элемент, Список) :-

        конк( _, [Элемент], Список).

(b)    последний( Элемент, [Элемент]).

        последиий( Элемент,[Первый | Остальные]):-

        последний( Элемент,Остальные).

3. 3

четнаядлина( [ ] ).

четнаядлина( [Первый | Остальные] ) :-

    нечетнаядлина( Остальные).

нечетнаядлина( [ _ ] ).

нечетнаядлина( [Первый | Остальные] ) :-

    четнаядлина( Остальные).

3. 4

обращение( [ ], [ ]).

обращение( [Первый | Остальные], ОбращСпис): -

    обращение( Остальные,ОбращСписОстальных),

конк( О6ращСписОстальных, [Первый], ОбращСпис).

3. 5

% Такой предикат легко определить припомощи отношения обратить

палиндром( Список) :-

    обратить( Список, Список).

% Вот другое решение, не использующее обратить

палиндром1( [ ] ).

палиндром1( [ _ ] ).

палиндром1 [Первый | Остальные] ) :-

    конк( Середина, [Первый], Остальные),

    палиндром1( Середина).

3. 6

сдвиг( [Первый | Остальные], Сдвинут) :-

    конк( Остальные, [Первый], Сдвинут).

3. 7

перевод( [ ], [ ]).

перевод( [Голова | Хвост], [Голова1 | Хвост1]) :-

    означает( Голова, Голова1),

    перевод( Хвост, Хвост1).

3. 8

подмножество( [ ], [ ] ).

подмножество( [Первый | Остальные], [Первый |Подмн]):-

                               % Оставить первый элемент в подмножестве

    подмножество( Остальные, Подмн).

подмножество( [Первый | Остальные], Подмн) :-

                               % Убрать первый элемент из подмножества

    подмножество( Остальные, Подмн).

3. 9

разбиениесписка( [ ], [ ], [ ]).                         % Разбивать нечего

разбиениесписка( [X], [X], [ ]).

                           % Разбиение одноэлементного списка

разбиениесписка( [X, Y | Список], [Х | Список1],

                               [Y | Список2]) :-

    разбиениесписка( Список, Список1,Список2).

3. 10

можетзавладеть( состояние( _, _, _, имеет), [ ] ).

                               % Ничего не надо делать

можетзавладеть( Состояние, [Действие |Действия]):-

    ход( Состояние, Действие,НовоеСостояние),

                               % Первое действие

    можетзавладеть( НовоеСостояние,Действия).

                               % Оставшиеся действия

3. 11

линеаризация( [Голова | Хвост],ЛинейныйСписок ) :-

                               % Линеаризация непустого списка

    линеаризация( Голова,ЛинейнаяГолова ),

    линеаризация( Хвост, ЛинейныйХвост ),

    конк( ЛинейнаяГолова, ЛинейныйХвост,

        ЛинейныйСписок ).

линеаризация( [ ], [ ] ).                 % Линеаризация пустого списка

линеаризация( X, [X] ).

                           % Линеаризация объекта, не являющегосясписком

% Замечание: при попытке получить от этойпрограммы более

% одного варианта решения выдается бессмыслица

3. 12

Терм1 = играет_в( джимми, и( футбол, сквош) )

Терм2 = играет_в( сьюзан, и( теннис,

                                   и( баскетбол, волейбол) ) )

3. 13

:- ор( 300, xfx, работает)

:- ор( 200, xfx, в)

:- ор( 100, xfx, нашем)

3. 14

(a)    А = 1 + 0

(b)    В = 1 + 1 + 0

(c)    С = 1 + 1 + 1 + 1 + 0

(d)    D = 1 + 1 + 0 + 1

3. 15

:- ор( 100, xfx, входит_в)

:- ор( 300, fx, конкатенация_списков)

:- ор( 200, xfx, дает)

:- ор( 100, xfx, и)

:- ор( 300, fx, удаление_элемента)

:- ор( 100, xfx, из_списка)                       % Принадлежность к списку

Элемент входит_в [Элемент | Список].

Элемент входит_в [Первый | СписокОстальных] :-

Элемент входит_в СписокОстальных.

% Конкатенация списков

конкатенация_списков [ ] и Список даетСписок.

конкатенация_списков [X | L1] и L2 дает [X | L3] :-

    конкатенация_списков L1 и L2 дает L3.

% Удаление элемента из списка

удаление_элемента Элемент иэ_списка

            [Элемент |ОстальныеЭлементы]

            даетОстальныеЭлементы.

удаление_элемента Элемент из_списка

        [Первый |ОстальныеЭлементы]

        дает [Первый |НовСписОстЭлементов] :-

    удаление_элемента Элемент из_списка

           ОстальныеЭлементы дает НовСписОстЭлементов.

3. 16

max( X, Y, X) :-

    X >= Y.

max( X, Y, Y) :-

    X <Y.

3. 17

максспис( [X], X).

                           % Максимум в одноэлементном списке

максспис( [X, Y | Остальные], Мах) :-

                           % В списке есть по крайней мере два элемента?

    максспис( [Y | Остальные],МаксОстальные),

    mах( X, МаксОстальные, Мах).

                           % Мах наибольшее из чисел X и МаксОстальные

3. 18

сумспис( [ ], 0).

сумспис( [Первый | Остальные], Сумма) :-

    сумспис( Остальные, СуммаОстальных),

    Сумма is Первый + СуммаОстальных.

3. 19

упорядоченный ([ ]).

                       % Одноэлементный список являетсяупорядоченным

упорядоченный( [X, Y | Остальные] :-

    X =< Y,

    упорядоченный( [Y | Остальные] ).

3. 20

подсумма( [ ], 0, [ ]).

подсумма( [N | Список], Сумма, [N | Подмн]) :-

                   % N принадлежит подмножеству

    Сумма1 is Сумма - N,

    подсумма( Список, Сумма1, Подмн).

подсумма( [N | Список], Сумма, Подмн) :-

                   % N не принадлежит подмножеству

    подсумма( Список, Сумма, Подмн).

3. 21

между( N1, N2, N1) :-

    N1 =< N2.

между( 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 сопоставим с Терм'ом?

    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, Хвост).

Глава 8

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

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, Дальше).

                           % Обработать следующие уровни

вывод( nil, _, _, _, _ ).

вывод( д( Лев, X, Прав), Уров, ГлубХ, Дальше) :-

    Глуб1 is ГлубХ + 1,

    вывод( Лев, Уров, Глуб1, Дальше),

                           % Вывод левого поддерева

( Уров = ГлубХ,  !,

                           % X на нашем уровне?

        write( X), Дальше = да;

                           % Вывести вершину, продолжить

        write(' ') ),

                           % Иначе - оставить место

        вывод( Прав, Уров,Глуб1, Дальше).

                           % Вывод левого поддерева

Глава 10

10. 1

внутри( Элем, л( Элем)).            % Элементнайден в листе

внутри( Элем, в2( Д1, М, Д2) ):-

                                                   % Вершина имеет два поддерева

    больше( М, Элем),  !,          % Вершина не вовтором поддереве

    внутри( Элем, Д1);              %Поиск в первом поддереве

    внутри( Элем, Д2).              %Иначе - во втором поддереве

внутри( Элем, в3( Д1, М2, Д2, М3, Д3) ):-

                                                   % Вершина имеет три поддерева

    больше( М2, Элем),  !,

               % Элемент не во втором и не в третьемподдереве

    внутри( Элем, Д1);              %Поиск в первом поддереве

    больше( М3, Элем),  !,        % Элемент не в третьемподдереве

    внутри( Элем, Д2);              %Поиск во втором поддереве

    внутри( Элем, Д3).              %Поиск в третьем поддереве

10. 3

avl( Дер) :-

    аvl( Дер, Глуб).        % Дер являетсяAVL-деревом глубины Глуб

avl( nil, 0).                   % Пустое дерево  -   AVL -дерево глубины 0

avl( д( Лев, Кор, Прав), Г) :-

    avl( Лев, ГЛ),

    avl( Прав, ГП),

    ( ГЛ is ГП; ГЛ is ГП + 1; ГЛ is ГП - 1),

                                   % Глубины поддеревьев примерно совпадают

        макс( ГЛ, ГП, Г).

макс1( U, V, М) :-                                   % М = 1 + макс( U, V)

    U > V,  !, М is U + 1;

    М is V + 1.

Глава 11

11. 1

вглубину1( [Верш | Путь], [Верш | Путь]) :-

    цель( Верш).

вглубину1( [Верш | Путь], Решение) :-

    после( Верш, Верш1),

    not принадлежит( Верш1, Путь),

    вглубину1( [ Верш1, Верш | Путь], Решение).

11. 6

решить( СтартМнож, Решение) :-

                           % СтартМнож - множество стартовых вершин

    bagof( [Верш], принадлежит( Верш,СтартМнож),

                                                       Пути),

    вширину( Пути, Решение).

Назад | Содержание| Вперёд









Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх