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

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

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

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

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

3.9

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

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

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

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

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

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

3.10

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

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

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

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

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

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

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

3.11

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

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

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

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

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

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

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

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

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

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

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

3.12

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

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

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

3.13

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

:- op( 200, xfx, в)

:- op( 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

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

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

:- op( 200, xfx, дает)

:- op( 100, xfx, и)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.16

max( X, Y, X) :-

 X >= Y.

max( X, Y, Y) :-

 X

3.17

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

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

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

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

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

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

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

3.18

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

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

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

Перейти на страницу:

Похожие книги