% Оставить первый элемент в подмножестве
подмножество( Остальные, Подмн).
подмножество( [Первый | Остальные], Подмн) :-
% Убрать первый элемент из подмножества
подмножество( Остальные, Подмн).
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).
сумспис( [Первый | Остальные], Сумма) :-
сумспис( Остальные, СуммаОстальных),