Глава 3. Lastl Item, [First | Rest]) : last( Item, Rest)
3.1. a) conc( L1, [_,_,_] , Li
б) сопс( {_,_,_ I L2 ],[_,•_,_] ,L)
3.2. a) last! Item, List) :-
cone( _, [Item], List) .
6) last ( Item, [Item] ) ,
lastl Item, [First | Rest]) : last( Item, Rest) .
3.3. evenlength ( [ ] ) .
Evenlength( [First I Rest]) : oddlength( Rest) .
Решения к отдельным упражнениям
oddlength( [First 1 Rest]) :-evenlength! Rest} .
3.4. reverse ( [],()>.
reverse! [First I Rest], Reversed) :-reverse! Rest, ReversedRest), concl ReversedRest, [First], Reversed).
3.5. % Эту задачу можно легко решить с помощью предиката reverse
palindrome[ List) :-
reverse! List, List) . % Еще одно решение, в котором не используется % предикат reverse palindrome 1( []) . palindrcmel( [_]) . palindrome 1( List) :-
conc( [First I Middle], [Firstl, List),
palindromelt Middle!.
3.6. shift,- [First I Rest], Shifted! :-
concl Rest, [First], Shifted).
3.7. translate ( [),!!).
translate! !Head ITail], [Headl ITaill]) :-Leans[ Head, Headl) , translate! Tail, Taill).
3.8. % Б приведенном ниже решении предполагается, что порядок
% элементов в списке Subset является таким же, как и в Set
subset! [],[])•
% Оставить элемент First в списке Subset
subset! [First I Rest], [First I Sub]) :-
subset! Rest, Sub) . subset! [First I Rest';, Sub) :- % Удалить элемент First
subset < Rest, Sub! .
3.9. • dividelist( ]] , [] , [)) . % Разделение пустого списка приводит
% к получению двух пустых списков dividelist! [X], [X], []). % Разделение
% одноэлементного списка dividelist! [X, Y I List], [X I Listl], [Y I List2]) :-dividelistt List, Listl, List2).
3.10. c=nget [ state (_,_,_,has) i !]) . % Возможные действия
% отсутствуют canget! State, [Action [ Actions]) :-
move( State, Action, NewState), % Первое действие canget{ NewState, Actions) . % Оставшиеся действия
3.11. flatten! [Head I Tail], FlatList) :- % Линеаризация
% непустого списка
flatten! Head, FlatHead),
flatten! Tail, Flatrail),
cone! FlatHead, FlatTail, FlatList). flatten! [],[]). £ Линеаризация пустого списка
flatten! X, [ Xj ) . 4 Примечание. При использовании перебора с возвратами эта % программа вырабатывает бессмысленные результаты
3.12. Terml = plays ( jimmy, and! football, sguash) !
Term2 •= plays! susan, and! tennis,
and[ basketball, volleyball)))
3.13. :- op! 300, xfx, was) .
: - op { 200 , xfx, of), :- opt 100, fx, the! .
З.Г4 a] A - 1 + 0
Решения к отдельным упражнениям 597
6) В = 1 + I + О
3.15.
3.16.
3.17.
3.18.
3.19.
a) c = l + i + l + l + O
r) D-l + 1 + 0 + 1; 0=1+0+1+1;
0 = 3 + 1 + 1 + 1% Дальнейшие попытки выполнить перебор % с возвратами вызывают возникновение бесконечного цикла
:- ор( 100, улу,, in) . :- ор( 300, iy., concatenating). :- opt 200, y.f-л, gives) . :- opt 100, xtx, and) . :- opt 300, fx, deleting). :- opt 100, xfx, from) . % Принадлежность к списку Item in [Item | List] . Item in [First| Rest] :-
Item in Rest. % Конкатенация списков concatenating (] and List gives List. Concatenating [X | LI] and L2 gives (X | L3] :-
concatenating LI and L2 gives L3. % Удаление элемента из списка deleting Item from (Item | Rest] gives Rest, deleting Item from [First | Rest] gives [First | HewRest] :-, deleting Item from Rest gives Hewfiest.
maxt X, Y, X! :-
X >= V. max [ X, Y, Y] :-
X < Y.
maxlist-; [X] , X) , * Наибольший элемент % в одноэлементном списке maxlisti [X, Y | Rest], Max) :- % По меньшей мере
% два элемента в списке maxlist) [Y | Rest], MaxRest),
max( X, MaxRest, Max) . % Элемент Max - наибольший среди Х
% и MaxRest
sumlist { [] , 0] . sumlist{ [First | Rest] , Sum) :-suralistl Rest, SumRest) , Sum is First + SumRest.
ordered{ [X]). 4 Одноэлементный список
% является упорядоченным ordered; [X, Y | Rest]) :-
3.20.
3.21.
ordered! [Y I Rest]) .
subsuml [] , 0, [] ) . subsuml [H | List], Sum, [N | Sub]) :- % Элемент н % принадлежи*к подмножеству Suntl is Sum - H, subsuml List, Suml, Sub) . subsum( [N | List], Sum, Sub) :- % Элемент N не
% принадлежит к подмножеству subsurrH List, Sum, Sub) .
between! HI, Ы2, N1] :-N1 =< N2 . between! HI, И2, X) :-HI < N2,
MewHl is Ml + 1, between{ KewNl,H2, X) .
Решения к отдельным упражнениям
:= Val3 else Anything |
- |
else Var |
Val4 |
3.22.
•
:- opt 900, fx, If) . ;- op( 800, xfx, then) . :- op( 700, xfx, else) . : - op [ 600, xfx, :-) . if Vail > Val2 then Var Vail > Val2, Var - Val3. if Vail > Val2 then Anything Vail - <Val2, Vat = Val4.
: -
-