СИИ задачи по спискам


чет и нечет
domains intlist=integer*.
predicates
nondeterm chet(intlist).
nondeterm nechet(intlist).
clauses
chet( [ ] ).
chet( [_] ):- write(«Список нечетный»).
chet( [X | T] ):- nechet(T).
nechet( [ _ ] ):- write(«Список четный»).
nechet( [X | T] ) :-
chet( T).
goal chet([1,2,9]).
———————————————-
обращение
domains intlist=integer*
predicates
reverse(intlist,intlist).
conc(intlist, intlist, intlist).
clauses
conc( [X | L1], L2, [X | L3]):-
conc( L1, L2, L3).
conc([ ], L2, L2).
reverse([],[]).
reverse([X|T],L):- reverse(T, L1), conc(L1,[X], L).
goal reverse([0,1,2,3,4,5,6,7,8,9], L).
————————————————-
сумма списка
domains intlist=integer*.
predicates
sum(intlist, integer).
clauses
sum([],0).
sum([A|Xs],S) :-sum(Xs, S1), S=S1+A.
goal
sum([1,2,3], X), write(«Summa = «,X), nl, fail.
—————————————————
сдвиги
domains intlist=integer*.
predicates
nondeterm f(intlist, intlist, integer,integer).
conc(intlist, intlist, intlist).
clauses
f(LL,L, K,K):-!.
f(LL, [X|H], K,Z) :- conc(H, [X], L1), write(L1), NewK= K+1, nl, f(LL, L1, NewK,Z).

conc( [X | L1], L2, [X | L3]):-
conc( L1, L2, L3).
conc([ ], L2, L2).
goal
write(«vvedite koli4estvo sdvigov «), nl, readint(Z),
f([1,2,3,4,5], [1,2,3,4,5], 0,Z).
——————————————————-
палиндром
domains intlist=integer*
predicates
reverse(intlist,intlist).
conc(intlist, intlist, intlist).
palin(intlist).
clauses
reverse([],[]).
reverse([X|T],L):- reverse(T, L1), conc(L1,[X], L).
palin( L) :-
reverse( L, L), write(«Данное число палиндром»), nl.
conc( [X | L1], L2, [X | L3]):-
conc( L1, L2, L3).
conc([ ], L2, L2).
///% Вот другое решение, не использующее обратить
/*palin( [ ] ).
palin([ _ ]).
palin ([X | T] ) :-
conc(T, [X], T),
palin(T).
*///////
goal
palin([3,4,5,6,5,4,3]).
———————————————————
разбиение
domains intlist=integer*
predicates
razbienie(intlist, intlist, intlist).
clauses
razbienie( [ ], [ ], [ ]). % Разбивать нечего
razbienie( [X], [X], [ ]). % Разбиение одноэлементного списка
razbienie( [XX, Y | L], [ХX | L1],
[Y | L2]) :-
razbienie( L, L1, L2).
goal
razbienie( [1, 2, 3, 4, 5], [1,3,5], L).
———————————————————
подсчет длины списка без определенного элемента
domains intlist=integer*
predicates
compare(integer, integer, integer).
dl(intlist,integer, integer).
clauses
dl( [ ], E, 0).
dl( [ X | T],E, N) :-
dl( T, E, N1), cm(X,E, R1),
N=N1+1+R1.
compare(Q, Y,R):- Q=Y, R=-1,!.
compare(Q,Y,R):- R=0.
goal dl( [1, 2, 3, 4, 5], 1,N).

посчитать количество опред-х эл-ов в списке
domains
intlist=integer*
predicates
compare(integer, integer, integer).
dl(intlist,integer, integer).
clauses
dl( [ ], E, 0).
dl( [ X | T],E, N) :-
dl( T, E, N1),
compare(X,E, R1),
N=N1+R1.
compare(Q, Y,R):- Q=Y, R=1,!.
compare(Q,Y,R):- R=0.
goal
dl( [1, 2, 1, 1, 1], 1,N).
———————————————————

Макс элемент в списке
domains
intlist=integer*
predicates
nondeterm max(integer, integer, integer).
nondeterm max_list(intlist, integer).
clauses
max(C,Y,C):- C>Y,!.
max(C,Y,Y).
max_list([X],X). /* M_T — max элемент хвоста */
max(H,M_T,M). /* M — max из M_T и первого элемента
исходного списка */
max_list([H|T],M):- max_list(T,MT), max(H,MT,M), write(M), nl.
goal
max_list( [4,1, 2, 9, 6, 3], D).
————————————————————