Глава 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.

: -

-

Наши рекомендации