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